From 35e2fc56092ac8f7ea2f27f5f7303c8ed7fc3e85 Mon Sep 17 00:00:00 2001 From: Abhijeet Prasad Date: Thu, 29 Jun 2023 13:37:06 -0400 Subject: [PATCH 01/11] ref(tracing): Extract propagation context from meta tags --- .../src/browser/browsertracing.ts | 38 +++++++++---------- .../tracing-internal/src/browser/request.ts | 4 +- .../test/browser/browsertracing.test.ts | 12 +++--- .../test/browser/metrics/index.test.ts | 1 + .../test/browser/request.test.ts | 1 + .../test/browser/router.test.ts | 1 + 6 files changed, 29 insertions(+), 28 deletions(-) diff --git a/packages/tracing-internal/src/browser/browsertracing.ts b/packages/tracing-internal/src/browser/browsertracing.ts index 4d1b1bca7c97..9dcd99f3dbe0 100644 --- a/packages/tracing-internal/src/browser/browsertracing.ts +++ b/packages/tracing-internal/src/browser/browsertracing.ts @@ -1,14 +1,8 @@ /* eslint-disable max-lines */ import type { Hub, IdleTransaction } from '@sentry/core'; -import { - addTracingExtensions, - extractTraceparentData, - getActiveTransaction, - startIdleTransaction, - TRACING_DEFAULTS, -} from '@sentry/core'; +import { addTracingExtensions, getActiveTransaction, startIdleTransaction, TRACING_DEFAULTS } from '@sentry/core'; import type { EventProcessor, Integration, Transaction, TransactionContext, TransactionSource } from '@sentry/types'; -import { baggageHeaderToDynamicSamplingContext, getDomElement, logger } from '@sentry/utils'; +import { getDomElement, logger, tracingContextFromHeaders } from '@sentry/utils'; import { registerBackgroundTabDetection } from './backgroundtab'; import { @@ -297,24 +291,29 @@ export class BrowserTracing implements Integration { return undefined; } + const hub = this._getCurrentHub(); + const { beforeNavigate, idleTimeout, finalTimeout, heartbeatInterval } = this.options; const isPageloadTransaction = context.op === 'pageload'; - const sentryTraceMetaTagValue = isPageloadTransaction ? getMetaContent('sentry-trace') : null; - const baggageMetaTagValue = isPageloadTransaction ? getMetaContent('baggage') : null; - - const traceParentData = sentryTraceMetaTagValue ? extractTraceparentData(sentryTraceMetaTagValue) : undefined; - const dynamicSamplingContext = baggageMetaTagValue - ? baggageHeaderToDynamicSamplingContext(baggageMetaTagValue) - : undefined; + const sentryTrace = isPageloadTransaction ? getMetaContent('sentry-trace') : ''; + const baggage = isPageloadTransaction ? getMetaContent('baggage') : ''; + const { traceparentData, dynamicSamplingContext, propagationContext } = tracingContextFromHeaders( + sentryTrace, + baggage, + ); + // Only set propagation context on pageload transactions. + if (isPageloadTransaction) { + hub.getScope().setPropagationContext(propagationContext); + } const expandedContext: TransactionContext = { ...context, - ...traceParentData, + ...traceparentData, metadata: { ...context.metadata, - dynamicSamplingContext: traceParentData && !dynamicSamplingContext ? {} : dynamicSamplingContext, + dynamicSamplingContext: traceparentData && !dynamicSamplingContext ? {} : dynamicSamplingContext, }, trimEnd: true, }; @@ -341,7 +340,6 @@ export class BrowserTracing implements Integration { __DEBUG_BUILD__ && logger.log(`[Tracing] Starting ${finalContext.op} transaction on scope`); - const hub = this._getCurrentHub(); const { location } = WINDOW; const idleTransaction = startIdleTransaction( @@ -424,11 +422,11 @@ export class BrowserTracing implements Integration { } /** Returns the value of a meta tag */ -export function getMetaContent(metaName: string): string | null { +export function getMetaContent(metaName: string): string | undefined { // Can't specify generic to `getDomElement` because tracing can be used // in a variety of environments, have to disable `no-unsafe-member-access` // as a result. const metaTag = getDomElement(`meta[name=${metaName}]`); // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access - return metaTag ? metaTag.getAttribute('content') : null; + return metaTag ? metaTag.getAttribute('content') : undefined; } diff --git a/packages/tracing-internal/src/browser/request.ts b/packages/tracing-internal/src/browser/request.ts index d7e397ae01ac..9a5bbb330b6b 100644 --- a/packages/tracing-internal/src/browser/request.ts +++ b/packages/tracing-internal/src/browser/request.ts @@ -214,7 +214,7 @@ export function shouldAttachHeaders(url: string, tracePropagationTargets: (strin * * @returns Span if a span was created, otherwise void. */ -function fetchCallback( +export function fetchCallback( handlerData: FetchData, shouldCreateSpan: (url: string) => boolean, shouldAttachHeaders: (url: string) => boolean, @@ -364,7 +364,7 @@ export function addTracingHeadersToFetchRequest( * * @returns Span if a span was created, otherwise void. */ -function xhrCallback( +export function xhrCallback( handlerData: XHRData, shouldCreateSpan: (url: string) => boolean, shouldAttachHeaders: (url: string) => boolean, diff --git a/packages/tracing-internal/test/browser/browsertracing.test.ts b/packages/tracing-internal/test/browser/browsertracing.test.ts index c7cec8a54735..156203dc40e0 100644 --- a/packages/tracing-internal/test/browser/browsertracing.test.ts +++ b/packages/tracing-internal/test/browser/browsertracing.test.ts @@ -94,7 +94,6 @@ describe('BrowserTracing', () => { const browserTracing = createBrowserTracing(); expect(browserTracing.options).toEqual({ - _experiments: {}, enableLongTask: true, ...TRACING_DEFAULTS, markBackgroundTransactions: true, @@ -113,9 +112,6 @@ describe('BrowserTracing', () => { }); expect(browserTracing.options).toEqual({ - _experiments: { - enableLongTask: false, - }, enableLongTask: false, ...TRACING_DEFAULTS, markBackgroundTransactions: true, @@ -123,6 +119,9 @@ describe('BrowserTracing', () => { startTransactionOnLocationChange: true, startTransactionOnPageLoad: true, ...defaultRequestInstrumentationOptions, + _experiments: { + enableLongTask: false, + }, }); }); @@ -132,7 +131,6 @@ describe('BrowserTracing', () => { }); expect(browserTracing.options).toEqual({ - _experiments: {}, enableLongTask: false, ...TRACING_DEFAULTS, markBackgroundTransactions: true, @@ -248,6 +246,7 @@ describe('BrowserTracing', () => { traceFetch: true, traceXHR: true, tracePropagationTargets: ['something'], + _experiments: {}, }); }); @@ -261,6 +260,7 @@ describe('BrowserTracing', () => { }); expect(instrumentOutgoingRequestsMock).toHaveBeenCalledWith({ + _experiments: {}, traceFetch: true, traceXHR: true, tracePropagationTargets: ['something-else'], @@ -546,7 +546,7 @@ describe('BrowserTracing', () => { document.head.innerHTML = ''; const metaTagValue = getMetaContent('dogpark'); - expect(metaTagValue).toBe(null); + expect(metaTagValue).toBe(undefined); }); it('can pick the correct tag out of multiple options', () => { diff --git a/packages/tracing-internal/test/browser/metrics/index.test.ts b/packages/tracing-internal/test/browser/metrics/index.test.ts index d325815bde31..c196fbd2467c 100644 --- a/packages/tracing-internal/test/browser/metrics/index.test.ts +++ b/packages/tracing-internal/test/browser/metrics/index.test.ts @@ -14,6 +14,7 @@ describe('_addMeasureSpans', () => { name: 'measure-1', duration: 10, startTime: 12, + detail: undefined, }; const timeOrigin = 100; diff --git a/packages/tracing-internal/test/browser/request.test.ts b/packages/tracing-internal/test/browser/request.test.ts index ee714e111a8b..c0c544506a09 100644 --- a/packages/tracing-internal/test/browser/request.test.ts +++ b/packages/tracing-internal/test/browser/request.test.ts @@ -240,6 +240,7 @@ describe('callbacks', () => { expect(finishedSpan.data).toEqual({ 'http.response_content_length': 123, 'http.method': 'GET', + 'http.response.status_code': 404, type: 'fetch', url: 'http://dogs.are.great/', }); diff --git a/packages/tracing-internal/test/browser/router.test.ts b/packages/tracing-internal/test/browser/router.test.ts index 65ce7e90af48..cfa2179386d9 100644 --- a/packages/tracing-internal/test/browser/router.test.ts +++ b/packages/tracing-internal/test/browser/router.test.ts @@ -46,6 +46,7 @@ describe('instrumentRoutingWithDefaults', () => { name: 'blank', op: 'pageload', metadata: { source: 'url' }, + startTimestamp: expect.any(Number), }); }); From 7450665f12ec6ff9356d57c1c27578765b1c7ee2 Mon Sep 17 00:00:00 2001 From: Abhijeet Prasad Date: Thu, 29 Jun 2023 15:45:28 -0400 Subject: [PATCH 02/11] improve logic for navigation transactions --- .../src/browser/browsertracing.ts | 22 +++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/packages/tracing-internal/src/browser/browsertracing.ts b/packages/tracing-internal/src/browser/browsertracing.ts index 9dcd99f3dbe0..4be633821a1a 100644 --- a/packages/tracing-internal/src/browser/browsertracing.ts +++ b/packages/tracing-internal/src/browser/browsertracing.ts @@ -303,10 +303,6 @@ export class BrowserTracing implements Integration { sentryTrace, baggage, ); - // Only set propagation context on pageload transactions. - if (isPageloadTransaction) { - hub.getScope().setPropagationContext(propagationContext); - } const expandedContext: TransactionContext = { ...context, @@ -351,6 +347,24 @@ export class BrowserTracing implements Integration { { location }, // for use in the tracesSampler heartbeatInterval, ); + + const scope = hub.getScope(); + + // If it's a pageload and there is a meta tag set + // use the traceparentData as the propagation context + if (isPageloadTransaction && traceparentData) { + scope.setPropagationContext(propagationContext); + } else { + // Navigation transactions should set a new propagation context based on the + // created idle transaction. + scope.setPropagationContext({ + traceId: idleTransaction.traceId, + spanId: idleTransaction.spanId, + parentSpanId: idleTransaction.parentSpanId, + sampled: !!idleTransaction.sampled, + }); + } + idleTransaction.registerBeforeFinishCallback(transaction => { this._collectWebVitals(); addPerformanceEntries(transaction); From e679f85b391cf646aa861d01ea3e0b0dbc090fcb Mon Sep 17 00:00:00 2001 From: Abhijeet Prasad Date: Thu, 29 Jun 2023 17:29:37 -0400 Subject: [PATCH 03/11] chore: Make sure we run sentry-internal unit tests --- package.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/package.json b/package.json index feb5be7839d0..36bb6500c23a 100644 --- a/package.json +++ b/package.json @@ -25,9 +25,9 @@ "lint:eslint": "lerna run lint:eslint", "validate:es5": "lerna run validate:es5", "postpublish": "lerna run --stream --concurrency 1 postpublish", - "test": "lerna run --ignore @sentry-internal/* test", - "test:unit": "lerna run --ignore @sentry-internal/* test:unit", - "test-ci-browser": "lerna run test --ignore \"@sentry/{node,opentelemetry-node,serverless,nextjs,remix,gatsby,sveltekit}\" --ignore @sentry-internal/*", + "test": "lerna run --ignore \"@sentry-internal/{browser-integration-tests,e2e-tests,integration-shims,node-integration-tests,overhead-metrics}\" test", + "test:unit": "lerna run --ignore \"@sentry-internal/{browser-integration-tests,e2e-tests,integration-shims,node-integration-tests,overhead-metrics}\" test:unit", + "test-ci-browser": "lerna run test --ignore \"@sentry/{node,opentelemetry-node,serverless,nextjs,remix,gatsby,sveltekit}\" --ignore \"@sentry-internal/{browser-integration-tests,e2e-tests,integration-shims,node-integration-tests,overhead-metrics}\"", "test-ci-node": "ts-node ./scripts/node-unit-tests.ts", "test:update-snapshots": "lerna run test:update-snapshots", "yalc:publish": "lerna run yalc:publish" From 34bb27811ea46fdbe3f4c3fbbeda9ffa5dfae498 Mon Sep 17 00:00:00 2001 From: Abhijeet Prasad Date: Fri, 30 Jun 2023 11:56:06 -0400 Subject: [PATCH 04/11] some additional logic --- .../tracing-internal/test/browser/router.test.ts | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/packages/tracing-internal/test/browser/router.test.ts b/packages/tracing-internal/test/browser/router.test.ts index cfa2179386d9..83c621754a05 100644 --- a/packages/tracing-internal/test/browser/router.test.ts +++ b/packages/tracing-internal/test/browser/router.test.ts @@ -1,4 +1,4 @@ -import type { InstrumentHandlerCallback, InstrumentHandlerType } from '@sentry/utils'; +import { InstrumentHandlerCallback, InstrumentHandlerType, parseSemver } from '@sentry/utils'; import { JSDOM } from 'jsdom'; import { instrumentRoutingWithDefaults } from '../../src/browser/router'; @@ -16,6 +16,17 @@ jest.mock('@sentry/utils', () => { }; }); +const NODE_VERSION = parseSemver(process.versions.node).major || 20; + +/** + * Since startTimestamp is created using browserPerformanceTimeOrigin, which requires Node 14+ + * we need to expect a different value for older versions of Node. This is not a problem for browser + * environments, but we need to run this test in multiple Node versions. + */ +function expectStartTimestamp() { + return NODE_VERSION > 14 ? expect.any(Number) : undefined; +} + describe('instrumentRoutingWithDefaults', () => { const mockFinish = jest.fn(); const customStartTransaction = jest.fn().mockReturnValue({ finish: mockFinish }); @@ -46,7 +57,7 @@ describe('instrumentRoutingWithDefaults', () => { name: 'blank', op: 'pageload', metadata: { source: 'url' }, - startTimestamp: expect.any(Number), + startTimestamp: expectStartTimestamp(), }); }); From 48c32d976072b1a763d1c4eeb8092fc33f87d172 Mon Sep 17 00:00:00 2001 From: Abhijeet Prasad Date: Fri, 30 Jun 2023 12:33:29 -0400 Subject: [PATCH 05/11] skip stuff --- scripts/node-unit-tests.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/scripts/node-unit-tests.ts b/scripts/node-unit-tests.ts index e5efc7c2ebd3..c32fa6376d38 100644 --- a/scripts/node-unit-tests.ts +++ b/scripts/node-unit-tests.ts @@ -22,6 +22,7 @@ const NODE_8_SKIP_TESTS_PACKAGES = [ '@sentry/nextjs', '@sentry/remix', '@sentry/sveltekit', + '@sentry-internal/replay-worker', ]; // We have to downgrade some of our dependencies in order to run tests in Node 8 and 10. @@ -34,7 +35,7 @@ const NODE_8_LEGACY_DEPENDENCIES = [ 'lerna@3.13.4', ]; -const NODE_10_SKIP_TESTS_PACKAGES = ['@sentry/remix', '@sentry/sveltekit']; +const NODE_10_SKIP_TESTS_PACKAGES = ['@sentry/remix', '@sentry/sveltekit', '@sentry-internal/replay-worker']; const NODE_10_LEGACY_DEPENDENCIES = ['jsdom@16.x', 'lerna@3.13.4']; const NODE_12_SKIP_TESTS_PACKAGES = ['@sentry/remix', '@sentry/sveltekit']; From deeb7d6a6cb224173a004fecf325f785a1b45aa4 Mon Sep 17 00:00:00 2001 From: Abhijeet Prasad Date: Fri, 30 Jun 2023 12:58:27 -0400 Subject: [PATCH 06/11] sort --- packages/tracing-internal/test/browser/router.test.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/tracing-internal/test/browser/router.test.ts b/packages/tracing-internal/test/browser/router.test.ts index 83c621754a05..ef512ef7b0dc 100644 --- a/packages/tracing-internal/test/browser/router.test.ts +++ b/packages/tracing-internal/test/browser/router.test.ts @@ -1,4 +1,5 @@ -import { InstrumentHandlerCallback, InstrumentHandlerType, parseSemver } from '@sentry/utils'; +import type { InstrumentHandlerCallback, InstrumentHandlerType} from '@sentry/utils'; +import { parseSemver } from '@sentry/utils'; import { JSDOM } from 'jsdom'; import { instrumentRoutingWithDefaults } from '../../src/browser/router'; From c668a74d9c4d3667824b6ea88fcf95cbd7de6fac Mon Sep 17 00:00:00 2001 From: Abhijeet Prasad Date: Fri, 30 Jun 2023 13:06:55 -0400 Subject: [PATCH 07/11] format --- packages/tracing-internal/test/browser/router.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/tracing-internal/test/browser/router.test.ts b/packages/tracing-internal/test/browser/router.test.ts index ef512ef7b0dc..bfdcd57be317 100644 --- a/packages/tracing-internal/test/browser/router.test.ts +++ b/packages/tracing-internal/test/browser/router.test.ts @@ -1,4 +1,4 @@ -import type { InstrumentHandlerCallback, InstrumentHandlerType} from '@sentry/utils'; +import type { InstrumentHandlerCallback, InstrumentHandlerType } from '@sentry/utils'; import { parseSemver } from '@sentry/utils'; import { JSDOM } from 'jsdom'; From 558376a69ab2ebfeda1f91c9af0c4dc4f8e7a321 Mon Sep 17 00:00:00 2001 From: Abhijeet Prasad Date: Fri, 30 Jun 2023 14:42:50 -0400 Subject: [PATCH 08/11] min test is Node 10 --- .../test/browser/browsertracing.test.ts | 4 ++-- packages/tracing/test/testutils.ts | 17 +++++++++++++++++ 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/packages/tracing-internal/test/browser/browsertracing.test.ts b/packages/tracing-internal/test/browser/browsertracing.test.ts index 156203dc40e0..fa5e575e8ada 100644 --- a/packages/tracing-internal/test/browser/browsertracing.test.ts +++ b/packages/tracing-internal/test/browser/browsertracing.test.ts @@ -7,7 +7,7 @@ import { JSDOM } from 'jsdom'; import type { IdleTransaction } from '../../../tracing/src'; import { getActiveTransaction } from '../../../tracing/src'; -import { getDefaultBrowserClientOptions } from '../../../tracing/test/testutils'; +import { conditionalTest, getDefaultBrowserClientOptions } from '../../../tracing/test/testutils'; import type { BrowserTracingOptions } from '../../src/browser/browsertracing'; import { BrowserTracing, getMetaContent } from '../../src/browser/browsertracing'; import { defaultRequestInstrumentationOptions } from '../../src/browser/request'; @@ -58,7 +58,7 @@ beforeAll(() => { WINDOW.location = dom.window.location; }); -describe('BrowserTracing', () => { +conditionalTest({ min: 10 })('BrowserTracing', () => { let hub: Hub; beforeEach(() => { jest.useFakeTimers(); diff --git a/packages/tracing/test/testutils.ts b/packages/tracing/test/testutils.ts index 071ecdf5111a..4302e7e3fdc4 100644 --- a/packages/tracing/test/testutils.ts +++ b/packages/tracing/test/testutils.ts @@ -58,6 +58,23 @@ export const testOnlyIfNodeVersionAtLeast = (minVersion: number): jest.It => { return it; }; +/** + * Returns`describe` or `describe.skip` depending on allowed major versions of Node. + * + * @param {{ min?: number; max?: number }} allowedVersion + * @return {*} {jest.Describe} + */ +export const conditionalTest = (allowedVersion: { min?: number; max?: number }): jest.Describe => { + const NODE_VERSION = parseSemver(process.versions.node).major; + if (!NODE_VERSION) { + return describe.skip; + } + + return NODE_VERSION < (allowedVersion.min || -Infinity) || NODE_VERSION > (allowedVersion.max || Infinity) + ? describe.skip + : describe; +}; + export function getDefaultBrowserClientOptions(options: Partial = {}): ClientOptions { return { integrations: [], From 61039f132f2b3585a288636fe3d4da9f953fb1a6 Mon Sep 17 00:00:00 2001 From: Abhijeet Prasad Date: Fri, 30 Jun 2023 14:52:50 -0400 Subject: [PATCH 09/11] parseSemvar --- packages/tracing/test/testutils.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/tracing/test/testutils.ts b/packages/tracing/test/testutils.ts index 4302e7e3fdc4..484e3bf3cc35 100644 --- a/packages/tracing/test/testutils.ts +++ b/packages/tracing/test/testutils.ts @@ -1,6 +1,6 @@ import { createTransport } from '@sentry/browser'; import type { Client, ClientOptions } from '@sentry/types'; -import { GLOBAL_OBJ, resolvedSyncPromise } from '@sentry/utils'; +import { GLOBAL_OBJ, parseSemver, resolvedSyncPromise } from '@sentry/utils'; import { JSDOM } from 'jsdom'; /** From 34a1b3c02d8cbed4d81d039a3cffc1d7d59244fd Mon Sep 17 00:00:00 2001 From: Abhijeet Prasad Date: Fri, 30 Jun 2023 21:20:08 -0400 Subject: [PATCH 10/11] use min Node version --- .../test/browser/router.test.ts | 17 +++-------------- 1 file changed, 3 insertions(+), 14 deletions(-) diff --git a/packages/tracing-internal/test/browser/router.test.ts b/packages/tracing-internal/test/browser/router.test.ts index bfdcd57be317..8ad414a97b80 100644 --- a/packages/tracing-internal/test/browser/router.test.ts +++ b/packages/tracing-internal/test/browser/router.test.ts @@ -1,7 +1,7 @@ import type { InstrumentHandlerCallback, InstrumentHandlerType } from '@sentry/utils'; -import { parseSemver } from '@sentry/utils'; import { JSDOM } from 'jsdom'; +import { conditionalTest } from '../../../tracing/test/testutils'; import { instrumentRoutingWithDefaults } from '../../src/browser/router'; let mockChangeHistory: ({ to, from }: { to: string; from?: string }) => void = () => undefined; @@ -17,18 +17,7 @@ jest.mock('@sentry/utils', () => { }; }); -const NODE_VERSION = parseSemver(process.versions.node).major || 20; - -/** - * Since startTimestamp is created using browserPerformanceTimeOrigin, which requires Node 14+ - * we need to expect a different value for older versions of Node. This is not a problem for browser - * environments, but we need to run this test in multiple Node versions. - */ -function expectStartTimestamp() { - return NODE_VERSION > 14 ? expect.any(Number) : undefined; -} - -describe('instrumentRoutingWithDefaults', () => { +conditionalTest({ min: 16 })('instrumentRoutingWithDefaults', () => { const mockFinish = jest.fn(); const customStartTransaction = jest.fn().mockReturnValue({ finish: mockFinish }); beforeEach(() => { @@ -58,7 +47,7 @@ describe('instrumentRoutingWithDefaults', () => { name: 'blank', op: 'pageload', metadata: { source: 'url' }, - startTimestamp: expectStartTimestamp(), + startTimestamp: expect.any(Number), }); }); From 9b9b325fe1f68edba2b68ff0cd88828e86eb57c2 Mon Sep 17 00:00:00 2001 From: Abhijeet Prasad Date: Fri, 30 Jun 2023 21:52:21 -0400 Subject: [PATCH 11/11] min node 10 for background tab --- packages/tracing-internal/test/browser/backgroundtab.test.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/tracing-internal/test/browser/backgroundtab.test.ts b/packages/tracing-internal/test/browser/backgroundtab.test.ts index 436d63aab36c..5ce370e6690f 100644 --- a/packages/tracing-internal/test/browser/backgroundtab.test.ts +++ b/packages/tracing-internal/test/browser/backgroundtab.test.ts @@ -2,11 +2,11 @@ import { Hub, makeMain } from '@sentry/core'; import { JSDOM } from 'jsdom'; import { addExtensionMethods } from '../../../tracing/src'; -import { getDefaultBrowserClientOptions } from '../../../tracing/test/testutils'; +import { conditionalTest, getDefaultBrowserClientOptions } from '../../../tracing/test/testutils'; import { registerBackgroundTabDetection } from '../../src/browser/backgroundtab'; import { TestClient } from '../utils/TestClient'; -describe('registerBackgroundTabDetection', () => { +conditionalTest({ min: 10 })('registerBackgroundTabDetection', () => { let events: Record = {}; let hub: Hub; beforeEach(() => {