diff --git a/CHANGELOG.md b/CHANGELOG.md index 442597ef242..92e020f5287 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -30,6 +30,7 @@ This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.htm - `go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc` now keeps the metadata already present in the context when `WithHeaders` is used. (#5911) - `go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc` now keeps the metadata already present in the context when `WithHeaders` is used. (#5915) - Support scope attributes and make them as identifying for `Tracer` in `go.opentelemetry.io/otel` and `go.opentelemetry.io/otel/sdk/trace`. (#5924) +- Support scope attributes and make them as identifying for `Meter` in `go.opentelemetry.io/otel` and `go.opentelemetry.io/otel/sdk/metric`. (#5926) diff --git a/internal/global/meter.go b/internal/global/meter.go index 78520e8d6e9..a6acd8dca66 100644 --- a/internal/global/meter.go +++ b/internal/global/meter.go @@ -67,6 +67,7 @@ func (p *meterProvider) Meter(name string, opts ...metric.MeterOption) metric.Me name: name, version: c.InstrumentationVersion(), schema: c.SchemaURL(), + attrs: c.InstrumentationAttributes(), } if p.meters == nil { diff --git a/internal/global/meter_test.go b/internal/global/meter_test.go index 3a700924e34..b68c363131e 100644 --- a/internal/global/meter_test.go +++ b/internal/global/meter_test.go @@ -13,6 +13,7 @@ import ( "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" + "go.opentelemetry.io/otel/attribute" "go.opentelemetry.io/otel/metric" "go.opentelemetry.io/otel/metric/noop" ) @@ -397,17 +398,18 @@ func TestRegistrationDelegation(t *testing.T) { } func TestMeterIdentity(t *testing.T) { - type id struct{ name, ver, url string } + type id struct{ name, ver, url, attr string } ids := []id{ - {"name-a", "version-a", "url-a"}, - {"name-a", "version-a", "url-b"}, - {"name-a", "version-b", "url-a"}, - {"name-a", "version-b", "url-b"}, - {"name-b", "version-a", "url-a"}, - {"name-b", "version-a", "url-b"}, - {"name-b", "version-b", "url-a"}, - {"name-b", "version-b", "url-b"}, + {"name-a", "version-a", "url-a", ""}, + {"name-a", "version-a", "url-a", "attr"}, + {"name-a", "version-a", "url-b", ""}, + {"name-a", "version-b", "url-a", ""}, + {"name-a", "version-b", "url-b", ""}, + {"name-b", "version-a", "url-a", ""}, + {"name-b", "version-a", "url-b", ""}, + {"name-b", "version-b", "url-a", ""}, + {"name-b", "version-b", "url-b", ""}, } provider := &meterProvider{} @@ -416,6 +418,7 @@ func TestMeterIdentity(t *testing.T) { i.name, metric.WithInstrumentationVersion(i.ver), metric.WithSchemaURL(i.url), + metric.WithInstrumentationAttributes(attribute.String("key", i.attr)), ) } diff --git a/sdk/metric/provider.go b/sdk/metric/provider.go index 7b0c0dbf714..2fca89e5a8e 100644 --- a/sdk/metric/provider.go +++ b/sdk/metric/provider.go @@ -76,15 +76,17 @@ func (mp *MeterProvider) Meter(name string, options ...metric.MeterOption) metri c := metric.NewMeterConfig(options...) s := instrumentation.Scope{ - Name: name, - Version: c.InstrumentationVersion(), - SchemaURL: c.SchemaURL(), + Name: name, + Version: c.InstrumentationVersion(), + SchemaURL: c.SchemaURL(), + Attributes: c.InstrumentationAttributes(), } global.Info("Meter created", "Name", s.Name, "Version", s.Version, "SchemaURL", s.SchemaURL, + "Attributes", s.Attributes, ) return mp.meters.Lookup(s, func() *meter { diff --git a/sdk/metric/provider_test.go b/sdk/metric/provider_test.go index e5ef498ad5d..7e9361ee3d6 100644 --- a/sdk/metric/provider_test.go +++ b/sdk/metric/provider_test.go @@ -96,7 +96,7 @@ func TestMeterProviderReturnsSameMeter(t *testing.T) { assert.Same(t, mtr, mp.Meter("")) assert.NotSame(t, mtr, mp.Meter("diff")) - assert.Same(t, mtr, mp.Meter("", api.WithInstrumentationAttributes(attribute.String("k", "v")))) // TODO (#3368): Change to assert.NotSame. + assert.NotSame(t, mtr, mp.Meter("", api.WithInstrumentationAttributes(attribute.String("k", "v")))) } func TestEmptyMeterName(t *testing.T) {