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(); }); }; diff --git a/packages/core/test/lib/tracing/trace.test.ts b/packages/core/test/lib/tracing/trace.test.ts index a1d786dfdd10..271cd669d56c 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,74 @@ describe('continueTrace', () => { }); }); }); + + it('updates the propagation context when called 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 sentryTraceId = '12312012123120121231201212312012'; + const sentryBaggage = 'sentry-org_id=123'; + + startSpan({ name: 'outer' }, () => { + continueTrace( + { + sentryTrace: sentryTrace, + baggage: sentryBaggage, + }, + () => { + const traceDataInContinuedTrace = getTraceData(); + const traceIdInContinuedTrace = traceDataInContinuedTrace['sentry-trace']?.split('-')[0]; + const traceIdInCurrentScope = getCurrentScope().getPropagationContext().traceId; + + expect(getActiveSpan()).toBeUndefined(); + expect(traceIdInContinuedTrace).toBe(sentryTraceId); + expect(traceIdInCurrentScope).toBe(sentryTraceId); + }, + ); + }); + }); + + 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', () => { 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;