Skip to content

Commit

Permalink
config: add support for configuring propagators
Browse files Browse the repository at this point in the history
  • Loading branch information
jpkrohling committed Feb 7, 2025
1 parent d21dd87 commit e083744
Show file tree
Hide file tree
Showing 6 changed files with 279 additions and 0 deletions.
5 changes: 5 additions & 0 deletions config/go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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.34.0 // indirect
golang.org/x/sys v0.30.0 // indirect
golang.org/x/text v0.22.0 // indirect
Expand Down
10 changes: 10 additions & 0 deletions config/go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -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=
Expand Down Expand Up @@ -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.34.0 h1:Mb7Mrk043xzHgnRM88suvJFwzVrRfHEHJEl5/71CKw0=
golang.org/x/net v0.34.0/go.mod h1:di0qlW3YNM5oh6GqDGQr92MyTozJPmybPK4Ev/Gm31k=
golang.org/x/sys v0.30.0 h1:QjkSwP/36a20jFYWkSue1YwXzLmsV5Gfq7Eiy72C1uc=
Expand Down
14 changes: 14 additions & 0 deletions config/v0.3.0/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -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"
)
Expand Down Expand Up @@ -46,6 +47,7 @@ type SDK struct {
meterProvider metric.MeterProvider
tracerProvider trace.TracerProvider
loggerProvider log.LoggerProvider
propagator propagation.TextMapPropagator
shutdown shutdownFunc
}

Expand All @@ -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)
Expand All @@ -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 },
}

Expand Down Expand Up @@ -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))
},
Expand Down
2 changes: 2 additions & 0 deletions config/v0.3.0/config_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ func TestNewSDK(t *testing.T) {
wantTracerProvider any
wantMeterProvider any
wantLoggerProvider any
wantPropagators any
wantErr error
wantShutdownErr error
}{
Expand Down Expand Up @@ -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()))
}
}
Expand Down
65 changes: 65 additions & 0 deletions config/v0.3.0/propagation.go
Original file line number Diff line number Diff line change
@@ -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")
}
}
183 changes: 183 additions & 0 deletions config/v0.3.0/propagation_test.go
Original file line number Diff line number Diff line change
@@ -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
}

0 comments on commit e083744

Please sign in to comment.