...
1 package level_test
2
3 import (
4 "io/ioutil"
5 "testing"
6
7 "github.com/go-kit/log"
8 "github.com/go-kit/log/level"
9 )
10
11 func Benchmark(b *testing.B) {
12 contexts := []struct {
13 name string
14 context func(log.Logger) log.Logger
15 }{
16 {"NoContext", func(l log.Logger) log.Logger {
17 return l
18 }},
19 {"TimeContext", func(l log.Logger) log.Logger {
20 return log.With(l, "time", log.DefaultTimestampUTC)
21 }},
22 {"CallerContext", func(l log.Logger) log.Logger {
23 return log.With(l, "caller", log.DefaultCaller)
24 }},
25 {"TimeCallerReqIDContext", func(l log.Logger) log.Logger {
26 return log.With(l, "time", log.DefaultTimestampUTC, "caller", log.DefaultCaller, "reqID", 29)
27 }},
28 }
29
30 loggers := []struct {
31 name string
32 logger log.Logger
33 }{
34 {"Nop", log.NewNopLogger()},
35 {"Logfmt", log.NewLogfmtLogger(ioutil.Discard)},
36 {"JSON", log.NewJSONLogger(ioutil.Discard)},
37 }
38
39 filters := []struct {
40 name string
41 filter func(log.Logger) log.Logger
42 }{
43 {"Baseline", func(l log.Logger) log.Logger {
44 return l
45 }},
46 {"DisallowedLevel", func(l log.Logger) log.Logger {
47 return level.NewFilter(l, level.AllowInfo())
48 }},
49 {"AllowedLevel", func(l log.Logger) log.Logger {
50 return level.NewFilter(l, level.AllowAll())
51 }},
52 }
53
54 for _, c := range contexts {
55 b.Run(c.name, func(b *testing.B) {
56 for _, f := range filters {
57 b.Run(f.name, func(b *testing.B) {
58 for _, l := range loggers {
59 b.Run(l.name, func(b *testing.B) {
60 logger := c.context(f.filter(l.logger))
61 b.ResetTimer()
62 b.ReportAllocs()
63 for i := 0; i < b.N; i++ {
64 level.Debug(logger).Log("foo", "bar")
65 }
66 })
67 }
68 })
69 }
70 })
71 }
72 }
73
View as plain text