1// Copyright 2023 The Go Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style
3// license that can be found in the LICENSE file.
4
5// Package benchmarks contains benchmarks for slog.
6//
7// These benchmarks are loosely based on github.com/uber-go/zap/benchmarks.
8// They have the following desirable properties:
9//
10//   - They test a complete log event, from the user's call to its return.
11//
12//   - The benchmarked code is run concurrently in multiple goroutines, to
13//     better simulate a real server (the most common environment for structured
14//     logs).
15//
16//   - Some handlers are optimistic versions of real handlers, doing real-world
17//     tasks as fast as possible (and sometimes faster, in that an
18//     implementation may not be concurrency-safe). This gives us an upper bound
19//     on handler performance, so we can evaluate the (handler-independent) core
20//     activity of the package in an end-to-end context without concern that a
21//     slow handler implementation is skewing the results.
22//
23//   - We also test the built-in handlers, for comparison.
24package benchmarks
25
26import (
27	"errors"
28	"log/slog"
29	"time"
30)
31
32const testMessage = "Test logging, but use a somewhat realistic message length."
33
34var (
35	testTime     = time.Date(2022, time.May, 1, 0, 0, 0, 0, time.UTC)
36	testString   = "7e3b3b2aaeff56a7108fe11e154200dd/7819479873059528190"
37	testInt      = 32768
38	testDuration = 23 * time.Second
39	testError    = errors.New("fail")
40)
41
42var testAttrs = []slog.Attr{
43	slog.String("string", testString),
44	slog.Int("status", testInt),
45	slog.Duration("duration", testDuration),
46	slog.Time("time", testTime),
47	slog.Any("error", testError),
48}
49
50const wantText = "time=1651363200 level=0 msg=Test logging, but use a somewhat realistic message length. string=7e3b3b2aaeff56a7108fe11e154200dd/7819479873059528190 status=32768 duration=23000000000 time=1651363200 error=fail\n"
51