Skip to content

Commit 982c420

Browse files
committed
Prioritize Server-Timing headers over meta tags
1 parent 284eee8 commit 982c420

File tree

2 files changed

+18
-20
lines changed

2 files changed

+18
-20
lines changed

packages/remix/src/client/performance.tsx

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -113,18 +113,18 @@ export function startPageloadSpan(client: Client): void {
113113
},
114114
};
115115

116-
// Priority: meta tags > Server-Timing header > async retry
117-
const metaTagTrace = getMetaTagTraceContext();
118-
if (metaTagTrace) {
116+
// Priority: Server-Timing header > meta tags > async retry
117+
const serverTimingTrace = getNavigationTraceContext();
118+
if (serverTimingTrace) {
119119
pageloadSpanStarted = true;
120-
startBrowserTracingPageLoadSpan(client, spanContext, metaTagTrace);
120+
startBrowserTracingPageLoadSpan(client, spanContext, serverTimingTrace);
121121
return;
122122
}
123123

124-
const serverTimingTrace = getNavigationTraceContext();
125-
if (serverTimingTrace) {
124+
const metaTagTrace = getMetaTagTraceContext();
125+
if (metaTagTrace) {
126126
pageloadSpanStarted = true;
127-
startBrowserTracingPageLoadSpan(client, spanContext, serverTimingTrace);
127+
startBrowserTracingPageLoadSpan(client, spanContext, metaTagTrace);
128128
return;
129129
}
130130

packages/remix/src/server/instrumentServer.ts

Lines changed: 11 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -31,9 +31,7 @@ import {
3131
SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN,
3232
SEMANTIC_ATTRIBUTE_SENTRY_SOURCE,
3333
setHttpStatus,
34-
spanToBaggageHeader,
3534
spanToJSON,
36-
spanToTraceHeader,
3735
startSpan,
3836
winterCGHeadersToDict,
3937
winterCGRequestToRequestData,
@@ -105,34 +103,34 @@ export function wrapHandleErrorWithSentry(
105103
}
106104

107105
/**
108-
* Get trace context for injection into loader response data.
109-
* Prioritizes active span context to ensure client pageload continues from the loader span,
110-
* not the http.server span, enabling proper trace continuity via Server-Timing headers.
106+
* Get trace context for injection into loader response data (for meta tags).
107+
* Returns empty object when Server-Timing headers are available, as they take priority.
108+
* Only provides trace data for meta tags as a fallback mechanism.
111109
*/
112110
function getTraceAndBaggage(): {
113111
sentryTrace?: string;
114112
sentryBaggage?: string;
115113
} {
114+
// Server-Timing headers take priority over meta tags.
115+
// When in Node.js or Cloudflare environments with an active span,
116+
// Server-Timing headers will be injected, so skip meta tag data.
116117
if (isNodeEnv() || isCloudflareEnv()) {
117118
const activeSpan = getActiveSpan();
118119
if (activeSpan) {
119-
const sentryTrace = spanToTraceHeader(activeSpan);
120-
if (sentryTrace) {
121-
return {
122-
sentryTrace,
123-
sentryBaggage: spanToBaggageHeader(activeSpan),
124-
};
125-
}
120+
// Server-Timing header will be available, skip meta tag injection
121+
DEBUG_BUILD && debug.log('[getTraceAndBaggage] Skipping meta tag injection - Server-Timing header will be used');
122+
return {};
126123
}
127124

125+
// No active span - fall back to meta tags via propagation context
128126
const scope = getCurrentScope();
129127
const propagationContext = scope.getPropagationContext();
130128
const traceData = getTraceData();
131129
const spanId = propagationContext.propagationSpanId ?? propagationContext.parentSpanId;
132130

133131
if (propagationContext.traceId && spanId) {
134132
const fallbackTrace = generateSentryTraceHeader(propagationContext.traceId, spanId, propagationContext.sampled);
135-
DEBUG_BUILD && debug.log('[getTraceAndBaggage] Falling back to propagation context:', fallbackTrace);
133+
DEBUG_BUILD && debug.log('[getTraceAndBaggage] Using meta tags fallback - no active span for Server-Timing');
136134

137135
return {
138136
sentryTrace: fallbackTrace,

0 commit comments

Comments
 (0)