Skip to content

Commit b3d09bb

Browse files
carabasdanielactions-user
authored andcommitted
fix-tracing: use custom nats header carrier for otel (#2149)
closes: https://linear.app/overmind/issue/ENG-348/handlequery-does-not-correctly-link-into-main-trace GitOrigin-RevId: eda2adcbba634b87b177167bdf1aeb1524ed52dc
1 parent 2ba76d0 commit b3d09bb

File tree

2 files changed

+36
-4
lines changed

2 files changed

+36
-4
lines changed

‎sdp-go/tracing.go

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,8 @@ import (
66
"connectrpc.com/connect"
77
"github.com/getsentry/sentry-go"
88
"github.com/nats-io/nats.go"
9+
"github.com/overmindtech/cli/tracing"
910
"go.opentelemetry.io/otel"
10-
"go.opentelemetry.io/otel/propagation"
1111
"go.opentelemetry.io/otel/trace"
1212
)
1313

@@ -21,7 +21,7 @@ func NewOtelExtractingHandler(spanName string, h CtxMsgHandler, t trace.Tracer,
2121
return func(msg *nats.Msg) {
2222
ctx := context.Background()
2323

24-
ctx = otel.GetTextMapPropagator().Extract(ctx, propagation.HeaderCarrier(msg.Header))
24+
ctx = otel.GetTextMapPropagator().Extract(ctx, tracing.NewNatsHeaderCarrier(msg.Header))
2525

2626
// don't start a span when we have no spanName
2727
if spanName != "" {
@@ -44,7 +44,7 @@ func NewAsyncOtelExtractingHandler(spanName string, h CtxMsgHandler, t trace.Tra
4444
defer sentry.Recover()
4545

4646
ctx := context.Background()
47-
ctx = otel.GetTextMapPropagator().Extract(ctx, propagation.HeaderCarrier(msg.Header))
47+
ctx = otel.GetTextMapPropagator().Extract(ctx, tracing.NewNatsHeaderCarrier(msg.Header))
4848

4949
// don't start a span when we have no spanName
5050
if spanName != "" {
@@ -62,7 +62,8 @@ func InjectOtelTraceContext(ctx context.Context, msg *nats.Msg) {
6262
if msg.Header == nil {
6363
msg.Header = make(nats.Header)
6464
}
65-
otel.GetTextMapPropagator().Inject(ctx, propagation.HeaderCarrier(msg.Header))
65+
66+
otel.GetTextMapPropagator().Inject(ctx, tracing.NewNatsHeaderCarrier(msg.Header))
6667
}
6768

6869
type sentryInterceptor struct{}

‎tracing/header_carrier.go

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
package tracing
2+
3+
import "github.com/nats-io/nats.go"
4+
5+
// HeaderCarrier is a custom wrapper on top of nats.Headers for otel's TextMapCarrier.
6+
type HeaderCarrier struct {
7+
headers nats.Header
8+
}
9+
10+
// NewNatsHeaderCarrier creates a new HeaderCarrier.
11+
func NewNatsHeaderCarrier(h nats.Header) *HeaderCarrier {
12+
return &HeaderCarrier{
13+
headers: h,
14+
}
15+
}
16+
17+
func (c *HeaderCarrier) Get(key string) string {
18+
return c.headers.Get(key)
19+
}
20+
21+
func (c *HeaderCarrier) Set(key, value string) {
22+
c.headers.Set(key, value)
23+
}
24+
25+
func (c *HeaderCarrier) Keys() []string {
26+
keys := make([]string, 0, len(c.headers))
27+
for key := range c.headers {
28+
keys = append(keys, key)
29+
}
30+
return keys
31+
}

0 commit comments

Comments
 (0)