Skip to content

Commit 34a4b1f

Browse files
committed
fix(sveltekit): Ensure trace meta tags are always injected
1 parent 0af5b4f commit 34a4b1f

File tree

2 files changed

+21
-31
lines changed

2 files changed

+21
-31
lines changed

packages/sveltekit/src/server/handle.ts

+9-23
Original file line numberDiff line numberDiff line change
@@ -5,19 +5,16 @@ import {
55
getCurrentScope,
66
getDefaultIsolationScope,
77
getIsolationScope,
8-
getRootSpan,
8+
getTraceMetaTags,
99
setHttpStatus,
10-
spanToTraceHeader,
1110
withIsolationScope,
1211
} from '@sentry/core';
1312
import { startSpan } from '@sentry/core';
1413
import { continueTrace } from '@sentry/node';
1514
import type { Span } from '@sentry/types';
16-
import { dynamicSamplingContextToSentryBaggageHeader, logger, winterCGRequestToRequestData } from '@sentry/utils';
15+
import { logger, winterCGRequestToRequestData } from '@sentry/utils';
1716
import type { Handle, ResolveOptions } from '@sveltejs/kit';
1817

19-
import { getDynamicSamplingContextFromSpan } from '@sentry/opentelemetry';
20-
2118
import { DEBUG_BUILD } from '../common/debug-build';
2219
import { flushIfServerless, getTracePropagationData, sendErrorToSentry } from './utils';
2320

@@ -81,25 +78,14 @@ export function addSentryCodeToPage(options: SentryHandleOptions): NonNullable<R
8178
const nonce = fetchProxyScriptNonce ? `nonce="${fetchProxyScriptNonce}"` : '';
8279

8380
return ({ html }) => {
84-
const activeSpan = getActiveSpan();
85-
const rootSpan = activeSpan ? getRootSpan(activeSpan) : undefined;
86-
if (rootSpan) {
87-
const traceparentData = spanToTraceHeader(rootSpan);
88-
const dynamicSamplingContext = dynamicSamplingContextToSentryBaggageHeader(
89-
getDynamicSamplingContextFromSpan(rootSpan),
90-
);
91-
const contentMeta = `<head>
92-
<meta name="sentry-trace" content="${traceparentData}"/>
93-
<meta name="baggage" content="${dynamicSamplingContext}"/>
94-
`;
95-
const contentScript = shouldInjectScript ? `<script ${nonce}>${FETCH_PROXY_SCRIPT}</script>` : '';
96-
97-
const content = `${contentMeta}\n${contentScript}`;
98-
99-
return html.replace('<head>', content);
100-
}
81+
const metaTags = getTraceMetaTags();
82+
const headWithMetaTags = metaTags ? `<head>\n${metaTags}` : '<head>';
83+
84+
const headWithFetchScript = shouldInjectScript ? `\n<script ${nonce}>${FETCH_PROXY_SCRIPT}</script>` : '';
85+
86+
const modifiedHead = `${headWithMetaTags}${headWithFetchScript}`;
10187

102-
return html;
88+
return html.replace('<head>', modifiedHead);
10389
};
10490
}
10591

packages/sveltekit/test/server/handle.test.ts

+12-8
Original file line numberDiff line numberDiff line change
@@ -429,10 +429,14 @@ describe('addSentryCodeToPage', () => {
429429
</body>
430430
</html>`;
431431

432-
it('does not add meta tags if no active transaction', () => {
432+
it("Adds add meta tags and fetch proxy script if there's no active transaction", () => {
433433
const transformPageChunk = addSentryCodeToPage({});
434434
const transformed = transformPageChunk({ html, done: true });
435-
expect(transformed).toEqual(html);
435+
436+
expect(transformed).toContain('<meta name="sentry-trace"');
437+
expect(transformed).toContain('<meta name="baggage"');
438+
expect(transformed).not.toContain('sentry-transaction=');
439+
expect(transformed).toContain(`<script >${FETCH_PROXY_SCRIPT}</script>`);
436440
});
437441

438442
it('adds meta tags and the fetch proxy script if there is an active transaction', () => {
@@ -442,6 +446,7 @@ describe('addSentryCodeToPage', () => {
442446

443447
expect(transformed).toContain('<meta name="sentry-trace"');
444448
expect(transformed).toContain('<meta name="baggage"');
449+
expect(transformed).toContain('sentry-transaction=test');
445450
expect(transformed).toContain(`<script >${FETCH_PROXY_SCRIPT}</script>`);
446451
});
447452
});
@@ -453,18 +458,17 @@ describe('addSentryCodeToPage', () => {
453458

454459
expect(transformed).toContain('<meta name="sentry-trace"');
455460
expect(transformed).toContain('<meta name="baggage"');
461+
expect(transformed).toContain('sentry-transaction=test');
456462
expect(transformed).toContain(`<script nonce="123abc">${FETCH_PROXY_SCRIPT}</script>`);
457463
});
458464
});
459465

460466
it('does not add the fetch proxy script if the `injectFetchProxyScript` option is false', () => {
461467
const transformPageChunk = addSentryCodeToPage({ injectFetchProxyScript: false });
462-
SentryNode.startSpan({ name: 'test' }, () => {
463-
const transformed = transformPageChunk({ html, done: true }) as string;
468+
const transformed = transformPageChunk({ html, done: true }) as string;
464469

465-
expect(transformed).toContain('<meta name="sentry-trace"');
466-
expect(transformed).toContain('<meta name="baggage"');
467-
expect(transformed).not.toContain(`<script >${FETCH_PROXY_SCRIPT}</script>`);
468-
});
470+
expect(transformed).toContain('<meta name="sentry-trace"');
471+
expect(transformed).toContain('<meta name="baggage"');
472+
expect(transformed).not.toContain(`<script >${FETCH_PROXY_SCRIPT}</script>`);
469473
});
470474
});

0 commit comments

Comments
 (0)