@sentry/nextjs
Version:
Official Sentry SDK for Next.js
65 lines (62 loc) • 2.92 kB
JavaScript
import { URL_PATH, URL_TEMPLATE, URL_FULL, SENTRY_SEGMENT_NAME_SOURCE, SENTRY_ORIGIN, SENTRY_OP } from '@sentry/conventions/attributes';
import { PAGELOAD } from '@sentry/conventions/op';
import { filterCollectedUrl, hasSpanStreamingEnabled, PAGELOAD_SPAN_NAME_FALLBACK, getCurrentScope } from '@sentry/core';
import { WINDOW, resolveCurrentRoute, startBrowserTracingPageLoadSpan } from '@sentry/react';
import { stripTrailingSlash } from './parameterization.js';
import { readTraceMetaTags, canWaitForTraceMetaTag, waitForTraceMetaTag, withCacheOrigin, addTraceMetaTagLink } from './traceMetaTags.js';
const PAGELOAD_TRACE_META_TAG_TIMEOUT_MS = 1e4;
let pendingPageloadWait;
function settlePendingPageloadWait() {
pendingPageloadWait?.giveUp();
}
function startPageloadSpan(client, spanOptions, documentUrl, traceMetaTags) {
const span = startBrowserTracingPageLoadSpan(client, withCacheOrigin(spanOptions, traceMetaTags), traceMetaTags);
const scope = getCurrentScope();
const { normalizedRequest } = scope.getScopeData().sdkProcessingMetadata;
if (normalizedRequest) {
scope.setSDKProcessingMetadata({ normalizedRequest: { ...normalizedRequest, url: documentUrl } });
}
return span;
}
function appRouterInstrumentPageLoad(client) {
const documentUrl = filterCollectedUrl(WINDOW.location.href, client);
const pathname = stripTrailingSlash(WINDOW.location.pathname);
const parameterizedPathname = resolveCurrentRoute(client);
const spanOptions = {
// With span streaming, span names have to be low cardinality, so we can't fall back to the URL.
name: parameterizedPathname ?? (hasSpanStreamingEnabled(client) ? PAGELOAD_SPAN_NAME_FALLBACK : pathname),
// pageload should always start at timeOrigin (and needs to be in s, not ms)
attributes: {
[SENTRY_OP]: PAGELOAD,
[SENTRY_ORIGIN]: "auto.pageload.nextjs.app_router_instrumentation",
[SENTRY_SEGMENT_NAME_SOURCE]: parameterizedPathname ? "route" : "url",
[URL_PATH]: WINDOW.location.pathname,
[URL_FULL]: documentUrl,
[URL_TEMPLATE]: parameterizedPathname
}
};
const traceMetaTags = readTraceMetaTags();
if (traceMetaTags || !canWaitForTraceMetaTag()) {
startPageloadSpan(client, spanOptions, documentUrl, traceMetaTags);
return;
}
pendingPageloadWait = waitForTraceMetaTag(
(values) => {
pendingPageloadWait = void 0;
startPageloadSpan(client, spanOptions, documentUrl, values);
},
() => {
pendingPageloadWait = void 0;
const span = startPageloadSpan(client, spanOptions, documentUrl);
if (span) {
waitForTraceMetaTag(
(values) => span.isRecording() && addTraceMetaTagLink(span, values),
() => void 0
);
}
},
PAGELOAD_TRACE_META_TAG_TIMEOUT_MS
);
}
export { appRouterInstrumentPageLoad, settlePendingPageloadWait };
//# sourceMappingURL=appRouterPageloadInstrumentation.js.map