Skip to content

Commit 5fd64e0

Browse files
syn-zhuclaude
andcommitted
fix: address review feedback for trace context propagation
- Remove unnecessary set_global_textmap override in Python tracing setup; the OTEL SDK already configures TraceContext + W3CBaggage propagators by default. - Move trace header context utilities (TraceHeadersFrom/To) from go/core/pkg/auth into go/core/internal/tracecontext, since they are unrelated to auth. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> Signed-off-by: Simon Zhu <simon.zhu@mongodb.com>
1 parent 11c4d7e commit 5fd64e0

4 files changed

Lines changed: 27 additions & 26 deletions

File tree

go/core/internal/httpserver/auth/authn.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import (
66
"net/http"
77
"net/url"
88

9+
"github.com/kagent-dev/kagent/go/core/internal/tracecontext"
910
"github.com/kagent-dev/kagent/go/core/pkg/auth"
1011
"k8s.io/apimachinery/pkg/types"
1112
)
@@ -81,7 +82,7 @@ func (p *A2AAuthenticator) Wrap(next http.Handler) http.Handler {
8182
if ts := r.Header.Get("tracestate"); ts != "" {
8283
traceHeaders.Set("tracestate", ts)
8384
}
84-
r = r.WithContext(auth.TraceHeadersTo(r.Context(), traceHeaders))
85+
r = r.WithContext(tracecontext.HeadersTo(r.Context(), traceHeaders))
8586
}
8687
authn.ServeHTTP(w, r)
8788
})
@@ -122,7 +123,7 @@ func A2ARequestHandler(authProvider auth.AuthProvider, agentNns types.Namespaced
122123
}
123124

124125
// Propagate W3C trace context headers captured from the incoming request.
125-
if traceHeaders, ok := auth.TraceHeadersFrom(ctx); ok {
126+
if traceHeaders, ok := tracecontext.HeadersFrom(ctx); ok {
126127
for key, values := range traceHeaders {
127128
for _, v := range values {
128129
req.Header.Set(key, v)
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package tracecontext
2+
3+
import (
4+
"context"
5+
"net/http"
6+
)
7+
8+
type traceHeadersKeyType struct{}
9+
10+
var traceHeadersKey = traceHeadersKeyType{}
11+
12+
// HeadersFrom retrieves W3C trace context headers (traceparent, tracestate)
13+
// that were captured from an incoming request.
14+
func HeadersFrom(ctx context.Context) (http.Header, bool) {
15+
v, ok := ctx.Value(traceHeadersKey).(http.Header)
16+
return v, ok && v != nil
17+
}
18+
19+
// HeadersTo stores W3C trace context headers in the context so they can
20+
// be propagated to outgoing requests (e.g., from the controller to agent pods).
21+
func HeadersTo(ctx context.Context, headers http.Header) context.Context {
22+
return context.WithValue(ctx, traceHeadersKey, headers)
23+
}

go/core/pkg/auth/auth.go

Lines changed: 1 addition & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -58,12 +58,8 @@ type Authorizer interface {
5858
// context utils
5959

6060
type sessionKeyType struct{}
61-
type traceHeadersKeyType struct{}
6261

63-
var (
64-
sessionKey = sessionKeyType{}
65-
traceHeadersKey = traceHeadersKeyType{}
66-
)
62+
var sessionKey = sessionKeyType{}
6763

6864
func AuthSessionFrom(ctx context.Context) (Session, bool) {
6965
v, ok := ctx.Value(sessionKey).(Session)
@@ -74,19 +70,6 @@ func AuthSessionTo(ctx context.Context, session Session) context.Context {
7470
return context.WithValue(ctx, sessionKey, session)
7571
}
7672

77-
// TraceHeadersFrom retrieves W3C trace context headers (traceparent, tracestate)
78-
// that were captured from an incoming request.
79-
func TraceHeadersFrom(ctx context.Context) (http.Header, bool) {
80-
v, ok := ctx.Value(traceHeadersKey).(http.Header)
81-
return v, ok && v != nil
82-
}
83-
84-
// TraceHeadersTo stores W3C trace context headers in the context so they can
85-
// be propagated to outgoing requests (e.g., from the controller to agent pods).
86-
func TraceHeadersTo(ctx context.Context, headers http.Header) context.Context {
87-
return context.WithValue(ctx, traceHeadersKey, headers)
88-
}
89-
9073
func AuthnMiddleware(authn AuthProvider) func(http.Handler) http.Handler {
9174
return func(next http.Handler) http.Handler {
9275
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {

python/packages/kagent-core/src/kagent/core/tracing/_utils.py

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,6 @@
55
from opentelemetry import _logs, trace
66
from opentelemetry.exporter.otlp.proto.grpc._log_exporter import OTLPLogExporter
77
from opentelemetry.exporter.otlp.proto.grpc.trace_exporter import OTLPSpanExporter
8-
from opentelemetry.propagate import set_global_textmap
9-
from opentelemetry.propagators.composite import CompositeHTTPPropagator
10-
from opentelemetry.trace.propagation.tracecontext import TraceContextTextMapPropagator
118
from opentelemetry.instrumentation.fastapi import FastAPIInstrumentor
129
from opentelemetry.instrumentation.httpx import HTTPXClientInstrumentor
1310
from opentelemetry.instrumentation.openai import OpenAIInstrumentor
@@ -80,9 +77,6 @@ def configure(name: str = "kagent", namespace: str = "kagent", fastapi_app: Fast
8077
# Configure tracing if enabled
8178
if tracing_enabled:
8279
logging.info("Enabling tracing")
83-
# Set up W3C TraceContext propagator so incoming traceparent headers
84-
# are extracted and outgoing requests carry them forward.
85-
set_global_textmap(CompositeHTTPPropagator([TraceContextTextMapPropagator()]))
8680
# Check standard OTEL env vars: signal-specific endpoint first, then general endpoint
8781
trace_endpoint = (
8882
os.getenv("OTEL_EXPORTER_OTLP_TRACES_ENDPOINT")

0 commit comments

Comments
 (0)