diff --git a/packages/api/main.go b/packages/api/main.go index 424eee22a4..ca4fa3fea7 100644 --- a/packages/api/main.go +++ b/packages/api/main.go @@ -164,6 +164,7 @@ func NewGinServer(ctx context.Context, config cfg.Config, tel *telemetry.Client, "sdk_runtime", "system", } + corsConfig.AllowHeaders = append(corsConfig.AllowHeaders, telemetry.ContextPropagationHeaders()...) r.Use(cors.New(corsConfig)) // Create a team API Key auth validator diff --git a/packages/dashboard-api/main.go b/packages/dashboard-api/main.go index f6090d69da..f1948464d3 100644 --- a/packages/dashboard-api/main.go +++ b/packages/dashboard-api/main.go @@ -187,6 +187,7 @@ func run() int { sharedauth.HeaderSupabaseToken, sharedauth.HeaderSupabaseTeam, } + corsConfig.AllowHeaders = append(corsConfig.AllowHeaders, telemetry.ContextPropagationHeaders()...) r.Use(cors.New(corsConfig)) r.Use( diff --git a/packages/shared/pkg/middleware/otel/tracing/middleware.go b/packages/shared/pkg/middleware/otel/tracing/middleware.go index c25d0daf8e..acd06153a1 100644 --- a/packages/shared/pkg/middleware/otel/tracing/middleware.go +++ b/packages/shared/pkg/middleware/otel/tracing/middleware.go @@ -25,7 +25,9 @@ import ( "github.com/gin-gonic/gin" "go.opentelemetry.io/contrib/instrumentation/github.com/gin-gonic/gin/otelgin" + "go.opentelemetry.io/otel" "go.opentelemetry.io/otel/attribute" + "go.opentelemetry.io/otel/propagation" semconv "go.opentelemetry.io/otel/semconv/v1.12.0" oteltrace "go.opentelemetry.io/otel/trace" @@ -73,20 +75,17 @@ func Middleware(tracerProvider oteltrace.TracerProvider, service string) gin.Han return func(c *gin.Context) { c.Set(tracerKey, tracer) - ctx := c.Request.Context() + savedCtx := c.Request.Context() + ctx := otel.GetTextMapPropagator().Extract(savedCtx, propagation.HeaderCarrier(c.Request.Header)) // Store the server receive time as the request start time // This allows us to calculate the whole request duration from server receive to completion ctx = WithRequestStartTime(ctx, time.Now()) defer func() { - c.Request = c.Request.WithContext(ctx) + c.Request = c.Request.WithContext(savedCtx) }() - // Remove traceparent (it's coming from our users and it can cause multiple calls share the same trace ID) - if c.Request.Header.Get("traceparent") != "" { - c.Request.Header.Del("traceparent") - } if edgeTraceID, ok := telemetry.ParseEdgeTraceID( c.Request.Header.Get(telemetry.GCPTraceContextHeader), c.Request.Header.Get(telemetry.AWSTraceContextHeader), diff --git a/packages/shared/pkg/telemetry/traces.go b/packages/shared/pkg/telemetry/traces.go index bebbeefed9..7d51b1e4ac 100644 --- a/packages/shared/pkg/telemetry/traces.go +++ b/packages/shared/pkg/telemetry/traces.go @@ -12,6 +12,8 @@ import ( "google.golang.org/grpc/encoding/gzip" ) +var contextPropagationHeaders = NewTextPropagator().Fields() + type noopSpanExporter struct{} // ExportSpans handles export of spans by dropping them. @@ -56,3 +58,7 @@ func NewTracerProvider(spanExporter sdktrace.SpanExporter, res *resource.Resourc func NewTextPropagator() propagation.TextMapPropagator { return propagation.NewCompositeTextMapPropagator(propagation.TraceContext{}, propagation.Baggage{}) } + +func ContextPropagationHeaders() []string { + return append([]string(nil), contextPropagationHeaders...) +}