Skip to content

Commit d882ca3

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

File tree

2 files changed

+18
-18
lines changed

2 files changed

+18
-18
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 & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -105,34 +105,34 @@ export function wrapHandleErrorWithSentry(
105105
}
106106

107107
/**
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.
108+
* Get trace context for injection into loader response data (for meta tags).
109+
* Returns empty object when Server-Timing headers are available, as they take priority.
110+
* Only provides trace data for meta tags as a fallback mechanism.
111111
*/
112112
function getTraceAndBaggage(): {
113113
sentryTrace?: string;
114114
sentryBaggage?: string;
115115
} {
116+
// Server-Timing headers take priority over meta tags.
117+
// When in Node.js or Cloudflare environments with an active span,
118+
// Server-Timing headers will be injected, so skip meta tag data.
116119
if (isNodeEnv() || isCloudflareEnv()) {
117120
const activeSpan = getActiveSpan();
118121
if (activeSpan) {
119-
const sentryTrace = spanToTraceHeader(activeSpan);
120-
if (sentryTrace) {
121-
return {
122-
sentryTrace,
123-
sentryBaggage: spanToBaggageHeader(activeSpan),
124-
};
125-
}
122+
// Server-Timing header will be available, skip meta tag injection
123+
DEBUG_BUILD && debug.log('[getTraceAndBaggage] Skipping meta tag injection - Server-Timing header will be used');
124+
return {};
126125
}
127126

127+
// No active span - fall back to meta tags via propagation context
128128
const scope = getCurrentScope();
129129
const propagationContext = scope.getPropagationContext();
130130
const traceData = getTraceData();
131131
const spanId = propagationContext.propagationSpanId ?? propagationContext.parentSpanId;
132132

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

137137
return {
138138
sentryTrace: fallbackTrace,

0 commit comments

Comments
 (0)