diff --git a/pkg/tracing/tracing.go b/pkg/tracing/tracing.go index 5ac07bf9e..76a3d3302 100644 --- a/pkg/tracing/tracing.go +++ b/pkg/tracing/tracing.go @@ -151,7 +151,7 @@ func (t *Tracer) Start(ctx context.Context, spanName string, opts ...trace.SpanS spanCtx, span := t.Tracer.Start(ctx, spanName, opts...) - wrappedSpan := &Span{Span: span, tracerProvider: &TracerProvider{tracer: t}} + wrappedSpan := &Span{Span: span, tracerProvider: &TracerProvider{TracerProvider: span.TracerProvider(), tracer: t}} return trace.ContextWithSpan(spanCtx, wrappedSpan), wrappedSpan } diff --git a/pkg/tracing/tracing_test.go b/pkg/tracing/tracing_test.go index b5e0d9b02..b4d92dca8 100644 --- a/pkg/tracing/tracing_test.go +++ b/pkg/tracing/tracing_test.go @@ -2,6 +2,7 @@ package tracing import ( "compress/gzip" + "context" "encoding/json" "io" "net/http" @@ -392,3 +393,25 @@ func TestTracing(t *testing.T) { }) } } + +// TestTracerProvider ensures that Tracer returns a valid TracerProvider +// when using the default Traefik Tracer and a custom one. +func TestTracerProvider(t *testing.T) { + t.Parallel() + + otlpConfig := &types.OTelTracing{} + otlpConfig.SetDefaults() + + config := &static.Tracing{OTLP: otlpConfig} + tracer, closer, err := NewTracing(config) + if err != nil { + t.Fatal(err) + } + closer.Close() + + _, span := tracer.Start(context.Background(), "test") + defer span.End() + + span.TracerProvider().Tracer("github.com/traefik/traefik") + span.TracerProvider().Tracer("other") +}