Skip to content

Commit 80793c9

Browse files
committed
feat!: move active tracing to context
Use context.Context as the active span stack, resolve sampling and transaction delivery through the contextual client, retain scope propagation only as the no-active-span fallback, and preserve frozen root baggage through child spans. BREAKING CHANGE: ContinueTrace no longer accepts a Hub. Pass the sentry-trace and baggage header values directly and carry the returned span through context.
1 parent 5d18fe6 commit 80793c9

20 files changed

Lines changed: 222 additions & 248 deletions

client.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -933,7 +933,7 @@ func (client *Client) capture(ctx context.Context, event *Event, opts captureOpt
933933
}
934934

935935
scope := scopeFromContextOrGlobal(ctx)
936-
if event = client.prepareEvent(event, scope, opts); event == nil {
936+
if event = client.prepareEvent(ctx, event, scope, opts); event == nil {
937937
return nil
938938
}
939939

@@ -981,8 +981,8 @@ func (client *Client) capture(ctx context.Context, event *Event, opts captureOpt
981981
return &event.EventID
982982
}
983983

984-
func (client *Client) prepareEvent(event *Event, scope *Scope, opts captureOptions) *Event {
985-
scopeProcessors := scope.applyToEvent(event, client, opts.hint, client.options.MaxBreadcrumbs)
984+
func (client *Client) prepareEvent(ctx context.Context, event *Event, scope *Scope, opts captureOptions) *Event {
985+
scopeProcessors := scope.applyToEvent(ctx, event, client, client.options.MaxBreadcrumbs)
986986
if event.Level == "" {
987987
event.Level = opts.defaultLevel
988988
}

client_test.go

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -196,12 +196,39 @@ func TestCaptureMessageCopiesHintAndUsesContext(t *testing.T) {
196196
assert.Same(t, providedCtx, provided.Context)
197197
}
198198

199+
func TestClientCaptureUsesContext(t *testing.T) {
200+
client, transport := newCaptureTestClient(t, ClientOptions{})
201+
scope := NewScope()
202+
ctx := ContextWithClient(ContextWithScope(context.Background(), scope), client)
203+
transaction := StartTransaction(ctx, "request", WithOpName("http.server"))
204+
205+
require.NotNil(t, client.CaptureMessage(transaction.Context(), "message"))
206+
207+
trace := requireSingleEvent(t, transport).Contexts[traceContextKey]
208+
assert.Equal(t, transaction.TraceID, trace[traceIDContextKey])
209+
assert.Equal(t, transaction.SpanID, trace[spanIDContextKey])
210+
}
211+
199212
func TestCaptureMessageShouldSendEventWithProvidedMessage(t *testing.T) {
200213
client, scope, transport := setupClientTest()
201214
client.CaptureMessage(ContextWithScope(context.Background(), scope), "foo")
202215
assertEqual(t, transport.lastEvent.Message, "foo")
203216
}
204217

218+
func TestCaptureMessagePreservesActiveSpanTraceContextWithoutScope(t *testing.T) {
219+
client, _, transport := setupClientTest()
220+
transaction := StartTransaction(context.Background(), "request", WithOpName("http.server"))
221+
transaction.SetData("http.request.method", http.MethodGet)
222+
223+
CaptureMessage(ContextWithClient(transaction.Context(), client), "foo")
224+
225+
trace := transport.lastEvent.Contexts["trace"]
226+
assertEqual(t, trace["trace_id"], transaction.TraceID)
227+
assertEqual(t, trace["span_id"], transaction.SpanID)
228+
assertEqual(t, trace["op"], "http.server")
229+
assertEqual(t, trace["data"], map[string]any{"http.request.method": http.MethodGet})
230+
}
231+
205232
func TestCaptureMessageShouldSucceedWithoutNilScope(t *testing.T) {
206233
client, _, transport := setupClientTest()
207234
client.CaptureMessage(context.Background(), "foo")

dynamic_sampling_context.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -39,11 +39,11 @@ func DynamicSamplingContextFromHeader(header []byte) (DynamicSamplingContext, er
3939
}
4040

4141
func DynamicSamplingContextFromTransaction(span *Span) DynamicSamplingContext {
42-
hub := hubFromContext(span.Context())
43-
scope := hub.Scope()
44-
client := hub.Client()
42+
return dynamicSamplingContextFromTransaction(span, ClientFromContext(span.Context()))
43+
}
4544

46-
if !client.IsEnabled() || scope == nil {
45+
func dynamicSamplingContextFromTransaction(span *Span, client *Client) DynamicSamplingContext {
46+
if !client.IsEnabled() {
4747
return DynamicSamplingContext{
4848
Entries: map[string]string{},
4949
Frozen: false,

echo/sentryecho.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ func (h *handler) handle(next echo.HandlerFunc) echo.HandlerFunc {
7979
}
8080

8181
options := []sentry.SpanOption{
82-
sentry.ContinueTrace(hub, r.Header.Get(sentry.SentryTraceHeader), r.Header.Get(sentry.SentryBaggageHeader)),
82+
sentry.ContinueTrace(r.Header.Get(sentry.SentryTraceHeader), r.Header.Get(sentry.SentryBaggageHeader)),
8383
sentry.WithOpName("http.server"),
8484
sentry.WithTransactionSource(transactionSource),
8585
sentry.WithSpanOrigin(sentry.SpanOriginEcho),

fasthttp/sentryfasthttp.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ func (h *Handler) Handle(handler fasthttp.RequestHandler) fasthttp.RequestHandle
7171
r := convert(ctx)
7272

7373
options := []sentry.SpanOption{
74-
sentry.ContinueTrace(hub, r.Header.Get(sentry.SentryTraceHeader), r.Header.Get(sentry.SentryBaggageHeader)),
74+
sentry.ContinueTrace(r.Header.Get(sentry.SentryTraceHeader), r.Header.Get(sentry.SentryBaggageHeader)),
7575
sentry.WithOpName("http.server"),
7676
sentry.WithTransactionSource(sentry.SourceURL),
7777
sentry.WithSpanOrigin(sentry.SpanOriginFastHTTP),

fiber/sentryfiber.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ func (h *handler) handle(ctx *fiber.Ctx) error {
7373
transactionSource := sentry.SourceURL
7474

7575
options := []sentry.SpanOption{
76-
sentry.ContinueTrace(hub, r.Header.Get(sentry.SentryTraceHeader), r.Header.Get(sentry.SentryBaggageHeader)),
76+
sentry.ContinueTrace(r.Header.Get(sentry.SentryTraceHeader), r.Header.Get(sentry.SentryBaggageHeader)),
7777
sentry.WithOpName("http.server"),
7878
sentry.WithTransactionSource(transactionSource),
7979
sentry.WithSpanOrigin(sentry.SpanOriginFiber),

fiberv3/sentryfiber.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ func (h *handler) handle(ctx fiber.Ctx) error {
7373
transactionSource := sentry.SourceURL
7474

7575
options := []sentry.SpanOption{
76-
sentry.ContinueTrace(hub, r.Header.Get(sentry.SentryTraceHeader), r.Header.Get(sentry.SentryBaggageHeader)),
76+
sentry.ContinueTrace(r.Header.Get(sentry.SentryTraceHeader), r.Header.Get(sentry.SentryBaggageHeader)),
7777
sentry.WithOpName("http.server"),
7878
sentry.WithTransactionSource(transactionSource),
7979
sentry.WithSpanOrigin(sentry.SpanOriginFiber),

gin/sentrygin.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ func (h *handler) handle(c *gin.Context) {
7676
}
7777

7878
options := []sentry.SpanOption{
79-
sentry.ContinueTrace(hub, c.GetHeader(sentry.SentryTraceHeader), c.GetHeader(sentry.SentryBaggageHeader)),
79+
sentry.ContinueTrace(c.GetHeader(sentry.SentryTraceHeader), c.GetHeader(sentry.SentryBaggageHeader)),
8080
sentry.WithOpName("http.server"),
8181
sentry.WithTransactionSource(transactionSource),
8282
sentry.WithSpanOrigin(sentry.SpanOriginGin),

grpc/server.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ func startServerTransaction(ctx context.Context, fullMethod string) (context.Con
8484
transaction := sentry.StartTransaction(
8585
sentry.SetHubOnContext(ctx, hub),
8686
name,
87-
sentry.ContinueTrace(hub, sentryTraceHeader, sentryBaggageHeader),
87+
sentry.ContinueTrace(sentryTraceHeader, sentryBaggageHeader),
8888
sentry.WithOpName(defaultServerOperationName),
8989
sentry.WithDescription(name),
9090
sentry.WithTransactionSource(sentry.SourceRoute),

http/sentryhttp.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,7 @@ func (h *Handler) handle(handler http.Handler) http.HandlerFunc {
9696
}
9797

9898
options := []sentry.SpanOption{
99-
sentry.ContinueTrace(hub, r.Header.Get(sentry.SentryTraceHeader), r.Header.Get(sentry.SentryBaggageHeader)),
99+
sentry.ContinueTrace(r.Header.Get(sentry.SentryTraceHeader), r.Header.Get(sentry.SentryBaggageHeader)),
100100
sentry.WithOpName("http.server"),
101101
sentry.WithTransactionSource(sentry.SourceURL),
102102
sentry.WithSpanOrigin(sentry.SpanOriginStdLib),

0 commit comments

Comments
 (0)