1package level_test
2
3import (
4	"io/ioutil"
5	"testing"
6
7	"github.com/go-kit/kit/log"
8	"github.com/go-kit/kit/log/level"
9)
10
11func 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