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,
WithOtelOptions(trace.WithSpanKind(trace.SpanKindServer)),
WithOtelTracer(tracer),
t.ContinueFromRequest(&stdRequest),
t.ContinueFromHeaders(stdRequest.Header),
)
defer func() {
if err := recover(); err != nil {

View file

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