From d09831f12df5c878cd1d20145a601b422db89014 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Juraci=20Paix=C3=A3o=20Kr=C3=B6hling?= Date: Thu, 6 Feb 2025 12:40:38 +0100 Subject: [PATCH 01/12] config: add support for configuring propagators Fixes #6712 --- config/go.mod | 5 + config/go.sum | 10 ++ config/v0.3.0/config.go | 14 +++ config/v0.3.0/config_test.go | 2 + config/v0.3.0/propagation.go | 65 +++++++++++ config/v0.3.0/propagation_test.go | 183 ++++++++++++++++++++++++++++++ 6 files changed, 279 insertions(+) create mode 100644 config/v0.3.0/propagation.go create mode 100644 config/v0.3.0/propagation_test.go diff --git a/config/go.mod b/config/go.mod index 32e6bd4c21e..6512266d541 100644 --- a/config/go.mod +++ b/config/go.mod @@ -5,6 +5,10 @@ go 1.22.0 require ( github.com/prometheus/client_golang v1.20.5 github.com/stretchr/testify v1.10.0 + go.opentelemetry.io/contrib/propagators/aws v1.34.0 + go.opentelemetry.io/contrib/propagators/b3 v1.34.0 + go.opentelemetry.io/contrib/propagators/jaeger v1.34.0 + go.opentelemetry.io/contrib/propagators/ot v1.34.0 go.opentelemetry.io/otel v1.34.0 go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.10.0 go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.10.0 @@ -44,6 +48,7 @@ require ( go.opentelemetry.io/auto/sdk v1.1.0 // indirect go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.34.0 // indirect go.opentelemetry.io/proto/otlp v1.5.0 // indirect + go.uber.org/multierr v1.11.0 // indirect golang.org/x/net v0.35.0 // indirect golang.org/x/sys v0.30.0 // indirect golang.org/x/text v0.22.0 // indirect diff --git a/config/go.sum b/config/go.sum index fee4aa65bde..edbef147807 100644 --- a/config/go.sum +++ b/config/go.sum @@ -45,6 +45,14 @@ github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOf github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA= go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A= +go.opentelemetry.io/contrib/propagators/aws v1.34.0 h1:pv/Yi44N2BM1Kyl6wxO6bTiwcxUA7Deog3Rc7NO9ITE= +go.opentelemetry.io/contrib/propagators/aws v1.34.0/go.mod h1:1aF3HFtAyIi+B2xJHOdKQcNz+bcDS+JLAZjsohcW1P4= +go.opentelemetry.io/contrib/propagators/b3 v1.34.0 h1:9pQdCEvV/6RWQmag94D6rhU+A4rzUhYBEJ8bpscx5p8= +go.opentelemetry.io/contrib/propagators/b3 v1.34.0/go.mod h1:FwM71WS8i1/mAK4n48t0KU6qUS/OZRBgDrHZv3RlJ+w= +go.opentelemetry.io/contrib/propagators/jaeger v1.34.0 h1:D3htJISCUU/wOVlKwisVKancWm+2U4h9xDEaiMkiyRE= +go.opentelemetry.io/contrib/propagators/jaeger v1.34.0/go.mod h1:DAX1bsj+uDm2ZuOQH/RgZRx7RQZWyzV5W2WR/0UX8JA= +go.opentelemetry.io/contrib/propagators/ot v1.34.0 h1:fcA0FMvHmco/mjXbmRoNx9IRs6+UuRVyXhMHzP+pEc8= +go.opentelemetry.io/contrib/propagators/ot v1.34.0/go.mod h1:VvybuUSU0G7m9DLza4YX8KKniYlIphI+mZ6ufkaV1m8= go.opentelemetry.io/otel v1.34.0 h1:zRLXxLCgL1WyKsPVrgbSdMN4c0FMkDAskSTQP+0hdUY= go.opentelemetry.io/otel v1.34.0/go.mod h1:OWFPOQ+h4G8xpyjgqo4SxJYdDQ/qmRH+wivy7zzx9oI= go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.10.0 h1:5dTKu4I5Dn4P2hxyW3l3jTaZx9ACgg0ECos1eAVrheY= @@ -85,6 +93,8 @@ go.opentelemetry.io/proto/otlp v1.5.0 h1:xJvq7gMzB31/d406fB8U5CBdyQGw4P399D1aQWU go.opentelemetry.io/proto/otlp v1.5.0/go.mod h1:keN8WnHxOy8PG0rQZjJJ5A2ebUoafqWp0eVQ4yIXvJ4= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= +go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= +go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= golang.org/x/net v0.35.0 h1:T5GQRQb2y08kTAByq9L4/bz8cipCdA8FbRTXewonqY8= golang.org/x/net v0.35.0/go.mod h1:EglIi67kWsHKlRzzVMUD93VMSWGFOMSZgxFjparz1Qk= golang.org/x/sys v0.30.0 h1:QjkSwP/36a20jFYWkSue1YwXzLmsV5Gfq7Eiy72C1uc= diff --git a/config/v0.3.0/config.go b/config/v0.3.0/config.go index 1dd458d5a4a..b09eaa32cbf 100644 --- a/config/v0.3.0/config.go +++ b/config/v0.3.0/config.go @@ -17,6 +17,7 @@ import ( nooplog "go.opentelemetry.io/otel/log/noop" "go.opentelemetry.io/otel/metric" noopmetric "go.opentelemetry.io/otel/metric/noop" + "go.opentelemetry.io/otel/propagation" "go.opentelemetry.io/otel/trace" nooptrace "go.opentelemetry.io/otel/trace/noop" ) @@ -46,6 +47,7 @@ type SDK struct { meterProvider metric.MeterProvider tracerProvider trace.TracerProvider loggerProvider log.LoggerProvider + propagator propagation.TextMapPropagator shutdown shutdownFunc } @@ -64,6 +66,11 @@ func (s *SDK) LoggerProvider() log.LoggerProvider { return s.loggerProvider } +// LoggerProvider returns a configured log.LoggerProvider. +func (s *SDK) Propagator() propagation.TextMapPropagator { + return s.propagator +} + // Shutdown calls shutdown on all configured providers. func (s *SDK) Shutdown(ctx context.Context) error { return s.shutdown(ctx) @@ -73,6 +80,7 @@ var noopSDK = SDK{ loggerProvider: nooplog.LoggerProvider{}, meterProvider: noopmetric.MeterProvider{}, tracerProvider: nooptrace.TracerProvider{}, + propagator: nil, shutdown: func(ctx context.Context) error { return nil }, } @@ -103,10 +111,16 @@ func NewSDK(opts ...ConfigurationOption) (SDK, error) { return noopSDK, err } + propagator, err := propagator(o) + if err != nil { + return noopSDK, err + } + return SDK{ meterProvider: mp, tracerProvider: tp, loggerProvider: lp, + propagator: propagator, shutdown: func(ctx context.Context) error { return errors.Join(mpShutdown(ctx), tpShutdown(ctx), lpShutdown(ctx)) }, diff --git a/config/v0.3.0/config_test.go b/config/v0.3.0/config_test.go index a25cfc9ff88..e50536df968 100644 --- a/config/v0.3.0/config_test.go +++ b/config/v0.3.0/config_test.go @@ -30,6 +30,7 @@ func TestNewSDK(t *testing.T) { wantTracerProvider any wantMeterProvider any wantLoggerProvider any + wantPropagators any wantErr error wantShutdownErr error }{ @@ -75,6 +76,7 @@ func TestNewSDK(t *testing.T) { assert.IsType(t, tt.wantTracerProvider, sdk.TracerProvider()) assert.IsType(t, tt.wantMeterProvider, sdk.MeterProvider()) assert.IsType(t, tt.wantLoggerProvider, sdk.LoggerProvider()) + assert.Equal(t, tt.wantPropagators, sdk.Propagator()) require.Equal(t, tt.wantShutdownErr, sdk.Shutdown(context.Background())) } } diff --git a/config/v0.3.0/propagation.go b/config/v0.3.0/propagation.go new file mode 100644 index 00000000000..248a679c4dd --- /dev/null +++ b/config/v0.3.0/propagation.go @@ -0,0 +1,65 @@ +package config + +import ( + "errors" + + "go.opentelemetry.io/contrib/propagators/aws/xray" + "go.opentelemetry.io/contrib/propagators/b3" + "go.opentelemetry.io/contrib/propagators/jaeger" + "go.opentelemetry.io/contrib/propagators/ot" + "go.opentelemetry.io/otel/propagation" +) + +func propagator(cfg configOptions) (propagation.TextMapPropagator, error) { + if cfg.opentelemetryConfig.Propagator == nil { + return nil, nil + } + + var errs []error + var ps []propagation.TextMapPropagator + for _, name := range cfg.opentelemetryConfig.Propagator.Composite { + if name == nil || *name == "" { + continue + } + + p, err := propagatorByName(*name) + if err == nil { + ps = append(ps, p) + } else { + + errs = append(errs, err) + } + } + + if len(errs) > 0 { + return nil, errors.Join(errs...) + } + + if len(ps) == 0 { + return nil, nil + } + + res := propagation.NewCompositeTextMapPropagator(ps...) + return res, nil +} + +func propagatorByName(name string) (propagation.TextMapPropagator, error) { + switch name { + case "tracecontext": + return propagation.TraceContext{}, nil + case "baggage": + return propagation.Baggage{}, nil + case "b3": + return b3.New(), nil + case "b3multi": + return b3.New(b3.WithInjectEncoding(b3.B3MultipleHeader)), nil + case "jaeger": + return jaeger.Jaeger{}, nil + case "xray": + return xray.Propagator{}, nil + case "ottrace": + return ot.OT{}, nil + default: + return nil, errors.New("unsupported propagator") + } +} diff --git a/config/v0.3.0/propagation_test.go b/config/v0.3.0/propagation_test.go new file mode 100644 index 00000000000..6cd22e99883 --- /dev/null +++ b/config/v0.3.0/propagation_test.go @@ -0,0 +1,183 @@ +package config + +import ( + "testing" + + "github.com/stretchr/testify/assert" + "go.opentelemetry.io/contrib/propagators/aws/xray" + "go.opentelemetry.io/contrib/propagators/b3" + "go.opentelemetry.io/contrib/propagators/jaeger" + "go.opentelemetry.io/contrib/propagators/ot" + "go.opentelemetry.io/otel/propagation" +) + +func TestPropagator(t *testing.T) { + tests := []struct { + name string + cfg configOptions + want propagation.TextMapPropagator + wantErr bool + errMsg string + }{ + { + name: "nil propagator config", + cfg: configOptions{ + opentelemetryConfig: OpenTelemetryConfiguration{ + Propagator: nil, + }, + }, + want: nil, + wantErr: false, + }, + { + name: "valid tracecontext", + cfg: configOptions{ + opentelemetryConfig: OpenTelemetryConfiguration{ + Propagator: &Propagator{ + Composite: []*string{strPtr("tracecontext")}, + }, + }, + }, + want: propagation.NewCompositeTextMapPropagator(propagation.TraceContext{}), + wantErr: false, + }, + { + name: "valid baggage", + cfg: configOptions{ + opentelemetryConfig: OpenTelemetryConfiguration{ + Propagator: &Propagator{ + Composite: []*string{strPtr("baggage")}, + }, + }, + }, + want: propagation.NewCompositeTextMapPropagator(propagation.Baggage{}), + wantErr: false, + }, + { + name: "valid b3", + cfg: configOptions{ + opentelemetryConfig: OpenTelemetryConfiguration{ + Propagator: &Propagator{ + Composite: []*string{strPtr("b3")}, + }, + }, + }, + want: propagation.NewCompositeTextMapPropagator(b3.New()), + wantErr: false, + }, + { + name: "valid b3multi", + cfg: configOptions{ + opentelemetryConfig: OpenTelemetryConfiguration{ + Propagator: &Propagator{ + Composite: []*string{strPtr("b3multi")}, + }, + }, + }, + want: propagation.NewCompositeTextMapPropagator(b3.New(b3.WithInjectEncoding(b3.B3MultipleHeader))), + wantErr: false, + }, + { + name: "valid jaeger", + cfg: configOptions{ + opentelemetryConfig: OpenTelemetryConfiguration{ + Propagator: &Propagator{ + Composite: []*string{strPtr("jaeger")}, + }, + }, + }, + want: propagation.NewCompositeTextMapPropagator(jaeger.Jaeger{}), + wantErr: false, + }, + { + name: "valid xray", + cfg: configOptions{ + opentelemetryConfig: OpenTelemetryConfiguration{ + Propagator: &Propagator{ + Composite: []*string{strPtr("xray")}, + }, + }, + }, + want: propagation.NewCompositeTextMapPropagator(xray.Propagator{}), + wantErr: false, + }, + { + name: "valid ottrace", + cfg: configOptions{ + opentelemetryConfig: OpenTelemetryConfiguration{ + Propagator: &Propagator{ + Composite: []*string{strPtr("ottrace")}, + }, + }, + }, + want: propagation.NewCompositeTextMapPropagator(ot.OT{}), + wantErr: false, + }, + { + name: "multiple propagators", + cfg: configOptions{ + opentelemetryConfig: OpenTelemetryConfiguration{ + Propagator: &Propagator{ + Composite: []*string{strPtr("tracecontext"), strPtr("baggage"), strPtr("b3")}, + }, + }, + }, + want: propagation.NewCompositeTextMapPropagator(propagation.TraceContext{}, propagation.Baggage{}, b3.New()), + wantErr: false, + }, + { + name: "empty composite", + cfg: configOptions{ + opentelemetryConfig: OpenTelemetryConfiguration{ + Propagator: &Propagator{ + Composite: []*string{}, + }, + }, + }, + want: nil, + wantErr: false, + }, + { + name: "nil propagator name", + cfg: configOptions{ + opentelemetryConfig: OpenTelemetryConfiguration{ + Propagator: &Propagator{ + Composite: []*string{nil, strPtr("tracecontext")}, + }, + }, + }, + want: propagation.NewCompositeTextMapPropagator(propagation.TraceContext{}), + wantErr: false, + }, + { + name: "unsupported propagator", + cfg: configOptions{ + opentelemetryConfig: OpenTelemetryConfiguration{ + Propagator: &Propagator{ + Composite: []*string{strPtr("unknown")}, + }, + }, + }, + want: nil, + wantErr: true, + errMsg: "unsupported propagator", + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + got, err := propagator(tt.cfg) + if tt.wantErr { + assert.Error(t, err) + assert.Contains(t, err.Error(), tt.errMsg) + return + } + assert.NoError(t, err) + assert.Equal(t, tt.want, got) + }) + } +} + +func strPtr(s string) *string { + return &s +} From 2d858e6a3e54c665101ad78e05256c5cdd972fae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Juraci=20Paix=C3=A3o=20Kr=C3=B6hling?= Date: Thu, 6 Feb 2025 12:58:38 +0100 Subject: [PATCH 02/12] make linter happy MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Juraci Paixão Kröhling --- config/v0.3.0/propagation.go | 6 ++++-- config/v0.3.0/propagation_test.go | 6 +++++- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/config/v0.3.0/propagation.go b/config/v0.3.0/propagation.go index 248a679c4dd..6880edb979d 100644 --- a/config/v0.3.0/propagation.go +++ b/config/v0.3.0/propagation.go @@ -1,4 +1,7 @@ -package config +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package config // import "go.opentelemetry.io/contrib/config/v0.3.0" import ( "errors" @@ -26,7 +29,6 @@ func propagator(cfg configOptions) (propagation.TextMapPropagator, error) { if err == nil { ps = append(ps, p) } else { - errs = append(errs, err) } } diff --git a/config/v0.3.0/propagation_test.go b/config/v0.3.0/propagation_test.go index 6cd22e99883..4d8ab365794 100644 --- a/config/v0.3.0/propagation_test.go +++ b/config/v0.3.0/propagation_test.go @@ -1,9 +1,13 @@ -package config +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package config // import "go.opentelemetry.io/contrib/config/v0.3.0" import ( "testing" "github.com/stretchr/testify/assert" + "go.opentelemetry.io/contrib/propagators/aws/xray" "go.opentelemetry.io/contrib/propagators/b3" "go.opentelemetry.io/contrib/propagators/jaeger" From 5ec3c2523395bd1670fd1d80d1198eb62833a097 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Juraci=20Paix=C3=A3o=20Kr=C3=B6hling?= Date: Thu, 6 Feb 2025 13:35:33 +0100 Subject: [PATCH 03/12] empty vs. nil MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Juraci Paixão Kröhling --- config/v0.3.0/config.go | 4 ++-- config/v0.3.0/config_test.go | 4 ++++ config/v0.3.0/propagation.go | 9 ++------- config/v0.3.0/propagation_test.go | 6 +++--- 4 files changed, 11 insertions(+), 12 deletions(-) diff --git a/config/v0.3.0/config.go b/config/v0.3.0/config.go index b09eaa32cbf..1f254e8e04c 100644 --- a/config/v0.3.0/config.go +++ b/config/v0.3.0/config.go @@ -66,7 +66,7 @@ func (s *SDK) LoggerProvider() log.LoggerProvider { return s.loggerProvider } -// LoggerProvider returns a configured log.LoggerProvider. +// Propagator returns a configured propagation.TextMapPropagator. func (s *SDK) Propagator() propagation.TextMapPropagator { return s.propagator } @@ -80,7 +80,7 @@ var noopSDK = SDK{ loggerProvider: nooplog.LoggerProvider{}, meterProvider: noopmetric.MeterProvider{}, tracerProvider: nooptrace.TracerProvider{}, - propagator: nil, + propagator: propagation.NewCompositeTextMapPropagator(), shutdown: func(ctx context.Context) error { return nil }, } diff --git a/config/v0.3.0/config_test.go b/config/v0.3.0/config_test.go index e50536df968..2c3349733ce 100644 --- a/config/v0.3.0/config_test.go +++ b/config/v0.3.0/config_test.go @@ -17,6 +17,7 @@ import ( lognoop "go.opentelemetry.io/otel/log/noop" metricnoop "go.opentelemetry.io/otel/metric/noop" + "go.opentelemetry.io/otel/propagation" sdklog "go.opentelemetry.io/otel/sdk/log" sdkmetric "go.opentelemetry.io/otel/sdk/metric" sdktrace "go.opentelemetry.io/otel/sdk/trace" @@ -39,6 +40,7 @@ func TestNewSDK(t *testing.T) { wantTracerProvider: tracenoop.NewTracerProvider(), wantMeterProvider: metricnoop.NewMeterProvider(), wantLoggerProvider: lognoop.NewLoggerProvider(), + wantPropagators: propagation.NewCompositeTextMapPropagator(), }, { name: "with-configuration", @@ -53,6 +55,7 @@ func TestNewSDK(t *testing.T) { wantTracerProvider: &sdktrace.TracerProvider{}, wantMeterProvider: &sdkmetric.MeterProvider{}, wantLoggerProvider: &sdklog.LoggerProvider{}, + wantPropagators: propagation.NewCompositeTextMapPropagator(), }, { name: "with-sdk-disabled", @@ -68,6 +71,7 @@ func TestNewSDK(t *testing.T) { wantTracerProvider: tracenoop.NewTracerProvider(), wantMeterProvider: metricnoop.NewMeterProvider(), wantLoggerProvider: lognoop.NewLoggerProvider(), + wantPropagators: propagation.NewCompositeTextMapPropagator(), }, } for _, tt := range tests { diff --git a/config/v0.3.0/propagation.go b/config/v0.3.0/propagation.go index 6880edb979d..85c127f2e5f 100644 --- a/config/v0.3.0/propagation.go +++ b/config/v0.3.0/propagation.go @@ -15,7 +15,7 @@ import ( func propagator(cfg configOptions) (propagation.TextMapPropagator, error) { if cfg.opentelemetryConfig.Propagator == nil { - return nil, nil + return propagation.NewCompositeTextMapPropagator(), nil } var errs []error @@ -37,12 +37,7 @@ func propagator(cfg configOptions) (propagation.TextMapPropagator, error) { return nil, errors.Join(errs...) } - if len(ps) == 0 { - return nil, nil - } - - res := propagation.NewCompositeTextMapPropagator(ps...) - return res, nil + return propagation.NewCompositeTextMapPropagator(ps...), nil } func propagatorByName(name string) (propagation.TextMapPropagator, error) { diff --git a/config/v0.3.0/propagation_test.go b/config/v0.3.0/propagation_test.go index 4d8ab365794..ed6dcc0ec5b 100644 --- a/config/v0.3.0/propagation_test.go +++ b/config/v0.3.0/propagation_test.go @@ -30,7 +30,7 @@ func TestPropagator(t *testing.T) { Propagator: nil, }, }, - want: nil, + want: propagation.NewCompositeTextMapPropagator(), wantErr: false, }, { @@ -138,7 +138,7 @@ func TestPropagator(t *testing.T) { }, }, }, - want: nil, + want: propagation.NewCompositeTextMapPropagator(), wantErr: false, }, { @@ -162,7 +162,7 @@ func TestPropagator(t *testing.T) { }, }, }, - want: nil, + want: propagation.NewCompositeTextMapPropagator(), wantErr: true, errMsg: "unsupported propagator", }, From a73e9ea9b401a45d98b47e32d14f067b36abe1ab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Juraci=20Paix=C3=A3o=20Kr=C3=B6hling?= Date: Thu, 6 Feb 2025 14:11:21 +0100 Subject: [PATCH 04/12] changelog, err handling, moved propagators logic to before signals MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Juraci Paixão Kröhling --- CHANGELOG.md | 1 + config/v0.3.0/config.go | 10 +++++----- config/v0.3.0/propagation.go | 16 +++++++--------- 3 files changed, 13 insertions(+), 14 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0a3a2c28ed2..0880f2b7bdf 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -21,6 +21,7 @@ The next release will require at least [Go 1.23]. - Added metrics support, and emit all stable metrics from the [Semantic Conventions](https://github.com/open-telemetry/semantic-conventions/blob/main/docs/http/http-metrics.md) in `go.opentelemetry.io/contrib/instrumentation/github.com/gorilla/mux/otelmux`. (#6648) - Add support for configuring `Insecure` field for OTLP exporters in `go.opentelemetry.io/contrib/config`. (#6658) - Support for the `OTEL_HTTP_CLIENT_COMPATIBILITY_MODE=http/dup` environment variable in `instrumentation/net/http/httptrace/otelhttptrace` to emit attributes for both the v1.20.0 and v1.26.0 semantic conventions. (#6720) +- Add support for configuring propagators in `go.opentelemetry.io/contrib/config`. (#6727) - Support for the `OTEL_HTTP_CLIENT_COMPATIBILITY_MODE=http/dup` environment variable in `instrumentation/github.com/emicklei/go-restful/otelrestful` to emit attributes for both the v1.20.0 and v1.26.0 semantic conventions. (#6710) - Added metrics support, and emit all stable metrics from the [Semantic Conventions](https://github.com/open-telemetry/semantic-conventions/blob/main/docs/http/http-metrics.md) in `go.opentelemetry.io/contrib/instrumentation/github.com/gin-gonic/gin/otelgin`. (#6747) - Support [Go 1.24]. (#6765) diff --git a/config/v0.3.0/config.go b/config/v0.3.0/config.go index 1f254e8e04c..069349387fb 100644 --- a/config/v0.3.0/config.go +++ b/config/v0.3.0/config.go @@ -94,6 +94,11 @@ func NewSDK(opts ...ConfigurationOption) (SDK, error) { return noopSDK, nil } + propagator, err := propagator(o) + if err != nil { + return noopSDK, err + } + r := newResource(o.opentelemetryConfig.Resource) mp, mpShutdown, err := meterProvider(o, r) @@ -111,11 +116,6 @@ func NewSDK(opts ...ConfigurationOption) (SDK, error) { return noopSDK, err } - propagator, err := propagator(o) - if err != nil { - return noopSDK, err - } - return SDK{ meterProvider: mp, tracerProvider: tp, diff --git a/config/v0.3.0/propagation.go b/config/v0.3.0/propagation.go index 85c127f2e5f..cec9164f2bc 100644 --- a/config/v0.3.0/propagation.go +++ b/config/v0.3.0/propagation.go @@ -18,23 +18,21 @@ func propagator(cfg configOptions) (propagation.TextMapPropagator, error) { return propagation.NewCompositeTextMapPropagator(), nil } - var errs []error + var rErr error var ps []propagation.TextMapPropagator for _, name := range cfg.opentelemetryConfig.Propagator.Composite { if name == nil || *name == "" { continue } - p, err := propagatorByName(*name) - if err == nil { - ps = append(ps, p) - } else { - errs = append(errs, err) + if err != nil { + rErr = errors.Join(rErr, err) + continue } + ps = append(ps, p) } - - if len(errs) > 0 { - return nil, errors.Join(errs...) + if rErr != nil { + return nil, rErr } return propagation.NewCompositeTextMapPropagator(ps...), nil From df3d0af82202b2b0dd1aa2dee380275a2aac914f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Juraci=20Paix=C3=A3o=20Kr=C3=B6hling?= Date: Fri, 7 Feb 2025 13:57:38 +0100 Subject: [PATCH 05/12] reuse autoprop MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Juraci Paixão Kröhling --- config/go.mod | 4 +++ config/go.sum | 2 ++ config/v0.3.0/config_test.go | 2 +- config/v0.3.0/generated_config.go | 2 +- config/v0.3.0/propagation.go | 48 ++----------------------- config/v0.3.0/propagation_test.go | 48 ++++++++++++------------- propagators/autoprop/propagator_test.go | 15 ++++++++ propagators/autoprop/registry.go | 7 ++++ 8 files changed, 55 insertions(+), 73 deletions(-) diff --git a/config/go.mod b/config/go.mod index 6512266d541..0f0acbd46d4 100644 --- a/config/go.mod +++ b/config/go.mod @@ -5,6 +5,7 @@ go 1.22.0 require ( github.com/prometheus/client_golang v1.20.5 github.com/stretchr/testify v1.10.0 + go.opentelemetry.io/contrib/propagators/autoprop v0.59.0 go.opentelemetry.io/contrib/propagators/aws v1.34.0 go.opentelemetry.io/contrib/propagators/b3 v1.34.0 go.opentelemetry.io/contrib/propagators/jaeger v1.34.0 @@ -56,3 +57,6 @@ require ( google.golang.org/genproto/googleapis/rpc v0.0.0-20250212204824-5a70512c5d8b // indirect google.golang.org/protobuf v1.36.5 // indirect ) + +// remove after v0.59.0 of autoprop +replace go.opentelemetry.io/contrib/propagators/autoprop => ../propagators/autoprop \ No newline at end of file diff --git a/config/go.sum b/config/go.sum index edbef147807..b917b451d31 100644 --- a/config/go.sum +++ b/config/go.sum @@ -45,6 +45,8 @@ github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOf github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA= go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A= +go.opentelemetry.io/contrib/propagators/autoprop v0.59.0 h1:bgG6F0HBLngIG79m8VYMdgh3adfcjCgLbsO8StsovQk= +go.opentelemetry.io/contrib/propagators/autoprop v0.59.0/go.mod h1:JV4DSHIsqQoFVaeE6xDef6xdI2I/IOOsWnXWCzQ0EXQ= go.opentelemetry.io/contrib/propagators/aws v1.34.0 h1:pv/Yi44N2BM1Kyl6wxO6bTiwcxUA7Deog3Rc7NO9ITE= go.opentelemetry.io/contrib/propagators/aws v1.34.0/go.mod h1:1aF3HFtAyIi+B2xJHOdKQcNz+bcDS+JLAZjsohcW1P4= go.opentelemetry.io/contrib/propagators/b3 v1.34.0 h1:9pQdCEvV/6RWQmag94D6rhU+A4rzUhYBEJ8bpscx5p8= diff --git a/config/v0.3.0/config_test.go b/config/v0.3.0/config_test.go index 2c3349733ce..d62c97972c9 100644 --- a/config/v0.3.0/config_test.go +++ b/config/v0.3.0/config_test.go @@ -291,7 +291,7 @@ var v03OpenTelemetryConfig = OpenTelemetryConfiguration{ }, }, Propagator: &Propagator{ - Composite: []*string{ptr("tracecontext"), ptr("baggage"), ptr("b3"), ptr("b3multi"), ptr("jaeger"), ptr("xray"), ptr("ottrace")}, + Composite: []string{"tracecontext", "baggage", "b3", "b3multi", "jaeger", "xray", "ottrace"}, }, Resource: &Resource{ Attributes: []AttributeNameValue{ diff --git a/config/v0.3.0/generated_config.go b/config/v0.3.0/generated_config.go index 8fe7310e9de..5fc0acfd2ce 100644 --- a/config/v0.3.0/generated_config.go +++ b/config/v0.3.0/generated_config.go @@ -395,7 +395,7 @@ type Prometheus struct { type Propagator struct { // Composite corresponds to the JSON schema field "composite". - Composite []*string `json:"composite,omitempty" yaml:"composite,omitempty" mapstructure:"composite,omitempty"` + Composite []string `json:"composite,omitempty" yaml:"composite,omitempty" mapstructure:"composite,omitempty"` AdditionalProperties interface{} `mapstructure:",remain"` } diff --git a/config/v0.3.0/propagation.go b/config/v0.3.0/propagation.go index cec9164f2bc..dd2017ee539 100644 --- a/config/v0.3.0/propagation.go +++ b/config/v0.3.0/propagation.go @@ -4,57 +4,15 @@ package config // import "go.opentelemetry.io/contrib/config/v0.3.0" import ( - "errors" - - "go.opentelemetry.io/contrib/propagators/aws/xray" - "go.opentelemetry.io/contrib/propagators/b3" - "go.opentelemetry.io/contrib/propagators/jaeger" - "go.opentelemetry.io/contrib/propagators/ot" + "go.opentelemetry.io/contrib/propagators/autoprop" "go.opentelemetry.io/otel/propagation" ) func propagator(cfg configOptions) (propagation.TextMapPropagator, error) { if cfg.opentelemetryConfig.Propagator == nil { - return propagation.NewCompositeTextMapPropagator(), nil - } - - var rErr error - var ps []propagation.TextMapPropagator - for _, name := range cfg.opentelemetryConfig.Propagator.Composite { - if name == nil || *name == "" { - continue - } - p, err := propagatorByName(*name) - if err != nil { - rErr = errors.Join(rErr, err) - continue - } - ps = append(ps, p) - } - if rErr != nil { - return nil, rErr + return autoprop.NewTextMapPropagator(), nil } - return propagation.NewCompositeTextMapPropagator(ps...), nil -} + return autoprop.TextMapPropagator(cfg.opentelemetryConfig.Propagator.Composite...) -func propagatorByName(name string) (propagation.TextMapPropagator, error) { - switch name { - case "tracecontext": - return propagation.TraceContext{}, nil - case "baggage": - return propagation.Baggage{}, nil - case "b3": - return b3.New(), nil - case "b3multi": - return b3.New(b3.WithInjectEncoding(b3.B3MultipleHeader)), nil - case "jaeger": - return jaeger.Jaeger{}, nil - case "xray": - return xray.Propagator{}, nil - case "ottrace": - return ot.OT{}, nil - default: - return nil, errors.New("unsupported propagator") - } } diff --git a/config/v0.3.0/propagation_test.go b/config/v0.3.0/propagation_test.go index ed6dcc0ec5b..1d9e9f8372f 100644 --- a/config/v0.3.0/propagation_test.go +++ b/config/v0.3.0/propagation_test.go @@ -30,7 +30,7 @@ func TestPropagator(t *testing.T) { Propagator: nil, }, }, - want: propagation.NewCompositeTextMapPropagator(), + want: propagation.NewCompositeTextMapPropagator(propagation.TraceContext{}, propagation.Baggage{}), wantErr: false, }, { @@ -38,11 +38,11 @@ func TestPropagator(t *testing.T) { cfg: configOptions{ opentelemetryConfig: OpenTelemetryConfiguration{ Propagator: &Propagator{ - Composite: []*string{strPtr("tracecontext")}, + Composite: []string{"tracecontext"}, }, }, }, - want: propagation.NewCompositeTextMapPropagator(propagation.TraceContext{}), + want: propagation.TraceContext{}, wantErr: false, }, { @@ -50,11 +50,11 @@ func TestPropagator(t *testing.T) { cfg: configOptions{ opentelemetryConfig: OpenTelemetryConfiguration{ Propagator: &Propagator{ - Composite: []*string{strPtr("baggage")}, + Composite: []string{"baggage"}, }, }, }, - want: propagation.NewCompositeTextMapPropagator(propagation.Baggage{}), + want: propagation.Baggage{}, wantErr: false, }, { @@ -62,11 +62,11 @@ func TestPropagator(t *testing.T) { cfg: configOptions{ opentelemetryConfig: OpenTelemetryConfiguration{ Propagator: &Propagator{ - Composite: []*string{strPtr("b3")}, + Composite: []string{"b3"}, }, }, }, - want: propagation.NewCompositeTextMapPropagator(b3.New()), + want: b3.New(), wantErr: false, }, { @@ -74,11 +74,11 @@ func TestPropagator(t *testing.T) { cfg: configOptions{ opentelemetryConfig: OpenTelemetryConfiguration{ Propagator: &Propagator{ - Composite: []*string{strPtr("b3multi")}, + Composite: []string{"b3multi"}, }, }, }, - want: propagation.NewCompositeTextMapPropagator(b3.New(b3.WithInjectEncoding(b3.B3MultipleHeader))), + want: b3.New(b3.WithInjectEncoding(b3.B3MultipleHeader)), wantErr: false, }, { @@ -86,11 +86,11 @@ func TestPropagator(t *testing.T) { cfg: configOptions{ opentelemetryConfig: OpenTelemetryConfiguration{ Propagator: &Propagator{ - Composite: []*string{strPtr("jaeger")}, + Composite: []string{"jaeger"}, }, }, }, - want: propagation.NewCompositeTextMapPropagator(jaeger.Jaeger{}), + want: jaeger.Jaeger{}, wantErr: false, }, { @@ -98,11 +98,11 @@ func TestPropagator(t *testing.T) { cfg: configOptions{ opentelemetryConfig: OpenTelemetryConfiguration{ Propagator: &Propagator{ - Composite: []*string{strPtr("xray")}, + Composite: []string{"xray"}, }, }, }, - want: propagation.NewCompositeTextMapPropagator(xray.Propagator{}), + want: xray.Propagator{}, wantErr: false, }, { @@ -110,11 +110,11 @@ func TestPropagator(t *testing.T) { cfg: configOptions{ opentelemetryConfig: OpenTelemetryConfiguration{ Propagator: &Propagator{ - Composite: []*string{strPtr("ottrace")}, + Composite: []string{"ottrace"}, }, }, }, - want: propagation.NewCompositeTextMapPropagator(ot.OT{}), + want: ot.OT{}, wantErr: false, }, { @@ -122,7 +122,7 @@ func TestPropagator(t *testing.T) { cfg: configOptions{ opentelemetryConfig: OpenTelemetryConfiguration{ Propagator: &Propagator{ - Composite: []*string{strPtr("tracecontext"), strPtr("baggage"), strPtr("b3")}, + Composite: []string{"tracecontext", "baggage", "b3"}, }, }, }, @@ -134,11 +134,11 @@ func TestPropagator(t *testing.T) { cfg: configOptions{ opentelemetryConfig: OpenTelemetryConfiguration{ Propagator: &Propagator{ - Composite: []*string{}, + Composite: []string{}, }, }, }, - want: propagation.NewCompositeTextMapPropagator(), + want: propagation.NewCompositeTextMapPropagator(propagation.TraceContext{}, propagation.Baggage{}), wantErr: false, }, { @@ -146,11 +146,11 @@ func TestPropagator(t *testing.T) { cfg: configOptions{ opentelemetryConfig: OpenTelemetryConfiguration{ Propagator: &Propagator{ - Composite: []*string{nil, strPtr("tracecontext")}, + Composite: []string{"", "tracecontext"}, }, }, }, - want: propagation.NewCompositeTextMapPropagator(propagation.TraceContext{}), + want: propagation.TraceContext{}, wantErr: false, }, { @@ -158,13 +158,13 @@ func TestPropagator(t *testing.T) { cfg: configOptions{ opentelemetryConfig: OpenTelemetryConfiguration{ Propagator: &Propagator{ - Composite: []*string{strPtr("unknown")}, + Composite: []string{"unknown"}, }, }, }, want: propagation.NewCompositeTextMapPropagator(), wantErr: true, - errMsg: "unsupported propagator", + errMsg: "unknown propagator", }, } @@ -181,7 +181,3 @@ func TestPropagator(t *testing.T) { }) } } - -func strPtr(s string) *string { - return &s -} diff --git a/propagators/autoprop/propagator_test.go b/propagators/autoprop/propagator_test.go index dcb17cd1372..cde1896d50a 100644 --- a/propagators/autoprop/propagator_test.go +++ b/propagators/autoprop/propagator_test.go @@ -8,6 +8,7 @@ import ( "testing" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" "go.opentelemetry.io/otel" "go.opentelemetry.io/otel/propagation" @@ -34,6 +35,20 @@ func TestNewTextMapPropagatorDefault(t *testing.T) { assert.ElementsMatch(t, expect, NewTextMapPropagator().Fields()) } +func TestEmptyElementIsIgnored(t *testing.T) { + in := []string{"", "tracecontext"} + p, err := TextMapPropagator(in...) + require.NoError(t, err) + assert.Equal(t, propagation.TraceContext{}, p) +} + +func TestEmptyElementSet(t *testing.T) { + in := []string{} + p, err := TextMapPropagator(in...) + require.NoError(t, err) + assert.Equal(t, propagation.NewCompositeTextMapPropagator(propagation.TraceContext{}, propagation.Baggage{}), p) +} + type ptrNoop struct{} func (*ptrNoop) Inject(context.Context, propagation.TextMapCarrier) {} diff --git a/propagators/autoprop/registry.go b/propagators/autoprop/registry.go index 2cb365aa059..e3f6d3edb9d 100644 --- a/propagators/autoprop/registry.go +++ b/propagators/autoprop/registry.go @@ -124,7 +124,14 @@ func TextMapPropagator(names ...string) (propagation.TextMapPropagator, error) { unknown []string ) + if len(names) == 0 { + return NewTextMapPropagator(), nil + } + for _, name := range names { + if len(name) == 0 { + continue + } if name == none { // If "none" is passed in combination with any other propagator, // the result still needs to be a no-op propagator. Therefore, From 88928e6dbc16afa1c70562ee6235bc3ca299f996 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Juraci=20Paix=C3=A3o=20Kr=C3=B6hling?= Date: Fri, 7 Feb 2025 13:58:29 +0100 Subject: [PATCH 06/12] make linter happy MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Juraci Paixão Kröhling --- config/go.mod | 2 +- config/go.sum | 2 -- config/v0.3.0/propagation.go | 1 - 3 files changed, 1 insertion(+), 4 deletions(-) diff --git a/config/go.mod b/config/go.mod index 0f0acbd46d4..4d73ae7821b 100644 --- a/config/go.mod +++ b/config/go.mod @@ -59,4 +59,4 @@ require ( ) // remove after v0.59.0 of autoprop -replace go.opentelemetry.io/contrib/propagators/autoprop => ../propagators/autoprop \ No newline at end of file +replace go.opentelemetry.io/contrib/propagators/autoprop => ../propagators/autoprop diff --git a/config/go.sum b/config/go.sum index b917b451d31..edbef147807 100644 --- a/config/go.sum +++ b/config/go.sum @@ -45,8 +45,6 @@ github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOf github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA= go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A= -go.opentelemetry.io/contrib/propagators/autoprop v0.59.0 h1:bgG6F0HBLngIG79m8VYMdgh3adfcjCgLbsO8StsovQk= -go.opentelemetry.io/contrib/propagators/autoprop v0.59.0/go.mod h1:JV4DSHIsqQoFVaeE6xDef6xdI2I/IOOsWnXWCzQ0EXQ= go.opentelemetry.io/contrib/propagators/aws v1.34.0 h1:pv/Yi44N2BM1Kyl6wxO6bTiwcxUA7Deog3Rc7NO9ITE= go.opentelemetry.io/contrib/propagators/aws v1.34.0/go.mod h1:1aF3HFtAyIi+B2xJHOdKQcNz+bcDS+JLAZjsohcW1P4= go.opentelemetry.io/contrib/propagators/b3 v1.34.0 h1:9pQdCEvV/6RWQmag94D6rhU+A4rzUhYBEJ8bpscx5p8= diff --git a/config/v0.3.0/propagation.go b/config/v0.3.0/propagation.go index dd2017ee539..2db37e8baec 100644 --- a/config/v0.3.0/propagation.go +++ b/config/v0.3.0/propagation.go @@ -14,5 +14,4 @@ func propagator(cfg configOptions) (propagation.TextMapPropagator, error) { } return autoprop.TextMapPropagator(cfg.opentelemetryConfig.Propagator.Composite...) - } From c48544332c35e280c313d3285e92c701a2f9a1b5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Juraci=20Paix=C3=A3o=20Kr=C3=B6hling?= Date: Fri, 7 Feb 2025 14:06:58 +0100 Subject: [PATCH 07/12] add config to propagator MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Juraci Paixão Kröhling --- config/v0.3.0/config_test.go | 24 +++++++++++++++--------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/config/v0.3.0/config_test.go b/config/v0.3.0/config_test.go index d62c97972c9..1c1f9423fd7 100644 --- a/config/v0.3.0/config_test.go +++ b/config/v0.3.0/config_test.go @@ -15,6 +15,7 @@ import ( "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" + "go.opentelemetry.io/contrib/propagators/b3" lognoop "go.opentelemetry.io/otel/log/noop" metricnoop "go.opentelemetry.io/otel/metric/noop" "go.opentelemetry.io/otel/propagation" @@ -40,7 +41,7 @@ func TestNewSDK(t *testing.T) { wantTracerProvider: tracenoop.NewTracerProvider(), wantMeterProvider: metricnoop.NewMeterProvider(), wantLoggerProvider: lognoop.NewLoggerProvider(), - wantPropagators: propagation.NewCompositeTextMapPropagator(), + wantPropagators: propagation.NewCompositeTextMapPropagator(propagation.TraceContext{}, propagation.Baggage{}), }, { name: "with-configuration", @@ -50,12 +51,15 @@ func TestNewSDK(t *testing.T) { TracerProvider: &TracerProvider{}, MeterProvider: &MeterProvider{}, LoggerProvider: &LoggerProvider{}, + Propagator: &Propagator{ + Composite: []string{"b3"}, + }, }), }, wantTracerProvider: &sdktrace.TracerProvider{}, wantMeterProvider: &sdkmetric.MeterProvider{}, wantLoggerProvider: &sdklog.LoggerProvider{}, - wantPropagators: propagation.NewCompositeTextMapPropagator(), + wantPropagators: b3.New(), }, { name: "with-sdk-disabled", @@ -75,13 +79,15 @@ func TestNewSDK(t *testing.T) { }, } for _, tt := range tests { - sdk, err := NewSDK(tt.cfg...) - require.Equal(t, tt.wantErr, err) - assert.IsType(t, tt.wantTracerProvider, sdk.TracerProvider()) - assert.IsType(t, tt.wantMeterProvider, sdk.MeterProvider()) - assert.IsType(t, tt.wantLoggerProvider, sdk.LoggerProvider()) - assert.Equal(t, tt.wantPropagators, sdk.Propagator()) - require.Equal(t, tt.wantShutdownErr, sdk.Shutdown(context.Background())) + t.Run(tt.name, func(t *testing.T) { + sdk, err := NewSDK(tt.cfg...) + require.Equal(t, tt.wantErr, err) + assert.IsType(t, tt.wantTracerProvider, sdk.TracerProvider()) + assert.IsType(t, tt.wantMeterProvider, sdk.MeterProvider()) + assert.IsType(t, tt.wantLoggerProvider, sdk.LoggerProvider()) + assert.Equal(t, tt.wantPropagators, sdk.Propagator()) + require.Equal(t, tt.wantShutdownErr, sdk.Shutdown(context.Background())) + }) } } From 4cc8205fb7e0a07e05152eaf7a6112d3f665c9c5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Juraci=20Paix=C3=A3o=20Kr=C3=B6hling?= Date: Fri, 7 Feb 2025 14:16:47 +0100 Subject: [PATCH 08/12] str pointers MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Juraci Paixão Kröhling --- config/v0.3.0/config_test.go | 4 ++-- config/v0.3.0/generated_config.go | 2 +- config/v0.3.0/propagation.go | 9 ++++++++- config/v0.3.0/propagation_test.go | 22 +++++++++++----------- 4 files changed, 22 insertions(+), 15 deletions(-) diff --git a/config/v0.3.0/config_test.go b/config/v0.3.0/config_test.go index 1c1f9423fd7..ccbd71bd271 100644 --- a/config/v0.3.0/config_test.go +++ b/config/v0.3.0/config_test.go @@ -52,7 +52,7 @@ func TestNewSDK(t *testing.T) { MeterProvider: &MeterProvider{}, LoggerProvider: &LoggerProvider{}, Propagator: &Propagator{ - Composite: []string{"b3"}, + Composite: []*string{ptr("b3")}, }, }), }, @@ -297,7 +297,7 @@ var v03OpenTelemetryConfig = OpenTelemetryConfiguration{ }, }, Propagator: &Propagator{ - Composite: []string{"tracecontext", "baggage", "b3", "b3multi", "jaeger", "xray", "ottrace"}, + Composite: []*string{ptr("tracecontext"), ptr("baggage"), ptr("b3"), ptr("b3multi"), ptr("jaeger"), ptr("xray"), ptr("ottrace")}, }, Resource: &Resource{ Attributes: []AttributeNameValue{ diff --git a/config/v0.3.0/generated_config.go b/config/v0.3.0/generated_config.go index 5fc0acfd2ce..8fe7310e9de 100644 --- a/config/v0.3.0/generated_config.go +++ b/config/v0.3.0/generated_config.go @@ -395,7 +395,7 @@ type Prometheus struct { type Propagator struct { // Composite corresponds to the JSON schema field "composite". - Composite []string `json:"composite,omitempty" yaml:"composite,omitempty" mapstructure:"composite,omitempty"` + Composite []*string `json:"composite,omitempty" yaml:"composite,omitempty" mapstructure:"composite,omitempty"` AdditionalProperties interface{} `mapstructure:",remain"` } diff --git a/config/v0.3.0/propagation.go b/config/v0.3.0/propagation.go index 2db37e8baec..44c640eeb8a 100644 --- a/config/v0.3.0/propagation.go +++ b/config/v0.3.0/propagation.go @@ -13,5 +13,12 @@ func propagator(cfg configOptions) (propagation.TextMapPropagator, error) { return autoprop.NewTextMapPropagator(), nil } - return autoprop.TextMapPropagator(cfg.opentelemetryConfig.Propagator.Composite...) + names := make([]string, 0, len(cfg.opentelemetryConfig.Propagator.Composite)) + for _, name := range cfg.opentelemetryConfig.Propagator.Composite { + if name != nil && *name != "" { + names = append(names, *name) + } + } + + return autoprop.TextMapPropagator(names...) } diff --git a/config/v0.3.0/propagation_test.go b/config/v0.3.0/propagation_test.go index 1d9e9f8372f..8de9568accb 100644 --- a/config/v0.3.0/propagation_test.go +++ b/config/v0.3.0/propagation_test.go @@ -38,7 +38,7 @@ func TestPropagator(t *testing.T) { cfg: configOptions{ opentelemetryConfig: OpenTelemetryConfiguration{ Propagator: &Propagator{ - Composite: []string{"tracecontext"}, + Composite: []*string{ptr("tracecontext")}, }, }, }, @@ -50,7 +50,7 @@ func TestPropagator(t *testing.T) { cfg: configOptions{ opentelemetryConfig: OpenTelemetryConfiguration{ Propagator: &Propagator{ - Composite: []string{"baggage"}, + Composite: []*string{ptr("baggage")}, }, }, }, @@ -62,7 +62,7 @@ func TestPropagator(t *testing.T) { cfg: configOptions{ opentelemetryConfig: OpenTelemetryConfiguration{ Propagator: &Propagator{ - Composite: []string{"b3"}, + Composite: []*string{ptr("b3")}, }, }, }, @@ -74,7 +74,7 @@ func TestPropagator(t *testing.T) { cfg: configOptions{ opentelemetryConfig: OpenTelemetryConfiguration{ Propagator: &Propagator{ - Composite: []string{"b3multi"}, + Composite: []*string{ptr("b3multi")}, }, }, }, @@ -86,7 +86,7 @@ func TestPropagator(t *testing.T) { cfg: configOptions{ opentelemetryConfig: OpenTelemetryConfiguration{ Propagator: &Propagator{ - Composite: []string{"jaeger"}, + Composite: []*string{ptr("jaeger")}, }, }, }, @@ -98,7 +98,7 @@ func TestPropagator(t *testing.T) { cfg: configOptions{ opentelemetryConfig: OpenTelemetryConfiguration{ Propagator: &Propagator{ - Composite: []string{"xray"}, + Composite: []*string{ptr("xray")}, }, }, }, @@ -110,7 +110,7 @@ func TestPropagator(t *testing.T) { cfg: configOptions{ opentelemetryConfig: OpenTelemetryConfiguration{ Propagator: &Propagator{ - Composite: []string{"ottrace"}, + Composite: []*string{ptr("ottrace")}, }, }, }, @@ -122,7 +122,7 @@ func TestPropagator(t *testing.T) { cfg: configOptions{ opentelemetryConfig: OpenTelemetryConfiguration{ Propagator: &Propagator{ - Composite: []string{"tracecontext", "baggage", "b3"}, + Composite: []*string{ptr("tracecontext"), ptr("baggage"), ptr("b3")}, }, }, }, @@ -134,7 +134,7 @@ func TestPropagator(t *testing.T) { cfg: configOptions{ opentelemetryConfig: OpenTelemetryConfiguration{ Propagator: &Propagator{ - Composite: []string{}, + Composite: []*string{}, }, }, }, @@ -146,7 +146,7 @@ func TestPropagator(t *testing.T) { cfg: configOptions{ opentelemetryConfig: OpenTelemetryConfiguration{ Propagator: &Propagator{ - Composite: []string{"", "tracecontext"}, + Composite: []*string{nil, ptr("tracecontext")}, }, }, }, @@ -158,7 +158,7 @@ func TestPropagator(t *testing.T) { cfg: configOptions{ opentelemetryConfig: OpenTelemetryConfiguration{ Propagator: &Propagator{ - Composite: []string{"unknown"}, + Composite: []*string{ptr("unknown")}, }, }, }, From c6af81b38ddfd65b86092c518a670f7a130d7ee9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Juraci=20Paix=C3=A3o=20Kr=C3=B6hling?= Date: Sat, 15 Feb 2025 13:15:21 +0100 Subject: [PATCH 09/12] revert changes to propagators MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Juraci Paixão Kröhling --- propagators/autoprop/propagator_test.go | 15 --------------- propagators/autoprop/registry.go | 7 ------- 2 files changed, 22 deletions(-) diff --git a/propagators/autoprop/propagator_test.go b/propagators/autoprop/propagator_test.go index cde1896d50a..dcb17cd1372 100644 --- a/propagators/autoprop/propagator_test.go +++ b/propagators/autoprop/propagator_test.go @@ -8,7 +8,6 @@ import ( "testing" "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" "go.opentelemetry.io/otel" "go.opentelemetry.io/otel/propagation" @@ -35,20 +34,6 @@ func TestNewTextMapPropagatorDefault(t *testing.T) { assert.ElementsMatch(t, expect, NewTextMapPropagator().Fields()) } -func TestEmptyElementIsIgnored(t *testing.T) { - in := []string{"", "tracecontext"} - p, err := TextMapPropagator(in...) - require.NoError(t, err) - assert.Equal(t, propagation.TraceContext{}, p) -} - -func TestEmptyElementSet(t *testing.T) { - in := []string{} - p, err := TextMapPropagator(in...) - require.NoError(t, err) - assert.Equal(t, propagation.NewCompositeTextMapPropagator(propagation.TraceContext{}, propagation.Baggage{}), p) -} - type ptrNoop struct{} func (*ptrNoop) Inject(context.Context, propagation.TextMapCarrier) {} diff --git a/propagators/autoprop/registry.go b/propagators/autoprop/registry.go index e3f6d3edb9d..2cb365aa059 100644 --- a/propagators/autoprop/registry.go +++ b/propagators/autoprop/registry.go @@ -124,14 +124,7 @@ func TextMapPropagator(names ...string) (propagation.TextMapPropagator, error) { unknown []string ) - if len(names) == 0 { - return NewTextMapPropagator(), nil - } - for _, name := range names { - if len(name) == 0 { - continue - } if name == none { // If "none" is passed in combination with any other propagator, // the result still needs to be a no-op propagator. Therefore, From e40d6df361937162fe3fdd5b80b9614922d1921b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Juraci=20Paix=C3=A3o=20Kr=C3=B6hling?= Date: Sat, 15 Feb 2025 13:32:07 +0100 Subject: [PATCH 10/12] crosslink and be more strict with nil/empty MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Juraci Paixão Kröhling --- config/go.mod | 9 ++++++++- config/v0.3.0/propagation.go | 23 ++++++++++++++++++++--- config/v0.3.0/propagation_test.go | 4 ++-- 3 files changed, 30 insertions(+), 6 deletions(-) diff --git a/config/go.mod b/config/go.mod index 4d73ae7821b..dc8c33d3e92 100644 --- a/config/go.mod +++ b/config/go.mod @@ -58,5 +58,12 @@ require ( google.golang.org/protobuf v1.36.5 // indirect ) -// remove after v0.59.0 of autoprop replace go.opentelemetry.io/contrib/propagators/autoprop => ../propagators/autoprop + +replace go.opentelemetry.io/contrib/propagators/jaeger => ../propagators/jaeger + +replace go.opentelemetry.io/contrib/propagators/b3 => ../propagators/b3 + +replace go.opentelemetry.io/contrib/propagators/aws => ../propagators/aws + +replace go.opentelemetry.io/contrib/propagators/ot => ../propagators/ot diff --git a/config/v0.3.0/propagation.go b/config/v0.3.0/propagation.go index 44c640eeb8a..700981f51cd 100644 --- a/config/v0.3.0/propagation.go +++ b/config/v0.3.0/propagation.go @@ -4,20 +4,37 @@ package config // import "go.opentelemetry.io/contrib/config/v0.3.0" import ( + "errors" + "go.opentelemetry.io/contrib/propagators/autoprop" "go.opentelemetry.io/otel/propagation" ) +var ( + errInvalidPropagatorEmpty = errors.New("invalid propagator name: empty") + errInvalidPropagatorNil = errors.New("invalid propagator name: nil") +) + func propagator(cfg configOptions) (propagation.TextMapPropagator, error) { if cfg.opentelemetryConfig.Propagator == nil { return autoprop.NewTextMapPropagator(), nil } - names := make([]string, 0, len(cfg.opentelemetryConfig.Propagator.Composite)) + n := len(cfg.opentelemetryConfig.Propagator.Composite) + if n == 0 { + return autoprop.NewTextMapPropagator(), nil + } + + names := make([]string, 0, n) for _, name := range cfg.opentelemetryConfig.Propagator.Composite { - if name != nil && *name != "" { - names = append(names, *name) + if name == nil { + return nil, errInvalidPropagatorNil } + if *name == "" { + return nil, errInvalidPropagatorEmpty + } + + names = append(names, *name) } return autoprop.TextMapPropagator(names...) diff --git a/config/v0.3.0/propagation_test.go b/config/v0.3.0/propagation_test.go index 8de9568accb..82cd316da72 100644 --- a/config/v0.3.0/propagation_test.go +++ b/config/v0.3.0/propagation_test.go @@ -150,8 +150,8 @@ func TestPropagator(t *testing.T) { }, }, }, - want: propagation.TraceContext{}, - wantErr: false, + want: nil, + wantErr: true, }, { name: "unsupported propagator", From 7a9f1161583dc72d6207f9aff4256d3eb5907db8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Juraci=20Paix=C3=A3o=20Kr=C3=B6hling?= Date: Sat, 15 Feb 2025 15:56:20 +0100 Subject: [PATCH 11/12] go.sum MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Juraci Paixão Kröhling --- config/go.sum | 8 -------- 1 file changed, 8 deletions(-) diff --git a/config/go.sum b/config/go.sum index edbef147807..0c9d7467e4f 100644 --- a/config/go.sum +++ b/config/go.sum @@ -45,14 +45,6 @@ github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOf github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA= go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A= -go.opentelemetry.io/contrib/propagators/aws v1.34.0 h1:pv/Yi44N2BM1Kyl6wxO6bTiwcxUA7Deog3Rc7NO9ITE= -go.opentelemetry.io/contrib/propagators/aws v1.34.0/go.mod h1:1aF3HFtAyIi+B2xJHOdKQcNz+bcDS+JLAZjsohcW1P4= -go.opentelemetry.io/contrib/propagators/b3 v1.34.0 h1:9pQdCEvV/6RWQmag94D6rhU+A4rzUhYBEJ8bpscx5p8= -go.opentelemetry.io/contrib/propagators/b3 v1.34.0/go.mod h1:FwM71WS8i1/mAK4n48t0KU6qUS/OZRBgDrHZv3RlJ+w= -go.opentelemetry.io/contrib/propagators/jaeger v1.34.0 h1:D3htJISCUU/wOVlKwisVKancWm+2U4h9xDEaiMkiyRE= -go.opentelemetry.io/contrib/propagators/jaeger v1.34.0/go.mod h1:DAX1bsj+uDm2ZuOQH/RgZRx7RQZWyzV5W2WR/0UX8JA= -go.opentelemetry.io/contrib/propagators/ot v1.34.0 h1:fcA0FMvHmco/mjXbmRoNx9IRs6+UuRVyXhMHzP+pEc8= -go.opentelemetry.io/contrib/propagators/ot v1.34.0/go.mod h1:VvybuUSU0G7m9DLza4YX8KKniYlIphI+mZ6ufkaV1m8= go.opentelemetry.io/otel v1.34.0 h1:zRLXxLCgL1WyKsPVrgbSdMN4c0FMkDAskSTQP+0hdUY= go.opentelemetry.io/otel v1.34.0/go.mod h1:OWFPOQ+h4G8xpyjgqo4SxJYdDQ/qmRH+wivy7zzx9oI= go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.10.0 h1:5dTKu4I5Dn4P2hxyW3l3jTaZx9ACgg0ECos1eAVrheY= From b61af118717bfe3f450c88d6c46d8e6851961309 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Juraci=20Paix=C3=A3o=20Kr=C3=B6hling?= Date: Tue, 18 Feb 2025 11:01:31 +0100 Subject: [PATCH 12/12] review comments MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Juraci Paixão Kröhling --- config/v0.3.0/config.go | 4 ++-- config/v0.3.0/propagation_test.go | 12 ++++++++++++ 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/config/v0.3.0/config.go b/config/v0.3.0/config.go index 069349387fb..e9e49d58002 100644 --- a/config/v0.3.0/config.go +++ b/config/v0.3.0/config.go @@ -94,7 +94,7 @@ func NewSDK(opts ...ConfigurationOption) (SDK, error) { return noopSDK, nil } - propagator, err := propagator(o) + prop, err := propagator(o) if err != nil { return noopSDK, err } @@ -120,7 +120,7 @@ func NewSDK(opts ...ConfigurationOption) (SDK, error) { meterProvider: mp, tracerProvider: tp, loggerProvider: lp, - propagator: propagator, + propagator: prop, shutdown: func(ctx context.Context) error { return errors.Join(mpShutdown(ctx), tpShutdown(ctx), lpShutdown(ctx)) }, diff --git a/config/v0.3.0/propagation_test.go b/config/v0.3.0/propagation_test.go index 82cd316da72..0ff9bf61ca9 100644 --- a/config/v0.3.0/propagation_test.go +++ b/config/v0.3.0/propagation_test.go @@ -141,6 +141,18 @@ func TestPropagator(t *testing.T) { want: propagation.NewCompositeTextMapPropagator(propagation.TraceContext{}, propagation.Baggage{}), wantErr: false, }, + { + name: "empty propagator name", + cfg: configOptions{ + opentelemetryConfig: OpenTelemetryConfiguration{ + Propagator: &Propagator{ + Composite: []*string{ptr(""), ptr("tracecontext")}, + }, + }, + }, + want: nil, + wantErr: true, + }, { name: "nil propagator name", cfg: configOptions{