1
0
mirror of https://github.com/open-telemetry/opentelemetry-go.git synced 2025-02-11 13:38:37 +02:00
opentelemetry-go/trace/config_test.go
Damien Mathieu 83c61f521f
Extend trace config benchmarks to run each option individually (#5566)
This extends the trace API new traces, span and event benchmarks into
sub benchmarks, so each option is tested individually rather than all of
them together.

```
open-telemetry/opentelemetry-go/trace›  git:(extend-trace-config-benchmarks) go test -v -bench=Config -run Benchmark
goos: darwin
goarch: arm64
pkg: go.opentelemetry.io/otel/trace
BenchmarkNewTracerConfig
BenchmarkNewTracerConfig/with_no_options
BenchmarkNewTracerConfig/with_no_options-10             558777036                2.021 ns/op           0 B/op          0 allocs/op
BenchmarkNewTracerConfig/with_an_instrumentation_version
BenchmarkNewTracerConfig/with_an_instrumentation_version-10             91590230                13.09 ns/op            0 B/op          0 allocs/op
BenchmarkNewTracerConfig/with_a_schema_url
BenchmarkNewTracerConfig/with_a_schema_url-10                           89374104                13.07 ns/op            0 B/op          0 allocs/op
BenchmarkNewSpanStartConfig
BenchmarkNewSpanStartConfig/with_no_options
BenchmarkNewSpanStartConfig/with_no_options-10                          288158400                4.187 ns/op           0 B/op          0 allocs/op
BenchmarkNewSpanStartConfig/with_attributes
BenchmarkNewSpanStartConfig/with_attributes-10                          26750458                45.20 ns/op           64 B/op          1 allocs/op
BenchmarkNewSpanStartConfig/with_attributes_set_multiple_times
BenchmarkNewSpanStartConfig/with_attributes_set_multiple_times-10       11745048               102.4 ns/op           192 B/op          2 allocs/op
BenchmarkNewSpanStartConfig/with_a_timestamp
BenchmarkNewSpanStartConfig/with_a_timestamp-10                         55898018                21.38 ns/op            0 B/op          0 allocs/op
BenchmarkNewSpanStartConfig/with_links
BenchmarkNewSpanStartConfig/with_links-10                               19950262                60.21 ns/op           96 B/op          1 allocs/op
BenchmarkNewSpanStartConfig/with_links_set_multiple_times
BenchmarkNewSpanStartConfig/with_links_set_multiple_times-10             8129803               141.6 ns/op           272 B/op          2 allocs/op
BenchmarkNewSpanStartConfig/with_new_root
BenchmarkNewSpanStartConfig/with_new_root-10                            43815543                27.46 ns/op            0 B/op          0 allocs/op
BenchmarkNewSpanStartConfig/with_span_kind
BenchmarkNewSpanStartConfig/with_span_kind-10                           43276576                27.49 ns/op            0 B/op          0 allocs/op
BenchmarkNewSpanEndConfig
BenchmarkNewSpanEndConfig/with_no_options
BenchmarkNewSpanEndConfig/with_no_options-10                            286546008                4.155 ns/op           0 B/op          0 allocs/op
BenchmarkNewSpanEndConfig/with_a_timestamp
BenchmarkNewSpanEndConfig/with_a_timestamp-10                           55678317                21.26 ns/op            0 B/op          0 allocs/op
BenchmarkNewSpanEndConfig/with_stack_trace
BenchmarkNewSpanEndConfig/with_stack_trace-10                           57029929                20.80 ns/op            0 B/op          0 allocs/op
BenchmarkNewEventConfig
BenchmarkNewEventConfig/with_no_options
BenchmarkNewEventConfig/with_no_options-10                              25571608                46.08 ns/op            0 B/op          0 allocs/op
BenchmarkNewEventConfig/with_attributes
BenchmarkNewEventConfig/with_attributes-10                              13868670                80.87 ns/op           64 B/op          1 allocs/op
BenchmarkNewEventConfig/with_attributes_set_multiple_times
BenchmarkNewEventConfig/with_attributes_set_multiple_times-10            8357275               143.2 ns/op           192 B/op          2 allocs/op
BenchmarkNewEventConfig/with_a_timestamp
BenchmarkNewEventConfig/with_a_timestamp-10                             80229771                14.77 ns/op            0 B/op          0 allocs/op
BenchmarkNewEventConfig/with_a_stacktrace
BenchmarkNewEventConfig/with_a_stacktrace-10                            21965215                54.93 ns/op            0 B/op          0 allocs/op
PASS
ok      go.opentelemetry.io/otel/trace  24.862s
```

---------

Co-authored-by: Robert Pająk <pellared@hotmail.com>
2024-07-08 16:14:15 +02:00

401 lines
7.7 KiB
Go

// Copyright The OpenTelemetry Authors
// SPDX-License-Identifier: Apache-2.0
package trace
import (
"testing"
"time"
"github.com/stretchr/testify/assert"
"go.opentelemetry.io/otel/attribute"
)
func TestNewSpanConfig(t *testing.T) {
k1v1 := attribute.String("key1", "value1")
k1v2 := attribute.String("key1", "value2")
k2v2 := attribute.String("key2", "value2")
timestamp0 := time.Unix(0, 0)
timestamp1 := time.Unix(0, 0)
link1 := Link{
SpanContext: SpanContext{traceID: TraceID([16]byte{1, 1}), spanID: SpanID{3}},
Attributes: []attribute.KeyValue{k1v1},
}
link2 := Link{
SpanContext: SpanContext{traceID: TraceID([16]byte{1, 1}), spanID: SpanID{3}},
Attributes: []attribute.KeyValue{k1v2, k2v2},
}
tests := []struct {
options []SpanStartOption
expected SpanConfig
}{
{
// No non-zero-values should be set.
[]SpanStartOption{},
SpanConfig{},
},
{
[]SpanStartOption{
WithAttributes(k1v1),
},
SpanConfig{
attributes: []attribute.KeyValue{k1v1},
},
},
{
// Multiple calls should append not overwrite.
[]SpanStartOption{
WithAttributes(k1v1),
WithAttributes(k1v2),
WithAttributes(k2v2),
},
SpanConfig{
// No uniqueness is guaranteed by the API.
attributes: []attribute.KeyValue{k1v1, k1v2, k2v2},
},
},
{
[]SpanStartOption{
WithAttributes(k1v1, k1v2, k2v2),
},
SpanConfig{
// No uniqueness is guaranteed by the API.
attributes: []attribute.KeyValue{k1v1, k1v2, k2v2},
},
},
{
[]SpanStartOption{
WithTimestamp(timestamp0),
},
SpanConfig{
timestamp: timestamp0,
},
},
{
[]SpanStartOption{
// Multiple calls overwrites with last-one-wins.
WithTimestamp(timestamp0),
WithTimestamp(timestamp1),
},
SpanConfig{
timestamp: timestamp1,
},
},
{
[]SpanStartOption{
WithLinks(link1),
},
SpanConfig{
links: []Link{link1},
},
},
{
[]SpanStartOption{
// Multiple calls should append not overwrite.
WithLinks(link1),
WithLinks(link1, link2),
},
SpanConfig{
// No uniqueness is guaranteed by the API.
links: []Link{link1, link1, link2},
},
},
{
[]SpanStartOption{
WithNewRoot(),
},
SpanConfig{
newRoot: true,
},
},
{
[]SpanStartOption{
// Multiple calls should not change NewRoot state.
WithNewRoot(),
WithNewRoot(),
},
SpanConfig{
newRoot: true,
},
},
{
[]SpanStartOption{
WithSpanKind(SpanKindConsumer),
},
SpanConfig{
spanKind: SpanKindConsumer,
},
},
{
[]SpanStartOption{
// Multiple calls overwrites with last-one-wins.
WithSpanKind(SpanKindClient),
WithSpanKind(SpanKindConsumer),
},
SpanConfig{
spanKind: SpanKindConsumer,
},
},
{
// Everything should work together.
[]SpanStartOption{
WithAttributes(k1v1),
WithTimestamp(timestamp0),
WithLinks(link1, link2),
WithNewRoot(),
WithSpanKind(SpanKindConsumer),
},
SpanConfig{
attributes: []attribute.KeyValue{k1v1},
timestamp: timestamp0,
links: []Link{link1, link2},
newRoot: true,
spanKind: SpanKindConsumer,
},
},
}
for _, test := range tests {
assert.Equal(t, test.expected, NewSpanStartConfig(test.options...))
}
}
func TestEndSpanConfig(t *testing.T) {
timestamp := time.Unix(0, 0)
tests := []struct {
options []SpanEndOption
expected SpanConfig
}{
{
[]SpanEndOption{},
SpanConfig{},
},
{
[]SpanEndOption{
WithStackTrace(true),
},
SpanConfig{
stackTrace: true,
},
},
{
[]SpanEndOption{
WithTimestamp(timestamp),
},
SpanConfig{
timestamp: timestamp,
},
},
}
for _, test := range tests {
assert.Equal(t, test.expected, NewSpanEndConfig(test.options...))
}
}
func TestTracerConfig(t *testing.T) {
v1 := "semver:0.0.1"
v2 := "semver:1.0.0"
schemaURL := "https://opentelemetry.io/schemas/1.2.0"
attrs := attribute.NewSet(
attribute.String("user", "alice"),
attribute.Bool("admin", true),
)
c := NewTracerConfig(
// Multiple calls should overwrite.
WithInstrumentationVersion(v1),
WithInstrumentationVersion(v2),
WithSchemaURL(schemaURL),
WithInstrumentationAttributes(attrs.ToSlice()...),
)
assert.Equal(t, v2, c.InstrumentationVersion(), "instrumentation version")
assert.Equal(t, schemaURL, c.SchemaURL(), "schema URL")
assert.Equal(t, attrs, c.InstrumentationAttributes(), "instrumentation attributes")
}
// Save benchmark results to a file level var to avoid the compiler optimizing
// away the actual work.
var (
tracerConfig TracerConfig
spanConfig SpanConfig
eventConfig EventConfig
)
func BenchmarkNewTracerConfig(b *testing.B) {
for _, bb := range []struct {
name string
options []TracerOption
}{
{
name: "with no options",
},
{
name: "with an instrumentation version",
options: []TracerOption{
WithInstrumentationVersion("testing version"),
},
},
{
name: "with a schema url",
options: []TracerOption{
WithSchemaURL("testing URL"),
},
},
} {
b.Run(bb.name, func(b *testing.B) {
b.ReportAllocs()
b.ResetTimer()
for i := 0; i < b.N; i++ {
tracerConfig = NewTracerConfig(bb.options...)
}
})
}
}
func BenchmarkNewSpanStartConfig(b *testing.B) {
for _, bb := range []struct {
name string
options []SpanStartOption
}{
{
name: "with no options",
},
{
name: "with attributes",
options: []SpanStartOption{
WithAttributes(attribute.Bool("key", true)),
},
},
{
name: "with attributes set multiple times",
options: []SpanStartOption{
WithAttributes(attribute.Bool("key", true)),
WithAttributes(attribute.Bool("secondKey", false)),
},
},
{
name: "with a timestamp",
options: []SpanStartOption{
WithTimestamp(time.Now()),
},
},
{
name: "with links",
options: []SpanStartOption{
WithLinks(Link{}),
},
},
{
name: "with links set multiple times",
options: []SpanStartOption{
WithLinks(Link{}),
WithLinks(Link{}),
},
},
{
name: "with new root",
options: []SpanStartOption{
WithNewRoot(),
},
},
{
name: "with span kind",
options: []SpanStartOption{
WithSpanKind(SpanKindClient),
},
},
} {
b.Run(bb.name, func(b *testing.B) {
b.ReportAllocs()
b.ResetTimer()
for i := 0; i < b.N; i++ {
spanConfig = NewSpanStartConfig(bb.options...)
}
})
}
}
func BenchmarkNewSpanEndConfig(b *testing.B) {
for _, bb := range []struct {
name string
options []SpanEndOption
}{
{
name: "with no options",
},
{
name: "with a timestamp",
options: []SpanEndOption{
WithTimestamp(time.Now()),
},
},
{
name: "with stack trace",
options: []SpanEndOption{
WithStackTrace(true),
},
},
} {
b.Run(bb.name, func(b *testing.B) {
b.ReportAllocs()
b.ResetTimer()
for i := 0; i < b.N; i++ {
spanConfig = NewSpanEndConfig(bb.options...)
}
})
}
}
func BenchmarkNewEventConfig(b *testing.B) {
for _, bb := range []struct {
name string
options []EventOption
}{
{
name: "with no options",
},
{
name: "with attributes",
options: []EventOption{
WithAttributes(attribute.Bool("key", true)),
},
},
{
name: "with attributes set multiple times",
options: []EventOption{
WithAttributes(attribute.Bool("key", true)),
WithAttributes(attribute.Bool("secondKey", false)),
},
},
{
name: "with a timestamp",
options: []EventOption{
WithTimestamp(time.Now()),
},
},
{
name: "with a stacktrace",
options: []EventOption{
WithStackTrace(true),
},
},
} {
b.Run(bb.name, func(b *testing.B) {
b.ReportAllocs()
b.ResetTimer()
for i := 0; i < b.N; i++ {
eventConfig = NewEventConfig(bb.options...)
}
})
}
}