Skip to content

Commit e80645b

Browse files
authored
[query] Move trace handler to server level (#6147)
## Which problem is this PR solving? - Resolves #6141 ## Description of the changes - Move the trace response handler to the server level so that it is applied to the whole server rather than just within the API handler. ## How was this change tested? - Unit test ## Checklist - [x] I have read https://github.com/jaegertracing/jaeger/blob/master/CONTRIBUTING_GUIDELINES.md - [x] I have signed all commits - [x] I have added unit tests for the new functionality - [x] I have run lint and test steps successfully - for `jaeger`: `make lint test` - for `jaeger-ui`: `yarn lint` and `yarn test` --------- Signed-off-by: Mahad Zaryab <[email protected]>
1 parent 43d2367 commit e80645b

File tree

4 files changed

+69
-17
lines changed

4 files changed

+69
-17
lines changed

cmd/query/app/http_handler.go

Lines changed: 0 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@ import (
1818
"github.com/gogo/protobuf/proto"
1919
"github.com/gorilla/mux"
2020
"go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp"
21-
"go.opentelemetry.io/otel/propagation"
2221
"go.opentelemetry.io/otel/trace"
2322
"go.uber.org/zap"
2423

@@ -132,7 +131,6 @@ func (aH *APIHandler) handleFunc(
132131
) *mux.Route {
133132
route := aH.formatRoute(routeFmt, args...)
134133
var handler http.Handler = http.HandlerFunc(f)
135-
handler = traceResponseHandler(handler)
136134
handler = otelhttp.WithRouteTag(route, handler)
137135
handler = spanNameHandler(route, handler)
138136
return router.HandleFunc(route, handler.ServeHTTP)
@@ -517,21 +515,6 @@ func (aH *APIHandler) writeJSON(w http.ResponseWriter, r *http.Request, response
517515
}
518516
}
519517

520-
// Returns a handler that generates a traceresponse header.
521-
// https://github.com/w3c/trace-context/blob/main/spec/21-http_response_header_format.md
522-
func traceResponseHandler(handler http.Handler) http.Handler {
523-
// We use the standard TraceContext propagator, since the formats are identical.
524-
// But the propagator uses "traceparent" header name, so we inject it into a map
525-
// `carrier` and then use the result to set the "tracereponse" header.
526-
var prop propagation.TraceContext
527-
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
528-
carrier := make(map[string]string)
529-
prop.Inject(r.Context(), propagation.MapCarrier(carrier))
530-
w.Header().Add("traceresponse", carrier["traceparent"])
531-
handler.ServeHTTP(w, r)
532-
})
533-
}
534-
535518
func spanNameHandler(spanName string, handler http.Handler) http.Handler {
536519
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
537520
span := trace.SpanFromContext(r.Context())

cmd/query/app/server.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -201,6 +201,7 @@ func initRouter(
201201
if tenancyMgr.Enabled {
202202
handler = tenancy.ExtractTenantHTTPHandler(tenancyMgr, handler)
203203
}
204+
handler = traceResponseHandler(handler)
204205
return handler, staticHandlerCloser
205206
}
206207

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
// Copyright (c) 2024 The Jaeger Authors.
2+
// SPDX-License-Identifier: Apache-2.0
3+
4+
package app
5+
6+
import (
7+
"net/http"
8+
9+
"go.opentelemetry.io/otel/propagation"
10+
)
11+
12+
// Returns a handler that generates a traceresponse header.
13+
// https://github.com/w3c/trace-context/blob/main/spec/21-http_response_header_format.md
14+
func traceResponseHandler(handler http.Handler) http.Handler {
15+
// We use the standard TraceContext propagator, since the formats are identical.
16+
// But the propagator uses "traceparent" header name, so we inject it into a map
17+
// `carrier` and then use the result to set the "tracereponse" header.
18+
var prop propagation.TraceContext
19+
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
20+
carrier := make(map[string]string)
21+
prop.Inject(r.Context(), propagation.MapCarrier(carrier))
22+
w.Header().Add("traceresponse", carrier["traceparent"])
23+
handler.ServeHTTP(w, r)
24+
})
25+
}
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
// Copyright (c) 2024 The Jaeger Authors.
2+
// SPDX-License-Identifier: Apache-2.0
3+
4+
package app
5+
6+
import (
7+
"context"
8+
"net/http"
9+
"net/http/httptest"
10+
"strings"
11+
"testing"
12+
13+
"github.com/stretchr/testify/require"
14+
"go.opentelemetry.io/otel/sdk/trace"
15+
"go.opentelemetry.io/otel/sdk/trace/tracetest"
16+
)
17+
18+
func TestTraceResponseHandler(t *testing.T) {
19+
emptyHandler := http.HandlerFunc(func(w http.ResponseWriter, _ *http.Request) {
20+
w.Write([]byte{})
21+
})
22+
handler := traceResponseHandler(emptyHandler)
23+
24+
exporter := tracetest.NewInMemoryExporter()
25+
tracerProvider := trace.NewTracerProvider(
26+
trace.WithSyncer(exporter),
27+
trace.WithSampler(trace.AlwaysSample()),
28+
)
29+
tracer := tracerProvider.Tracer("test-tracer")
30+
ctx, span := tracer.Start(context.Background(), "test-span")
31+
defer span.End()
32+
33+
req, err := http.NewRequestWithContext(ctx, http.MethodGet, "http://localhost:8080", nil)
34+
require.NoError(t, err)
35+
36+
w := httptest.NewRecorder()
37+
38+
handler.ServeHTTP(w, req)
39+
40+
traceResponse := w.Header().Get("traceresponse")
41+
parts := strings.Split(traceResponse, "-")
42+
require.Len(t, parts, 4)
43+
}

0 commit comments

Comments
 (0)