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