From d55a3c39049723768bcc0fcc242cad57ec3b20bd Mon Sep 17 00:00:00 2001 From: Nicolas Hrubec Date: Tue, 25 Nov 2025 15:42:26 +0100 Subject: [PATCH 1/8] fix(core): continue trace should adopt the trace id even if there is already an active span --- packages/core/src/tracing/trace.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/core/src/tracing/trace.ts b/packages/core/src/tracing/trace.ts index 98c3a33a8a79..b147bb92fa63 100644 --- a/packages/core/src/tracing/trace.ts +++ b/packages/core/src/tracing/trace.ts @@ -226,6 +226,7 @@ export const continueTrace = ( return withScope(scope => { const propagationContext = propagationContextFromHeaders(sentryTrace, baggage); scope.setPropagationContext(propagationContext); + _setSpanForScope(scope, undefined); return callback(); }); }; From 45b74b788cdfdf1a6d5d0b40299615e88b99194d Mon Sep 17 00:00:00 2001 From: Nicolas Hrubec Date: Tue, 25 Nov 2025 16:22:06 +0100 Subject: [PATCH 2/8] fix test --- packages/sveltekit/test/server-common/handle.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/sveltekit/test/server-common/handle.test.ts b/packages/sveltekit/test/server-common/handle.test.ts index fdb4a1103d90..7ecd222ad780 100644 --- a/packages/sveltekit/test/server-common/handle.test.ts +++ b/packages/sveltekit/test/server-common/handle.test.ts @@ -186,7 +186,7 @@ describe('sentryHandle', () => { resolve: async _ => { // simulating a nested load call: await sentryHandle()({ - event: mockEvent({ route: { id: 'api/users/details/[id]', isSubRequest: true } }), + event: mockEvent({ route: { id: 'api/users/details/[id]' }, isSubRequest: true }), resolve: resolve(type, isError), }); return mockResponse; From e7e83c60d88b39a642fa279c5702573ef5e80ed0 Mon Sep 17 00:00:00 2001 From: Nicolas Hrubec Date: Wed, 26 Nov 2025 10:12:38 +0100 Subject: [PATCH 3/8] add unit test (fails) --- packages/core/test/lib/tracing/trace.test.ts | 21 ++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/packages/core/test/lib/tracing/trace.test.ts b/packages/core/test/lib/tracing/trace.test.ts index a1d786dfdd10..4725e67e0ae4 100644 --- a/packages/core/test/lib/tracing/trace.test.ts +++ b/packages/core/test/lib/tracing/trace.test.ts @@ -4,6 +4,7 @@ import { getGlobalScope, getIsolationScope, getMainCarrier, + getTraceData, Scope, SEMANTIC_ATTRIBUTE_SENTRY_OP, SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN, @@ -2021,6 +2022,26 @@ describe('continueTrace', () => { }); }); }); + + it('works inside an active span', () => { + const sentryTrace = '12312012123120121231201212312012-1121201211212012-1' + const sentryBaggage = 'sentry-org_id=123' + + startSpan({ name: 'outer' }, () => { + continueTrace( + { + sentryTrace: sentryTrace, + baggage: sentryBaggage, + }, + () => { + expect(getActiveSpan()).toBeUndefined(); + expect(getTraceData()).toBeDefined() + expect(getTraceData()['sentry-trace']).toBe(sentryTrace); + expect(getCurrentScope().getPropagationContext().traceId).toBe(sentryTrace); + }, + ); + }); + }); }); describe('getActiveSpan', () => { From 21713dc679d12344c1def0e6847b3b21d09f612f Mon Sep 17 00:00:00 2001 From: Nicolas Hrubec Date: Wed, 26 Nov 2025 11:50:15 +0100 Subject: [PATCH 4/8] progress --- packages/core/test/lib/tracing/trace.test.ts | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/packages/core/test/lib/tracing/trace.test.ts b/packages/core/test/lib/tracing/trace.test.ts index 4725e67e0ae4..87384a808ddd 100644 --- a/packages/core/test/lib/tracing/trace.test.ts +++ b/packages/core/test/lib/tracing/trace.test.ts @@ -2024,6 +2024,15 @@ describe('continueTrace', () => { }); it('works inside an active span', () => { + const client = new TestClient( + getDefaultTestClientOptions({ + dsn: 'https://username@domain/123', + tracesSampleRate: 1, + }), + ); + setCurrentClient(client); + client.init(); + const sentryTrace = '12312012123120121231201212312012-1121201211212012-1' const sentryBaggage = 'sentry-org_id=123' From 459766ec16062812bc81c9f5be1097fe22067041 Mon Sep 17 00:00:00 2001 From: Nicolas Hrubec Date: Wed, 26 Nov 2025 11:59:15 +0100 Subject: [PATCH 5/8] fix test --- packages/core/test/lib/tracing/trace.test.ts | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/packages/core/test/lib/tracing/trace.test.ts b/packages/core/test/lib/tracing/trace.test.ts index 87384a808ddd..ca15203465d1 100644 --- a/packages/core/test/lib/tracing/trace.test.ts +++ b/packages/core/test/lib/tracing/trace.test.ts @@ -2034,6 +2034,7 @@ describe('continueTrace', () => { client.init(); const sentryTrace = '12312012123120121231201212312012-1121201211212012-1' + const sentryTraceId = '12312012123120121231201212312012' const sentryBaggage = 'sentry-org_id=123' startSpan({ name: 'outer' }, () => { @@ -2043,10 +2044,13 @@ describe('continueTrace', () => { baggage: sentryBaggage, }, () => { + const traceDataInContinuedTrace = getTraceData(); + const traceIdInContinuedTrace = traceDataInContinuedTrace['sentry-trace']?.split('-')[0]; + const traceIdInCurrentScope = getCurrentScope().getPropagationContext().traceId; + expect(getActiveSpan()).toBeUndefined(); - expect(getTraceData()).toBeDefined() - expect(getTraceData()['sentry-trace']).toBe(sentryTrace); - expect(getCurrentScope().getPropagationContext().traceId).toBe(sentryTrace); + expect(traceIdInContinuedTrace).toBe(sentryTraceId); + expect(traceIdInCurrentScope).toBe(sentryTraceId); }, ); }); From c8e32bbd660c4492223144ffe7450486c94a7a91 Mon Sep 17 00:00:00 2001 From: Nicolas Hrubec Date: Wed, 26 Nov 2025 12:15:35 +0100 Subject: [PATCH 6/8] yarn fix --- packages/core/test/lib/tracing/trace.test.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/core/test/lib/tracing/trace.test.ts b/packages/core/test/lib/tracing/trace.test.ts index ca15203465d1..4fc5f69b83cb 100644 --- a/packages/core/test/lib/tracing/trace.test.ts +++ b/packages/core/test/lib/tracing/trace.test.ts @@ -2033,9 +2033,9 @@ describe('continueTrace', () => { setCurrentClient(client); client.init(); - const sentryTrace = '12312012123120121231201212312012-1121201211212012-1' - const sentryTraceId = '12312012123120121231201212312012' - const sentryBaggage = 'sentry-org_id=123' + const sentryTrace = '12312012123120121231201212312012-1121201211212012-1'; + const sentryTraceId = '12312012123120121231201212312012'; + const sentryBaggage = 'sentry-org_id=123'; startSpan({ name: 'outer' }, () => { continueTrace( From 661a11b1148b571b17f195315d024f386a0e34e0 Mon Sep 17 00:00:00 2001 From: Nicolas Hrubec Date: Wed, 26 Nov 2025 17:49:22 +0100 Subject: [PATCH 7/8] address pr comments --- packages/core/test/lib/tracing/trace.test.ts | 37 +++++++++++++++++++- 1 file changed, 36 insertions(+), 1 deletion(-) diff --git a/packages/core/test/lib/tracing/trace.test.ts b/packages/core/test/lib/tracing/trace.test.ts index 4fc5f69b83cb..84b5eeef0c39 100644 --- a/packages/core/test/lib/tracing/trace.test.ts +++ b/packages/core/test/lib/tracing/trace.test.ts @@ -2023,7 +2023,7 @@ describe('continueTrace', () => { }); }); - it('works inside an active span', () => { + it('updates the propagation context when called inside an active span', () => { const client = new TestClient( getDefaultTestClientOptions({ dsn: 'https://username@domain/123', @@ -2055,6 +2055,41 @@ describe('continueTrace', () => { ); }); }); + + it('sets the correct trace and parent span ids when called inside an active span and a new span is started from within the callback', () => { + const client = new TestClient( + getDefaultTestClientOptions({ + dsn: 'https://username@domain/123', + tracesSampleRate: 1, + }), + ); + setCurrentClient(client); + client.init(); + + const sentryTrace = '12312012123120121231201212312012-1121201211212012-1'; + const sentryTraceId = '12312012123120121231201212312012'; + const sentrySpanId = '1121201211212012'; + const sentryBaggage = 'sentry-org_id=123'; + + startSpan({ name: 'outer' }, () => { + continueTrace( + { + sentryTrace: sentryTrace, + baggage: sentryBaggage, + }, + () => { + startSpan({ name: 'inner' }, (span) => { + const innerSpanJson = spanToJSON(span); + const innerTraceId = innerSpanJson.trace_id; + const innerParentSpanId = innerSpanJson.parent_span_id; + + expect(innerTraceId).toBe(sentryTraceId); + expect(innerParentSpanId).toBe(sentrySpanId); + }); + }, + ); + }); + }); }); describe('getActiveSpan', () => { From 499a58e6ab1a8e938c596109fb2b9da8c33612c1 Mon Sep 17 00:00:00 2001 From: Nicolas Hrubec Date: Wed, 26 Nov 2025 17:53:42 +0100 Subject: [PATCH 8/8] . --- packages/core/test/lib/tracing/trace.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/core/test/lib/tracing/trace.test.ts b/packages/core/test/lib/tracing/trace.test.ts index 84b5eeef0c39..271cd669d56c 100644 --- a/packages/core/test/lib/tracing/trace.test.ts +++ b/packages/core/test/lib/tracing/trace.test.ts @@ -2078,7 +2078,7 @@ describe('continueTrace', () => { baggage: sentryBaggage, }, () => { - startSpan({ name: 'inner' }, (span) => { + startSpan({ name: 'inner' }, span => { const innerSpanJson = spanToJSON(span); const innerTraceId = innerSpanJson.trace_id; const innerParentSpanId = innerSpanJson.parent_span_id;