diff --git a/CHANGELOG.md b/CHANGELOG.md index 92e020f5287..9720ef72484 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -31,6 +31,7 @@ This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.htm - `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) +- Support scope attributes and make them as identifying for `Logger` in `go.opentelemetry.io/otel` and `go.opentelemetry.io/otel/sdk/log`. (#5925) diff --git a/log/internal/global/log.go b/log/internal/global/log.go index 8a27358d4ba..d97ee966350 100644 --- a/log/internal/global/log.go +++ b/log/internal/global/log.go @@ -8,6 +8,7 @@ import ( "sync" "sync/atomic" + "go.opentelemetry.io/otel/attribute" "go.opentelemetry.io/otel/log" "go.opentelemetry.io/otel/log/embedded" ) @@ -15,7 +16,12 @@ import ( // instLib defines the instrumentation library a logger is created for. // // Do not use sdk/instrumentation (API cannot depend on the SDK). -type instLib struct{ name, version, schemaURL string } +type instLib struct { + name string + version string + schemaURL string + attrs attribute.Set +} type loggerProvider struct { embedded.LoggerProvider @@ -41,6 +47,7 @@ func (p *loggerProvider) Logger(name string, options ...log.LoggerOption) log.Lo name: name, version: cfg.InstrumentationVersion(), schemaURL: cfg.SchemaURL(), + attrs: cfg.InstrumentationAttributes(), } if p.loggers == nil { diff --git a/log/internal/global/log_test.go b/log/internal/global/log_test.go index a27f832113d..ae2c5b2a6dd 100644 --- a/log/internal/global/log_test.go +++ b/log/internal/global/log_test.go @@ -10,6 +10,7 @@ import ( "github.com/stretchr/testify/assert" + "go.opentelemetry.io/otel/attribute" "go.opentelemetry.io/otel/log" "go.opentelemetry.io/otel/log/embedded" "go.opentelemetry.io/otel/log/noop" @@ -128,6 +129,9 @@ func TestDelegation(t *testing.T) { alt := provider.Logger("alt") assert.NotSame(t, pre0, alt) + alt2 := provider.Logger(preName, log.WithInstrumentationAttributes(attribute.String("k", "v"))) + assert.NotSame(t, pre0, alt2) + delegate := &testLoggerProvider{} provider.setDelegate(delegate) diff --git a/sdk/log/provider.go b/sdk/log/provider.go index 14084ed99a8..8c825e6ab79 100644 --- a/sdk/log/provider.go +++ b/sdk/log/provider.go @@ -124,9 +124,10 @@ func (p *LoggerProvider) Logger(name string, opts ...log.LoggerOption) log.Logge cfg := log.NewLoggerConfig(opts...) scope := instrumentation.Scope{ - Name: name, - Version: cfg.InstrumentationVersion(), - SchemaURL: cfg.SchemaURL(), + Name: name, + Version: cfg.InstrumentationVersion(), + SchemaURL: cfg.SchemaURL(), + Attributes: cfg.InstrumentationAttributes(), } p.loggersMu.Lock() diff --git a/sdk/log/provider_test.go b/sdk/log/provider_test.go index fecd8f10127..133e752896b 100644 --- a/sdk/log/provider_test.go +++ b/sdk/log/provider_test.go @@ -302,7 +302,7 @@ func TestLoggerProviderLogger(t *testing.T) { l0, l1, l2 := p.Logger("l0"), p.Logger("l1"), p.Logger("l0", log.WithInstrumentationAttributes(attribute.String("foo", "bar"))) assert.NotSame(t, l0, l1) - assert.Same(t, l0, l2) // TODO (#3368): Change to assert.NotSame. + assert.NotSame(t, l0, l2) assert.NotSame(t, l1, l2) l3, l4, l5 := p.Logger("l0"), p.Logger("l1"), p.Logger("l0", log.WithInstrumentationAttributes(attribute.String("foo", "bar")))