Many resources are needed to download a project. Please understand that we have to compensate our server costs. Thank you in advance. Project price only 1 $
You can buy this project and download/modify it how often you want.
{"version":3,"file":"browserTracingIntegration.js","sources":["../../../../src/tracing/browserTracingIntegration.ts"],"sourcesContent":["/* eslint-disable max-lines */\nimport {\n addHistoryInstrumentationHandler,\n addPerformanceEntries,\n registerInpInteractionListener,\n startTrackingINP,\n startTrackingInteractions,\n startTrackingLongAnimationFrames,\n startTrackingLongTasks,\n startTrackingWebVitals,\n} from '@sentry-internal/browser-utils';\nimport {\n SEMANTIC_ATTRIBUTE_SENTRY_IDLE_SPAN_FINISH_REASON,\n SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN,\n SEMANTIC_ATTRIBUTE_SENTRY_SOURCE,\n TRACING_DEFAULTS,\n getActiveSpan,\n getClient,\n getCurrentScope,\n getDynamicSamplingContextFromSpan,\n getIsolationScope,\n getRootSpan,\n registerSpanErrorInstrumentation,\n spanIsSampled,\n spanToJSON,\n startIdleSpan,\n} from '@sentry/core';\nimport type { Client, IntegrationFn, StartSpanOptions, TransactionSource } from '@sentry/types';\nimport type { Span } from '@sentry/types';\nimport {\n GLOBAL_OBJ,\n browserPerformanceTimeOrigin,\n generatePropagationContext,\n getDomElement,\n logger,\n propagationContextFromHeaders,\n} from '@sentry/utils';\n\nimport { DEBUG_BUILD } from '../debug-build';\nimport { WINDOW } from '../helpers';\nimport { registerBackgroundTabDetection } from './backgroundtab';\nimport { defaultRequestInstrumentationOptions, instrumentOutgoingRequests } from './request';\n\nexport const BROWSER_TRACING_INTEGRATION_ID = 'BrowserTracing';\n\ninterface RouteInfo {\n name: string | undefined;\n source: TransactionSource | undefined;\n}\n\n/** Options for Browser Tracing integration */\nexport interface BrowserTracingOptions {\n /**\n * The time that has to pass without any span being created.\n * If this time is exceeded, the idle span will finish.\n *\n * Default: 1000 (ms)\n */\n idleTimeout: number;\n\n /**\n * The max. time an idle span may run.\n * If this time is exceeded, the idle span will finish no matter what.\n *\n * Default: 30000 (ms)\n */\n finalTimeout: number;\n\n /**\n The max. time an idle span may run.\n * If this time is exceeded, the idle span will finish no matter what.\n *\n * Default: 15000 (ms)\n */\n childSpanTimeout: number;\n\n /**\n * If a span should be created on page load.\n * If this is set to `false`, this integration will not start the default page load span.\n * Default: true\n */\n instrumentPageLoad: boolean;\n\n /**\n * If a span should be created on navigation (history change).\n * If this is set to `false`, this integration will not start the default navigation spans.\n * Default: true\n */\n instrumentNavigation: boolean;\n\n /**\n * Flag spans where tabs moved to background with \"cancelled\". Browser background tab timing is\n * not suited towards doing precise measurements of operations. By default, we recommend that this option\n * be enabled as background transactions can mess up your statistics in nondeterministic ways.\n *\n * Default: true\n */\n markBackgroundSpan: boolean;\n\n /**\n * If true, Sentry will capture long tasks and add them to the corresponding transaction.\n *\n * Default: true\n */\n enableLongTask: boolean;\n\n /**\n * If true, Sentry will capture long animation frames and add them to the corresponding transaction.\n *\n * Default: false\n */\n enableLongAnimationFrame: boolean;\n\n /**\n * If true, Sentry will capture first input delay and add it to the corresponding transaction.\n *\n * Default: true\n */\n enableInp: boolean;\n\n /**\n * Flag to disable patching all together for fetch requests.\n *\n * Default: true\n */\n traceFetch: boolean;\n\n /**\n * Flag to disable patching all together for xhr requests.\n *\n * Default: true\n */\n traceXHR: boolean;\n\n /**\n * If true, Sentry will capture http timings and add them to the corresponding http spans.\n *\n * Default: true\n */\n enableHTTPTimings: boolean;\n\n /**\n * _experiments allows the user to send options to define how this integration works.\n *\n * Default: undefined\n */\n _experiments: Partial<{\n enableInteractions: boolean;\n enableStandaloneClsSpans: boolean;\n }>;\n\n /**\n * A callback which is called before a span for a pageload or navigation is started.\n * It receives the options passed to `startSpan`, and expects to return an updated options object.\n */\n beforeStartSpan?: (options: StartSpanOptions) => StartSpanOptions;\n\n /**\n * This function will be called before creating a span for a request with the given url.\n * Return false if you don't want a span for the given url.\n *\n * Default: (url: string) => true\n */\n shouldCreateSpanForRequest?(this: void, url: string): boolean;\n}\n\nconst DEFAULT_BROWSER_TRACING_OPTIONS: BrowserTracingOptions = {\n ...TRACING_DEFAULTS,\n instrumentNavigation: true,\n instrumentPageLoad: true,\n markBackgroundSpan: true,\n enableLongTask: true,\n enableLongAnimationFrame: true,\n enableInp: true,\n _experiments: {},\n ...defaultRequestInstrumentationOptions,\n};\n\n/**\n * The Browser Tracing integration automatically instruments browser pageload/navigation\n * actions as transactions, and captures requests, metrics and errors as spans.\n *\n * The integration can be configured with a variety of options, and can be extended to use\n * any routing library.\n *\n * We explicitly export the proper type here, as this has to be extended in some cases.\n */\nexport const browserTracingIntegration = ((_options: Partial = {}) => {\n registerSpanErrorInstrumentation();\n\n const {\n enableInp,\n enableLongTask,\n enableLongAnimationFrame,\n _experiments: { enableInteractions, enableStandaloneClsSpans },\n beforeStartSpan,\n idleTimeout,\n finalTimeout,\n childSpanTimeout,\n markBackgroundSpan,\n traceFetch,\n traceXHR,\n shouldCreateSpanForRequest,\n enableHTTPTimings,\n instrumentPageLoad,\n instrumentNavigation,\n } = {\n ...DEFAULT_BROWSER_TRACING_OPTIONS,\n ..._options,\n };\n\n const _collectWebVitals = startTrackingWebVitals({ recordClsStandaloneSpans: enableStandaloneClsSpans || false });\n\n if (enableInp) {\n startTrackingINP();\n }\n\n if (\n enableLongAnimationFrame &&\n GLOBAL_OBJ.PerformanceObserver &&\n PerformanceObserver.supportedEntryTypes &&\n PerformanceObserver.supportedEntryTypes.includes('long-animation-frame')\n ) {\n startTrackingLongAnimationFrames();\n } else if (enableLongTask) {\n startTrackingLongTasks();\n }\n\n if (enableInteractions) {\n startTrackingInteractions();\n }\n\n const latestRoute: RouteInfo = {\n name: undefined,\n source: undefined,\n };\n\n /** Create routing idle transaction. */\n function _createRouteSpan(client: Client, startSpanOptions: StartSpanOptions): Span {\n const isPageloadTransaction = startSpanOptions.op === 'pageload';\n\n const finalStartSpanOptions: StartSpanOptions = beforeStartSpan\n ? beforeStartSpan(startSpanOptions)\n : startSpanOptions;\n\n const attributes = finalStartSpanOptions.attributes || {};\n\n // If `finalStartSpanOptions.name` is different than `startSpanOptions.name`\n // it is because `beforeStartSpan` set a custom name. Therefore we set the source to 'custom'.\n if (startSpanOptions.name !== finalStartSpanOptions.name) {\n attributes[SEMANTIC_ATTRIBUTE_SENTRY_SOURCE] = 'custom';\n finalStartSpanOptions.attributes = attributes;\n }\n\n latestRoute.name = finalStartSpanOptions.name;\n latestRoute.source = attributes[SEMANTIC_ATTRIBUTE_SENTRY_SOURCE];\n\n const idleSpan = startIdleSpan(finalStartSpanOptions, {\n idleTimeout,\n finalTimeout,\n childSpanTimeout,\n // should wait for finish signal if it's a pageload transaction\n disableAutoFinish: isPageloadTransaction,\n beforeSpanEnd: span => {\n _collectWebVitals();\n addPerformanceEntries(span, { recordClsOnPageloadSpan: !enableStandaloneClsSpans });\n },\n });\n\n function emitFinish(): void {\n if (['interactive', 'complete'].includes(WINDOW.document.readyState)) {\n client.emit('idleSpanEnableAutoFinish', idleSpan);\n }\n }\n\n if (isPageloadTransaction && WINDOW.document) {\n WINDOW.document.addEventListener('readystatechange', () => {\n emitFinish();\n });\n\n emitFinish();\n }\n\n return idleSpan;\n }\n\n return {\n name: BROWSER_TRACING_INTEGRATION_ID,\n afterAllSetup(client) {\n let activeSpan: Span | undefined;\n let startingUrl: string | undefined = WINDOW.location && WINDOW.location.href;\n\n client.on('startNavigationSpan', startSpanOptions => {\n if (getClient() !== client) {\n return;\n }\n\n if (activeSpan && !spanToJSON(activeSpan).timestamp) {\n DEBUG_BUILD && logger.log(`[Tracing] Finishing current root span with op: ${spanToJSON(activeSpan).op}`);\n // If there's an open transaction on the scope, we need to finish it before creating an new one.\n activeSpan.end();\n }\n\n activeSpan = _createRouteSpan(client, {\n op: 'navigation',\n ...startSpanOptions,\n });\n });\n\n client.on('startPageLoadSpan', (startSpanOptions, traceOptions = {}) => {\n if (getClient() !== client) {\n return;\n }\n\n if (activeSpan && !spanToJSON(activeSpan).timestamp) {\n DEBUG_BUILD && logger.log(`[Tracing] Finishing current root span with op: ${spanToJSON(activeSpan).op}`);\n // If there's an open transaction on the scope, we need to finish it before creating an new one.\n activeSpan.end();\n }\n\n const sentryTrace = traceOptions.sentryTrace || getMetaContent('sentry-trace');\n const baggage = traceOptions.baggage || getMetaContent('baggage');\n\n const propagationContext = propagationContextFromHeaders(sentryTrace, baggage);\n getCurrentScope().setPropagationContext(propagationContext);\n\n activeSpan = _createRouteSpan(client, {\n op: 'pageload',\n ...startSpanOptions,\n });\n });\n\n // A trace should to stay the consistent over the entire time span of one route.\n // Therefore, when the initial pageload or navigation root span ends, we update the\n // scope's propagation context to keep span-specific attributes like the `sampled` decision and\n // the dynamic sampling context valid, even after the root span has ended.\n // This ensures that the trace data is consistent for the entire duration of the route.\n client.on('spanEnd', span => {\n const op = spanToJSON(span).op;\n if (span !== getRootSpan(span) || (op !== 'navigation' && op !== 'pageload')) {\n return;\n }\n\n const scope = getCurrentScope();\n const oldPropagationContext = scope.getPropagationContext();\n\n scope.setPropagationContext({\n ...oldPropagationContext,\n sampled: oldPropagationContext.sampled !== undefined ? oldPropagationContext.sampled : spanIsSampled(span),\n dsc: oldPropagationContext.dsc || getDynamicSamplingContextFromSpan(span),\n });\n });\n\n if (WINDOW.location) {\n if (instrumentPageLoad) {\n startBrowserTracingPageLoadSpan(client, {\n name: WINDOW.location.pathname,\n // pageload should always start at timeOrigin (and needs to be in s, not ms)\n startTime: browserPerformanceTimeOrigin ? browserPerformanceTimeOrigin / 1000 : undefined,\n attributes: {\n [SEMANTIC_ATTRIBUTE_SENTRY_SOURCE]: 'url',\n [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'auto.pageload.browser',\n },\n });\n }\n\n if (instrumentNavigation) {\n addHistoryInstrumentationHandler(({ to, from }) => {\n /**\n * This early return is there to account for some cases where a navigation transaction starts right after\n * long-running pageload. We make sure that if `from` is undefined and a valid `startingURL` exists, we don't\n * create an uneccessary navigation transaction.\n *\n * This was hard to duplicate, but this behavior stopped as soon as this fix was applied. This issue might also\n * only be caused in certain development environments where the usage of a hot module reloader is causing\n * errors.\n */\n if (from === undefined && startingUrl && startingUrl.indexOf(to) !== -1) {\n startingUrl = undefined;\n return;\n }\n\n if (from !== to) {\n startingUrl = undefined;\n startBrowserTracingNavigationSpan(client, {\n name: WINDOW.location.pathname,\n attributes: {\n [SEMANTIC_ATTRIBUTE_SENTRY_SOURCE]: 'url',\n [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'auto.navigation.browser',\n },\n });\n }\n });\n }\n }\n\n if (markBackgroundSpan) {\n registerBackgroundTabDetection();\n }\n\n if (enableInteractions) {\n registerInteractionListener(idleTimeout, finalTimeout, childSpanTimeout, latestRoute);\n }\n\n if (enableInp) {\n registerInpInteractionListener();\n }\n\n instrumentOutgoingRequests(client, {\n traceFetch,\n traceXHR,\n tracePropagationTargets: client.getOptions().tracePropagationTargets,\n shouldCreateSpanForRequest,\n enableHTTPTimings,\n });\n },\n };\n}) satisfies IntegrationFn;\n\n/**\n * Manually start a page load span.\n * This will only do something if a browser tracing integration integration has been setup.\n *\n * If you provide a custom `traceOptions` object, it will be used to continue the trace\n * instead of the default behavior, which is to look it up on the tags.\n */\nexport function startBrowserTracingPageLoadSpan(\n client: Client,\n spanOptions: StartSpanOptions,\n traceOptions?: { sentryTrace?: string | undefined; baggage?: string | undefined },\n): Span | undefined {\n client.emit('startPageLoadSpan', spanOptions, traceOptions);\n\n getCurrentScope().setTransactionName(spanOptions.name);\n\n const span = getActiveSpan();\n const op = span && spanToJSON(span).op;\n return op === 'pageload' ? span : undefined;\n}\n\n/**\n * Manually start a navigation span.\n * This will only do something if a browser tracing integration has been setup.\n */\nexport function startBrowserTracingNavigationSpan(client: Client, spanOptions: StartSpanOptions): Span | undefined {\n getIsolationScope().setPropagationContext(generatePropagationContext());\n getCurrentScope().setPropagationContext(generatePropagationContext());\n\n client.emit('startNavigationSpan', spanOptions);\n\n getCurrentScope().setTransactionName(spanOptions.name);\n\n const span = getActiveSpan();\n const op = span && spanToJSON(span).op;\n return op === 'navigation' ? span : undefined;\n}\n\n/** Returns the value of a meta tag */\nexport function getMetaContent(metaName: string): string | undefined {\n // Can't specify generic to `getDomElement` because tracing can be used\n // in a variety of environments, have to disable `no-unsafe-member-access`\n // as a result.\n const metaTag = getDomElement(`meta[name=${metaName}]`);\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n return metaTag ? metaTag.getAttribute('content') : undefined;\n}\n\n/** Start listener for interaction transactions */\nfunction registerInteractionListener(\n idleTimeout: BrowserTracingOptions['idleTimeout'],\n finalTimeout: BrowserTracingOptions['finalTimeout'],\n childSpanTimeout: BrowserTracingOptions['childSpanTimeout'],\n latestRoute: RouteInfo,\n): void {\n let inflightInteractionSpan: Span | undefined;\n const registerInteractionTransaction = (): void => {\n const op = 'ui.action.click';\n\n const activeSpan = getActiveSpan();\n const rootSpan = activeSpan && getRootSpan(activeSpan);\n if (rootSpan) {\n const currentRootSpanOp = spanToJSON(rootSpan).op;\n if (['navigation', 'pageload'].includes(currentRootSpanOp as string)) {\n DEBUG_BUILD &&\n logger.warn(`[Tracing] Did not create ${op} span because a pageload or navigation span is in progress.`);\n return undefined;\n }\n }\n\n if (inflightInteractionSpan) {\n inflightInteractionSpan.setAttribute(SEMANTIC_ATTRIBUTE_SENTRY_IDLE_SPAN_FINISH_REASON, 'interactionInterrupted');\n inflightInteractionSpan.end();\n inflightInteractionSpan = undefined;\n }\n\n if (!latestRoute.name) {\n DEBUG_BUILD && logger.warn(`[Tracing] Did not create ${op} transaction because _latestRouteName is missing.`);\n return undefined;\n }\n\n inflightInteractionSpan = startIdleSpan(\n {\n name: latestRoute.name,\n op,\n attributes: {\n [SEMANTIC_ATTRIBUTE_SENTRY_SOURCE]: latestRoute.source || 'url',\n },\n },\n {\n idleTimeout,\n finalTimeout,\n childSpanTimeout,\n },\n );\n };\n\n if (WINDOW.document) {\n addEventListener('click', registerInteractionTransaction, { once: false, capture: true });\n }\n}\n"],"names":["TRACING_DEFAULTS","defaultRequestInstrumentationOptions","registerSpanErrorInstrumentation","startTrackingWebVitals","startTrackingINP","GLOBAL_OBJ","startTrackingLongAnimationFrames","startTrackingLongTasks","startTrackingInteractions","SEMANTIC_ATTRIBUTE_SENTRY_SOURCE","startIdleSpan","addPerformanceEntries","WINDOW","getClient","spanToJSON","DEBUG_BUILD","logger","propagationContextFromHeaders","getCurrentScope","getRootSpan","spanIsSampled","getDynamicSamplingContextFromSpan","browserPerformanceTimeOrigin","SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN","addHistoryInstrumentationHandler","registerBackgroundTabDetection","registerInpInteractionListener","instrumentOutgoingRequests","getActiveSpan","getIsolationScope","generatePropagationContext","getDomElement","SEMANTIC_ATTRIBUTE_SENTRY_IDLE_SPAN_FINISH_REASON"],"mappings":"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"}