Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
aos
GitHub Repository: aos/grafana-agent
Path: blob/main/pkg/util/zapadapter/zapadapter_test.go
4095 views
1
package zapadapter_test
2
3
import (
4
"bytes"
5
"fmt"
6
"io"
7
"strings"
8
"testing"
9
"time"
10
11
"github.com/go-kit/log"
12
"github.com/go-kit/log/level"
13
"github.com/grafana/agent/pkg/util/zapadapter"
14
"github.com/stretchr/testify/require"
15
"go.uber.org/zap"
16
)
17
18
func Test(t *testing.T) {
19
tt := []struct {
20
name string
21
field []zap.Field
22
expect string
23
}{
24
{
25
name: "No fields",
26
expect: `level=info msg="Hello, world!"`,
27
},
28
{
29
name: "Any",
30
field: []zap.Field{zap.Any("key", 12345)},
31
expect: `level=info msg="Hello, world!" key=12345`,
32
},
33
{
34
name: "Bool",
35
field: []zap.Field{zap.Bool("key", true)},
36
expect: `level=info msg="Hello, world!" key=true`,
37
},
38
{
39
name: "Duration",
40
field: []zap.Field{zap.Duration("key", time.Minute)},
41
expect: `level=info msg="Hello, world!" key=1m0s`,
42
},
43
{
44
name: "Error",
45
field: []zap.Field{zap.Error(fmt.Errorf("something went wrong"))},
46
expect: `level=info msg="Hello, world!" error="something went wrong"`,
47
},
48
{
49
name: "Float32",
50
field: []zap.Field{zap.Float32("key", 123.45)},
51
expect: `level=info msg="Hello, world!" key=123.45`,
52
},
53
{
54
name: "Float64",
55
field: []zap.Field{zap.Float64("key", 123.45)},
56
expect: `level=info msg="Hello, world!" key=123.45`,
57
},
58
{
59
name: "Int",
60
field: []zap.Field{zap.Int("key", 12345)},
61
expect: `level=info msg="Hello, world!" key=12345`,
62
},
63
{
64
name: "String",
65
field: []zap.Field{zap.String("key", "foobar")},
66
expect: `level=info msg="Hello, world!" key=foobar`,
67
},
68
{
69
name: "Time",
70
field: []zap.Field{
71
zap.Time("key", time.Date(2022, 12, 1, 1, 1, 1, 1, time.UTC)),
72
},
73
expect: `level=info msg="Hello, world!" key=2022-12-01T01:01:01.000000001Z`,
74
},
75
{
76
name: "Namespace",
77
field: []zap.Field{
78
zap.String("key", "foo"),
79
zap.Namespace("ns"),
80
zap.String("key", "bar"),
81
},
82
expect: `level=info msg="Hello, world!" key=foo ns.key=bar`,
83
},
84
}
85
86
for _, tc := range tt {
87
t.Run(tc.name, func(t *testing.T) {
88
var buf bytes.Buffer
89
90
inner := log.NewLogfmtLogger(log.NewSyncWriter(&buf))
91
92
zapLogger := zapadapter.New(inner)
93
zapLogger.Info("Hello, world!", tc.field...)
94
95
require.Equal(t, tc.expect, strings.TrimSpace(buf.String()))
96
})
97
}
98
}
99
100
func Benchmark(b *testing.B) {
101
// Benchmark various fields that may be commonly printed.
102
//
103
// NOTE(rfratto): Array and Object are skipped as benchmarks since they
104
// currently only print placeholder text in place of actual values.
105
106
runBenchmark(b, "No fields")
107
runBenchmark(b, "Any", zap.Any("key", 12345))
108
runBenchmark(b, "Bool", zap.Bool("key", true))
109
runBenchmark(b, "Duration", zap.Duration("key", time.Second))
110
runBenchmark(b, "Error", zap.Error(fmt.Errorf("hello")))
111
runBenchmark(b, "Float32", zap.Float32("key", 1234))
112
runBenchmark(b, "Float64", zap.Float64("key", 1234))
113
runBenchmark(b, "Int", zap.Int("key", 1234))
114
runBenchmark(b, "String", zap.String("key", "test"))
115
runBenchmark(b, "Time", zap.Time("key", time.Date(2022, 12, 1, 1, 1, 1, 1, time.UTC)))
116
}
117
118
func runBenchmark(b *testing.B, name string, fields ...zap.Field) {
119
innerLogger := log.NewLogfmtLogger(io.Discard)
120
innerLogger = level.NewFilter(innerLogger, level.AllowAll())
121
122
zapLogger := zapadapter.New(innerLogger)
123
124
b.Run(name, func(b *testing.B) {
125
for i := 0; i < b.N; i++ {
126
zapLogger.Info("Hello, world!", fields...)
127
}
128
})
129
}
130
131