browserTracingIntegration.js.map 28 KB

1
  1. {"version":3,"file":"browserTracingIntegration.js","sources":["../../../src/browser/browserTracingIntegration.ts"],"sourcesContent":["/* eslint-disable max-lines */\nimport type { IdleTransaction } from '@sentry/core';\nimport { getActiveSpan } from '@sentry/core';\nimport { getCurrentHub } from '@sentry/core';\nimport {\n SEMANTIC_ATTRIBUTE_SENTRY_SOURCE,\n TRACING_DEFAULTS,\n addTracingExtensions,\n getActiveTransaction,\n spanToJSON,\n startIdleTransaction,\n} from '@sentry/core';\nimport type {\n Client,\n IntegrationFn,\n StartSpanOptions,\n Transaction,\n TransactionContext,\n TransactionSource,\n} from '@sentry/types';\nimport type { Span } from '@sentry/types';\nimport {\n addHistoryInstrumentationHandler,\n browserPerformanceTimeOrigin,\n getDomElement,\n logger,\n propagationContextFromHeaders,\n} from '@sentry/utils';\n\nimport { DEBUG_BUILD } from '../common/debug-build';\nimport { registerBackgroundTabDetection } from './backgroundtab';\nimport {\n addPerformanceEntries,\n startTrackingInteractions,\n startTrackingLongTasks,\n startTrackingWebVitals,\n} from './metrics';\nimport type { RequestInstrumentationOptions } from './request';\nimport { defaultRequestInstrumentationOptions, instrumentOutgoingRequests } from './request';\nimport { WINDOW } from './types';\n\nexport const BROWSER_TRACING_INTEGRATION_ID = 'BrowserTracing';\n\n/** Options for Browser Tracing integration */\nexport interface BrowserTracingOptions extends RequestInstrumentationOptions {\n /**\n * The time to wait in ms until the transaction will be finished during an idle state. An idle state is defined\n * by a moment where there are no in-progress spans.\n *\n * The transaction will use the end timestamp of the last finished span as the endtime for the transaction.\n * If there are still active spans when this the `idleTimeout` is set, the `idleTimeout` will get reset.\n * Time is in ms.\n *\n * Default: 1000\n */\n idleTimeout: number;\n\n /**\n * The max duration for a transaction. If a transaction duration hits the `finalTimeout` value, it\n * will be finished.\n * Time is in ms.\n *\n * Default: 30000\n */\n finalTimeout: number;\n\n /**\n * The heartbeat interval. If no new spans are started or open spans are finished within 3 heartbeats,\n * the transaction will be finished.\n * Time is in ms.\n *\n * Default: 5000\n */\n heartbeatInterval: 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 * _metricOptions allows the user to send options to change how metrics are collected.\n *\n * _metricOptions is currently experimental.\n *\n * Default: undefined\n */\n _metricOptions?: Partial<{\n /**\n * @deprecated This property no longer has any effect and will be removed in v8.\n */\n _reportAllChanges: boolean;\n }>;\n\n /**\n * _experiments allows the user to send options to define how this integration works.\n * Note that the `enableLongTask` options is deprecated in favor of the option at the top level, and will be removed in v8.\n *\n * TODO (v8): Remove enableLongTask\n *\n * Default: undefined\n */\n _experiments: Partial<{\n enableInteractions: 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\nconst DEFAULT_BROWSER_TRACING_OPTIONS: BrowserTracingOptions = {\n ...TRACING_DEFAULTS,\n instrumentNavigation: true,\n instrumentPageLoad: true,\n markBackgroundSpan: true,\n enableLongTask: 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. This integration uses {@see IdleTransaction} to create transactions.\n *\n * We explicitly export the proper type here, as this has to be extended in some cases.\n */\nexport const browserTracingIntegration = ((_options: Partial<BrowserTracingOptions> = {}) => {\n const _hasSetTracePropagationTargets = DEBUG_BUILD\n ? !!(\n // eslint-disable-next-line deprecation/deprecation\n (_options.tracePropagationTargets || _options.tracingOrigins)\n )\n : false;\n\n addTracingExtensions();\n\n // TODO (v8): remove this block after tracingOrigins is removed\n // Set tracePropagationTargets to tracingOrigins if specified by the user\n // In case both are specified, tracePropagationTargets takes precedence\n // eslint-disable-next-line deprecation/deprecation\n if (!_options.tracePropagationTargets && _options.tracingOrigins) {\n // eslint-disable-next-line deprecation/deprecation\n _options.tracePropagationTargets = _options.tracingOrigins;\n }\n\n const options = {\n ...DEFAULT_BROWSER_TRACING_OPTIONS,\n ..._options,\n };\n\n const _collectWebVitals = startTrackingWebVitals();\n\n if (options.enableLongTask) {\n startTrackingLongTasks();\n }\n if (options._experiments.enableInteractions) {\n startTrackingInteractions();\n }\n\n let latestRouteName: string | undefined;\n let latestRouteSource: TransactionSource | undefined;\n\n /** Create routing idle transaction. */\n function _createRouteTransaction(context: TransactionContext): Transaction | undefined {\n // eslint-disable-next-line deprecation/deprecation\n const hub = getCurrentHub();\n\n const { beforeStartSpan, idleTimeout, finalTimeout, heartbeatInterval } = options;\n\n const isPageloadTransaction = context.op === 'pageload';\n\n let expandedContext: TransactionContext;\n if (isPageloadTransaction) {\n const sentryTrace = isPageloadTransaction ? getMetaContent('sentry-trace') : '';\n const baggage = isPageloadTransaction ? getMetaContent('baggage') : undefined;\n const { traceId, dsc, parentSpanId, sampled } = propagationContextFromHeaders(sentryTrace, baggage);\n expandedContext = {\n traceId,\n parentSpanId,\n parentSampled: sampled,\n ...context,\n metadata: {\n // eslint-disable-next-line deprecation/deprecation\n ...context.metadata,\n dynamicSamplingContext: dsc,\n },\n trimEnd: true,\n };\n } else {\n expandedContext = {\n trimEnd: true,\n ...context,\n };\n }\n\n const finalContext = beforeStartSpan ? beforeStartSpan(expandedContext) : expandedContext;\n\n // If `beforeStartSpan` set a custom name, record that fact\n // eslint-disable-next-line deprecation/deprecation\n finalContext.metadata =\n finalContext.name !== expandedContext.name\n ? // eslint-disable-next-line deprecation/deprecation\n { ...finalContext.metadata, source: 'custom' }\n : // eslint-disable-next-line deprecation/deprecation\n finalContext.metadata;\n\n latestRouteName = finalContext.name;\n latestRouteSource = getSource(finalContext);\n\n if (finalContext.sampled === false) {\n DEBUG_BUILD && logger.log(`[Tracing] Will not send ${finalContext.op} transaction because of beforeNavigate.`);\n }\n\n DEBUG_BUILD && logger.log(`[Tracing] Starting ${finalContext.op} transaction on scope`);\n\n const { location } = WINDOW;\n\n const idleTransaction = startIdleTransaction(\n hub,\n finalContext,\n idleTimeout,\n finalTimeout,\n true,\n { location }, // for use in the tracesSampler\n heartbeatInterval,\n isPageloadTransaction, // should wait for finish signal if it's a pageload transaction\n );\n\n if (isPageloadTransaction) {\n WINDOW.document.addEventListener('readystatechange', () => {\n if (['interactive', 'complete'].includes(WINDOW.document.readyState)) {\n idleTransaction.sendAutoFinishSignal();\n }\n });\n\n if (['interactive', 'complete'].includes(WINDOW.document.readyState)) {\n idleTransaction.sendAutoFinishSignal();\n }\n }\n\n idleTransaction.registerBeforeFinishCallback(transaction => {\n _collectWebVitals();\n addPerformanceEntries(transaction);\n });\n\n return idleTransaction as Transaction;\n }\n\n return {\n name: BROWSER_TRACING_INTEGRATION_ID,\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n setupOnce: () => {},\n afterAllSetup(client) {\n const clientOptions = client.getOptions();\n\n const { markBackgroundSpan, traceFetch, traceXHR, shouldCreateSpanForRequest, enableHTTPTimings, _experiments } =\n options;\n\n const clientOptionsTracePropagationTargets = clientOptions && clientOptions.tracePropagationTargets;\n // There are three ways to configure tracePropagationTargets:\n // 1. via top level client option `tracePropagationTargets`\n // 2. via BrowserTracing option `tracePropagationTargets`\n // 3. via BrowserTracing option `tracingOrigins` (deprecated)\n //\n // To avoid confusion, favour top level client option `tracePropagationTargets`, and fallback to\n // BrowserTracing option `tracePropagationTargets` and then `tracingOrigins` (deprecated).\n // This is done as it minimizes bundle size (we don't have to have undefined checks).\n //\n // If both 1 and either one of 2 or 3 are set (from above), we log out a warning.\n // eslint-disable-next-line deprecation/deprecation\n const tracePropagationTargets = clientOptionsTracePropagationTargets || options.tracePropagationTargets;\n if (DEBUG_BUILD && _hasSetTracePropagationTargets && clientOptionsTracePropagationTargets) {\n logger.warn(\n '[Tracing] The `tracePropagationTargets` option was set in the BrowserTracing integration and top level `Sentry.init`. The top level `Sentry.init` value is being used.',\n );\n }\n\n let activeSpan: Span | undefined;\n let startingUrl: string | undefined = WINDOW.location.href;\n\n if (client.on) {\n client.on('startNavigationSpan', (context: StartSpanOptions) => {\n if (activeSpan) {\n DEBUG_BUILD && logger.log(`[Tracing] Finishing current transaction 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 activeSpan = _createRouteTransaction({\n op: 'navigation',\n ...context,\n });\n });\n\n client.on('startPageLoadSpan', (context: StartSpanOptions) => {\n if (activeSpan) {\n DEBUG_BUILD && logger.log(`[Tracing] Finishing current transaction 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 activeSpan = _createRouteTransaction({\n op: 'pageload',\n ...context,\n });\n });\n }\n\n if (options.instrumentPageLoad && client.emit) {\n const context: StartSpanOptions = {\n name: WINDOW.location.pathname,\n // pageload should always start at timeOrigin (and needs to be in s, not ms)\n startTimestamp: browserPerformanceTimeOrigin ? browserPerformanceTimeOrigin / 1000 : undefined,\n origin: 'auto.pageload.browser',\n attributes: {\n [SEMANTIC_ATTRIBUTE_SENTRY_SOURCE]: 'url',\n },\n };\n startBrowserTracingPageLoadSpan(client, context);\n }\n\n if (options.instrumentNavigation && client.emit) {\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 const context: StartSpanOptions = {\n name: WINDOW.location.pathname,\n origin: 'auto.navigation.browser',\n attributes: {\n [SEMANTIC_ATTRIBUTE_SENTRY_SOURCE]: 'url',\n },\n };\n\n startBrowserTracingNavigationSpan(client, context);\n }\n });\n }\n\n if (markBackgroundSpan) {\n registerBackgroundTabDetection();\n }\n\n if (_experiments.enableInteractions) {\n registerInteractionListener(options, latestRouteName, latestRouteSource);\n }\n\n instrumentOutgoingRequests({\n traceFetch,\n traceXHR,\n tracePropagationTargets,\n shouldCreateSpanForRequest,\n enableHTTPTimings,\n });\n },\n // TODO v8: Remove this again\n // This is private API that we use to fix converted BrowserTracing integrations in Next.js & SvelteKit\n options,\n };\n}) satisfies IntegrationFn;\n\n/**\n * Manually start a page load span.\n * This will only do something if the BrowserTracing integration has been setup.\n */\nexport function startBrowserTracingPageLoadSpan(client: Client, spanOptions: StartSpanOptions): Span | undefined {\n if (!client.emit) {\n return;\n }\n\n client.emit('startPageLoadSpan', spanOptions);\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 the BrowserTracing integration has been setup.\n */\nexport function startBrowserTracingNavigationSpan(client: Client, spanOptions: StartSpanOptions): Span | undefined {\n if (!client.emit) {\n return;\n }\n\n client.emit('startNavigationSpan', spanOptions);\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 options: BrowserTracingOptions,\n latestRouteName: string | undefined,\n latestRouteSource: TransactionSource | undefined,\n): void {\n let inflightInteractionTransaction: IdleTransaction | undefined;\n const registerInteractionTransaction = (): void => {\n const { idleTimeout, finalTimeout, heartbeatInterval } = options;\n const op = 'ui.action.click';\n\n // eslint-disable-next-line deprecation/deprecation\n const currentTransaction = getActiveTransaction();\n if (currentTransaction && currentTransaction.op && ['navigation', 'pageload'].includes(currentTransaction.op)) {\n DEBUG_BUILD &&\n logger.warn(\n `[Tracing] Did not create ${op} transaction because a pageload or navigation transaction is in progress.`,\n );\n return undefined;\n }\n\n if (inflightInteractionTransaction) {\n inflightInteractionTransaction.setFinishReason('interactionInterrupted');\n inflightInteractionTransaction.end();\n inflightInteractionTransaction = undefined;\n }\n\n if (!latestRouteName) {\n DEBUG_BUILD && logger.warn(`[Tracing] Did not create ${op} transaction because _latestRouteName is missing.`);\n return undefined;\n }\n\n const { location } = WINDOW;\n\n const context: TransactionContext = {\n name: latestRouteName,\n op,\n trimEnd: true,\n data: {\n [SEMANTIC_ATTRIBUTE_SENTRY_SOURCE]: latestRouteSource || 'url',\n },\n };\n\n inflightInteractionTransaction = startIdleTransaction(\n // eslint-disable-next-line deprecation/deprecation\n getCurrentHub(),\n context,\n idleTimeout,\n finalTimeout,\n true,\n { location }, // for use in the tracesSampler\n heartbeatInterval,\n );\n };\n\n ['click'].forEach(type => {\n addEventListener(type, registerInteractionTransaction, { once: false, capture: true });\n });\n}\n\nfunction getSource(context: TransactionContext): TransactionSource | undefined {\n const sourceFromAttributes = context.attributes && context.attributes[SEMANTIC_ATTRIBUTE_SENTRY_SOURCE];\n // eslint-disable-next-line deprecation/deprecation\n const sourceFromData = context.data && context.data[SEMANTIC_ATTRIBUTE_SENTRY_SOURCE];\n // eslint-disable-next-line deprecation/deprecation\n const sourceFromMetadata = context.metadata && context.metadata.source;\n\n return sourceFromAttributes || sourceFromData || sourceFromMetadata;\n}\n"],"names":["TRACING_DEFAULTS","defaultRequestInstrumentationOptions","DEBUG_BUILD","addTracingExtensions","startTrackingWebVitals","startTrackingLongTasks","startTrackingInteractions","getCurrentHub","propagationContextFromHeaders","logger","WINDOW","startIdleTransaction","addPerformanceEntries","spanToJSON","browserPerformanceTimeOrigin","SEMANTIC_ATTRIBUTE_SENTRY_SOURCE","addHistoryInstrumentationHandler","registerBackgroundTabDetection","instrumentOutgoingRequests","getActiveSpan","getDomElement","getActiveTransaction"],"mappings":"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"}