Skip to content

Commit dfc463e

Browse files
authored
feat(fxmcpserver): Added tracing remote propagation (#350)
1 parent dfc8362 commit dfc463e

File tree

4 files changed

+32
-11
lines changed

4 files changed

+32
-11
lines changed

fxmcpserver/fxmcpservertest/server_test.go

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import (
1212
"github.com/ankorstore/yokai/log/logtest"
1313
"github.com/mark3labs/mcp-go/server"
1414
"github.com/stretchr/testify/assert"
15+
"go.opentelemetry.io/otel/propagation"
1516
"go.opentelemetry.io/otel/sdk/trace"
1617
)
1718

@@ -27,11 +28,13 @@ func TestMCPSSETestServer(t *testing.T) {
2728

2829
tp := trace.NewTracerProvider()
2930

31+
tmp := propagation.NewCompositeTextMapPropagator(propagation.TraceContext{}, propagation.Baggage{})
32+
3033
lb := logtest.NewDefaultTestLogBuffer()
3134
lg, err := log.NewDefaultLoggerFactory().Create(log.WithOutputWriter(lb))
3235
assert.NoError(t, err)
3336

34-
hdl := sse.NewDefaultMCPSSEServerContextHandler(gm, tp, lg)
37+
hdl := sse.NewDefaultMCPSSEServerContextHandler(gm, tp, tmp, lg)
3538

3639
mcpSrv := server.NewMCPServer("test-server", "1.0.0")
3740

fxmcpserver/module.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import (
1212
"github.com/ankorstore/yokai/log"
1313
"github.com/mark3labs/mcp-go/server"
1414
"github.com/prometheus/client_golang/prometheus"
15+
"go.opentelemetry.io/otel/propagation"
1516
"go.opentelemetry.io/otel/trace"
1617
"go.uber.org/fx"
1718
)
@@ -135,9 +136,15 @@ type ProvideDefaultMCPSSEContextHandlerParam struct {
135136

136137
// ProvideDefaultMCPSSEServerContextHandler provides the default sse.MCPSSEServerContextHandler instance.
137138
func ProvideDefaultMCPSSEServerContextHandler(p ProvideDefaultMCPSSEContextHandlerParam) *sse.DefaultMCPSSEServerContextHandler {
139+
textMapPropagator := propagation.NewCompositeTextMapPropagator(
140+
propagation.TraceContext{},
141+
propagation.Baggage{},
142+
)
143+
138144
return sse.NewDefaultMCPSSEServerContextHandler(
139145
p.Generator,
140146
p.TracerProvider,
147+
textMapPropagator,
141148
p.Logger,
142149
p.MCPSSEServerContextHooks...,
143150
)

fxmcpserver/server/sse/context.go

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import (
1111
"github.com/ankorstore/yokai/trace"
1212
"github.com/mark3labs/mcp-go/server"
1313
"go.opentelemetry.io/otel/attribute"
14+
"go.opentelemetry.io/otel/propagation"
1415
ot "go.opentelemetry.io/otel/trace"
1516
)
1617

@@ -28,24 +29,27 @@ type MCPSSEServerContextHandler interface {
2829

2930
// DefaultMCPSSEServerContextHandler is the default MCPSSEServerContextHandler implementation.
3031
type DefaultMCPSSEServerContextHandler struct {
31-
generator uuid.UuidGenerator
32-
tracerProvider ot.TracerProvider
33-
logger *log.Logger
34-
contextHooks []MCPSSEServerContextHook
32+
generator uuid.UuidGenerator
33+
tracerProvider ot.TracerProvider
34+
textMapPropagator propagation.TextMapPropagator
35+
logger *log.Logger
36+
contextHooks []MCPSSEServerContextHook
3537
}
3638

3739
// NewDefaultMCPSSEServerContextHandler returns a new DefaultMCPSSEServerContextHandler instance.
3840
func NewDefaultMCPSSEServerContextHandler(
3941
generator uuid.UuidGenerator,
4042
tracerProvider ot.TracerProvider,
43+
textMapPropagator propagation.TextMapPropagator,
4144
logger *log.Logger,
4245
contextHooks ...MCPSSEServerContextHook,
4346
) *DefaultMCPSSEServerContextHandler {
4447
return &DefaultMCPSSEServerContextHandler{
45-
generator: generator,
46-
tracerProvider: tracerProvider,
47-
logger: logger,
48-
contextHooks: contextHooks,
48+
generator: generator,
49+
tracerProvider: tracerProvider,
50+
textMapPropagator: textMapPropagator,
51+
logger: logger,
52+
contextHooks: contextHooks,
4953
}
5054
}
5155

@@ -71,6 +75,8 @@ func (h *DefaultMCPSSEServerContextHandler) Handle() server.SSEContextFunc {
7175
ctx = fsc.WithRequestID(ctx, rID)
7276

7377
// tracer propagation
78+
ctx = h.textMapPropagator.Extract(ctx, propagation.HeaderCarrier(req.Header))
79+
7480
ctx = trace.WithContext(ctx, h.tracerProvider)
7581

7682
ctx, span := trace.CtxTracer(ctx).Start(

fxmcpserver/server/sse/context_test.go

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import (
1313
"github.com/ankorstore/yokai/log/logtest"
1414
"github.com/stretchr/testify/assert"
1515
"github.com/stretchr/testify/mock"
16+
"go.opentelemetry.io/otel/propagation"
1617
"go.opentelemetry.io/otel/sdk/trace"
1718
)
1819

@@ -36,11 +37,13 @@ func TestDefaultMCPSSEServerContextHandler_Handle(t *testing.T) {
3637

3738
tp := trace.NewTracerProvider()
3839

40+
tmp := propagation.NewCompositeTextMapPropagator(propagation.TraceContext{}, propagation.Baggage{})
41+
3942
lb := logtest.NewDefaultTestLogBuffer()
4043
lg, err := log.NewDefaultLoggerFactory().Create(log.WithOutputWriter(lb))
4144
assert.NoError(t, err)
4245

43-
handler := sse.NewDefaultMCPSSEServerContextHandler(gm, tp, lg)
46+
handler := sse.NewDefaultMCPSSEServerContextHandler(gm, tp, tmp, lg)
4447

4548
req := httptest.NewRequest(http.MethodGet, "/sse", nil)
4649

@@ -91,13 +94,15 @@ func TestDefaultMCPSSEServerContextHandler_Handle(t *testing.T) {
9194

9295
tp := trace.NewTracerProvider()
9396

97+
tmp := propagation.NewCompositeTextMapPropagator(propagation.TraceContext{}, propagation.Baggage{})
98+
9499
lb := logtest.NewDefaultTestLogBuffer()
95100
lg, err := log.NewDefaultLoggerFactory().Create(log.WithOutputWriter(lb))
96101
assert.NoError(t, err)
97102

98103
hk := hook.NewSimpleMCPSSEServerContextHook()
99104

100-
handler := sse.NewDefaultMCPSSEServerContextHandler(gm, tp, lg, hk)
105+
handler := sse.NewDefaultMCPSSEServerContextHandler(gm, tp, tmp, lg, hk)
101106

102107
req := httptest.NewRequest(http.MethodGet, "/sse?sessionId=test-session-id", nil)
103108
req.Header.Set("X-Request-Id", "test-request-id")

0 commit comments

Comments
 (0)