UNPKG

@sentry/nextjs

Version:
65 lines (62 loc) • 2.92 kB
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