From 0f3b97c3418fac29c07b01d9005aff8ad9625f4e Mon Sep 17 00:00:00 2001 From: isaacs Date: Wed, 14 Oct 2026 17:09:50 -0700 Subject: [PATCH] fix(sveltekit): add op and origin to Kit's `sveltekit.endpoint` span SvelteKit 3.1.0 emits a `sveltekit.endpoint` span for `+server` handlers when server tracing is on. The SDK did not know the span, so it went out with origin `manual` and no op, unlike Kit's other spans. It also broke the `sveltekit-3` e2e test, which counts the child spans of a page that fetches a `+server` route. The span now gets op `function` and origin `auto.function.sveltekit.endpoint`. The origin follows the trace origin format and the other Kit span origins (`auto.function.sveltekit.load`, `auto.function.sveltekit.action`). Its part keeps the span apart from the SDK's own `wrapServerRouteWithSentry` span (`auto.function.sveltekit`), which can now appear next to it. Under span streaming, the span also gets `sentry.description`, as Kit's other spans do, because the `function` description template needs `code.function.name`, which Kit does not set. Re: sveltejs/kit#17325 Co-Authored-By: Claude Opus 5.5 (1M context) --- .../sveltekit-3/tests/tracing.server.test.ts | 15 ++++++++++++++- .../server-common/integrations/svelteKitSpans.ts | 2 ++ .../integrations/svelteKitSpans.test.ts | 2 ++ 3 files changed, 18 insertions(+), 1 deletion(-) diff --git a/dev-packages/e2e-tests/test-applications/sveltekit-3/tests/tracing.server.test.ts b/dev-packages/e2e-tests/test-applications/sveltekit-3/tests/tracing.server.test.ts index 3e5d13e187e6..f92dfad104f4 100644 --- a/dev-packages/e2e-tests/test-applications/sveltekit-3/tests/tracing.server.test.ts +++ b/dev-packages/e2e-tests/test-applications/sveltekit-3/tests/tracing.server.test.ts @@ -26,7 +26,7 @@ test('server pageload request span has nested request span for sub request', asy const spans = getSegmentChildSpans(serverTraceSpans, serverSpan); - expect(spans).toHaveLength(6); + expect(spans).toHaveLength(7); expect(spans).toEqual( expect.arrayContaining([ @@ -102,6 +102,19 @@ test('server pageload request span has nested request span for sub request', asy 'http.route': { value: '/api/users', type: 'string' }, }), }), + + // sub request `+server` handler span (emitted by Kit since 3.1.0): + expect.objectContaining({ + name: 'sveltekit.endpoint', + status: 'ok', + attributes: expect.objectContaining({ + 'sentry.op': { value: 'function', type: 'string' }, + 'sentry.origin': { value: 'auto.function.sveltekit.endpoint', type: 'string' }, + 'sentry.description': { value: 'sveltekit.endpoint', type: 'string' }, + 'http.route': { value: '/api/users', type: 'string' }, + 'http.method': { value: 'GET', type: 'string' }, + }), + }), ]), ); }); diff --git a/packages/sveltekit/src/server-common/integrations/svelteKitSpans.ts b/packages/sveltekit/src/server-common/integrations/svelteKitSpans.ts index 3d48b7e80ea8..78081dfaacb4 100644 --- a/packages/sveltekit/src/server-common/integrations/svelteKitSpans.ts +++ b/packages/sveltekit/src/server-common/integrations/svelteKitSpans.ts @@ -84,6 +84,8 @@ function _getKitSpanOrigin(spanName: string | undefined): SpanOrigin | undefined return 'auto.function.sveltekit.load'; case 'sveltekit.form_action': return 'auto.function.sveltekit.action'; + case 'sveltekit.endpoint': + return 'auto.function.sveltekit.endpoint'; case 'sveltekit.remote.call': return 'auto.rpc.sveltekit.remote'; case 'sveltekit.handle.root': diff --git a/packages/sveltekit/test/server-common/integrations/svelteKitSpans.test.ts b/packages/sveltekit/test/server-common/integrations/svelteKitSpans.test.ts index 2c53de829a3e..5d8d2d7c0d69 100644 --- a/packages/sveltekit/test/server-common/integrations/svelteKitSpans.test.ts +++ b/packages/sveltekit/test/server-common/integrations/svelteKitSpans.test.ts @@ -56,6 +56,7 @@ describe('svelteKitSpansIntegration', () => { ['sveltekit.resolve', 'function', 'auto.http.sveltekit'], ['sveltekit.load', 'function', 'auto.function.sveltekit.load'], ['sveltekit.form_action', 'function', 'auto.function.sveltekit.action'], + ['sveltekit.endpoint', 'function', 'auto.function.sveltekit.endpoint'], ['sveltekit.remote.call', 'function', 'auto.rpc.sveltekit.remote'], ['sveltekit.handle.sequenced.0', 'function', 'auto.function.sveltekit.handle'], ['sveltekit.handle.sequenced.myHandler', 'function', 'auto.function.sveltekit.handle'], @@ -194,6 +195,7 @@ describe('svelteKitSpansIntegration', () => { ['sveltekit.resolve', 'function', 'auto.http.sveltekit'], ['sveltekit.load', 'function', 'auto.function.sveltekit.load'], ['sveltekit.form_action', 'function', 'auto.function.sveltekit.action'], + ['sveltekit.endpoint', 'function', 'auto.function.sveltekit.endpoint'], ['sveltekit.remote.call', 'function', 'auto.rpc.sveltekit.remote'], ['sveltekit.handle.sequenced.0', 'function', 'auto.function.sveltekit.handle'], ['sveltekit.handle.sequenced.myHandler', 'function', 'auto.function.sveltekit.handle'],