feat(tracing): map injection support

This commit is contained in:
DevMiner 2024-08-11 02:54:27 +02:00
parent 3c254e8768
commit 261161b911
2 changed files with 45 additions and 7 deletions

View file

@ -146,7 +146,7 @@ func (t *Telemetry) FiberMiddleware(config ...FiberMiddlewareConfig) fiber.Handl
description, description,
WithOtelOptions(trace.WithSpanKind(trace.SpanKindServer)), WithOtelOptions(trace.WithSpanKind(trace.SpanKindServer)),
WithOtelTracer(tracer), WithOtelTracer(tracer),
t.ContinueFromRequest(&stdRequest), t.ContinueFromHeaders(stdRequest.Header),
) )
defer func() { defer func() {
if err := recover(); err != nil { if err := recover(); err != nil {

View file

@ -14,6 +14,11 @@ type contextKey struct {
Key string Key string
} }
const (
SentryTraceHeader = "sentry-trace"
SentryBaggageHeader = "sentry-baggage"
)
var ( var (
tracerContextKey = contextKey{"tracer"} tracerContextKey = contextKey{"tracer"}
) )
@ -63,16 +68,49 @@ func (t *Telemetry) InjectIntoHeaders(ctx context.Context, headers http.Header)
// this should never happen... // this should never happen...
log.Trace().Msgf("failed to inject Sentry span ID, Sentry span could not be extracted from the context.Context") log.Trace().Msgf("failed to inject Sentry span ID, Sentry span could not be extracted from the context.Context")
} else { } else {
headers.Set("sentry-trace", sentrySpan.ToSentryTrace()) headers.Set(SentryTraceHeader, sentrySpan.ToSentryTrace())
headers.Set("sentry-baggage", sentrySpan.ToBaggage()) headers.Set(SentryBaggageHeader, sentrySpan.ToBaggage())
} }
} }
func (t *Telemetry) ContinueFromRequest(r *http.Request) ConfigureSpanStartFunc { func (t *Telemetry) InjectIntoMap(ctx context.Context, m map[string]string) {
return func(ctx context.Context) (context.Context, []trace.SpanStartOption, []sentry.SpanOption) { t.propagator.Inject(ctx, propagation.MapCarrier(m))
ctx = t.propagator.Extract(ctx, propagation.HeaderCarrier(r.Header))
return ctx, []trace.SpanStartOption{}, []sentry.SpanOption{sentry.ContinueFromRequest(r), sentry.WithTransactionSource(sentry.SourceURL)} if sentrySpan := sentry.SpanFromContext(ctx); sentrySpan == nil {
// this should never happen...
log.Trace().Msgf("failed to inject Sentry span ID, Sentry span could not be extracted from the context.Context")
} else {
m[SentryTraceHeader] = sentrySpan.ToSentryTrace()
m[SentryBaggageHeader] = sentrySpan.ToBaggage()
}
}
func (t *Telemetry) ContinueFromHeaders(h http.Header) ConfigureSpanStartFunc {
return func(ctx context.Context) (context.Context, []trace.SpanStartOption, []sentry.SpanOption) {
ctx = t.propagator.Extract(ctx, propagation.HeaderCarrier(h))
return ctx,
[]trace.SpanStartOption{},
[]sentry.SpanOption{
sentry.ContinueFromHeaders(h.Get(sentry.SentryTraceHeader), h.Get(sentry.SentryBaggageHeader)),
sentry.WithTransactionSource(sentry.SourceURL),
}
}
}
func (t *Telemetry) ContinueFromMap(m map[string]string) ConfigureSpanStartFunc {
return func(ctx context.Context) (context.Context, []trace.SpanStartOption, []sentry.SpanOption) {
ctx = t.propagator.Extract(ctx, propagation.MapCarrier(m))
sentryTrace := m[sentry.SentryTraceHeader]
sentryBaggage := m[sentry.SentryBaggageHeader]
return ctx,
[]trace.SpanStartOption{},
[]sentry.SpanOption{
sentry.ContinueFromHeaders(sentryTrace, sentryBaggage),
sentry.WithTransactionSource(sentry.SourceURL),
}
} }
} }