1
0
mirror of https://github.com/open-telemetry/opentelemetry-go.git synced 2025-11-25 22:41:46 +02:00
Files
opentelemetry-go/trace/config_test.go

547 lines
12 KiB
Go
Raw Normal View History

// 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 TestSpanStartConfigAttributeMutability(t *testing.T) {
a := attribute.String("a", "val")
b := attribute.String("b", "val")
attrs := []attribute.KeyValue{a, b}
conf := NewSpanStartConfig(WithAttributes(attrs...))
// Mutating passed arg should not change configured attributes.
attrs[0] = attribute.String("c", "val")
want := SpanConfig{attributes: []attribute.KeyValue{a, b}}
assert.Equal(t, want, conf)
}
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.21.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")
}
trace,metric,log: change WithInstrumentationAttributes to not de-depuplicate the passed attributes in a closure (#7266) WithInstrumentationAttributes is creating a closure with a reference to a slice which is later passed to attribute.NewSet. attribute.NewSet may mutate the slice, so this will lead to a data race when the option is applied concurrently. We can fix this by moving the call to attribute.NewSet outside the closure. Fixes #7217 <details> <summary>benchstat for New*Config</summary> ``` goos: linux goarch: amd64 pkg: go.opentelemetry.io/otel/log cpu: Intel(R) Core(TM) Ultra 7 155U │ /tmp/old.txt │ /tmp/new.txt │ │ sec/op │ sec/op vs base │ NewLoggerConfig/with_no_options-14 2.961n ± 6% 3.091n ± 6% ~ (p=0.132 n=6) NewLoggerConfig/with_an_instrumentation_version-14 24.75n ± 4% 25.04n ± 5% ~ (p=0.126 n=6) NewLoggerConfig/with_a_schema_url-14 24.97n ± 6% 24.79n ± 4% ~ (p=0.974 n=6) NewLoggerConfig/with_instrumentation_attribute-14 55.32n ± 4% 25.32n ± 4% -54.23% (p=0.002 n=6) NewLoggerConfig/with_instrumentation_attribute_set-14 24.77n ± 3% 24.96n ± 4% ~ (p=0.394 n=6) geomean 19.05n 16.47n -13.52% │ /tmp/old.txt │ /tmp/new.txt │ │ B/op │ B/op vs base │ NewLoggerConfig/with_no_options-14 0.000 ± 0% 0.000 ± 0% ~ (p=1.000 n=6) ¹ NewLoggerConfig/with_an_instrumentation_version-14 0.000 ± 0% 0.000 ± 0% ~ (p=1.000 n=6) ¹ NewLoggerConfig/with_a_schema_url-14 0.000 ± 0% 0.000 ± 0% ~ (p=1.000 n=6) ¹ NewLoggerConfig/with_instrumentation_attribute-14 64.00 ± 0% 0.00 ± 0% -100.00% (p=0.002 n=6) NewLoggerConfig/with_instrumentation_attribute_set-14 0.000 ± 0% 0.000 ± 0% ~ (p=1.000 n=6) ¹ geomean ² ? ² ³ ¹ all samples are equal ² summaries must be >0 to compute geomean ³ ratios must be >0 to compute geomean │ /tmp/old.txt │ /tmp/new.txt │ │ allocs/op │ allocs/op vs base │ NewLoggerConfig/with_no_options-14 0.000 ± 0% 0.000 ± 0% ~ (p=1.000 n=6) ¹ NewLoggerConfig/with_an_instrumentation_version-14 0.000 ± 0% 0.000 ± 0% ~ (p=1.000 n=6) ¹ NewLoggerConfig/with_a_schema_url-14 0.000 ± 0% 0.000 ± 0% ~ (p=1.000 n=6) ¹ NewLoggerConfig/with_instrumentation_attribute-14 1.000 ± 0% 0.000 ± 0% -100.00% (p=0.002 n=6) NewLoggerConfig/with_instrumentation_attribute_set-14 0.000 ± 0% 0.000 ± 0% ~ (p=1.000 n=6) ¹ geomean ² ? ² ³ ¹ all samples are equal ² summaries must be >0 to compute geomean ³ ratios must be >0 to compute geomean pkg: go.opentelemetry.io/otel/metric │ /tmp/old.txt │ /tmp/new.txt │ │ sec/op │ sec/op vs base │ NewMeterConfig/with_no_options-14 3.255n ± 2% 3.045n ± 4% -6.42% (p=0.002 n=6) NewMeterConfig/with_an_instrumentation_version-14 22.84n ± 6% 23.14n ± 3% ~ (p=0.818 n=6) NewMeterConfig/with_a_schema_url-14 24.71n ± 5% 25.29n ± 4% ~ (p=0.132 n=6) NewMeterConfig/with_instrumentation_attribute-14 61.30n ± 5% 25.36n ± 7% -58.63% (p=0.002 n=6) NewMeterConfig/with_instrumentation_attribute_set-14 25.93n ± 5% 26.24n ± 4% ~ (p=0.485 n=6) geomean 19.64n 16.40n -16.49% │ /tmp/old.txt │ /tmp/new.txt │ │ B/op │ B/op vs base │ NewMeterConfig/with_no_options-14 0.000 ± 0% 0.000 ± 0% ~ (p=1.000 n=6) ¹ NewMeterConfig/with_an_instrumentation_version-14 0.000 ± 0% 0.000 ± 0% ~ (p=1.000 n=6) ¹ NewMeterConfig/with_a_schema_url-14 0.000 ± 0% 0.000 ± 0% ~ (p=1.000 n=6) ¹ NewMeterConfig/with_instrumentation_attribute-14 64.00 ± 0% 0.00 ± 0% -100.00% (p=0.002 n=6) NewMeterConfig/with_instrumentation_attribute_set-14 0.000 ± 0% 0.000 ± 0% ~ (p=1.000 n=6) ¹ geomean ² ? ² ³ ¹ all samples are equal ² summaries must be >0 to compute geomean ³ ratios must be >0 to compute geomean │ /tmp/old.txt │ /tmp/new.txt │ │ allocs/op │ allocs/op vs base │ NewMeterConfig/with_no_options-14 0.000 ± 0% 0.000 ± 0% ~ (p=1.000 n=6) ¹ NewMeterConfig/with_an_instrumentation_version-14 0.000 ± 0% 0.000 ± 0% ~ (p=1.000 n=6) ¹ NewMeterConfig/with_a_schema_url-14 0.000 ± 0% 0.000 ± 0% ~ (p=1.000 n=6) ¹ NewMeterConfig/with_instrumentation_attribute-14 1.000 ± 0% 0.000 ± 0% -100.00% (p=0.002 n=6) NewMeterConfig/with_instrumentation_attribute_set-14 0.000 ± 0% 0.000 ± 0% ~ (p=1.000 n=6) ¹ geomean ² ? ² ³ ¹ all samples are equal ² summaries must be >0 to compute geomean ³ ratios must be >0 to compute geomean pkg: go.opentelemetry.io/otel/trace │ /tmp/old.txt │ /tmp/new.txt │ │ sec/op │ sec/op vs base │ NewTracerConfig/with_no_options-14 2.980n ± 5% 2.948n ± 3% ~ (p=0.240 n=6) NewTracerConfig/with_an_instrumentation_version-14 24.44n ± 4% 23.54n ± 1% -3.70% (p=0.002 n=6) NewTracerConfig/with_a_schema_url-14 24.47n ± 5% 23.95n ± 7% ~ (p=0.180 n=6) NewTracerConfig/with_instrumentation_attribute-14 58.39n ± 7% 25.54n ± 6% -56.25% (p=0.002 n=6) NewTracerConfig/with_instrumentation_attribute_set-14 25.70n ± 3% 26.55n ± 6% ~ (p=0.310 n=6) NewSpanStartConfig/with_no_options-14 2.670n ± 7% 2.838n ± 6% ~ (p=0.093 n=6) NewSpanStartConfig/with_attributes-14 60.65n ± 20% 51.84n ± 8% ~ (p=0.240 n=6) NewSpanStartConfig/with_attributes_set_multiple_times-14 115.4n ± 10% 110.0n ± 7% -4.68% (p=0.004 n=6) NewSpanStartConfig/with_a_timestamp-14 18.03n ± 3% 17.77n ± 4% ~ (p=0.937 n=6) NewSpanStartConfig/with_links-14 66.63n ± 8% 75.60n ± 8% +13.47% (p=0.009 n=6) NewSpanStartConfig/with_links_set_multiple_times-14 155.2n ± 4% 162.8n ± 18% ~ (p=0.485 n=6) NewSpanStartConfig/with_new_root-14 26.59n ± 19% 23.04n ± 4% -13.32% (p=0.004 n=6) NewSpanStartConfig/with_span_kind-14 24.02n ± 4% 23.72n ± 9% ~ (p=0.589 n=6) NewSpanEndConfig/with_no_options-14 2.673n ± 10% 2.765n ± 7% ~ (p=0.485 n=6) NewSpanEndConfig/with_a_timestamp-14 17.37n ± 9% 18.04n ± 4% ~ (p=0.093 n=6) NewSpanEndConfig/with_stack_trace-14 16.70n ± 3% 16.59n ± 4% ~ (p=0.937 n=6) NewEventConfig/with_no_options-14 37.14n ± 6% 36.63n ± 3% ~ (p=0.818 n=6) NewEventConfig/with_attributes-14 117.15n ± 9% 98.92n ± 14% -15.56% (p=0.009 n=6) NewEventConfig/with_attributes_set_multiple_times-14 172.6n ± 5% 168.1n ± 9% ~ (p=0.333 n=6) NewEventConfig/with_a_timestamp-14 25.41n ± 3% 26.66n ± 3% +4.92% (p=0.002 n=6) NewEventConfig/with_a_stacktrace-14 51.01n ± 15% 52.45n ± 2% ~ (p=0.093 n=6) geomean 28.82n 27.38n -4.98% │ /tmp/old.txt │ /tmp/new.txt │ │ B/op │ B/op vs base │ NewTracerConfig/with_no_options-14 0.000 ± 0% 0.000 ± 0% ~ (p=1.000 n=6) ¹ NewTracerConfig/with_an_instrumentation_version-14 0.000 ± 0% 0.000 ± 0% ~ (p=1.000 n=6) ¹ NewTracerConfig/with_a_schema_url-14 0.000 ± 0% 0.000 ± 0% ~ (p=1.000 n=6) ¹ NewTracerConfig/with_instrumentation_attribute-14 64.00 ± 0% 0.00 ± 0% -100.00% (p=0.002 n=6) NewTracerConfig/with_instrumentation_attribute_set-14 0.000 ± 0% 0.000 ± 0% ~ (p=1.000 n=6) ¹ NewSpanStartConfig/with_no_options-14 0.000 ± 0% 0.000 ± 0% ~ (p=1.000 n=6) ¹ NewSpanStartConfig/with_attributes-14 64.00 ± 0% 64.00 ± 0% ~ (p=1.000 n=6) ¹ NewSpanStartConfig/with_attributes_set_multiple_times-14 192.0 ± 0% 192.0 ± 0% ~ (p=1.000 n=6) ¹ NewSpanStartConfig/with_a_timestamp-14 0.000 ± 0% 0.000 ± 0% ~ (p=1.000 n=6) ¹ NewSpanStartConfig/with_links-14 96.00 ± 0% 96.00 ± 0% ~ (p=1.000 n=6) ¹ NewSpanStartConfig/with_links_set_multiple_times-14 272.0 ± 0% 272.0 ± 0% ~ (p=1.000 n=6) ¹ NewSpanStartConfig/with_new_root-14 0.000 ± 0% 0.000 ± 0% ~ (p=1.000 n=6) ¹ NewSpanStartConfig/with_span_kind-14 0.000 ± 0% 0.000 ± 0% ~ (p=1.000 n=6) ¹ NewSpanEndConfig/with_no_options-14 0.000 ± 0% 0.000 ± 0% ~ (p=1.000 n=6) ¹ NewSpanEndConfig/with_a_timestamp-14 0.000 ± 0% 0.000 ± 0% ~ (p=1.000 n=6) ¹ NewSpanEndConfig/with_stack_trace-14 0.000 ± 0% 0.000 ± 0% ~ (p=1.000 n=6) ¹ NewEventConfig/with_no_options-14 0.000 ± 0% 0.000 ± 0% ~ (p=1.000 n=6) ¹ NewEventConfig/with_attributes-14 64.00 ± 0% 64.00 ± 0% ~ (p=1.000 n=6) ¹ NewEventConfig/with_attributes_set_multiple_times-14 192.0 ± 0% 192.0 ± 0% ~ (p=1.000 n=6) ¹ NewEventConfig/with_a_timestamp-14 0.000 ± 0% 0.000 ± 0% ~ (p=1.000 n=6) ¹ NewEventConfig/with_a_stacktrace-14 0.000 ± 0% 0.000 ± 0% ~ (p=1.000 n=6) ¹ geomean ² ? ² ³ ¹ all samples are equal ² summaries must be >0 to compute geomean ³ ratios must be >0 to compute geomean │ /tmp/old.txt │ /tmp/new.txt │ │ allocs/op │ allocs/op vs base │ NewTracerConfig/with_no_options-14 0.000 ± 0% 0.000 ± 0% ~ (p=1.000 n=6) ¹ NewTracerConfig/with_an_instrumentation_version-14 0.000 ± 0% 0.000 ± 0% ~ (p=1.000 n=6) ¹ NewTracerConfig/with_a_schema_url-14 0.000 ± 0% 0.000 ± 0% ~ (p=1.000 n=6) ¹ NewTracerConfig/with_instrumentation_attribute-14 1.000 ± 0% 0.000 ± 0% -100.00% (p=0.002 n=6) NewTracerConfig/with_instrumentation_attribute_set-14 0.000 ± 0% 0.000 ± 0% ~ (p=1.000 n=6) ¹ NewSpanStartConfig/with_no_options-14 0.000 ± 0% 0.000 ± 0% ~ (p=1.000 n=6) ¹ NewSpanStartConfig/with_attributes-14 1.000 ± 0% 1.000 ± 0% ~ (p=1.000 n=6) ¹ NewSpanStartConfig/with_attributes_set_multiple_times-14 2.000 ± 0% 2.000 ± 0% ~ (p=1.000 n=6) ¹ NewSpanStartConfig/with_a_timestamp-14 0.000 ± 0% 0.000 ± 0% ~ (p=1.000 n=6) ¹ NewSpanStartConfig/with_links-14 1.000 ± 0% 1.000 ± 0% ~ (p=1.000 n=6) ¹ NewSpanStartConfig/with_links_set_multiple_times-14 2.000 ± 0% 2.000 ± 0% ~ (p=1.000 n=6) ¹ NewSpanStartConfig/with_new_root-14 0.000 ± 0% 0.000 ± 0% ~ (p=1.000 n=6) ¹ NewSpanStartConfig/with_span_kind-14 0.000 ± 0% 0.000 ± 0% ~ (p=1.000 n=6) ¹ NewSpanEndConfig/with_no_options-14 0.000 ± 0% 0.000 ± 0% ~ (p=1.000 n=6) ¹ NewSpanEndConfig/with_a_timestamp-14 0.000 ± 0% 0.000 ± 0% ~ (p=1.000 n=6) ¹ NewSpanEndConfig/with_stack_trace-14 0.000 ± 0% 0.000 ± 0% ~ (p=1.000 n=6) ¹ NewEventConfig/with_no_options-14 0.000 ± 0% 0.000 ± 0% ~ (p=1.000 n=6) ¹ NewEventConfig/with_attributes-14 1.000 ± 0% 1.000 ± 0% ~ (p=1.000 n=6) ¹ NewEventConfig/with_attributes_set_multiple_times-14 2.000 ± 0% 2.000 ± 0% ~ (p=1.000 n=6) ¹ NewEventConfig/with_a_timestamp-14 0.000 ± 0% 0.000 ± 0% ~ (p=1.000 n=6) ¹ NewEventConfig/with_a_stacktrace-14 0.000 ± 0% 0.000 ± 0% ~ (p=1.000 n=6) ¹ geomean ² ? ² ³ ¹ all samples are equal ² summaries must be >0 to compute geomean ³ ratios must be >0 to compute geomean ``` </details> --------- Co-authored-by: Robert Pająk <pellared@hotmail.com> Co-authored-by: Flc゛ <four_leaf_clover@foxmail.com> Co-authored-by: Tyler Yahn <MrAlias@users.noreply.github.com>
2025-09-11 23:47:22 +08:00
func TestWithInstrumentationAttributesNotLazy(t *testing.T) {
attrs := []attribute.KeyValue{
attribute.String("service", "test"),
attribute.Int("three", 3),
}
want := attribute.NewSet(attrs...)
// WithInstrumentationAttributes is expected to immediately
// create an immutable set from the attributes, so later changes
// to attrs should not affect the config.
opt := WithInstrumentationAttributes(attrs...)
attrs[0] = attribute.String("service", "changed")
c := NewTracerConfig(opt)
assert.Equal(t, want, c.InstrumentationAttributes(), "instrumentation attributes")
}
trace,metric,log: add WithInstrumentationAttributeSet option (#7287) Per https://github.com/open-telemetry/opentelemetry-go/pull/7266#issuecomment-3237027300 Related to https://github.com/open-telemetry/opentelemetry-go/issues/7217 ## What This PR adds `WithInstrumentationAttributeSet` option functions to the `log`, `metric`, and `trace` packages as suggested in https://github.com/open-telemetry/opentelemetry-go/pull/7266#issuecomment-3237027300. These new functions provide a more concurrent-safe alternative to the existing `WithInstrumentationAttributes` functions by accepting a pre-constructed `attribute.Set` instead of variadic `attribute.KeyValue` parameters. ## Why As discussed in #7266, the existing `WithInstrumentationAttributes` functions can lead to data races when used concurrently because `attribute.NewSet()` may mutate the passed slice in-place. While the issue was partially addressed by moving the `attribute.NewSet()` call outside the closure, the best long-term solution is to provide an alternative that accepts an immutable `attribute.Set`. **Benefits:** 1. **Concurrent Safety**: Since `attribute.Set` is immutable, these functions are inherently safe for concurrent use 2. **Performance**: Avoids repeated calls to `attribute.NewSet()` when the same attributes are used multiple times 3. **Consistency**: Matches the existing pattern used in `metric.WithAttributeSet()` 4. **Flexibility**: Allows users to pre-compute attribute sets and reuse them Deprecating `WithInstrumentationAttributes` is out of scope. See https://github.com/open-telemetry/opentelemetry-go/pull/7287#issuecomment-3245820459. ## Benchmarks ``` goos: linux goarch: amd64 pkg: go.opentelemetry.io/otel/trace cpu: 13th Gen Intel(R) Core(TM) i7-13800H BenchmarkNewTracerConfig/with_no_options-20 280298306 4.268 ns/op 0 B/op 0 allocs/op BenchmarkNewTracerConfig/with_an_instrumentation_version-20 33389427 30.84 ns/op 0 B/op 0 allocs/op BenchmarkNewTracerConfig/with_a_schema_url-20 35441077 30.46 ns/op 0 B/op 0 allocs/op BenchmarkNewTracerConfig/with_instrumentation_attribute-20 17607649 88.23 ns/op 64 B/op 1 allocs/op BenchmarkNewTracerConfig/with_instrumentation_attribute_set-20 38336211 31.30 ns/op 0 B/op 0 allocs/op ``` ``` goos: linux goarch: amd64 pkg: go.opentelemetry.io/otel/metric cpu: 13th Gen Intel(R) Core(TM) i7-13800H BenchmarkNewMeterConfig/with_no_options-20 262998199 4.525 ns/op 0 B/op 0 allocs/op BenchmarkNewMeterConfig/with_an_instrumentation_version-20 40483780 29.31 ns/op 0 B/op 0 allocs/op BenchmarkNewMeterConfig/with_a_schema_url-20 39162420 30.58 ns/op 0 B/op 0 allocs/op BenchmarkNewMeterConfig/with_instrumentation_attribute-20 19900275 77.50 ns/op 64 B/op 1 allocs/op BenchmarkNewMeterConfig/with_instrumentation_attribute_set-20 37519020 31.93 ns/op 0 B/op 0 allocs/op ``` ``` goos: linux goarch: amd64 pkg: go.opentelemetry.io/otel/log cpu: 13th Gen Intel(R) Core(TM) i7-13800H BenchmarkNewLoggerConfig/with_no_options-20 271100760 4.322 ns/op 0 B/op 0 allocs/op BenchmarkNewLoggerConfig/with_an_instrumentation_version-20 38392390 30.77 ns/op 0 B/op 0 allocs/op BenchmarkNewLoggerConfig/with_a_schema_url-20 39615074 30.25 ns/op 0 B/op 0 allocs/op BenchmarkNewLoggerConfig/with_instrumentation_attribute-20 17108463 82.51 ns/op 64 B/op 1 allocs/op BenchmarkNewLoggerConfig/with_instrumentation_attribute_set-20 37746534 31.70 ns/op 0 B/op 0 allocs/op ```
2025-09-08 17:21:37 +02:00
func TestWithInstrumentationAttributeSet(t *testing.T) {
attrs := attribute.NewSet(
attribute.String("service", "test"),
attribute.Int("three", 3),
)
c := NewTracerConfig(
WithInstrumentationAttributeSet(attrs),
)
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 (
trace,metric,log: add WithInstrumentationAttributeSet option (#7287) Per https://github.com/open-telemetry/opentelemetry-go/pull/7266#issuecomment-3237027300 Related to https://github.com/open-telemetry/opentelemetry-go/issues/7217 ## What This PR adds `WithInstrumentationAttributeSet` option functions to the `log`, `metric`, and `trace` packages as suggested in https://github.com/open-telemetry/opentelemetry-go/pull/7266#issuecomment-3237027300. These new functions provide a more concurrent-safe alternative to the existing `WithInstrumentationAttributes` functions by accepting a pre-constructed `attribute.Set` instead of variadic `attribute.KeyValue` parameters. ## Why As discussed in #7266, the existing `WithInstrumentationAttributes` functions can lead to data races when used concurrently because `attribute.NewSet()` may mutate the passed slice in-place. While the issue was partially addressed by moving the `attribute.NewSet()` call outside the closure, the best long-term solution is to provide an alternative that accepts an immutable `attribute.Set`. **Benefits:** 1. **Concurrent Safety**: Since `attribute.Set` is immutable, these functions are inherently safe for concurrent use 2. **Performance**: Avoids repeated calls to `attribute.NewSet()` when the same attributes are used multiple times 3. **Consistency**: Matches the existing pattern used in `metric.WithAttributeSet()` 4. **Flexibility**: Allows users to pre-compute attribute sets and reuse them Deprecating `WithInstrumentationAttributes` is out of scope. See https://github.com/open-telemetry/opentelemetry-go/pull/7287#issuecomment-3245820459. ## Benchmarks ``` goos: linux goarch: amd64 pkg: go.opentelemetry.io/otel/trace cpu: 13th Gen Intel(R) Core(TM) i7-13800H BenchmarkNewTracerConfig/with_no_options-20 280298306 4.268 ns/op 0 B/op 0 allocs/op BenchmarkNewTracerConfig/with_an_instrumentation_version-20 33389427 30.84 ns/op 0 B/op 0 allocs/op BenchmarkNewTracerConfig/with_a_schema_url-20 35441077 30.46 ns/op 0 B/op 0 allocs/op BenchmarkNewTracerConfig/with_instrumentation_attribute-20 17607649 88.23 ns/op 64 B/op 1 allocs/op BenchmarkNewTracerConfig/with_instrumentation_attribute_set-20 38336211 31.30 ns/op 0 B/op 0 allocs/op ``` ``` goos: linux goarch: amd64 pkg: go.opentelemetry.io/otel/metric cpu: 13th Gen Intel(R) Core(TM) i7-13800H BenchmarkNewMeterConfig/with_no_options-20 262998199 4.525 ns/op 0 B/op 0 allocs/op BenchmarkNewMeterConfig/with_an_instrumentation_version-20 40483780 29.31 ns/op 0 B/op 0 allocs/op BenchmarkNewMeterConfig/with_a_schema_url-20 39162420 30.58 ns/op 0 B/op 0 allocs/op BenchmarkNewMeterConfig/with_instrumentation_attribute-20 19900275 77.50 ns/op 64 B/op 1 allocs/op BenchmarkNewMeterConfig/with_instrumentation_attribute_set-20 37519020 31.93 ns/op 0 B/op 0 allocs/op ``` ``` goos: linux goarch: amd64 pkg: go.opentelemetry.io/otel/log cpu: 13th Gen Intel(R) Core(TM) i7-13800H BenchmarkNewLoggerConfig/with_no_options-20 271100760 4.322 ns/op 0 B/op 0 allocs/op BenchmarkNewLoggerConfig/with_an_instrumentation_version-20 38392390 30.77 ns/op 0 B/op 0 allocs/op BenchmarkNewLoggerConfig/with_a_schema_url-20 39615074 30.25 ns/op 0 B/op 0 allocs/op BenchmarkNewLoggerConfig/with_instrumentation_attribute-20 17108463 82.51 ns/op 64 B/op 1 allocs/op BenchmarkNewLoggerConfig/with_instrumentation_attribute_set-20 37746534 31.70 ns/op 0 B/op 0 allocs/op ```
2025-09-08 17:21:37 +02:00
spanConfig SpanConfig
eventConfig EventConfig
)
func BenchmarkNewTracerConfig(b *testing.B) {
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
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"),
},
},
trace,metric,log: add WithInstrumentationAttributeSet option (#7287) Per https://github.com/open-telemetry/opentelemetry-go/pull/7266#issuecomment-3237027300 Related to https://github.com/open-telemetry/opentelemetry-go/issues/7217 ## What This PR adds `WithInstrumentationAttributeSet` option functions to the `log`, `metric`, and `trace` packages as suggested in https://github.com/open-telemetry/opentelemetry-go/pull/7266#issuecomment-3237027300. These new functions provide a more concurrent-safe alternative to the existing `WithInstrumentationAttributes` functions by accepting a pre-constructed `attribute.Set` instead of variadic `attribute.KeyValue` parameters. ## Why As discussed in #7266, the existing `WithInstrumentationAttributes` functions can lead to data races when used concurrently because `attribute.NewSet()` may mutate the passed slice in-place. While the issue was partially addressed by moving the `attribute.NewSet()` call outside the closure, the best long-term solution is to provide an alternative that accepts an immutable `attribute.Set`. **Benefits:** 1. **Concurrent Safety**: Since `attribute.Set` is immutable, these functions are inherently safe for concurrent use 2. **Performance**: Avoids repeated calls to `attribute.NewSet()` when the same attributes are used multiple times 3. **Consistency**: Matches the existing pattern used in `metric.WithAttributeSet()` 4. **Flexibility**: Allows users to pre-compute attribute sets and reuse them Deprecating `WithInstrumentationAttributes` is out of scope. See https://github.com/open-telemetry/opentelemetry-go/pull/7287#issuecomment-3245820459. ## Benchmarks ``` goos: linux goarch: amd64 pkg: go.opentelemetry.io/otel/trace cpu: 13th Gen Intel(R) Core(TM) i7-13800H BenchmarkNewTracerConfig/with_no_options-20 280298306 4.268 ns/op 0 B/op 0 allocs/op BenchmarkNewTracerConfig/with_an_instrumentation_version-20 33389427 30.84 ns/op 0 B/op 0 allocs/op BenchmarkNewTracerConfig/with_a_schema_url-20 35441077 30.46 ns/op 0 B/op 0 allocs/op BenchmarkNewTracerConfig/with_instrumentation_attribute-20 17607649 88.23 ns/op 64 B/op 1 allocs/op BenchmarkNewTracerConfig/with_instrumentation_attribute_set-20 38336211 31.30 ns/op 0 B/op 0 allocs/op ``` ``` goos: linux goarch: amd64 pkg: go.opentelemetry.io/otel/metric cpu: 13th Gen Intel(R) Core(TM) i7-13800H BenchmarkNewMeterConfig/with_no_options-20 262998199 4.525 ns/op 0 B/op 0 allocs/op BenchmarkNewMeterConfig/with_an_instrumentation_version-20 40483780 29.31 ns/op 0 B/op 0 allocs/op BenchmarkNewMeterConfig/with_a_schema_url-20 39162420 30.58 ns/op 0 B/op 0 allocs/op BenchmarkNewMeterConfig/with_instrumentation_attribute-20 19900275 77.50 ns/op 64 B/op 1 allocs/op BenchmarkNewMeterConfig/with_instrumentation_attribute_set-20 37519020 31.93 ns/op 0 B/op 0 allocs/op ``` ``` goos: linux goarch: amd64 pkg: go.opentelemetry.io/otel/log cpu: 13th Gen Intel(R) Core(TM) i7-13800H BenchmarkNewLoggerConfig/with_no_options-20 271100760 4.322 ns/op 0 B/op 0 allocs/op BenchmarkNewLoggerConfig/with_an_instrumentation_version-20 38392390 30.77 ns/op 0 B/op 0 allocs/op BenchmarkNewLoggerConfig/with_a_schema_url-20 39615074 30.25 ns/op 0 B/op 0 allocs/op BenchmarkNewLoggerConfig/with_instrumentation_attribute-20 17108463 82.51 ns/op 64 B/op 1 allocs/op BenchmarkNewLoggerConfig/with_instrumentation_attribute_set-20 37746534 31.70 ns/op 0 B/op 0 allocs/op ```
2025-09-08 17:21:37 +02:00
{
name: "with instrumentation attribute",
options: []TracerOption{
WithInstrumentationAttributes(attribute.String("key", "value")),
},
},
{
name: "with instrumentation attribute set",
options: []TracerOption{
WithInstrumentationAttributeSet(attribute.NewSet(attribute.String("key", "value"))),
},
},
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
} {
b.Run(bb.name, func(b *testing.B) {
b.ReportAllocs()
b.ResetTimer()
trace,metric,log: add WithInstrumentationAttributeSet option (#7287) Per https://github.com/open-telemetry/opentelemetry-go/pull/7266#issuecomment-3237027300 Related to https://github.com/open-telemetry/opentelemetry-go/issues/7217 ## What This PR adds `WithInstrumentationAttributeSet` option functions to the `log`, `metric`, and `trace` packages as suggested in https://github.com/open-telemetry/opentelemetry-go/pull/7266#issuecomment-3237027300. These new functions provide a more concurrent-safe alternative to the existing `WithInstrumentationAttributes` functions by accepting a pre-constructed `attribute.Set` instead of variadic `attribute.KeyValue` parameters. ## Why As discussed in #7266, the existing `WithInstrumentationAttributes` functions can lead to data races when used concurrently because `attribute.NewSet()` may mutate the passed slice in-place. While the issue was partially addressed by moving the `attribute.NewSet()` call outside the closure, the best long-term solution is to provide an alternative that accepts an immutable `attribute.Set`. **Benefits:** 1. **Concurrent Safety**: Since `attribute.Set` is immutable, these functions are inherently safe for concurrent use 2. **Performance**: Avoids repeated calls to `attribute.NewSet()` when the same attributes are used multiple times 3. **Consistency**: Matches the existing pattern used in `metric.WithAttributeSet()` 4. **Flexibility**: Allows users to pre-compute attribute sets and reuse them Deprecating `WithInstrumentationAttributes` is out of scope. See https://github.com/open-telemetry/opentelemetry-go/pull/7287#issuecomment-3245820459. ## Benchmarks ``` goos: linux goarch: amd64 pkg: go.opentelemetry.io/otel/trace cpu: 13th Gen Intel(R) Core(TM) i7-13800H BenchmarkNewTracerConfig/with_no_options-20 280298306 4.268 ns/op 0 B/op 0 allocs/op BenchmarkNewTracerConfig/with_an_instrumentation_version-20 33389427 30.84 ns/op 0 B/op 0 allocs/op BenchmarkNewTracerConfig/with_a_schema_url-20 35441077 30.46 ns/op 0 B/op 0 allocs/op BenchmarkNewTracerConfig/with_instrumentation_attribute-20 17607649 88.23 ns/op 64 B/op 1 allocs/op BenchmarkNewTracerConfig/with_instrumentation_attribute_set-20 38336211 31.30 ns/op 0 B/op 0 allocs/op ``` ``` goos: linux goarch: amd64 pkg: go.opentelemetry.io/otel/metric cpu: 13th Gen Intel(R) Core(TM) i7-13800H BenchmarkNewMeterConfig/with_no_options-20 262998199 4.525 ns/op 0 B/op 0 allocs/op BenchmarkNewMeterConfig/with_an_instrumentation_version-20 40483780 29.31 ns/op 0 B/op 0 allocs/op BenchmarkNewMeterConfig/with_a_schema_url-20 39162420 30.58 ns/op 0 B/op 0 allocs/op BenchmarkNewMeterConfig/with_instrumentation_attribute-20 19900275 77.50 ns/op 64 B/op 1 allocs/op BenchmarkNewMeterConfig/with_instrumentation_attribute_set-20 37519020 31.93 ns/op 0 B/op 0 allocs/op ``` ``` goos: linux goarch: amd64 pkg: go.opentelemetry.io/otel/log cpu: 13th Gen Intel(R) Core(TM) i7-13800H BenchmarkNewLoggerConfig/with_no_options-20 271100760 4.322 ns/op 0 B/op 0 allocs/op BenchmarkNewLoggerConfig/with_an_instrumentation_version-20 38392390 30.77 ns/op 0 B/op 0 allocs/op BenchmarkNewLoggerConfig/with_a_schema_url-20 39615074 30.25 ns/op 0 B/op 0 allocs/op BenchmarkNewLoggerConfig/with_instrumentation_attribute-20 17108463 82.51 ns/op 64 B/op 1 allocs/op BenchmarkNewLoggerConfig/with_instrumentation_attribute_set-20 37746534 31.70 ns/op 0 B/op 0 allocs/op ```
2025-09-08 17:21:37 +02:00
for b.Loop() {
NewTracerConfig(bb.options...)
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
}
})
}
}
func BenchmarkNewSpanStartConfig(b *testing.B) {
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
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()
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
for i := 0; i < b.N; i++ {
spanConfig = NewSpanStartConfig(bb.options...)
}
})
}
}
func BenchmarkNewSpanEndConfig(b *testing.B) {
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
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()
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
for i := 0; i < b.N; i++ {
spanConfig = NewSpanEndConfig(bb.options...)
}
})
}
}
func BenchmarkNewEventConfig(b *testing.B) {
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
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()
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
for i := 0; i < b.N; i++ {
eventConfig = NewEventConfig(bb.options...)
}
})
}
}
func TestWithInstrumentationAttributesMerge(t *testing.T) {
aliceAttr := attribute.String("user", "Alice")
bobAttr := attribute.String("user", "Bob")
adminAttr := attribute.Bool("admin", true)
alice := attribute.NewSet(aliceAttr)
bob := attribute.NewSet(bobAttr)
aliceAdmin := attribute.NewSet(aliceAttr, adminAttr)
bobAdmin := attribute.NewSet(bobAttr, adminAttr)
t.Run("SameKey", func(t *testing.T) {
c := NewTracerConfig(
WithInstrumentationAttributes(aliceAttr),
WithInstrumentationAttributes(bobAttr),
)
assert.Equal(t, bob, c.InstrumentationAttributes(),
"Later values for the same key should overwrite earlier ones.")
})
t.Run("DifferentKeys", func(t *testing.T) {
c := NewTracerConfig(
WithInstrumentationAttributes(aliceAttr),
WithInstrumentationAttributes(adminAttr),
)
assert.Equal(t, aliceAdmin, c.InstrumentationAttributes(),
"Different keys should be merged")
})
t.Run("Mixed", func(t *testing.T) {
c := NewTracerConfig(
WithInstrumentationAttributes(aliceAttr, adminAttr),
WithInstrumentationAttributes(bobAttr),
)
assert.Equal(t, bobAdmin, c.InstrumentationAttributes(),
"Combination of same and different keys should be merged.")
})
t.Run("MergedEmpty", func(t *testing.T) {
c := NewTracerConfig(
WithInstrumentationAttributes(aliceAttr),
WithInstrumentationAttributes(),
)
assert.Equal(t, alice, c.InstrumentationAttributes(),
"Empty attributes should not affect existing ones.")
})
trace,metric,log: add WithInstrumentationAttributeSet option (#7287) Per https://github.com/open-telemetry/opentelemetry-go/pull/7266#issuecomment-3237027300 Related to https://github.com/open-telemetry/opentelemetry-go/issues/7217 ## What This PR adds `WithInstrumentationAttributeSet` option functions to the `log`, `metric`, and `trace` packages as suggested in https://github.com/open-telemetry/opentelemetry-go/pull/7266#issuecomment-3237027300. These new functions provide a more concurrent-safe alternative to the existing `WithInstrumentationAttributes` functions by accepting a pre-constructed `attribute.Set` instead of variadic `attribute.KeyValue` parameters. ## Why As discussed in #7266, the existing `WithInstrumentationAttributes` functions can lead to data races when used concurrently because `attribute.NewSet()` may mutate the passed slice in-place. While the issue was partially addressed by moving the `attribute.NewSet()` call outside the closure, the best long-term solution is to provide an alternative that accepts an immutable `attribute.Set`. **Benefits:** 1. **Concurrent Safety**: Since `attribute.Set` is immutable, these functions are inherently safe for concurrent use 2. **Performance**: Avoids repeated calls to `attribute.NewSet()` when the same attributes are used multiple times 3. **Consistency**: Matches the existing pattern used in `metric.WithAttributeSet()` 4. **Flexibility**: Allows users to pre-compute attribute sets and reuse them Deprecating `WithInstrumentationAttributes` is out of scope. See https://github.com/open-telemetry/opentelemetry-go/pull/7287#issuecomment-3245820459. ## Benchmarks ``` goos: linux goarch: amd64 pkg: go.opentelemetry.io/otel/trace cpu: 13th Gen Intel(R) Core(TM) i7-13800H BenchmarkNewTracerConfig/with_no_options-20 280298306 4.268 ns/op 0 B/op 0 allocs/op BenchmarkNewTracerConfig/with_an_instrumentation_version-20 33389427 30.84 ns/op 0 B/op 0 allocs/op BenchmarkNewTracerConfig/with_a_schema_url-20 35441077 30.46 ns/op 0 B/op 0 allocs/op BenchmarkNewTracerConfig/with_instrumentation_attribute-20 17607649 88.23 ns/op 64 B/op 1 allocs/op BenchmarkNewTracerConfig/with_instrumentation_attribute_set-20 38336211 31.30 ns/op 0 B/op 0 allocs/op ``` ``` goos: linux goarch: amd64 pkg: go.opentelemetry.io/otel/metric cpu: 13th Gen Intel(R) Core(TM) i7-13800H BenchmarkNewMeterConfig/with_no_options-20 262998199 4.525 ns/op 0 B/op 0 allocs/op BenchmarkNewMeterConfig/with_an_instrumentation_version-20 40483780 29.31 ns/op 0 B/op 0 allocs/op BenchmarkNewMeterConfig/with_a_schema_url-20 39162420 30.58 ns/op 0 B/op 0 allocs/op BenchmarkNewMeterConfig/with_instrumentation_attribute-20 19900275 77.50 ns/op 64 B/op 1 allocs/op BenchmarkNewMeterConfig/with_instrumentation_attribute_set-20 37519020 31.93 ns/op 0 B/op 0 allocs/op ``` ``` goos: linux goarch: amd64 pkg: go.opentelemetry.io/otel/log cpu: 13th Gen Intel(R) Core(TM) i7-13800H BenchmarkNewLoggerConfig/with_no_options-20 271100760 4.322 ns/op 0 B/op 0 allocs/op BenchmarkNewLoggerConfig/with_an_instrumentation_version-20 38392390 30.77 ns/op 0 B/op 0 allocs/op BenchmarkNewLoggerConfig/with_a_schema_url-20 39615074 30.25 ns/op 0 B/op 0 allocs/op BenchmarkNewLoggerConfig/with_instrumentation_attribute-20 17108463 82.51 ns/op 64 B/op 1 allocs/op BenchmarkNewLoggerConfig/with_instrumentation_attribute_set-20 37746534 31.70 ns/op 0 B/op 0 allocs/op ```
2025-09-08 17:21:37 +02:00
t.Run("SameKeyWithSet", func(t *testing.T) {
c := NewTracerConfig(
WithInstrumentationAttributeSet(alice),
WithInstrumentationAttributeSet(bob),
)
assert.Equal(t, bob, c.InstrumentationAttributes(),
"Later values for the same key should overwrite earlier ones.")
})
t.Run("DifferentKeysWithSet", func(t *testing.T) {
c := NewTracerConfig(
WithInstrumentationAttributeSet(alice),
WithInstrumentationAttributeSet(attribute.NewSet(adminAttr)),
)
assert.Equal(t, aliceAdmin, c.InstrumentationAttributes(),
"Different keys should be merged.")
})
t.Run("MixedWithSet", func(t *testing.T) {
c := NewTracerConfig(
WithInstrumentationAttributeSet(aliceAdmin),
WithInstrumentationAttributeSet(bob),
)
assert.Equal(t, bobAdmin, c.InstrumentationAttributes(),
"Combination of same and different keys should be merged.")
})
t.Run("MergedEmptyWithSet", func(t *testing.T) {
c := NewTracerConfig(
WithInstrumentationAttributeSet(alice),
WithInstrumentationAttributeSet(attribute.NewSet()),
)
assert.Equal(t, alice, c.InstrumentationAttributes(),
"Empty attribute set should not affect existing ones.")
})
t.Run("MixedAttributesAndSet", func(t *testing.T) {
c := NewTracerConfig(
WithInstrumentationAttributes(aliceAttr),
WithInstrumentationAttributeSet(attribute.NewSet(bobAttr, adminAttr)),
)
assert.Equal(t, bobAdmin, c.InstrumentationAttributes(),
"Attributes and attribute sets should be merged together.")
})
}