From f4f2809618232b09332e2071b14ca588d25eae46 Mon Sep 17 00:00:00 2001 From: Francesco Novy Date: Mon, 14 Apr 2025 11:29:37 +0200 Subject: [PATCH 1/3] feat(browser): Warn on duplicate `browserTracingIntegration` --- .../multiple-integrations/init.js | 9 ++++++++ .../multiple-integrations/test.ts | 22 +++++++++++++++++++ .../src/tracing/browserTracingIntegration.ts | 22 ++++++++++++++++++- 3 files changed, 52 insertions(+), 1 deletion(-) create mode 100644 dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/multiple-integrations/init.js create mode 100644 dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/multiple-integrations/test.ts diff --git a/dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/multiple-integrations/init.js b/dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/multiple-integrations/init.js new file mode 100644 index 000000000000..6d4dd43801b8 --- /dev/null +++ b/dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/multiple-integrations/init.js @@ -0,0 +1,9 @@ +import * as Sentry from '@sentry/browser'; + +window.Sentry = Sentry; + +Sentry.init({ + dsn: 'https://public@dsn.ingest.sentry.io/1337', + integrations: [Sentry.browserTracingIntegration(), Sentry.browserTracingIntegration()], + tracesSampleRate: 1, +}); diff --git a/dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/multiple-integrations/test.ts b/dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/multiple-integrations/test.ts new file mode 100644 index 000000000000..f7f3c50ee052 --- /dev/null +++ b/dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/multiple-integrations/test.ts @@ -0,0 +1,22 @@ +import { expect } from '@playwright/test'; + +import { sentryTest } from '../../../../utils/fixtures'; +import { shouldSkipTracingTest } from '../../../../utils/helpers'; + +sentryTest('warns if multiple integrations are used', async ({ getLocalTestUrl, page }) => { + if (shouldSkipTracingTest()) { + sentryTest.skip(); + } + + const msgs: string[] = []; + + page.on('console', msg => { + msgs.push(msg.text()); + }); + + const url = await getLocalTestUrl({ testDir: __dirname }); + + await page.goto(url); + + expect(msgs).toEqual(['Multiple browserTracingIntegration instances are not supported.']); +}); diff --git a/packages/browser/src/tracing/browserTracingIntegration.ts b/packages/browser/src/tracing/browserTracingIntegration.ts index fab45cd1ed4f..eea0a9e60aa9 100644 --- a/packages/browser/src/tracing/browserTracingIntegration.ts +++ b/packages/browser/src/tracing/browserTracingIntegration.ts @@ -9,7 +9,16 @@ import { startTrackingLongTasks, startTrackingWebVitals, } from '@sentry-internal/browser-utils'; -import type { Client, IntegrationFn, Span, StartSpanOptions, TransactionSource, WebFetchHeaders } from '@sentry/core'; +import { + Client, + IntegrationFn, + Span, + StartSpanOptions, + TransactionSource, + WebFetchHeaders, + consoleSandbox, + isBrowser, +} from '@sentry/core'; import { GLOBAL_OBJ, SEMANTIC_ATTRIBUTE_SENTRY_IDLE_SPAN_FINISH_REASON, @@ -217,6 +226,8 @@ const DEFAULT_BROWSER_TRACING_OPTIONS: BrowserTracingOptions = { ...defaultRequestInstrumentationOptions, }; +let _hasBeenInitialized = false; + /** * The Browser Tracing integration automatically instruments browser pageload/navigation * actions as transactions, and captures requests, metrics and errors as spans. @@ -227,6 +238,15 @@ const DEFAULT_BROWSER_TRACING_OPTIONS: BrowserTracingOptions = { * We explicitly export the proper type here, as this has to be extended in some cases. */ export const browserTracingIntegration = ((_options: Partial = {}) => { + if (_hasBeenInitialized && isBrowser()) { + consoleSandbox(() => { + // eslint-disable-next-line no-console + console.warn('Multiple browserTracingIntegration instances are not supported.'); + }); + } + + _hasBeenInitialized = true; + /** * This is just a small wrapper that makes `document` optional. * We want to be extra-safe and always check that this exists, to ensure weird environments do not blow up. From 2b1440b927a4e128a29c513015a80d6cf69aaf76 Mon Sep 17 00:00:00 2001 From: Francesco Novy Date: Mon, 14 Apr 2025 11:42:40 +0200 Subject: [PATCH 2/3] remove one check --- packages/browser/src/tracing/browserTracingIntegration.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/packages/browser/src/tracing/browserTracingIntegration.ts b/packages/browser/src/tracing/browserTracingIntegration.ts index eea0a9e60aa9..25653d07e629 100644 --- a/packages/browser/src/tracing/browserTracingIntegration.ts +++ b/packages/browser/src/tracing/browserTracingIntegration.ts @@ -17,7 +17,6 @@ import { TransactionSource, WebFetchHeaders, consoleSandbox, - isBrowser, } from '@sentry/core'; import { GLOBAL_OBJ, @@ -238,7 +237,7 @@ let _hasBeenInitialized = false; * We explicitly export the proper type here, as this has to be extended in some cases. */ export const browserTracingIntegration = ((_options: Partial = {}) => { - if (_hasBeenInitialized && isBrowser()) { + if (_hasBeenInitialized) { consoleSandbox(() => { // eslint-disable-next-line no-console console.warn('Multiple browserTracingIntegration instances are not supported.'); From f3af41b9bbbee81d7e59434a37667c28afdc4167 Mon Sep 17 00:00:00 2001 From: Francesco Novy Date: Mon, 14 Apr 2025 11:43:10 +0200 Subject: [PATCH 3/3] bump size limit & fix lint --- .size-limit.js | 2 +- .../browser/src/tracing/browserTracingIntegration.ts | 11 ++--------- 2 files changed, 3 insertions(+), 10 deletions(-) diff --git a/.size-limit.js b/.size-limit.js index ca26288b07b3..d66ece2b690d 100644 --- a/.size-limit.js +++ b/.size-limit.js @@ -40,7 +40,7 @@ module.exports = [ path: 'packages/browser/build/npm/esm/index.js', import: createImport('init', 'browserTracingIntegration'), gzip: true, - limit: '38 KB', + limit: '39 KB', }, { name: '@sentry/browser (incl. Tracing, Replay)', diff --git a/packages/browser/src/tracing/browserTracingIntegration.ts b/packages/browser/src/tracing/browserTracingIntegration.ts index 25653d07e629..5851edfec823 100644 --- a/packages/browser/src/tracing/browserTracingIntegration.ts +++ b/packages/browser/src/tracing/browserTracingIntegration.ts @@ -9,15 +9,8 @@ import { startTrackingLongTasks, startTrackingWebVitals, } from '@sentry-internal/browser-utils'; -import { - Client, - IntegrationFn, - Span, - StartSpanOptions, - TransactionSource, - WebFetchHeaders, - consoleSandbox, -} from '@sentry/core'; +import type { Client, IntegrationFn, Span, StartSpanOptions, TransactionSource, WebFetchHeaders } from '@sentry/core'; +import { consoleSandbox } from '@sentry/core'; import { GLOBAL_OBJ, SEMANTIC_ATTRIBUTE_SENTRY_IDLE_SPAN_FINISH_REASON,