@sentry/browser 11.0.0-alpha.1 → 11.0.0-alpha.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/npm/cjs/dev/client.js.map +1 -1
- package/build/npm/cjs/dev/helpers.js +2 -1
- package/build/npm/cjs/dev/helpers.js.map +1 -1
- package/build/npm/cjs/dev/index.js +6 -4
- package/build/npm/cjs/dev/index.js.map +1 -1
- package/build/npm/cjs/dev/integrations/bfcache.js +113 -0
- package/build/npm/cjs/dev/integrations/bfcache.js.map +1 -0
- package/build/npm/cjs/dev/integrations/breadcrumbs.js +1 -1
- package/build/npm/cjs/dev/integrations/breadcrumbs.js.map +1 -1
- package/build/npm/cjs/dev/integrations/fetchStreamPerformance.js +11 -11
- package/build/npm/cjs/dev/integrations/fetchStreamPerformance.js.map +1 -1
- package/build/npm/cjs/dev/integrations/globalhandlers.js +2 -1
- package/build/npm/cjs/dev/integrations/globalhandlers.js.map +1 -1
- package/build/npm/cjs/dev/integrations/httpclient.js.map +1 -1
- package/build/npm/cjs/dev/integrations/reportingobserver.js +4 -1
- package/build/npm/cjs/dev/integrations/reportingobserver.js.map +1 -1
- package/build/npm/cjs/dev/integrations/spotlight.js +2 -1
- package/build/npm/cjs/dev/integrations/spotlight.js.map +1 -1
- package/build/npm/cjs/dev/integrations/view-hierarchy.js +2 -1
- package/build/npm/cjs/dev/integrations/view-hierarchy.js.map +1 -1
- package/build/npm/cjs/dev/sdk.js +0 -4
- package/build/npm/cjs/dev/sdk.js.map +1 -1
- package/build/npm/cjs/dev/tracing/browserTracingIntegration.js +26 -78
- package/build/npm/cjs/dev/tracing/browserTracingIntegration.js.map +1 -1
- package/build/npm/cjs/dev/tracing/linkedTraces.js +0 -1
- package/build/npm/cjs/dev/tracing/linkedTraces.js.map +1 -1
- package/build/npm/cjs/dev/tracing/request.js +5 -5
- package/build/npm/cjs/dev/tracing/request.js.map +1 -1
- package/build/npm/cjs/dev/utils/detectBrowserExtension.js +2 -1
- package/build/npm/cjs/dev/utils/detectBrowserExtension.js.map +1 -1
- package/build/npm/cjs/dev/utils/lazyLoadIntegration.js +1 -0
- package/build/npm/cjs/dev/utils/lazyLoadIntegration.js.map +1 -1
- package/build/npm/cjs/prod/client.js.map +1 -1
- package/build/npm/cjs/prod/helpers.js +2 -1
- package/build/npm/cjs/prod/helpers.js.map +1 -1
- package/build/npm/cjs/prod/index.js +6 -4
- package/build/npm/cjs/prod/index.js.map +1 -1
- package/build/npm/cjs/prod/integrations/bfcache.js +113 -0
- package/build/npm/cjs/prod/integrations/bfcache.js.map +1 -0
- package/build/npm/cjs/prod/integrations/breadcrumbs.js +1 -1
- package/build/npm/cjs/prod/integrations/breadcrumbs.js.map +1 -1
- package/build/npm/cjs/prod/integrations/fetchStreamPerformance.js +11 -11
- package/build/npm/cjs/prod/integrations/fetchStreamPerformance.js.map +1 -1
- package/build/npm/cjs/prod/integrations/globalhandlers.js +2 -1
- package/build/npm/cjs/prod/integrations/globalhandlers.js.map +1 -1
- package/build/npm/cjs/prod/integrations/httpclient.js.map +1 -1
- package/build/npm/cjs/prod/integrations/reportingobserver.js +4 -1
- package/build/npm/cjs/prod/integrations/reportingobserver.js.map +1 -1
- package/build/npm/cjs/prod/integrations/spotlight.js +2 -1
- package/build/npm/cjs/prod/integrations/spotlight.js.map +1 -1
- package/build/npm/cjs/prod/integrations/view-hierarchy.js +2 -1
- package/build/npm/cjs/prod/integrations/view-hierarchy.js.map +1 -1
- package/build/npm/cjs/prod/sdk.js +0 -4
- package/build/npm/cjs/prod/sdk.js.map +1 -1
- package/build/npm/cjs/prod/tracing/browserTracingIntegration.js +26 -78
- package/build/npm/cjs/prod/tracing/browserTracingIntegration.js.map +1 -1
- package/build/npm/cjs/prod/tracing/linkedTraces.js +0 -1
- package/build/npm/cjs/prod/tracing/linkedTraces.js.map +1 -1
- package/build/npm/cjs/prod/tracing/request.js +5 -5
- package/build/npm/cjs/prod/tracing/request.js.map +1 -1
- package/build/npm/cjs/prod/utils/detectBrowserExtension.js +2 -1
- package/build/npm/cjs/prod/utils/detectBrowserExtension.js.map +1 -1
- package/build/npm/cjs/prod/utils/lazyLoadIntegration.js +1 -0
- package/build/npm/cjs/prod/utils/lazyLoadIntegration.js.map +1 -1
- package/build/npm/esm/dev/client.js.map +1 -1
- package/build/npm/esm/dev/helpers.js +2 -1
- package/build/npm/esm/dev/helpers.js.map +1 -1
- package/build/npm/esm/dev/index.js +4 -4
- package/build/npm/esm/dev/integrations/bfcache.js +109 -0
- package/build/npm/esm/dev/integrations/bfcache.js.map +1 -0
- package/build/npm/esm/dev/integrations/breadcrumbs.js +2 -2
- package/build/npm/esm/dev/integrations/breadcrumbs.js.map +1 -1
- package/build/npm/esm/dev/integrations/fetchStreamPerformance.js +3 -3
- package/build/npm/esm/dev/integrations/fetchStreamPerformance.js.map +1 -1
- package/build/npm/esm/dev/integrations/globalhandlers.js +2 -1
- package/build/npm/esm/dev/integrations/globalhandlers.js.map +1 -1
- package/build/npm/esm/dev/integrations/httpclient.js.map +1 -1
- package/build/npm/esm/dev/integrations/reportingobserver.js +4 -1
- package/build/npm/esm/dev/integrations/reportingobserver.js.map +1 -1
- package/build/npm/esm/dev/integrations/spotlight.js +2 -1
- package/build/npm/esm/dev/integrations/spotlight.js.map +1 -1
- package/build/npm/esm/dev/integrations/view-hierarchy.js +2 -1
- package/build/npm/esm/dev/integrations/view-hierarchy.js.map +1 -1
- package/build/npm/esm/dev/package.json +1 -1
- package/build/npm/esm/dev/sdk.js +0 -4
- package/build/npm/esm/dev/sdk.js.map +1 -1
- package/build/npm/esm/dev/tracing/browserTracingIntegration.js +28 -79
- package/build/npm/esm/dev/tracing/browserTracingIntegration.js.map +1 -1
- package/build/npm/esm/dev/tracing/linkedTraces.js +0 -1
- package/build/npm/esm/dev/tracing/linkedTraces.js.map +1 -1
- package/build/npm/esm/dev/tracing/request.js +7 -7
- package/build/npm/esm/dev/tracing/request.js.map +1 -1
- package/build/npm/esm/dev/utils/detectBrowserExtension.js +2 -1
- package/build/npm/esm/dev/utils/detectBrowserExtension.js.map +1 -1
- package/build/npm/esm/dev/utils/lazyLoadIntegration.js +1 -0
- package/build/npm/esm/dev/utils/lazyLoadIntegration.js.map +1 -1
- package/build/npm/esm/prod/client.js.map +1 -1
- package/build/npm/esm/prod/helpers.js +2 -1
- package/build/npm/esm/prod/helpers.js.map +1 -1
- package/build/npm/esm/prod/index.js +4 -4
- package/build/npm/esm/prod/integrations/bfcache.js +109 -0
- package/build/npm/esm/prod/integrations/bfcache.js.map +1 -0
- package/build/npm/esm/prod/integrations/breadcrumbs.js +2 -2
- package/build/npm/esm/prod/integrations/breadcrumbs.js.map +1 -1
- package/build/npm/esm/prod/integrations/fetchStreamPerformance.js +3 -3
- package/build/npm/esm/prod/integrations/fetchStreamPerformance.js.map +1 -1
- package/build/npm/esm/prod/integrations/globalhandlers.js +2 -1
- package/build/npm/esm/prod/integrations/globalhandlers.js.map +1 -1
- package/build/npm/esm/prod/integrations/httpclient.js.map +1 -1
- package/build/npm/esm/prod/integrations/reportingobserver.js +4 -1
- package/build/npm/esm/prod/integrations/reportingobserver.js.map +1 -1
- package/build/npm/esm/prod/integrations/spotlight.js +2 -1
- package/build/npm/esm/prod/integrations/spotlight.js.map +1 -1
- package/build/npm/esm/prod/integrations/view-hierarchy.js +2 -1
- package/build/npm/esm/prod/integrations/view-hierarchy.js.map +1 -1
- package/build/npm/esm/prod/package.json +1 -1
- package/build/npm/esm/prod/sdk.js +0 -4
- package/build/npm/esm/prod/sdk.js.map +1 -1
- package/build/npm/esm/prod/tracing/browserTracingIntegration.js +28 -79
- package/build/npm/esm/prod/tracing/browserTracingIntegration.js.map +1 -1
- package/build/npm/esm/prod/tracing/linkedTraces.js +0 -1
- package/build/npm/esm/prod/tracing/linkedTraces.js.map +1 -1
- package/build/npm/esm/prod/tracing/request.js +7 -7
- package/build/npm/esm/prod/tracing/request.js.map +1 -1
- package/build/npm/esm/prod/utils/detectBrowserExtension.js +2 -1
- package/build/npm/esm/prod/utils/detectBrowserExtension.js.map +1 -1
- package/build/npm/esm/prod/utils/lazyLoadIntegration.js +1 -0
- package/build/npm/esm/prod/utils/lazyLoadIntegration.js.map +1 -1
- package/build/npm/types/client.d.ts +22 -1
- package/build/npm/types/client.d.ts.map +1 -1
- package/build/npm/types/exports.d.ts +1 -1
- package/build/npm/types/exports.d.ts.map +1 -1
- package/build/npm/types/helpers.d.ts.map +1 -1
- package/build/npm/types/index.bundle.tracing.d.ts +3 -2
- package/build/npm/types/index.bundle.tracing.d.ts.map +1 -1
- package/build/npm/types/index.bundle.tracing.logs.metrics.d.ts +3 -2
- package/build/npm/types/index.bundle.tracing.logs.metrics.d.ts.map +1 -1
- package/build/npm/types/index.bundle.tracing.replay.d.ts +3 -2
- package/build/npm/types/index.bundle.tracing.replay.d.ts.map +1 -1
- package/build/npm/types/index.bundle.tracing.replay.feedback.d.ts +3 -2
- package/build/npm/types/index.bundle.tracing.replay.feedback.d.ts.map +1 -1
- package/build/npm/types/index.bundle.tracing.replay.feedback.logs.metrics.d.ts +3 -2
- package/build/npm/types/index.bundle.tracing.replay.feedback.logs.metrics.d.ts.map +1 -1
- package/build/npm/types/index.bundle.tracing.replay.logs.metrics.d.ts +3 -2
- package/build/npm/types/index.bundle.tracing.replay.logs.metrics.d.ts.map +1 -1
- package/build/npm/types/index.d.ts +5 -3
- package/build/npm/types/index.d.ts.map +1 -1
- package/build/npm/types/integrations/bfcache.d.ts +42 -0
- package/build/npm/types/integrations/bfcache.d.ts.map +1 -0
- package/build/npm/types/integrations/breadcrumbs.d.ts.map +1 -1
- package/build/npm/types/integrations/httpclient.d.ts.map +1 -1
- package/build/npm/types/integrations/interactions.d.ts +2 -0
- package/build/npm/types/integrations/interactions.d.ts.map +1 -0
- package/build/npm/types/integrations/reportingobserver.d.ts.map +1 -1
- package/build/npm/types/integrations/spotlight.d.ts.map +1 -1
- package/build/npm/types/integrations/view-hierarchy.d.ts.map +1 -1
- package/build/npm/types/sdk.d.ts.map +1 -1
- package/build/npm/types/tracing/browserTracingIntegration.d.ts +0 -9
- package/build/npm/types/tracing/browserTracingIntegration.d.ts.map +1 -1
- package/build/npm/types/tracing/request.d.ts +1 -0
- package/build/npm/types/tracing/request.d.ts.map +1 -1
- package/build/npm/types/utils/detectBrowserExtension.d.ts.map +1 -1
- package/build/npm/types/utils/lazyLoadIntegration.d.ts +1 -1
- package/build/npm/types/utils/lazyLoadIntegration.d.ts.map +1 -1
- package/package.json +10 -9
- package/build/npm/cjs/dev/integrations/spanstreaming.js +0 -34
- package/build/npm/cjs/dev/integrations/spanstreaming.js.map +0 -1
- package/build/npm/cjs/prod/integrations/spanstreaming.js +0 -34
- package/build/npm/cjs/prod/integrations/spanstreaming.js.map +0 -1
- package/build/npm/esm/dev/integrations/spanstreaming.js +0 -31
- package/build/npm/esm/dev/integrations/spanstreaming.js.map +0 -1
- package/build/npm/esm/prod/integrations/spanstreaming.js +0 -31
- package/build/npm/esm/prod/integrations/spanstreaming.js.map +0 -1
- package/build/npm/types/integrations/spanstreaming.d.ts +0 -5
- package/build/npm/types/integrations/spanstreaming.d.ts.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"spotlight.js","sources":["../../../../../src/integrations/spotlight.ts"],"sourcesContent":["import type { Client, Envelope, IntegrationFn } from '@sentry/core/browser';\nimport { debug, defineIntegration, serializeEnvelope } from '@sentry/core/browser';\nimport { getNativeImplementation } from '@sentry/browser-utils';\nimport { DEBUG_BUILD } from '../debug-build';\nimport type { WINDOW } from '../helpers';\n\nexport type SpotlightConnectionOptions = {\n /**\n * Set this if the Spotlight Sidecar is not running on localhost:8969\n * By default, the Url is set to http://localhost:8969/stream\n */\n sidecarUrl?: string;\n};\n\nexport const INTEGRATION_NAME = 'SpotlightBrowser' as const;\n\nexport const SPOTLIGHT_IGNORE_SPANS = [{ op:
|
|
1
|
+
{"version":3,"file":"spotlight.js","sources":["../../../../../src/integrations/spotlight.ts"],"sourcesContent":["import type { Client, Envelope, IntegrationFn } from '@sentry/core/browser';\nimport { debug, defineIntegration, serializeEnvelope } from '@sentry/core/browser';\nimport { getNativeImplementation } from '@sentry/browser-utils';\nimport { UI_INTERACTION_CLICK } from '@sentry/conventions/op';\nimport { DEBUG_BUILD } from '../debug-build';\nimport type { WINDOW } from '../helpers';\n\nexport type SpotlightConnectionOptions = {\n /**\n * Set this if the Spotlight Sidecar is not running on localhost:8969\n * By default, the Url is set to http://localhost:8969/stream\n */\n sidecarUrl?: string;\n};\n\nexport const INTEGRATION_NAME = 'SpotlightBrowser' as const;\n\nexport const SPOTLIGHT_IGNORE_SPANS = [{ op: UI_INTERACTION_CLICK, name: '#sentry-spotlight' }];\n\nconst _spotlightIntegration = ((options: Partial<SpotlightConnectionOptions> = {}) => {\n const sidecarUrl = options.sidecarUrl || 'http://localhost:8969/stream';\n\n return {\n name: INTEGRATION_NAME,\n setup: () => {\n DEBUG_BUILD && debug.log('Using Sidecar URL', sidecarUrl);\n },\n beforeSetup(client: Client) {\n const opts = client.getOptions();\n opts.ignoreSpans = [...(opts.ignoreSpans || []), ...SPOTLIGHT_IGNORE_SPANS];\n },\n afterAllSetup: (client: Client) => {\n setupSidecarForwarding(client, sidecarUrl);\n },\n };\n}) satisfies IntegrationFn;\n\nfunction setupSidecarForwarding(client: Client, sidecarUrl: string): void {\n const makeFetch: typeof WINDOW.fetch | undefined = getNativeImplementation('fetch');\n let failCount = 0;\n\n client.on('beforeEnvelope', (envelope: Envelope) => {\n if (failCount > 3) {\n debug.warn('[Spotlight] Disabled Sentry -> Spotlight integration due to too many failed requests:', failCount);\n return;\n }\n\n makeFetch(sidecarUrl, {\n method: 'POST',\n body: serializeEnvelope(envelope) as BodyInit,\n headers: {\n 'Content-Type': 'application/x-sentry-envelope',\n },\n mode: 'cors',\n }).then(\n res => {\n if (res.status >= 200 && res.status < 400) {\n // Reset failed requests counter on success\n failCount = 0;\n }\n },\n err => {\n failCount++;\n debug.error(\n \"Sentry SDK can't connect to Sidecar is it running? See: https://spotlightjs.com/sidecar/npx/\",\n err,\n );\n },\n );\n });\n}\n\n/**\n * Use this integration to send errors and transactions to Spotlight.\n *\n * Learn more about spotlight at https://spotlightjs.com\n */\nexport const spotlightBrowserIntegration = defineIntegration(_spotlightIntegration);\n"],"names":[],"mappings":";;;;;AAeO,MAAM,gBAAA,GAAmB;AAEzB,MAAM,yBAAyB,CAAC,EAAE,IAAI,oBAAA,EAAsB,IAAA,EAAM,qBAAqB;AAE9F,MAAM,qBAAA,IAAyB,CAAC,OAAA,GAA+C,EAAC,KAAM;AACpF,EAAA,MAAM,UAAA,GAAa,QAAQ,UAAA,IAAc,8BAAA;AAEzC,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,gBAAA;AAAA,IACN,OAAO,MAAM;AACX,MAAA,WAAA,IAAe,KAAA,CAAM,GAAA,CAAI,mBAAA,EAAqB,UAAU,CAAA;AAAA,IAC1D,CAAA;AAAA,IACA,YAAY,MAAA,EAAgB;AAC1B,MAAA,MAAM,IAAA,GAAO,OAAO,UAAA,EAAW;AAC/B,MAAA,IAAA,CAAK,WAAA,GAAc,CAAC,GAAI,IAAA,CAAK,eAAe,EAAC,EAAI,GAAG,sBAAsB,CAAA;AAAA,IAC5E,CAAA;AAAA,IACA,aAAA,EAAe,CAAC,MAAA,KAAmB;AACjC,MAAA,sBAAA,CAAuB,QAAQ,UAAU,CAAA;AAAA,IAC3C;AAAA,GACF;AACF,CAAA,CAAA;AAEA,SAAS,sBAAA,CAAuB,QAAgB,UAAA,EAA0B;AACxE,EAAA,MAAM,SAAA,GAA6C,wBAAwB,OAAO,CAAA;AAClF,EAAA,IAAI,SAAA,GAAY,CAAA;AAEhB,EAAA,MAAA,CAAO,EAAA,CAAG,gBAAA,EAAkB,CAAC,QAAA,KAAuB;AAClD,IAAA,IAAI,YAAY,CAAA,EAAG;AACjB,MAAA,KAAA,CAAM,IAAA,CAAK,yFAAyF,SAAS,CAAA;AAC7G,MAAA;AAAA,IACF;AAEA,IAAA,SAAA,CAAU,UAAA,EAAY;AAAA,MACpB,MAAA,EAAQ,MAAA;AAAA,MACR,IAAA,EAAM,kBAAkB,QAAQ,CAAA;AAAA,MAChC,OAAA,EAAS;AAAA,QACP,cAAA,EAAgB;AAAA,OAClB;AAAA,MACA,IAAA,EAAM;AAAA,KACP,CAAA,CAAE,IAAA;AAAA,MACD,CAAA,GAAA,KAAO;AACL,QAAA,IAAI,GAAA,CAAI,MAAA,IAAU,GAAA,IAAO,GAAA,CAAI,SAAS,GAAA,EAAK;AAEzC,UAAA,SAAA,GAAY,CAAA;AAAA,QACd;AAAA,MACF,CAAA;AAAA,MACA,CAAA,GAAA,KAAO;AACL,QAAA,SAAA,EAAA;AACA,QAAA,KAAA,CAAM,KAAA;AAAA,UACJ,8FAAA;AAAA,UACA;AAAA,SACF;AAAA,MACF;AAAA,KACF;AAAA,EACF,CAAC,CAAA;AACH;AAOO,MAAM,2BAAA,GAA8B,kBAAkB,qBAAqB;;;;"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import { defineIntegration
|
|
1
|
+
import { defineIntegration } from '@sentry/core/browser';
|
|
2
|
+
import { getComponentName } from '@sentry/browser-utils';
|
|
2
3
|
import { WINDOW } from '../helpers.js';
|
|
3
4
|
|
|
4
5
|
const viewHierarchyIntegration = defineIntegration((options = {}) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"view-hierarchy.js","sources":["../../../../../src/integrations/view-hierarchy.ts"],"sourcesContent":["import type { Attachment, Event, EventHint, ViewHierarchyData, ViewHierarchyWindow } from '@sentry/core/browser';\nimport { defineIntegration
|
|
1
|
+
{"version":3,"file":"view-hierarchy.js","sources":["../../../../../src/integrations/view-hierarchy.ts"],"sourcesContent":["import type { Attachment, Event, EventHint, ViewHierarchyData, ViewHierarchyWindow } from '@sentry/core/browser';\nimport { defineIntegration } from '@sentry/core/browser';\nimport { getComponentName } from '@sentry/browser-utils';\nimport { WINDOW } from '../helpers';\n\ninterface OnElementArgs {\n /**\n * The element being processed.\n */\n element: HTMLElement;\n /**\n * Lowercase tag name of the element.\n */\n tagName: string;\n /**\n * The component name of the element.\n */\n componentName?: string;\n\n /**\n * The current depth of the element in the view hierarchy. The root element will have a depth of 0.\n *\n * This allows you to limit the traversal depth for large DOM trees.\n */\n depth?: number;\n}\n\ninterface Options {\n /**\n * Whether to attach the view hierarchy to the event.\n *\n * Default: Always attach.\n */\n shouldAttach?: (event: Event, hint: EventHint) => boolean;\n\n /**\n * A function that returns the root element to start walking the DOM from.\n *\n * Default: `window.document.body`\n */\n rootElement?: () => HTMLElement | undefined;\n\n /**\n * Called for each HTMLElement as we walk the DOM.\n *\n * Return an object to include the element with any additional properties.\n * Return `skip` to exclude the element and its children.\n * Return `children` to skip the element but include its children.\n */\n onElement?: (prop: OnElementArgs) => Record<string, string | number | boolean> | 'skip' | 'children';\n}\n\n/**\n * An integration to include a view hierarchy attachment which contains the DOM.\n */\nexport const viewHierarchyIntegration = defineIntegration((options: Options = {}) => {\n const skipHtmlTags = ['script'];\n\n /** Walk an element */\n function walk(element: HTMLElement, windows: ViewHierarchyWindow[], depth = 0): void {\n if (!element) {\n return;\n }\n\n // With Web Components, we need to walk into shadow DOMs\n const children = 'shadowRoot' in element && element.shadowRoot ? element.shadowRoot.children : element.children;\n\n for (const child of children) {\n if (!(child instanceof HTMLElement)) {\n continue;\n }\n\n const componentName = getComponentName(child, 1) || undefined;\n const tagName = child.tagName.toLowerCase();\n\n if (skipHtmlTags.includes(tagName)) {\n continue;\n }\n\n const result = options.onElement?.({ element: child, componentName, tagName, depth }) || {};\n\n if (result === 'skip') {\n continue;\n }\n\n // Skip this element but include its children\n if (result === 'children') {\n walk(child, windows, depth + 1);\n continue;\n }\n\n const { x, y, width, height } = child.getBoundingClientRect();\n\n const window: ViewHierarchyWindow = {\n // oxlint-disable-next-line typescript/no-unnecessary-type-assertion -- rule false positive: the cast drops `undefined` to satisfy `identifier: string`; tsc errors without it\n identifier: (child.id || undefined) as string,\n type: componentName || tagName,\n visible: true,\n alpha: 1,\n height,\n width,\n x,\n y,\n ...result,\n };\n\n const children: ViewHierarchyWindow[] = [];\n window.children = children;\n\n // Recursively walk the children\n walk(child, window.children, depth + 1);\n\n windows.push(window);\n }\n }\n\n return {\n name: 'ViewHierarchy' as const,\n processEvent: (event, hint) => {\n // only capture for error events\n if (event.type !== undefined || options.shouldAttach?.(event, hint) === false) {\n return event;\n }\n\n const root: ViewHierarchyData = {\n rendering_system: 'DOM',\n positioning: 'absolute',\n windows: [],\n };\n\n walk(options.rootElement?.() || WINDOW.document.body, root.windows);\n\n const attachment: Attachment = {\n filename: 'view-hierarchy.json',\n attachmentType: 'event.view_hierarchy',\n contentType: 'application/json',\n data: JSON.stringify(root),\n };\n\n hint.attachments = hint.attachments || [];\n hint.attachments.push(attachment);\n\n return event;\n },\n };\n});\n"],"names":["children"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"type":"module","version":"11.0.0-alpha.
|
|
1
|
+
{"type":"module","version":"11.0.0-alpha.2","sideEffects":false}
|
package/build/npm/esm/dev/sdk.js
CHANGED
|
@@ -8,7 +8,6 @@ import { globalHandlersIntegration } from './integrations/globalhandlers.js';
|
|
|
8
8
|
import { httpContextIntegration } from './integrations/httpcontext.js';
|
|
9
9
|
import { linkedErrorsIntegration } from './integrations/linkederrors.js';
|
|
10
10
|
import { spotlightBrowserIntegration } from './integrations/spotlight.js';
|
|
11
|
-
import { INTEGRATION_NAME, spanStreamingIntegration } from './integrations/spanstreaming.js';
|
|
12
11
|
import { defaultStackParser } from './stack-parsers.js';
|
|
13
12
|
import { makeFetchTransport } from './transports/fetch.js';
|
|
14
13
|
import { normalizeStringifyValue } from './normalizeStringifyValue.js';
|
|
@@ -45,9 +44,6 @@ function init(options = {}) {
|
|
|
45
44
|
integrations: options.integrations,
|
|
46
45
|
defaultIntegrations
|
|
47
46
|
});
|
|
48
|
-
if ((typeof __SENTRY_TRACING__ === "undefined" || __SENTRY_TRACING__) && options.traceLifecycle !== "static" && !integrations.some((integration) => integration.name === INTEGRATION_NAME)) {
|
|
49
|
-
integrations.push(spanStreamingIntegration());
|
|
50
|
-
}
|
|
51
47
|
const clientOptions = {
|
|
52
48
|
...options,
|
|
53
49
|
enabled: shouldDisableBecauseIsBrowserExtenstion ? false : options.enabled,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sdk.js","sources":["../../../../src/sdk.ts"],"sourcesContent":["import type { Client, Integration, Options } from '@sentry/core/browser';\nimport {\n conversationIdIntegration,\n dedupeIntegration,\n eventFiltersIntegration,\n functionToStringIntegration,\n getIntegrationsToSetup,\n initAndBind,\n setNormalizeStringifier,\n stackParserFromStackParserOptions,\n} from '@sentry/core/browser';\nimport type { BrowserClientOptions, BrowserOptions } from './client';\nimport { BrowserClient } from './client';\nimport { breadcrumbsIntegration } from './integrations/breadcrumbs';\nimport { browserApiErrorsIntegration } from './integrations/browserapierrors';\nimport { browserSessionIntegration } from './integrations/browsersession';\nimport { cultureContextIntegration } from './integrations/culturecontext';\nimport { globalHandlersIntegration } from './integrations/globalhandlers';\nimport { httpContextIntegration } from './integrations/httpcontext';\nimport { linkedErrorsIntegration } from './integrations/linkederrors';\nimport { spotlightBrowserIntegration } from './integrations/spotlight';\nimport {
|
|
1
|
+
{"version":3,"file":"sdk.js","sources":["../../../../src/sdk.ts"],"sourcesContent":["import type { Client, Integration, Options } from '@sentry/core/browser';\nimport {\n conversationIdIntegration,\n dedupeIntegration,\n eventFiltersIntegration,\n functionToStringIntegration,\n getIntegrationsToSetup,\n initAndBind,\n setNormalizeStringifier,\n stackParserFromStackParserOptions,\n} from '@sentry/core/browser';\nimport type { BrowserClientOptions, BrowserOptions } from './client';\nimport { BrowserClient } from './client';\nimport { breadcrumbsIntegration } from './integrations/breadcrumbs';\nimport { browserApiErrorsIntegration } from './integrations/browserapierrors';\nimport { browserSessionIntegration } from './integrations/browsersession';\nimport { cultureContextIntegration } from './integrations/culturecontext';\nimport { globalHandlersIntegration } from './integrations/globalhandlers';\nimport { httpContextIntegration } from './integrations/httpcontext';\nimport { linkedErrorsIntegration } from './integrations/linkederrors';\nimport { spotlightBrowserIntegration } from './integrations/spotlight';\nimport { defaultStackParser } from './stack-parsers';\nimport { makeFetchTransport } from './transports/fetch';\nimport { normalizeStringifyValue } from './normalizeStringifyValue';\nimport { checkAndWarnIfIsEmbeddedBrowserExtension } from './utils/detectBrowserExtension';\n\n/** Get the default integrations for the browser SDK. */\nexport function getDefaultIntegrations(_options: Options): Integration[] {\n /**\n * Note: Please make sure this stays in sync with Angular SDK, which re-exports\n * `getDefaultIntegrations` but with an adjusted set of integrations.\n */\n return [\n eventFiltersIntegration(),\n functionToStringIntegration(),\n conversationIdIntegration(),\n browserApiErrorsIntegration(),\n breadcrumbsIntegration(),\n globalHandlersIntegration(),\n linkedErrorsIntegration(),\n dedupeIntegration(),\n httpContextIntegration(),\n cultureContextIntegration(),\n browserSessionIntegration(),\n ];\n}\n\n/**\n * The Sentry Browser SDK Client.\n *\n * To use this SDK, call the {@link init} function as early as possible when\n * loading the web page. To set context information or send manual events, use\n * the provided methods.\n *\n * @example\n *\n * ```\n *\n * import { init } from '@sentry/browser';\n *\n * init({\n * dsn: '__DSN__',\n * // ...\n * });\n * ```\n *\n * @example\n * ```\n *\n * import { addBreadcrumb } from '@sentry/browser';\n * addBreadcrumb({\n * message: 'My Breadcrumb',\n * // ...\n * });\n * ```\n *\n * @example\n *\n * ```\n *\n * import * as Sentry from '@sentry/browser';\n * Sentry.captureMessage('Hello, world!');\n * Sentry.captureException(new Error('Good bye'));\n * Sentry.captureEvent({\n * message: 'Manual',\n * stacktrace: [\n * // ...\n * ],\n * });\n * ```\n *\n * @see {@link BrowserOptions} for documentation on configuration options.\n */\nexport function init(options: BrowserOptions = {}): Client | undefined {\n const shouldDisableBecauseIsBrowserExtenstion =\n !options.skipBrowserExtensionCheck && checkAndWarnIfIsEmbeddedBrowserExtension();\n\n let defaultIntegrations =\n options.defaultIntegrations == null ? getDefaultIntegrations(options) : options.defaultIntegrations;\n\n /*! rollup-include-development-only */\n if (options.spotlight) {\n if (!defaultIntegrations) {\n defaultIntegrations = [];\n }\n const args = typeof options.spotlight === 'string' ? { sidecarUrl: options.spotlight } : undefined;\n defaultIntegrations.push(spotlightBrowserIntegration(args));\n }\n /*! rollup-include-development-only-end */\n\n const integrations = getIntegrationsToSetup({\n integrations: options.integrations,\n defaultIntegrations,\n });\n\n const clientOptions: BrowserClientOptions = {\n ...options,\n enabled: shouldDisableBecauseIsBrowserExtenstion ? false : options.enabled,\n stackParser: stackParserFromStackParserOptions(options.stackParser || defaultStackParser),\n integrations,\n transport: options.transport || makeFetchTransport,\n };\n\n setNormalizeStringifier(normalizeStringifyValue);\n\n return initAndBind(BrowserClient, clientOptions);\n}\n\n/**\n * This function is here to be API compatible with the loader.\n * @hidden\n */\nexport function forceLoad(): void {\n // Noop\n}\n\n/**\n * This function is here to be API compatible with the loader.\n * @hidden\n */\nexport function onLoad(callback: () => void): void {\n callback();\n}\n"],"names":[],"mappings":";;;;;;;;;;;;;;;AA2BO,SAAS,uBAAuB,QAAA,EAAkC;AAKvE,EAAA,OAAO;AAAA,IACL,uBAAA,EAAwB;AAAA,IACxB,2BAAA,EAA4B;AAAA,IAC5B,yBAAA,EAA0B;AAAA,IAC1B,2BAAA,EAA4B;AAAA,IAC5B,sBAAA,EAAuB;AAAA,IACvB,yBAAA,EAA0B;AAAA,IAC1B,uBAAA,EAAwB;AAAA,IACxB,iBAAA,EAAkB;AAAA,IAClB,sBAAA,EAAuB;AAAA,IACvB,yBAAA,EAA0B;AAAA,IAC1B,yBAAA;AAA0B,GAC5B;AACF;AAgDO,SAAS,IAAA,CAAK,OAAA,GAA0B,EAAC,EAAuB;AACrE,EAAA,MAAM,uCAAA,GACJ,CAAC,OAAA,CAAQ,yBAAA,IAA6B,wCAAA,EAAyC;AAEjF,EAAA,IAAI,sBACF,OAAA,CAAQ,mBAAA,IAAuB,OAAO,sBAAA,CAA8B,IAAI,OAAA,CAAQ,mBAAA;AAAA;AAGlF,EAAA,IAAI,QAAQ,SAAA,EAAW;AACrB,IAAA,IAAI,CAAC,mBAAA,EAAqB;AACxB,MAAA,mBAAA,GAAsB,EAAC;AAAA,IACzB;AACA,IAAA,MAAM,IAAA,GAAO,OAAO,OAAA,CAAQ,SAAA,KAAc,WAAW,EAAE,UAAA,EAAY,OAAA,CAAQ,SAAA,EAAU,GAAI,MAAA;AACzF,IAAA,mBAAA,CAAoB,IAAA,CAAK,2BAAA,CAA4B,IAAI,CAAC,CAAA;AAAA,EAC5D;AAAA;AAGA,EAAA,MAAM,eAAe,sBAAA,CAAuB;AAAA,IAC1C,cAAc,OAAA,CAAQ,YAAA;AAAA,IACtB;AAAA,GACD,CAAA;AAED,EAAA,MAAM,aAAA,GAAsC;AAAA,IAC1C,GAAG,OAAA;AAAA,IACH,OAAA,EAAS,uCAAA,GAA0C,KAAA,GAAQ,OAAA,CAAQ,OAAA;AAAA,IACnE,WAAA,EAAa,iCAAA,CAAkC,OAAA,CAAQ,WAAA,IAAe,kBAAkB,CAAA;AAAA,IACxF,YAAA;AAAA,IACA,SAAA,EAAW,QAAQ,SAAA,IAAa;AAAA,GAClC;AAEA,EAAA,uBAAA,CAAwB,uBAAuB,CAAA;AAE/C,EAAA,OAAO,WAAA,CAAY,eAAe,aAAa,CAAA;AACjD;AAMO,SAAS,SAAA,GAAkB;AAElC;AAMO,SAAS,OAAO,QAAA,EAA4B;AACjD,EAAA,QAAA,EAAS;AACX;;;;"}
|
|
@@ -1,23 +1,15 @@
|
|
|
1
|
-
import { TRACING_DEFAULTS, consoleSandbox,
|
|
2
|
-
import { addHistoryInstrumentationHandler, startTrackingLongAnimationFrames, startTrackingLongTasks,
|
|
1
|
+
import { TRACING_DEFAULTS, consoleSandbox, _INTERNAL_ensureBrowserSpanStreaming, hasSpanStreamingEnabled, PAGELOAD_SPAN_NAME_FALLBACK, parseStringToURLObject, NAVIGATION_SPAN_NAME_FALLBACK, debug, registerSpanErrorInstrumentation, GLOBAL_OBJ, getCurrentScope, getDynamicSamplingContextFromSpan, spanIsSampled, getClient, hasSpansEnabled, generateSpanId, generateTraceId, propagationContextFromHeaders, SEMANTIC_ATTRIBUTE_SENTRY_IDLE_SPAN_FINISH_REASON, browserPerformanceTimeOrigin, spanToJSON, dateTimestampInSeconds, timestampInSeconds, addNonEnumerableProperty, isURLObjectRelative, startInactiveSpan, startIdleSpan, SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN } from '@sentry/core/browser';
|
|
2
|
+
import { isBotUserAgent, getLocationHref, addHistoryInstrumentationHandler, startTrackingLongAnimationFrames, startTrackingLongTasks, addPerformanceEntries } from '@sentry/browser-utils';
|
|
3
3
|
import { DEBUG_BUILD } from '../debug-build.js';
|
|
4
4
|
import { filterCollectedUrl } from '@sentry/core';
|
|
5
5
|
import { WINDOW, getHttpRequestData } from '../helpers.js';
|
|
6
6
|
import { WEB_VITALS_INTEGRATION_NAME, webVitalsIntegration } from '../integrations/webVitals.js';
|
|
7
7
|
import { registerBackgroundTabDetection } from './backgroundtab.js';
|
|
8
8
|
import { linkTraces } from './linkedTraces.js';
|
|
9
|
-
import {
|
|
10
|
-
import { URL_FULL, URL_PATH, SENTRY_OP } from '@sentry/conventions/attributes';
|
|
9
|
+
import { instrumentOutgoingRequests, defaultRequestInstrumentationOptions } from './request.js';
|
|
10
|
+
import { URL_FULL, URL_PATH, SENTRY_OP, SENTRY_SEGMENT_NAME_SOURCE } from '@sentry/conventions/attributes';
|
|
11
11
|
|
|
12
12
|
const BROWSER_TRACING_INTEGRATION_ID = "BrowserTracing";
|
|
13
|
-
const BOT_USER_AGENT_RE = /Googlebot|Google-InspectionTool|Storebot-Google|Bingbot|Slurp|DuckDuckBot|Baiduspider|YandexBot|Facebot|facebookexternalhit|LinkedInBot|Twitterbot|Applebot/i;
|
|
14
|
-
function isBotUserAgent() {
|
|
15
|
-
const nav = WINDOW.navigator;
|
|
16
|
-
if (!nav?.userAgent) {
|
|
17
|
-
return false;
|
|
18
|
-
}
|
|
19
|
-
return BOT_USER_AGENT_RE.test(nav.userAgent);
|
|
20
|
-
}
|
|
21
13
|
const DEFAULT_BROWSER_TRACING_OPTIONS = {
|
|
22
14
|
...TRACING_DEFAULTS,
|
|
23
15
|
instrumentNavigation: true,
|
|
@@ -31,7 +23,6 @@ const DEFAULT_BROWSER_TRACING_OPTIONS = {
|
|
|
31
23
|
linkPreviousTrace: "in-memory",
|
|
32
24
|
consistentTraceSampling: false,
|
|
33
25
|
enableReportPageLoaded: false,
|
|
34
|
-
_experiments: {},
|
|
35
26
|
...defaultRequestInstrumentationOptions
|
|
36
27
|
};
|
|
37
28
|
const browserTracingIntegration = ((options = {}) => {
|
|
@@ -42,16 +33,11 @@ const browserTracingIntegration = ((options = {}) => {
|
|
|
42
33
|
);
|
|
43
34
|
});
|
|
44
35
|
}
|
|
45
|
-
const latestRoute = {
|
|
46
|
-
name: void 0,
|
|
47
|
-
source: void 0
|
|
48
|
-
};
|
|
49
36
|
const optionalWindowDocument = WINDOW.document;
|
|
50
37
|
const {
|
|
51
38
|
enableInp,
|
|
52
39
|
enableLongTask,
|
|
53
40
|
enableLongAnimationFrame,
|
|
54
|
-
_experiments: { enableInteractions },
|
|
55
41
|
beforeStartSpan,
|
|
56
42
|
idleTimeout,
|
|
57
43
|
finalTimeout,
|
|
@@ -88,7 +74,7 @@ const browserTracingIntegration = ((options = {}) => {
|
|
|
88
74
|
...finalStartSpanOptions.attributes
|
|
89
75
|
};
|
|
90
76
|
if (initialSpanName !== finalStartSpanOptions.name) {
|
|
91
|
-
attributes[
|
|
77
|
+
attributes[SENTRY_SEGMENT_NAME_SOURCE] = "custom";
|
|
92
78
|
}
|
|
93
79
|
finalStartSpanOptions.attributes = attributes;
|
|
94
80
|
if (!makeActive) {
|
|
@@ -99,8 +85,6 @@ const browserTracingIntegration = ((options = {}) => {
|
|
|
99
85
|
}).end(now);
|
|
100
86
|
return;
|
|
101
87
|
}
|
|
102
|
-
latestRoute.name = finalStartSpanOptions.name;
|
|
103
|
-
latestRoute.source = attributes[SEMANTIC_ATTRIBUTE_SENTRY_SOURCE];
|
|
104
88
|
const idleSpan = startIdleSpan(finalStartSpanOptions, {
|
|
105
89
|
idleTimeout,
|
|
106
90
|
finalTimeout,
|
|
@@ -137,9 +121,6 @@ const browserTracingIntegration = ((options = {}) => {
|
|
|
137
121
|
} else if (enableLongTask) {
|
|
138
122
|
startTrackingLongTasks();
|
|
139
123
|
}
|
|
140
|
-
if (enableInteractions) {
|
|
141
|
-
startTrackingInteractions();
|
|
142
|
-
}
|
|
143
124
|
if (detectRedirects && optionalWindowDocument) {
|
|
144
125
|
const interactionHandler = () => {
|
|
145
126
|
lastInteractionTimestamp = timestampInSeconds();
|
|
@@ -251,6 +232,7 @@ const browserTracingIntegration = ((options = {}) => {
|
|
|
251
232
|
if (_isBot) {
|
|
252
233
|
return;
|
|
253
234
|
}
|
|
235
|
+
_INTERNAL_ensureBrowserSpanStreaming(client);
|
|
254
236
|
if (client.addIntegration && !client.getIntegrationByName?.(WEB_VITALS_INTEGRATION_NAME)) {
|
|
255
237
|
client.addIntegration(
|
|
256
238
|
webVitalsIntegration({
|
|
@@ -264,13 +246,12 @@ const browserTracingIntegration = ((options = {}) => {
|
|
|
264
246
|
}
|
|
265
247
|
if (WINDOW.location) {
|
|
266
248
|
if (instrumentPageLoad) {
|
|
267
|
-
const origin = browserPerformanceTimeOrigin();
|
|
268
249
|
startBrowserTracingPageLoadSpan(client, {
|
|
269
|
-
|
|
270
|
-
//
|
|
271
|
-
|
|
250
|
+
// With span streaming, span names have to be low cardinality, and there is no route
|
|
251
|
+
// information available here.
|
|
252
|
+
name: hasSpanStreamingEnabled(client) ? PAGELOAD_SPAN_NAME_FALLBACK : WINDOW.location.pathname,
|
|
272
253
|
attributes: {
|
|
273
|
-
[
|
|
254
|
+
[SENTRY_SEGMENT_NAME_SOURCE]: "url",
|
|
274
255
|
[SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: "auto.pageload.browser"
|
|
275
256
|
}
|
|
276
257
|
});
|
|
@@ -288,9 +269,11 @@ const browserTracingIntegration = ((options = {}) => {
|
|
|
288
269
|
startBrowserTracingNavigationSpan(
|
|
289
270
|
client,
|
|
290
271
|
{
|
|
291
|
-
|
|
272
|
+
// With span streaming, span names have to be low cardinality, and there is no route
|
|
273
|
+
// information available here.
|
|
274
|
+
name: hasSpanStreamingEnabled(client) ? NAVIGATION_SPAN_NAME_FALLBACK : parsed?.pathname || WINDOW.location.pathname,
|
|
292
275
|
attributes: {
|
|
293
|
-
[
|
|
276
|
+
[SENTRY_SEGMENT_NAME_SOURCE]: "url",
|
|
294
277
|
[SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: "auto.navigation.browser"
|
|
295
278
|
}
|
|
296
279
|
},
|
|
@@ -302,9 +285,6 @@ const browserTracingIntegration = ((options = {}) => {
|
|
|
302
285
|
if (markBackgroundSpan) {
|
|
303
286
|
registerBackgroundTabDetection();
|
|
304
287
|
}
|
|
305
|
-
if (enableInteractions) {
|
|
306
|
-
registerInteractionListener(client, idleTimeout, finalTimeout, childSpanTimeout, latestRoute);
|
|
307
|
-
}
|
|
308
288
|
instrumentOutgoingRequests(client, {
|
|
309
289
|
traceFetch,
|
|
310
290
|
traceXHR,
|
|
@@ -318,8 +298,15 @@ const browserTracingIntegration = ((options = {}) => {
|
|
|
318
298
|
};
|
|
319
299
|
});
|
|
320
300
|
function startBrowserTracingPageLoadSpan(client, spanOptions, traceOptions) {
|
|
321
|
-
|
|
322
|
-
getCurrentScope().setTransactionName(spanOptions.name);
|
|
301
|
+
const isFallbackSpanName = spanOptions.name === PAGELOAD_SPAN_NAME_FALLBACK;
|
|
302
|
+
getCurrentScope().setTransactionName(isFallbackSpanName ? WINDOW.location?.pathname : spanOptions.name);
|
|
303
|
+
const timeOrigin = browserPerformanceTimeOrigin();
|
|
304
|
+
const pageloadSpanOptions = {
|
|
305
|
+
...spanOptions,
|
|
306
|
+
// startTime needs to be in seconds, not ms
|
|
307
|
+
startTime: spanOptions.startTime ?? (timeOrigin ? timeOrigin / 1e3 : void 0)
|
|
308
|
+
};
|
|
309
|
+
client.emit("startPageLoadSpan", pageloadSpanOptions, traceOptions);
|
|
323
310
|
const pageloadSpan = getActiveIdleSpan(client);
|
|
324
311
|
if (pageloadSpan) {
|
|
325
312
|
client.emit("afterStartPageLoadSpan", pageloadSpan);
|
|
@@ -331,7 +318,10 @@ function startBrowserTracingNavigationSpan(client, spanOptions, options) {
|
|
|
331
318
|
client.emit("beforeStartNavigationSpan", spanOptions, { isRedirect: isRedirect2, url });
|
|
332
319
|
client.emit("startNavigationSpan", spanOptions, { isRedirect: isRedirect2, url });
|
|
333
320
|
const scope = getCurrentScope();
|
|
334
|
-
|
|
321
|
+
const isFallbackSpanName = spanOptions.name === NAVIGATION_SPAN_NAME_FALLBACK;
|
|
322
|
+
scope.setTransactionName(
|
|
323
|
+
isFallbackSpanName ? url && parseStringToURLObject(url)?.pathname || WINDOW.location?.pathname : spanOptions.name
|
|
324
|
+
);
|
|
335
325
|
if (url && !isRedirect2) {
|
|
336
326
|
scope.setSDKProcessingMetadata({
|
|
337
327
|
normalizedRequest: {
|
|
@@ -352,47 +342,6 @@ function getServerTiming(name) {
|
|
|
352
342
|
const entry = navigation?.serverTiming?.find((entry2) => entry2.name === name);
|
|
353
343
|
return entry?.description;
|
|
354
344
|
}
|
|
355
|
-
function registerInteractionListener(client, idleTimeout, finalTimeout, childSpanTimeout, latestRoute) {
|
|
356
|
-
const optionalWindowDocument = WINDOW.document;
|
|
357
|
-
let inflightInteractionSpan;
|
|
358
|
-
const registerInteractionTransaction = () => {
|
|
359
|
-
const op = "ui.action.click";
|
|
360
|
-
const activeIdleSpan = getActiveIdleSpan(client);
|
|
361
|
-
if (activeIdleSpan) {
|
|
362
|
-
const currentRootSpanOp = spanToJSON(activeIdleSpan).attributes[SENTRY_OP];
|
|
363
|
-
if (["navigation", "pageload"].includes(currentRootSpanOp)) {
|
|
364
|
-
DEBUG_BUILD && debug.warn(`[Tracing] Did not create ${op} span because a pageload or navigation span is in progress.`);
|
|
365
|
-
return void 0;
|
|
366
|
-
}
|
|
367
|
-
}
|
|
368
|
-
if (inflightInteractionSpan) {
|
|
369
|
-
inflightInteractionSpan.setAttribute(SEMANTIC_ATTRIBUTE_SENTRY_IDLE_SPAN_FINISH_REASON, "interactionInterrupted");
|
|
370
|
-
inflightInteractionSpan.end();
|
|
371
|
-
inflightInteractionSpan = void 0;
|
|
372
|
-
}
|
|
373
|
-
if (!latestRoute.name) {
|
|
374
|
-
DEBUG_BUILD && debug.warn(`[Tracing] Did not create ${op} transaction because _latestRouteName is missing.`);
|
|
375
|
-
return void 0;
|
|
376
|
-
}
|
|
377
|
-
inflightInteractionSpan = startIdleSpan(
|
|
378
|
-
{
|
|
379
|
-
name: latestRoute.name,
|
|
380
|
-
op,
|
|
381
|
-
attributes: {
|
|
382
|
-
[SEMANTIC_ATTRIBUTE_SENTRY_SOURCE]: latestRoute.source || "url"
|
|
383
|
-
}
|
|
384
|
-
},
|
|
385
|
-
{
|
|
386
|
-
idleTimeout,
|
|
387
|
-
finalTimeout,
|
|
388
|
-
childSpanTimeout
|
|
389
|
-
}
|
|
390
|
-
);
|
|
391
|
-
};
|
|
392
|
-
if (optionalWindowDocument) {
|
|
393
|
-
addEventListener("click", registerInteractionTransaction, { capture: true });
|
|
394
|
-
}
|
|
395
|
-
}
|
|
396
345
|
const ACTIVE_IDLE_SPAN_PROPERTY = "_sentry_idleSpan";
|
|
397
346
|
function getActiveIdleSpan(client) {
|
|
398
347
|
return client[ACTIVE_IDLE_SPAN_PROPERTY];
|
|
@@ -414,5 +363,5 @@ function isRedirect(activeSpan, lastInteractionTimestamp) {
|
|
|
414
363
|
return true;
|
|
415
364
|
}
|
|
416
365
|
|
|
417
|
-
export { BROWSER_TRACING_INTEGRATION_ID, browserTracingIntegration, getMetaContent, getServerTiming,
|
|
366
|
+
export { BROWSER_TRACING_INTEGRATION_ID, browserTracingIntegration, getMetaContent, getServerTiming, startBrowserTracingNavigationSpan, startBrowserTracingPageLoadSpan };
|
|
418
367
|
//# sourceMappingURL=browserTracingIntegration.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"browserTracingIntegration.js","sources":["../../../../../src/tracing/browserTracingIntegration.ts"],"sourcesContent":["/* eslint-disable max-lines */\nimport type {\n Client,\n IntegrationFn,\n RequestHookInfo,\n ResponseHookInfo,\n Span,\n StartSpanOptions,\n TransactionSource,\n} from '@sentry/core/browser';\nimport {\n addNonEnumerableProperty,\n browserPerformanceTimeOrigin,\n consoleSandbox,\n dateTimestampInSeconds,\n debug,\n generateSpanId,\n generateTraceId,\n getClient,\n getCurrentScope,\n getDynamicSamplingContextFromSpan,\n getLocationHref,\n GLOBAL_OBJ,\n hasSpansEnabled,\n hasSpanStreamingEnabled,\n isURLObjectRelative,\n parseStringToURLObject,\n propagationContextFromHeaders,\n registerSpanErrorInstrumentation,\n SEMANTIC_ATTRIBUTE_SENTRY_IDLE_SPAN_FINISH_REASON,\n SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN,\n SEMANTIC_ATTRIBUTE_SENTRY_SOURCE,\n spanIsSampled,\n spanToJSON,\n startIdleSpan,\n startInactiveSpan,\n timestampInSeconds,\n TRACING_DEFAULTS,\n} from '@sentry/core/browser';\nimport {\n addHistoryInstrumentationHandler,\n addPerformanceEntries,\n startTrackingInteractions,\n startTrackingLongAnimationFrames,\n startTrackingLongTasks,\n} from '@sentry/browser-utils';\nimport { DEBUG_BUILD } from '../debug-build';\nimport { filterCollectedUrl } from '@sentry/core';\nimport { getHttpRequestData, WINDOW } from '../helpers';\nimport { WEB_VITALS_INTEGRATION_NAME, webVitalsIntegration } from '../integrations/webVitals';\nimport { registerBackgroundTabDetection } from './backgroundtab';\nimport { linkTraces } from './linkedTraces';\nimport { defaultRequestInstrumentationOptions, instrumentOutgoingRequests } from './request';\nimport { SENTRY_OP, URL_FULL, URL_PATH } from '@sentry/conventions/attributes';\n\nexport const BROWSER_TRACING_INTEGRATION_ID = 'BrowserTracing';\n\n/**\n * We don't want to start a bunch of idle timers and PerformanceObservers\n * for web crawlers, as they may prevent the page from being seen as \"idle\"\n * by the crawler's rendering engine (e.g. Googlebot's headless Chromium).\n */\nconst BOT_USER_AGENT_RE =\n /Googlebot|Google-InspectionTool|Storebot-Google|Bingbot|Slurp|DuckDuckBot|Baiduspider|YandexBot|Facebot|facebookexternalhit|LinkedInBot|Twitterbot|Applebot/i;\n\nexport function isBotUserAgent(): boolean {\n const nav = WINDOW.navigator as Navigator | undefined;\n if (!nav?.userAgent) {\n return false;\n }\n return BOT_USER_AGENT_RE.test(nav.userAgent);\n}\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 * @deprecated This option is no longer used. Element timing is now tracked via the standalone\n * `elementTimingIntegration`. Add it to your `integrations` array to collect element timing metrics.\n */\n enableElementTiming?: 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 * Resource spans with `op`s matching strings in the array will not be emitted.\n *\n * Default: []\n */\n ignoreResourceSpans: Array<'resource.script' | 'resource.css' | 'resource.img' | 'resource.other' | string>;\n\n /**\n * By default, the SDK will try to detect redirects and avoid creating separate spans for them.\n * If you want to opt-out of this behavior, you can set this option to `false`.\n *\n * Default: true\n */\n detectRedirects: boolean;\n\n /**\n * Link the currently started trace to a previous trace (e.g. a prior pageload, navigation or\n * manually started span). When enabled, this option will allow you to navigate between traces\n * in the Sentry UI.\n *\n * You can set this option to the following values:\n *\n * - `'in-memory'`: The previous trace data will be stored in memory.\n * This is useful for single-page applications and enabled by default.\n *\n * - `'session-storage'`: The previous trace data will be stored in the `sessionStorage`.\n * This is useful for multi-page applications or static sites but it means that the\n * Sentry SDK writes to the browser's `sessionStorage`.\n *\n * - `'off'`: The previous trace data will not be stored or linked.\n *\n * You can also use {@link BrowserTracingOptions.consistentTraceSampling} to get\n * consistent trace sampling of subsequent traces. Otherwise, by default, your\n * `tracesSampleRate` or `tracesSampler` config significantly influences how often\n * traces will be linked.\n *\n * @default 'in-memory' - see explanation above\n */\n linkPreviousTrace: 'in-memory' | 'session-storage' | 'off';\n\n /**\n * If true, Sentry will consistently sample subsequent traces based on the\n * sampling decision of the initial trace. For example, if the initial page\n * load trace was sampled positively, all subsequent traces (e.g. navigations)\n * are also sampled positively. In case the initial trace was sampled negatively,\n * all subsequent traces are also sampled negatively.\n *\n * This option allows you to get consistent, linked traces within a user journey\n * while maintaining an overall quota based on your trace sampling settings.\n *\n * This option is only effective if {@link BrowserTracingOptions.linkPreviousTrace}\n * is enabled (i.e. not set to `'off'`).\n *\n * @default `false` - this is an opt-in feature.\n */\n consistentTraceSampling: boolean;\n\n /**\n * If set to `true`, the pageload span will not end itself automatically, unless it\n * runs until the {@link BrowserTracingOptions.finalTimeout} (30 seconds by default) is reached.\n *\n * Set this option to `true`, if you want full control over the pageload span duration.\n * You can use `Sentry.reportPageLoaded()` to manually end the pageload span whenever convenient.\n * Be aware that you have to ensure that this is always called, regardless of the chosen route\n * or path in the application.\n *\n * @default `false`. By default, the pageload span will end itself automatically, based on\n * the {@link BrowserTracingOptions.finalTimeout}, {@link BrowserTracingOptions.idleTimeout}\n * and {@link BrowserTracingOptions.childSpanTimeout}. This is more convenient to use but means\n * that the pageload duration can be arbitrary and might not be fully representative of a perceived\n * page load time.\n */\n enableReportPageLoaded: 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 }>;\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 /**\n * This callback is invoked directly after a span is started for an outgoing fetch or XHR request.\n * You can use it to annotate the span with additional data or attributes, for example by setting\n * attributes based on the passed request headers.\n */\n onRequestSpanStart?(span: Span, requestInformation: RequestHookInfo): void;\n\n /**\n * Is called when spans end for outgoing requests, providing access to response headers.\n */\n onRequestSpanEnd?(span: Span, responseInformation: ResponseHookInfo): void;\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 ignoreResourceSpans: [],\n detectRedirects: true,\n linkPreviousTrace: 'in-memory',\n consistentTraceSampling: false,\n enableReportPageLoaded: false,\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<BrowserTracingOptions> = {}) => {\n if ('enableElementTiming' in options) {\n consoleSandbox(() => {\n // oxlint-disable-next-line no-console\n console.warn(\n '[Sentry] `enableElementTiming` is deprecated and no longer has any effect. Use the standalone `elementTimingIntegration` instead.',\n );\n });\n }\n\n const latestRoute: RouteInfo = {\n name: undefined,\n source: undefined,\n };\n\n /**\n * This is just a small wrapper that makes `document` optional.\n * We want to be extra-safe and always check that this exists, to ensure weird environments do not blow up.\n */\n const optionalWindowDocument = WINDOW.document as (typeof WINDOW)['document'] | undefined;\n\n const {\n enableInp,\n enableLongTask,\n enableLongAnimationFrame,\n _experiments: { enableInteractions },\n beforeStartSpan,\n idleTimeout,\n finalTimeout,\n childSpanTimeout,\n markBackgroundSpan,\n traceFetch,\n traceXHR,\n shouldCreateSpanForRequest,\n enableHTTPTimings,\n ignoreResourceSpans,\n instrumentPageLoad,\n instrumentNavigation,\n detectRedirects,\n linkPreviousTrace,\n consistentTraceSampling,\n enableReportPageLoaded,\n onRequestSpanStart,\n onRequestSpanEnd,\n } = {\n ...DEFAULT_BROWSER_TRACING_OPTIONS,\n ...options,\n };\n\n const _isBot = isBotUserAgent();\n\n let lastInteractionTimestamp: number | undefined;\n\n let _pageloadSpan: Span | undefined;\n\n /** Create routing idle transaction. */\n function _createRouteSpan(client: Client, startSpanOptions: StartSpanOptions, makeActive = true, url?: string): void {\n const isPageloadSpan = startSpanOptions.op === 'pageload';\n\n const initialSpanName = startSpanOptions.name;\n const finalStartSpanOptions: StartSpanOptions = beforeStartSpan\n ? beforeStartSpan(startSpanOptions)\n : startSpanOptions;\n\n // For navigations, `url` is the destination URL, so we use it to reflect the post-navigation location.\n // For pageloads (and manual navigation spans without a URL) we fall back to the current location.\n const urlObject = parseStringToURLObject(url || getLocationHref());\n\n const attributes = {\n ...(urlObject?.pathname && { [URL_PATH]: urlObject.pathname }),\n ...(urlObject && !isURLObjectRelative(urlObject) && { [URL_FULL]: filterCollectedUrl(urlObject.href) }),\n ...finalStartSpanOptions.attributes,\n };\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 (initialSpanName !== finalStartSpanOptions.name) {\n attributes[SEMANTIC_ATTRIBUTE_SENTRY_SOURCE] = 'custom';\n }\n\n finalStartSpanOptions.attributes = attributes;\n\n if (!makeActive) {\n // We want to ensure this has 0s duration\n const now = dateTimestampInSeconds();\n startInactiveSpan({\n ...finalStartSpanOptions,\n startTime: now,\n }).end(now);\n return;\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: isPageloadSpan,\n trimIdleSpanEndTimestamp: !enableReportPageLoaded,\n });\n\n if (isPageloadSpan && enableReportPageLoaded) {\n _pageloadSpan = idleSpan;\n }\n\n setActiveIdleSpan(client, idleSpan);\n\n function emitFinish(): void {\n if (optionalWindowDocument && ['interactive', 'complete'].includes(optionalWindowDocument.readyState)) {\n client.emit('idleSpanEnableAutoFinish', idleSpan);\n // Once the finish signal has been emitted, the listener is no longer needed. Removing it here (rather than\n // relying on `{ once: true }`) also covers the common case where the document is already loaded when the span\n // starts, so the listener never fires and would otherwise leak together with the `idleSpan` it closes over.\n optionalWindowDocument.removeEventListener('readystatechange', emitFinish);\n }\n }\n\n // Enable auto finish of the pageload span if users are not explicitly ending it\n if (isPageloadSpan && !enableReportPageLoaded && optionalWindowDocument) {\n optionalWindowDocument.addEventListener('readystatechange', emitFinish);\n\n emitFinish();\n }\n }\n\n return {\n name: BROWSER_TRACING_INTEGRATION_ID,\n setup(client) {\n if (_isBot) {\n DEBUG_BUILD && debug.log('[Tracing] Skipping browserTracingIntegration setup for bot user agent.');\n return;\n }\n\n registerSpanErrorInstrumentation();\n\n if (\n enableLongAnimationFrame &&\n GLOBAL_OBJ.PerformanceObserver &&\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 if (detectRedirects && optionalWindowDocument) {\n const interactionHandler = (): void => {\n lastInteractionTimestamp = timestampInSeconds();\n };\n addEventListener('click', interactionHandler, { capture: true });\n addEventListener('keydown', interactionHandler, { capture: true, passive: true });\n }\n\n function maybeEndActiveSpan(): void {\n const activeSpan = getActiveIdleSpan(client);\n\n if (activeSpan && !spanToJSON(activeSpan).end_timestamp) {\n DEBUG_BUILD &&\n debug.log(\n `[Tracing] Finishing current active span with op: ${spanToJSON(activeSpan).attributes[SENTRY_OP]}`,\n );\n // If there's an open active span, we need to finish it before creating an new one.\n activeSpan.setAttribute(SEMANTIC_ATTRIBUTE_SENTRY_IDLE_SPAN_FINISH_REASON, 'cancelled');\n activeSpan.end();\n }\n }\n\n client.on('beforeIdleSpanEnd', span => {\n // Interaction idle spans also flow through this hook, but the route bookkeeping below only\n // applies to the pageload/navigation span. We identify it by reference rather than by op:\n // only the route span is registered as the active idle span.\n if (getActiveIdleSpan(client) !== span) {\n return;\n }\n\n addPerformanceEntries(span, {\n ignoreResourceSpans,\n spanStreamingEnabled: hasSpanStreamingEnabled(client),\n });\n setActiveIdleSpan(client, undefined);\n\n // A trace should stay consistent over the entire timespan of one route - even after the pageload/navigation ended.\n // Only when another navigation happens, we want to create a new trace.\n // This way, e.g. errors that occur after the pageload span ended are still associated to the pageload trace.\n const scope = getCurrentScope();\n const oldPropagationContext = scope.getPropagationContext();\n\n scope.setPropagationContext({\n ...oldPropagationContext,\n traceId: span.spanContext().traceId,\n sampled: spanIsSampled(span),\n dsc: getDynamicSamplingContextFromSpan(span),\n });\n\n if (_pageloadSpan === span) {\n // clean up the stored pageload span on the integration.\n _pageloadSpan = undefined;\n }\n });\n\n client.on('startNavigationSpan', (startSpanOptions, navigationOptions) => {\n if (getClient() !== client) {\n return;\n }\n\n if (navigationOptions?.isRedirect) {\n DEBUG_BUILD &&\n debug.warn('[Tracing] Detected redirect, navigation span will not be the root span, but a child span.');\n _createRouteSpan(\n client,\n {\n op: 'navigation.redirect',\n ...startSpanOptions,\n },\n false,\n navigationOptions.url,\n );\n return;\n }\n\n // Reset the last interaction timestamp since we now start a new navigation.\n // Any subsequent navigation span starts could again be a redirect, so we\n // should reset our heuristic detectors.\n lastInteractionTimestamp = undefined;\n\n maybeEndActiveSpan();\n\n const scope = getCurrentScope();\n scope.setPropagationContext({\n traceId: generateTraceId(),\n sampleRand: Math.random(),\n propagationSpanId: hasSpansEnabled() ? undefined : generateSpanId(),\n });\n\n // We reset this to ensure we do not have lingering incorrect data here\n // places that call this hook may set this where appropriate - else, the URL at span sending time is used\n scope.setSDKProcessingMetadata({\n normalizedRequest: undefined,\n });\n\n _createRouteSpan(\n client,\n {\n op: 'navigation',\n ...startSpanOptions,\n // Navigation starts a new trace and is NOT parented under any active interaction (e.g. ui.action.click)\n parentSpan: null,\n forceTransaction: true,\n },\n true,\n navigationOptions?.url,\n );\n });\n\n client.on('startPageLoadSpan', (startSpanOptions, traceOptions = {}) => {\n if (getClient() !== client) {\n return;\n }\n maybeEndActiveSpan();\n\n const sentryTrace =\n traceOptions.sentryTrace || getMetaContent('sentry-trace') || getServerTiming('sentry-trace');\n const baggage = traceOptions.baggage || getMetaContent('baggage') || getServerTiming('baggage');\n\n const propagationContext = propagationContextFromHeaders(sentryTrace, baggage);\n\n const scope = getCurrentScope();\n scope.setPropagationContext(propagationContext);\n if (!hasSpansEnabled()) {\n // for browser, we wanna keep the spanIds consistent during the entire lifetime of the trace\n // this works by setting the propagationSpanId to a random spanId so that we have a consistent\n // span id to propagate in TwP mode (!hasSpansEnabled())\n scope.getPropagationContext().propagationSpanId = generateSpanId();\n }\n\n // We store the normalized request data on the scope, so we get the request data at time of span creation\n // otherwise, the URL etc. may already be of the following navigation, and we'd report the wrong URL\n scope.setSDKProcessingMetadata({\n normalizedRequest: getHttpRequestData(),\n });\n\n _createRouteSpan(client, {\n op: 'pageload',\n ...startSpanOptions,\n });\n });\n\n client.on('endPageloadSpan', () => {\n if (enableReportPageLoaded && _pageloadSpan) {\n _pageloadSpan.setAttribute(SEMANTIC_ATTRIBUTE_SENTRY_IDLE_SPAN_FINISH_REASON, 'reportPageLoaded');\n _pageloadSpan.end();\n }\n });\n },\n\n afterAllSetup(client) {\n if (_isBot) {\n return;\n }\n\n // Auto-register webVitalsIntegration if the user hasn't added one. We do this in\n // afterAllSetup so that a user-provided webVitalsIntegration - which may be ordered after\n // browserTracingIntegration in the integrations array - has already been installed.\n if (client.addIntegration && !client.getIntegrationByName?.(WEB_VITALS_INTEGRATION_NAME)) {\n client.addIntegration(\n webVitalsIntegration({\n ignore: enableInp ? [] : ['inp'],\n }),\n );\n }\n\n let startingUrl: string | undefined = getLocationHref();\n\n if (linkPreviousTrace !== 'off') {\n linkTraces(client, { linkPreviousTrace, consistentTraceSampling });\n }\n\n if (WINDOW.location) {\n if (instrumentPageLoad) {\n const origin = browserPerformanceTimeOrigin();\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: origin ? origin / 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?.indexOf(to) !== -1) {\n startingUrl = undefined;\n return;\n }\n\n startingUrl = undefined;\n const parsed = parseStringToURLObject(to);\n const activeSpan = getActiveIdleSpan(client);\n const navigationIsRedirect =\n activeSpan && detectRedirects && isRedirect(activeSpan, lastInteractionTimestamp);\n\n startBrowserTracingNavigationSpan(\n client,\n {\n name: parsed?.pathname || WINDOW.location.pathname,\n attributes: {\n [SEMANTIC_ATTRIBUTE_SENTRY_SOURCE]: 'url',\n [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'auto.navigation.browser',\n },\n },\n { url: to, isRedirect: navigationIsRedirect },\n );\n });\n }\n }\n\n if (markBackgroundSpan) {\n registerBackgroundTabDetection();\n }\n\n if (enableInteractions) {\n registerInteractionListener(client, idleTimeout, finalTimeout, childSpanTimeout, latestRoute);\n }\n\n instrumentOutgoingRequests(client, {\n traceFetch,\n traceXHR,\n tracePropagationTargets: client.getOptions().tracePropagationTargets,\n shouldCreateSpanForRequest,\n enableHTTPTimings,\n onRequestSpanStart,\n onRequestSpanEnd,\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 <meta> 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 getCurrentScope().setTransactionName(spanOptions.name);\n\n const pageloadSpan = getActiveIdleSpan(client);\n\n if (pageloadSpan) {\n client.emit('afterStartPageLoadSpan', pageloadSpan);\n }\n\n return pageloadSpan;\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(\n client: Client,\n spanOptions: StartSpanOptions,\n options?: { url?: string; isRedirect?: boolean },\n): Span | undefined {\n const { url, isRedirect } = options || {};\n client.emit('beforeStartNavigationSpan', spanOptions, { isRedirect, url });\n client.emit('startNavigationSpan', spanOptions, { isRedirect, url });\n\n const scope = getCurrentScope();\n scope.setTransactionName(spanOptions.name);\n\n // We store the normalized request data on the scope, so we get the request data at time of span creation\n // otherwise, the URL etc. may already be of the following navigation, and we'd report the wrong URL\n if (url && !isRedirect) {\n scope.setSDKProcessingMetadata({\n normalizedRequest: {\n ...getHttpRequestData(),\n url,\n },\n });\n }\n\n return getActiveIdleSpan(client);\n}\n\n/** Returns the value of a meta tag */\nexport function getMetaContent(metaName: string): string | undefined {\n /**\n * This is just a small wrapper that makes `document` optional.\n * We want to be extra-safe and always check that this exists, to ensure weird environments do not blow up.\n */\n const optionalWindowDocument = WINDOW.document as (typeof WINDOW)['document'] | undefined;\n\n const metaTag = optionalWindowDocument?.querySelector(`meta[name=${metaName}]`);\n return metaTag?.getAttribute('content') || undefined;\n}\n\n/** Returns the description of a server timing entry */\nexport function getServerTiming(name: string): string | undefined {\n // The cast is required for the declaration build (`build:types`), which resolves\n // `getEntriesByType('navigation')` to `PerformanceEntry[]` (no `serverTiming`). It only reads as\n // \"unnecessary\" to the type-aware linter, which runs with web-vitals' global augmentation applied.\n // oxlint-disable-next-line typescript/no-unnecessary-type-assertion\n const navigation = WINDOW.performance?.getEntriesByType?.('navigation')[0] as PerformanceNavigationTiming | undefined;\n const entry = navigation?.serverTiming?.find(entry => entry.name === name);\n return entry?.description;\n}\n\n/** Start listener for interaction transactions */\nfunction registerInteractionListener(\n client: Client,\n idleTimeout: BrowserTracingOptions['idleTimeout'],\n finalTimeout: BrowserTracingOptions['finalTimeout'],\n childSpanTimeout: BrowserTracingOptions['childSpanTimeout'],\n latestRoute: RouteInfo,\n): void {\n /**\n * This is just a small wrapper that makes `document` optional.\n * We want to be extra-safe and always check that this exists, to ensure weird environments do not blow up.\n */\n const optionalWindowDocument = WINDOW.document as (typeof WINDOW)['document'] | undefined;\n\n let inflightInteractionSpan: Span | undefined;\n const registerInteractionTransaction = (): void => {\n const op = 'ui.action.click';\n\n const activeIdleSpan = getActiveIdleSpan(client);\n if (activeIdleSpan) {\n const currentRootSpanOp = spanToJSON(activeIdleSpan).attributes[SENTRY_OP];\n if (['navigation', 'pageload'].includes(currentRootSpanOp as string)) {\n DEBUG_BUILD &&\n debug.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 && debug.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 (optionalWindowDocument) {\n addEventListener('click', registerInteractionTransaction, { capture: true });\n }\n}\n\n// We store the active idle span on the client object, so we can access it from exported functions\nconst ACTIVE_IDLE_SPAN_PROPERTY = '_sentry_idleSpan';\nfunction getActiveIdleSpan(client: Client): Span | undefined {\n return (client as { [ACTIVE_IDLE_SPAN_PROPERTY]?: Span })[ACTIVE_IDLE_SPAN_PROPERTY];\n}\n\nfunction setActiveIdleSpan(client: Client, span: Span | undefined): void {\n addNonEnumerableProperty(client, ACTIVE_IDLE_SPAN_PROPERTY, span);\n}\n\n// The max. time in seconds between two pageload/navigation spans that makes us consider the second one a redirect\nconst REDIRECT_THRESHOLD = 1.5;\n\nfunction isRedirect(activeSpan: Span, lastInteractionTimestamp: number | undefined): boolean {\n const spanData = spanToJSON(activeSpan);\n\n const now = dateTimestampInSeconds();\n\n // More than REDIRECT_THRESHOLD seconds since last navigation/pageload span?\n // --> never consider this a redirect\n const startTimestamp = spanData.start_timestamp;\n if (now - startTimestamp > REDIRECT_THRESHOLD) {\n return false;\n }\n\n // A click happened in the last REDIRECT_THRESHOLD seconds?\n // --> never consider this a redirect\n if (lastInteractionTimestamp && now - lastInteractionTimestamp <= REDIRECT_THRESHOLD) {\n return false;\n }\n\n return true;\n}\n"],"names":["isRedirect","entry"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"browserTracingIntegration.js","sources":["../../../../../src/tracing/browserTracingIntegration.ts"],"sourcesContent":["/* eslint-disable max-lines */\nimport type {\n Client,\n IntegrationFn,\n RequestHookInfo,\n ResponseHookInfo,\n Span,\n StartSpanOptions,\n} from '@sentry/core/browser';\nimport {\n _INTERNAL_ensureBrowserSpanStreaming,\n addNonEnumerableProperty,\n consoleSandbox,\n dateTimestampInSeconds,\n debug,\n generateSpanId,\n generateTraceId,\n getClient,\n getCurrentScope,\n getDynamicSamplingContextFromSpan,\n GLOBAL_OBJ,\n hasSpansEnabled,\n hasSpanStreamingEnabled,\n NAVIGATION_SPAN_NAME_FALLBACK,\n PAGELOAD_SPAN_NAME_FALLBACK,\n isURLObjectRelative,\n parseStringToURLObject,\n propagationContextFromHeaders,\n registerSpanErrorInstrumentation,\n SEMANTIC_ATTRIBUTE_SENTRY_IDLE_SPAN_FINISH_REASON,\n SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN,\n spanIsSampled,\n spanToJSON,\n startIdleSpan,\n startInactiveSpan,\n timestampInSeconds,\n TRACING_DEFAULTS,\n browserPerformanceTimeOrigin,\n} from '@sentry/core/browser';\nimport {\n addHistoryInstrumentationHandler,\n addPerformanceEntries,\n getLocationHref,\n isBotUserAgent,\n startTrackingLongAnimationFrames,\n startTrackingLongTasks,\n} from '@sentry/browser-utils';\nimport { DEBUG_BUILD } from '../debug-build';\nimport { filterCollectedUrl } from '@sentry/core';\nimport { getHttpRequestData, WINDOW } from '../helpers';\nimport { WEB_VITALS_INTEGRATION_NAME, webVitalsIntegration } from '../integrations/webVitals';\nimport { registerBackgroundTabDetection } from './backgroundtab';\nimport { linkTraces } from './linkedTraces';\nimport { defaultRequestInstrumentationOptions, instrumentOutgoingRequests } from './request';\nimport { SENTRY_SEGMENT_NAME_SOURCE, SENTRY_OP, URL_FULL, URL_PATH } from '@sentry/conventions/attributes';\n\nexport const BROWSER_TRACING_INTEGRATION_ID = 'BrowserTracing';\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 * @deprecated This option is no longer used. Element timing is now tracked via the standalone\n * `elementTimingIntegration`. Add it to your `integrations` array to collect element timing metrics.\n */\n enableElementTiming?: 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 * Resource spans with `op`s matching strings in the array will not be emitted.\n *\n * Default: []\n */\n ignoreResourceSpans: Array<'resource.script' | 'resource.css' | 'resource.img' | 'resource.other' | string>;\n\n /**\n * By default, the SDK will try to detect redirects and avoid creating separate spans for them.\n * If you want to opt-out of this behavior, you can set this option to `false`.\n *\n * Default: true\n */\n detectRedirects: boolean;\n\n /**\n * Link the currently started trace to a previous trace (e.g. a prior pageload, navigation or\n * manually started span). When enabled, this option will allow you to navigate between traces\n * in the Sentry UI.\n *\n * You can set this option to the following values:\n *\n * - `'in-memory'`: The previous trace data will be stored in memory.\n * This is useful for single-page applications and enabled by default.\n *\n * - `'session-storage'`: The previous trace data will be stored in the `sessionStorage`.\n * This is useful for multi-page applications or static sites but it means that the\n * Sentry SDK writes to the browser's `sessionStorage`.\n *\n * - `'off'`: The previous trace data will not be stored or linked.\n *\n * You can also use {@link BrowserTracingOptions.consistentTraceSampling} to get\n * consistent trace sampling of subsequent traces. Otherwise, by default, your\n * `tracesSampleRate` or `tracesSampler` config significantly influences how often\n * traces will be linked.\n *\n * @default 'in-memory' - see explanation above\n */\n linkPreviousTrace: 'in-memory' | 'session-storage' | 'off';\n\n /**\n * If true, Sentry will consistently sample subsequent traces based on the\n * sampling decision of the initial trace. For example, if the initial page\n * load trace was sampled positively, all subsequent traces (e.g. navigations)\n * are also sampled positively. In case the initial trace was sampled negatively,\n * all subsequent traces are also sampled negatively.\n *\n * This option allows you to get consistent, linked traces within a user journey\n * while maintaining an overall quota based on your trace sampling settings.\n *\n * This option is only effective if {@link BrowserTracingOptions.linkPreviousTrace}\n * is enabled (i.e. not set to `'off'`).\n *\n * @default `false` - this is an opt-in feature.\n */\n consistentTraceSampling: boolean;\n\n /**\n * If set to `true`, the pageload span will not end itself automatically, unless it\n * runs until the {@link BrowserTracingOptions.finalTimeout} (30 seconds by default) is reached.\n *\n * Set this option to `true`, if you want full control over the pageload span duration.\n * You can use `Sentry.reportPageLoaded()` to manually end the pageload span whenever convenient.\n * Be aware that you have to ensure that this is always called, regardless of the chosen route\n * or path in the application.\n *\n * @default `false`. By default, the pageload span will end itself automatically, based on\n * the {@link BrowserTracingOptions.finalTimeout}, {@link BrowserTracingOptions.idleTimeout}\n * and {@link BrowserTracingOptions.childSpanTimeout}. This is more convenient to use but means\n * that the pageload duration can be arbitrary and might not be fully representative of a perceived\n * page load time.\n */\n enableReportPageLoaded: boolean;\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 /**\n * This callback is invoked directly after a span is started for an outgoing fetch or XHR request.\n * You can use it to annotate the span with additional data or attributes, for example by setting\n * attributes based on the passed request headers.\n */\n onRequestSpanStart?(span: Span, requestInformation: RequestHookInfo): void;\n\n /**\n * Is called when spans end for outgoing requests, providing access to response headers.\n */\n onRequestSpanEnd?(span: Span, responseInformation: ResponseHookInfo): void;\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 ignoreResourceSpans: [],\n detectRedirects: true,\n linkPreviousTrace: 'in-memory',\n consistentTraceSampling: false,\n enableReportPageLoaded: false,\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<BrowserTracingOptions> = {}) => {\n if ('enableElementTiming' in options) {\n consoleSandbox(() => {\n // oxlint-disable-next-line no-console\n console.warn(\n '[Sentry] `enableElementTiming` is deprecated and no longer has any effect. Use the standalone `elementTimingIntegration` instead.',\n );\n });\n }\n\n /**\n * This is just a small wrapper that makes `document` optional.\n * We want to be extra-safe and always check that this exists, to ensure weird environments do not blow up.\n */\n const optionalWindowDocument = WINDOW.document as (typeof WINDOW)['document'] | undefined;\n\n const {\n enableInp,\n enableLongTask,\n enableLongAnimationFrame,\n beforeStartSpan,\n idleTimeout,\n finalTimeout,\n childSpanTimeout,\n markBackgroundSpan,\n traceFetch,\n traceXHR,\n shouldCreateSpanForRequest,\n enableHTTPTimings,\n ignoreResourceSpans,\n instrumentPageLoad,\n instrumentNavigation,\n detectRedirects,\n linkPreviousTrace,\n consistentTraceSampling,\n enableReportPageLoaded,\n onRequestSpanStart,\n onRequestSpanEnd,\n } = {\n ...DEFAULT_BROWSER_TRACING_OPTIONS,\n ...options,\n };\n\n const _isBot = isBotUserAgent();\n\n let lastInteractionTimestamp: number | undefined;\n\n let _pageloadSpan: Span | undefined;\n\n /** Create routing idle transaction. */\n function _createRouteSpan(client: Client, startSpanOptions: StartSpanOptions, makeActive = true, url?: string): void {\n const isPageloadSpan = startSpanOptions.op === 'pageload';\n\n const initialSpanName = startSpanOptions.name;\n const finalStartSpanOptions: StartSpanOptions = beforeStartSpan\n ? beforeStartSpan(startSpanOptions)\n : startSpanOptions;\n\n // For navigations, `url` is the destination URL, so we use it to reflect the post-navigation location.\n // For pageloads (and manual navigation spans without a URL) we fall back to the current location.\n const urlObject = parseStringToURLObject(url || getLocationHref());\n\n const attributes = {\n ...(urlObject?.pathname && { [URL_PATH]: urlObject.pathname }),\n ...(urlObject && !isURLObjectRelative(urlObject) && { [URL_FULL]: filterCollectedUrl(urlObject.href) }),\n ...finalStartSpanOptions.attributes,\n };\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 (initialSpanName !== finalStartSpanOptions.name) {\n attributes[SENTRY_SEGMENT_NAME_SOURCE] = 'custom';\n }\n\n finalStartSpanOptions.attributes = attributes;\n\n if (!makeActive) {\n // We want to ensure this has 0s duration\n const now = dateTimestampInSeconds();\n startInactiveSpan({\n ...finalStartSpanOptions,\n startTime: now,\n }).end(now);\n return;\n }\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: isPageloadSpan,\n trimIdleSpanEndTimestamp: !enableReportPageLoaded,\n });\n\n if (isPageloadSpan && enableReportPageLoaded) {\n _pageloadSpan = idleSpan;\n }\n\n setActiveIdleSpan(client, idleSpan);\n\n function emitFinish(): void {\n if (optionalWindowDocument && ['interactive', 'complete'].includes(optionalWindowDocument.readyState)) {\n client.emit('idleSpanEnableAutoFinish', idleSpan);\n // Once the finish signal has been emitted, the listener is no longer needed. Removing it here (rather than\n // relying on `{ once: true }`) also covers the common case where the document is already loaded when the span\n // starts, so the listener never fires and would otherwise leak together with the `idleSpan` it closes over.\n optionalWindowDocument.removeEventListener('readystatechange', emitFinish);\n }\n }\n\n // Enable auto finish of the pageload span if users are not explicitly ending it\n if (isPageloadSpan && !enableReportPageLoaded && optionalWindowDocument) {\n optionalWindowDocument.addEventListener('readystatechange', emitFinish);\n\n emitFinish();\n }\n }\n\n return {\n name: BROWSER_TRACING_INTEGRATION_ID,\n setup(client) {\n if (_isBot) {\n DEBUG_BUILD && debug.log('[Tracing] Skipping browserTracingIntegration setup for bot user agent.');\n return;\n }\n\n registerSpanErrorInstrumentation();\n\n if (\n enableLongAnimationFrame &&\n GLOBAL_OBJ.PerformanceObserver &&\n PerformanceObserver.supportedEntryTypes?.includes('long-animation-frame')\n ) {\n startTrackingLongAnimationFrames();\n } else if (enableLongTask) {\n startTrackingLongTasks();\n }\n\n if (detectRedirects && optionalWindowDocument) {\n const interactionHandler = (): void => {\n lastInteractionTimestamp = timestampInSeconds();\n };\n addEventListener('click', interactionHandler, { capture: true });\n addEventListener('keydown', interactionHandler, { capture: true, passive: true });\n }\n\n function maybeEndActiveSpan(): void {\n const activeSpan = getActiveIdleSpan(client);\n\n if (activeSpan && !spanToJSON(activeSpan).end_timestamp) {\n DEBUG_BUILD &&\n debug.log(\n `[Tracing] Finishing current active span with op: ${spanToJSON(activeSpan).attributes[SENTRY_OP]}`,\n );\n // If there's an open active span, we need to finish it before creating an new one.\n activeSpan.setAttribute(SEMANTIC_ATTRIBUTE_SENTRY_IDLE_SPAN_FINISH_REASON, 'cancelled');\n activeSpan.end();\n }\n }\n\n client.on('beforeIdleSpanEnd', span => {\n // Interaction idle spans also flow through this hook, but the route bookkeeping below only\n // applies to the pageload/navigation span. We identify it by reference rather than by op:\n // only the route span is registered as the active idle span.\n if (getActiveIdleSpan(client) !== span) {\n return;\n }\n\n addPerformanceEntries(span, {\n ignoreResourceSpans,\n spanStreamingEnabled: hasSpanStreamingEnabled(client),\n });\n setActiveIdleSpan(client, undefined);\n\n // A trace should stay consistent over the entire timespan of one route - even after the pageload/navigation ended.\n // Only when another navigation happens, we want to create a new trace.\n // This way, e.g. errors that occur after the pageload span ended are still associated to the pageload trace.\n const scope = getCurrentScope();\n const oldPropagationContext = scope.getPropagationContext();\n\n scope.setPropagationContext({\n ...oldPropagationContext,\n traceId: span.spanContext().traceId,\n sampled: spanIsSampled(span),\n dsc: getDynamicSamplingContextFromSpan(span),\n });\n\n if (_pageloadSpan === span) {\n // clean up the stored pageload span on the integration.\n _pageloadSpan = undefined;\n }\n });\n\n client.on('startNavigationSpan', (startSpanOptions, navigationOptions) => {\n if (getClient() !== client) {\n return;\n }\n\n if (navigationOptions?.isRedirect) {\n DEBUG_BUILD &&\n debug.warn('[Tracing] Detected redirect, navigation span will not be the root span, but a child span.');\n _createRouteSpan(\n client,\n {\n op: 'navigation.redirect',\n ...startSpanOptions,\n },\n false,\n navigationOptions.url,\n );\n return;\n }\n\n // Reset the last interaction timestamp since we now start a new navigation.\n // Any subsequent navigation span starts could again be a redirect, so we\n // should reset our heuristic detectors.\n lastInteractionTimestamp = undefined;\n\n maybeEndActiveSpan();\n\n const scope = getCurrentScope();\n scope.setPropagationContext({\n traceId: generateTraceId(),\n sampleRand: Math.random(),\n propagationSpanId: hasSpansEnabled() ? undefined : generateSpanId(),\n });\n\n // We reset this to ensure we do not have lingering incorrect data here\n // places that call this hook may set this where appropriate - else, the URL at span sending time is used\n scope.setSDKProcessingMetadata({\n normalizedRequest: undefined,\n });\n\n _createRouteSpan(\n client,\n {\n op: 'navigation',\n ...startSpanOptions,\n // Navigation starts a new trace and is NOT parented under any active interaction (e.g. ui.action.click)\n parentSpan: null,\n forceTransaction: true,\n },\n true,\n navigationOptions?.url,\n );\n });\n\n client.on('startPageLoadSpan', (startSpanOptions, traceOptions = {}) => {\n if (getClient() !== client) {\n return;\n }\n maybeEndActiveSpan();\n\n const sentryTrace =\n traceOptions.sentryTrace || getMetaContent('sentry-trace') || getServerTiming('sentry-trace');\n const baggage = traceOptions.baggage || getMetaContent('baggage') || getServerTiming('baggage');\n\n const propagationContext = propagationContextFromHeaders(sentryTrace, baggage);\n\n const scope = getCurrentScope();\n scope.setPropagationContext(propagationContext);\n if (!hasSpansEnabled()) {\n // for browser, we wanna keep the spanIds consistent during the entire lifetime of the trace\n // this works by setting the propagationSpanId to a random spanId so that we have a consistent\n // span id to propagate in TwP mode (!hasSpansEnabled())\n scope.getPropagationContext().propagationSpanId = generateSpanId();\n }\n\n // We store the normalized request data on the scope, so we get the request data at time of span creation\n // otherwise, the URL etc. may already be of the following navigation, and we'd report the wrong URL\n scope.setSDKProcessingMetadata({\n normalizedRequest: getHttpRequestData(),\n });\n\n _createRouteSpan(client, {\n op: 'pageload',\n ...startSpanOptions,\n });\n });\n\n client.on('endPageloadSpan', () => {\n if (enableReportPageLoaded && _pageloadSpan) {\n _pageloadSpan.setAttribute(SEMANTIC_ATTRIBUTE_SENTRY_IDLE_SPAN_FINISH_REASON, 'reportPageLoaded');\n _pageloadSpan.end();\n }\n });\n },\n\n afterAllSetup(client) {\n if (_isBot) {\n return;\n }\n\n // Technically, every startSpan call already ensures that `spanStreamingIntegration` is installed,\n // but we do it here anyway for the edge case that users disabled pageload and navigation spans and\n // purely rely on manual startSpan calls.\n _INTERNAL_ensureBrowserSpanStreaming(client);\n\n // Auto-register webVitalsIntegration if the user hasn't added one. We do this in\n // afterAllSetup so that a user-provided webVitalsIntegration - which may be ordered after\n // browserTracingIntegration in the integrations array - has already been installed.\n if (client.addIntegration && !client.getIntegrationByName?.(WEB_VITALS_INTEGRATION_NAME)) {\n client.addIntegration(\n webVitalsIntegration({\n ignore: enableInp ? [] : ['inp'],\n }),\n );\n }\n\n let startingUrl: string | undefined = getLocationHref();\n\n if (linkPreviousTrace !== 'off') {\n linkTraces(client, { linkPreviousTrace, consistentTraceSampling });\n }\n\n if (WINDOW.location) {\n if (instrumentPageLoad) {\n startBrowserTracingPageLoadSpan(client, {\n // With span streaming, span names have to be low cardinality, and there is no route\n // information available here.\n name: hasSpanStreamingEnabled(client) ? PAGELOAD_SPAN_NAME_FALLBACK : WINDOW.location.pathname,\n attributes: {\n [SENTRY_SEGMENT_NAME_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?.indexOf(to) !== -1) {\n startingUrl = undefined;\n return;\n }\n\n startingUrl = undefined;\n const parsed = parseStringToURLObject(to);\n const activeSpan = getActiveIdleSpan(client);\n const navigationIsRedirect =\n activeSpan && detectRedirects && isRedirect(activeSpan, lastInteractionTimestamp);\n\n startBrowserTracingNavigationSpan(\n client,\n {\n // With span streaming, span names have to be low cardinality, and there is no route\n // information available here.\n name: hasSpanStreamingEnabled(client)\n ? NAVIGATION_SPAN_NAME_FALLBACK\n : parsed?.pathname || WINDOW.location.pathname,\n attributes: {\n [SENTRY_SEGMENT_NAME_SOURCE]: 'url',\n [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'auto.navigation.browser',\n },\n },\n { url: to, isRedirect: navigationIsRedirect },\n );\n });\n }\n }\n\n if (markBackgroundSpan) {\n registerBackgroundTabDetection();\n }\n\n instrumentOutgoingRequests(client, {\n traceFetch,\n traceXHR,\n tracePropagationTargets: client.getOptions().tracePropagationTargets,\n shouldCreateSpanForRequest,\n enableHTTPTimings,\n onRequestSpanStart,\n onRequestSpanEnd,\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 <meta> tags.\n */\nexport function startBrowserTracingPageLoadSpan(\n client: Client,\n spanOptions: StartSpanOptions,\n traceOptions?: { sentryTrace?: string | undefined; baggage?: string | undefined },\n): Span | undefined {\n // `Pageload` is a low-cardinality span name, not a description of the page. The scope's\n // transaction name is what error events are grouped by, so it keeps the URL instead.\n const isFallbackSpanName = spanOptions.name === PAGELOAD_SPAN_NAME_FALLBACK;\n getCurrentScope().setTransactionName(isFallbackSpanName ? WINDOW.location?.pathname : spanOptions.name);\n // A pageload span always covers the entire page load, no matter how late the SDK or a routing\n // instrumentation gets around to starting it. Everything that happened before (DNS, TLS, TTFB,\n // HTML parsing, chunk loading) is part of the page load and the performance child spans we attach\n // later are anchored at the time origin anyway.\n const timeOrigin = browserPerformanceTimeOrigin();\n const pageloadSpanOptions: StartSpanOptions = {\n ...spanOptions,\n // startTime needs to be in seconds, not ms\n startTime: spanOptions.startTime ?? (timeOrigin ? timeOrigin / 1000 : undefined),\n };\n\n client.emit('startPageLoadSpan', pageloadSpanOptions, traceOptions);\n\n const pageloadSpan = getActiveIdleSpan(client);\n\n if (pageloadSpan) {\n client.emit('afterStartPageLoadSpan', pageloadSpan);\n }\n\n return pageloadSpan;\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(\n client: Client,\n spanOptions: StartSpanOptions,\n options?: { url?: string; isRedirect?: boolean },\n): Span | undefined {\n const { url, isRedirect } = options || {};\n client.emit('beforeStartNavigationSpan', spanOptions, { isRedirect, url });\n client.emit('startNavigationSpan', spanOptions, { isRedirect, url });\n\n const scope = getCurrentScope();\n // `Navigation` is a low-cardinality span name, not a description of the page. The scope's\n // transaction name is what error events are grouped by, so it keeps the URL instead. `url` is the\n // destination, while `location` still points at the previous page during a `pushState`.\n const isFallbackSpanName = spanOptions.name === NAVIGATION_SPAN_NAME_FALLBACK;\n scope.setTransactionName(\n isFallbackSpanName ? (url && parseStringToURLObject(url)?.pathname) || WINDOW.location?.pathname : spanOptions.name,\n );\n\n // We store the normalized request data on the scope, so we get the request data at time of span creation\n // otherwise, the URL etc. may already be of the following navigation, and we'd report the wrong URL\n if (url && !isRedirect) {\n scope.setSDKProcessingMetadata({\n normalizedRequest: {\n ...getHttpRequestData(),\n url,\n },\n });\n }\n\n return getActiveIdleSpan(client);\n}\n\n/** Returns the value of a meta tag */\nexport function getMetaContent(metaName: string): string | undefined {\n /**\n * This is just a small wrapper that makes `document` optional.\n * We want to be extra-safe and always check that this exists, to ensure weird environments do not blow up.\n */\n const optionalWindowDocument = WINDOW.document as (typeof WINDOW)['document'] | undefined;\n\n const metaTag = optionalWindowDocument?.querySelector(`meta[name=${metaName}]`);\n return metaTag?.getAttribute('content') || undefined;\n}\n\n/** Returns the description of a server timing entry */\nexport function getServerTiming(name: string): string | undefined {\n // The cast is required for the declaration build (`build:types`), which resolves\n // `getEntriesByType('navigation')` to `PerformanceEntry[]` (no `serverTiming`). It only reads as\n // \"unnecessary\" to the type-aware linter, which runs with web-vitals' global augmentation applied.\n // oxlint-disable-next-line typescript/no-unnecessary-type-assertion\n const navigation = WINDOW.performance?.getEntriesByType?.('navigation')[0] as PerformanceNavigationTiming | undefined;\n const entry = navigation?.serverTiming?.find(entry => entry.name === name);\n return entry?.description;\n}\n\n// We store the active idle span on the client object, so we can access it from exported functions\nconst ACTIVE_IDLE_SPAN_PROPERTY = '_sentry_idleSpan';\nfunction getActiveIdleSpan(client: Client): Span | undefined {\n return (client as { [ACTIVE_IDLE_SPAN_PROPERTY]?: Span })[ACTIVE_IDLE_SPAN_PROPERTY];\n}\n\nfunction setActiveIdleSpan(client: Client, span: Span | undefined): void {\n addNonEnumerableProperty(client, ACTIVE_IDLE_SPAN_PROPERTY, span);\n}\n\n// The max. time in seconds between two pageload/navigation spans that makes us consider the second one a redirect\nconst REDIRECT_THRESHOLD = 1.5;\n\nfunction isRedirect(activeSpan: Span, lastInteractionTimestamp: number | undefined): boolean {\n const spanData = spanToJSON(activeSpan);\n\n const now = dateTimestampInSeconds();\n\n // More than REDIRECT_THRESHOLD seconds since last navigation/pageload span?\n // --> never consider this a redirect\n const startTimestamp = spanData.start_timestamp;\n if (now - startTimestamp > REDIRECT_THRESHOLD) {\n return false;\n }\n\n // A click happened in the last REDIRECT_THRESHOLD seconds?\n // --> never consider this a redirect\n if (lastInteractionTimestamp && now - lastInteractionTimestamp <= REDIRECT_THRESHOLD) {\n return false;\n }\n\n return true;\n}\n"],"names":["isRedirect","entry"],"mappings":"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"}
|
|
@@ -11,7 +11,6 @@ import '../integrations/globalhandlers.js';
|
|
|
11
11
|
import '../integrations/httpcontext.js';
|
|
12
12
|
import '../integrations/linkederrors.js';
|
|
13
13
|
import '../integrations/spotlight.js';
|
|
14
|
-
import '../integrations/spanstreaming.js';
|
|
15
14
|
import { SENTRY_OP } from '@sentry/conventions/attributes';
|
|
16
15
|
|
|
17
16
|
const PREVIOUS_TRACE_MAX_DURATION = 3600;
|