1
0
mirror of https://github.com/open-telemetry/opentelemetry-go.git synced 2026-06-03 18:35:08 +02:00
Files
opentelemetry-go/metric/config_test.go
T
Robert Pająk dcf14aa937 trace,metric,log: WithInstrumentationAttributes options to merge attributes (#7300)
## What

Fix `WithInstrumentationAttributes` options in
`go.opentelemetry.io/otel/trace`, `go.opentelemetry.io/otel/metric`, and
`go.opentelemetry.io/otel/log` to properly merge attributes when passed
multiple times instead of replacing them. Attributes with duplicate keys
will use the last value passed.

## Why

Per
https://github.com/open-telemetry/opentelemetry-go/pull/7287#pullrequestreview-3181379062
and
https://github.com/open-telemetry/opentelemetry-go/pull/7287#issuecomment-3250085450

Not that this does not address
https://github.com/open-telemetry/opentelemetry-go/issues/7217. This is
left to a seperate PR to not scope creep this one. CC @axw

---------

Co-authored-by: Damien Mathieu <42@dmathieu.com>
2025-09-08 10:46:08 +02:00

81 lines
2.4 KiB
Go

// Copyright The OpenTelemetry Authors
// SPDX-License-Identifier: Apache-2.0
package metric_test
import (
"testing"
"github.com/stretchr/testify/assert"
"go.opentelemetry.io/otel/attribute"
"go.opentelemetry.io/otel/metric"
)
func TestConfig(t *testing.T) {
version := "v1.1.1"
schemaURL := "https://opentelemetry.io/schemas/1.37.0"
attr := attribute.NewSet(
attribute.String("user", "alice"),
attribute.Bool("admin", true),
)
c := metric.NewMeterConfig(
metric.WithInstrumentationVersion(version),
metric.WithSchemaURL(schemaURL),
metric.WithInstrumentationAttributes(attr.ToSlice()...),
)
assert.Equal(t, version, c.InstrumentationVersion(), "instrumentation version")
assert.Equal(t, schemaURL, c.SchemaURL(), "schema URL")
assert.Equal(t, attr, c.InstrumentationAttributes(), "instrumentation attributes")
}
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 := metric.NewMeterConfig(
metric.WithInstrumentationAttributes(aliceAttr),
metric.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) {
// Different keys should be merged
c := metric.NewMeterConfig(
metric.WithInstrumentationAttributes(aliceAttr),
metric.WithInstrumentationAttributes(adminAttr),
)
assert.Equal(t, aliceAdmin, c.InstrumentationAttributes(),
"Different keys should be merged.")
})
t.Run("Mixed", func(t *testing.T) {
c := metric.NewMeterConfig(
metric.WithInstrumentationAttributes(aliceAttr, adminAttr),
metric.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 := metric.NewMeterConfig(
metric.WithInstrumentationAttributes(aliceAttr),
metric.WithInstrumentationAttributes(),
)
assert.Equal(t, alice, c.InstrumentationAttributes(),
"Empty attributes should not affect existing ones.")
})
}