From e22b510cd892fc4fb91beb45df9479ed24cc07c4 Mon Sep 17 00:00:00 2001 From: Marcus Efraimsson Date: Wed, 2 Oct 2024 17:07:31 +0200 Subject: [PATCH] API Server: Fix extracting jaeger remote trace from incoming request (#93998) --- pkg/aggregator/go.mod | 2 +- pkg/aggregator/go.sum | 4 ++-- .../endpoints/filters/jaeger_tracing.go | 17 +++++++++++++++++ pkg/apiserver/go.mod | 3 ++- pkg/apiserver/go.sum | 2 ++ pkg/promlib/go.mod | 2 +- pkg/promlib/go.sum | 4 ++-- pkg/services/apiserver/builder/helper.go | 1 + 8 files changed, 28 insertions(+), 7 deletions(-) create mode 100644 pkg/apiserver/endpoints/filters/jaeger_tracing.go diff --git a/pkg/aggregator/go.mod b/pkg/aggregator/go.mod index f71917ffb66..c57a765062d 100644 --- a/pkg/aggregator/go.mod +++ b/pkg/aggregator/go.mod @@ -121,7 +121,7 @@ require ( go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.53.0 // indirect go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace v0.55.0 // indirect go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.55.0 // indirect - go.opentelemetry.io/contrib/propagators/jaeger v1.29.0 // indirect + go.opentelemetry.io/contrib/propagators/jaeger v1.30.0 // indirect go.opentelemetry.io/contrib/samplers/jaegerremote v0.23.0 // indirect go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.29.0 // indirect go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.29.0 // indirect diff --git a/pkg/aggregator/go.sum b/pkg/aggregator/go.sum index 2e636ea7f64..99753ff55f8 100644 --- a/pkg/aggregator/go.sum +++ b/pkg/aggregator/go.sum @@ -348,8 +348,8 @@ go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace v0. go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace v0.55.0/go.mod h1:rsg1EO8LXSs2po50PB5CeY/MSVlhghuKBgXlKnqm6ks= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.55.0 h1:ZIg3ZT/aQ7AfKqdwp7ECpOK6vHqquXXuyTjIO8ZdmPs= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.55.0/go.mod h1:DQAwmETtZV00skUwgD6+0U89g80NKsJE3DCKeLLPQMI= -go.opentelemetry.io/contrib/propagators/jaeger v1.29.0 h1:+YPiqF5rR6PqHBlmEFLPumbSP0gY0WmCGFayXRcCLvs= -go.opentelemetry.io/contrib/propagators/jaeger v1.29.0/go.mod h1:6PD7q7qquWSp3Z4HeM3e/2ipRubaY1rXZO8NIHVDZjs= +go.opentelemetry.io/contrib/propagators/jaeger v1.30.0 h1:g8+Y+7lnhH1DB0THjPPthzQ+RlzAntmTz8+TH2sRU0k= +go.opentelemetry.io/contrib/propagators/jaeger v1.30.0/go.mod h1:lRMaD/FjOQJ2yz/MwOHYxP/BTCMFodNW/wuYDkJvdA4= go.opentelemetry.io/contrib/samplers/jaegerremote v0.23.0 h1:qKi9ntCcronqWqfuKxqrxZlZd82jXJEgGiAWH1+phxo= go.opentelemetry.io/contrib/samplers/jaegerremote v0.23.0/go.mod h1:1kbAgQa5lgYC3rC6cE3jSxQ/Q13l33wv/WI8U+htwag= go.opentelemetry.io/otel v1.21.0/go.mod h1:QZzNPQPm1zLX4gZK4cMi+71eaorMSGT3A4znnUvNNEo= diff --git a/pkg/apiserver/endpoints/filters/jaeger_tracing.go b/pkg/apiserver/endpoints/filters/jaeger_tracing.go new file mode 100644 index 00000000000..444190976ed --- /dev/null +++ b/pkg/apiserver/endpoints/filters/jaeger_tracing.go @@ -0,0 +1,17 @@ +package filters + +import ( + "net/http" + + jaegerpropagator "go.opentelemetry.io/contrib/propagators/jaeger" + "go.opentelemetry.io/otel/propagation" +) + +// WithExtractJaegerTrace tries to extract remote trace/span from incoming request. +func WithExtractJaegerTrace(handler http.Handler) http.Handler { + return http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) { + propagator := jaegerpropagator.Jaeger{} + ctx := propagator.Extract(req.Context(), propagation.HeaderCarrier(req.Header)) + handler.ServeHTTP(w, req.WithContext(ctx)) + }) +} diff --git a/pkg/apiserver/go.mod b/pkg/apiserver/go.mod index 6e41f937b51..df18223a271 100644 --- a/pkg/apiserver/go.mod +++ b/pkg/apiserver/go.mod @@ -8,6 +8,8 @@ require ( github.com/grafana/grafana/pkg/apimachinery v0.0.0-20240701135906-559738ce6ae1 github.com/prometheus/client_golang v1.20.3 github.com/stretchr/testify v1.9.0 + go.opentelemetry.io/contrib/propagators/jaeger v1.30.0 + go.opentelemetry.io/otel v1.30.0 go.opentelemetry.io/otel/trace v1.30.0 k8s.io/apimachinery v0.31.0 k8s.io/apiserver v0.31.0 @@ -64,7 +66,6 @@ require ( go.etcd.io/etcd/client/v3 v3.5.14 // indirect go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.53.0 // indirect go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.55.0 // indirect - go.opentelemetry.io/otel v1.30.0 // indirect go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.29.0 // indirect go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.29.0 // indirect go.opentelemetry.io/otel/metric v1.30.0 // indirect diff --git a/pkg/apiserver/go.sum b/pkg/apiserver/go.sum index ae07c35d4b7..49e6ba493c6 100644 --- a/pkg/apiserver/go.sum +++ b/pkg/apiserver/go.sum @@ -192,6 +192,8 @@ go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.5 go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.53.0/go.mod h1:azvtTADFQJA8mX80jIH/akaE7h+dbm/sVuaHqN13w74= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.55.0 h1:ZIg3ZT/aQ7AfKqdwp7ECpOK6vHqquXXuyTjIO8ZdmPs= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.55.0/go.mod h1:DQAwmETtZV00skUwgD6+0U89g80NKsJE3DCKeLLPQMI= +go.opentelemetry.io/contrib/propagators/jaeger v1.30.0 h1:g8+Y+7lnhH1DB0THjPPthzQ+RlzAntmTz8+TH2sRU0k= +go.opentelemetry.io/contrib/propagators/jaeger v1.30.0/go.mod h1:lRMaD/FjOQJ2yz/MwOHYxP/BTCMFodNW/wuYDkJvdA4= go.opentelemetry.io/otel v1.30.0 h1:F2t8sK4qf1fAmY9ua4ohFS/K+FUuOPemHUIXHtktrts= go.opentelemetry.io/otel v1.30.0/go.mod h1:tFw4Br9b7fOS+uEao81PJjVMjW/5fvNCbpsDIXqP0pc= go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.29.0 h1:dIIDULZJpgdiHz5tXrTgKIMLkus6jEFa7x5SOKcyR7E= diff --git a/pkg/promlib/go.mod b/pkg/promlib/go.mod index 8d029b16294..aaf7c74f960 100644 --- a/pkg/promlib/go.mod +++ b/pkg/promlib/go.mod @@ -103,7 +103,7 @@ require ( github.com/zeebo/xxh3 v1.0.2 // indirect go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.53.0 // indirect go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace v0.55.0 // indirect - go.opentelemetry.io/contrib/propagators/jaeger v1.29.0 // indirect + go.opentelemetry.io/contrib/propagators/jaeger v1.30.0 // indirect go.opentelemetry.io/contrib/samplers/jaegerremote v0.23.0 // indirect go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.29.0 // indirect go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.29.0 // indirect diff --git a/pkg/promlib/go.sum b/pkg/promlib/go.sum index c7afbecfc64..62dd38a48aa 100644 --- a/pkg/promlib/go.sum +++ b/pkg/promlib/go.sum @@ -268,8 +268,8 @@ go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace v0. go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace v0.55.0/go.mod h1:rsg1EO8LXSs2po50PB5CeY/MSVlhghuKBgXlKnqm6ks= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.55.0 h1:ZIg3ZT/aQ7AfKqdwp7ECpOK6vHqquXXuyTjIO8ZdmPs= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.55.0/go.mod h1:DQAwmETtZV00skUwgD6+0U89g80NKsJE3DCKeLLPQMI= -go.opentelemetry.io/contrib/propagators/jaeger v1.29.0 h1:+YPiqF5rR6PqHBlmEFLPumbSP0gY0WmCGFayXRcCLvs= -go.opentelemetry.io/contrib/propagators/jaeger v1.29.0/go.mod h1:6PD7q7qquWSp3Z4HeM3e/2ipRubaY1rXZO8NIHVDZjs= +go.opentelemetry.io/contrib/propagators/jaeger v1.30.0 h1:g8+Y+7lnhH1DB0THjPPthzQ+RlzAntmTz8+TH2sRU0k= +go.opentelemetry.io/contrib/propagators/jaeger v1.30.0/go.mod h1:lRMaD/FjOQJ2yz/MwOHYxP/BTCMFodNW/wuYDkJvdA4= go.opentelemetry.io/contrib/samplers/jaegerremote v0.23.0 h1:qKi9ntCcronqWqfuKxqrxZlZd82jXJEgGiAWH1+phxo= go.opentelemetry.io/contrib/samplers/jaegerremote v0.23.0/go.mod h1:1kbAgQa5lgYC3rC6cE3jSxQ/Q13l33wv/WI8U+htwag= go.opentelemetry.io/otel v1.21.0/go.mod h1:QZzNPQPm1zLX4gZK4cMi+71eaorMSGT3A4znnUvNNEo= diff --git a/pkg/services/apiserver/builder/helper.go b/pkg/services/apiserver/builder/helper.go index 1b7358cdd71..fd2a0e2fab9 100644 --- a/pkg/services/apiserver/builder/helper.go +++ b/pkg/services/apiserver/builder/helper.go @@ -84,6 +84,7 @@ func getDefaultBuildHandlerChainFunc(builders []APIGroupBuilder) BuildHandlerCha handler = filters.WithAcceptHeader(handler) handler = filters.WithPathRewriters(handler, PathRewriters) handler = k8stracing.WithTracing(handler, c.TracerProvider, "KubernetesAPI") + handler = filters.WithExtractJaegerTrace(handler) // Configure filters.WithPanicRecovery to not crash on panic utilruntime.ReallyCrash = false