From f1d349910eecf9d11d11ebc5e9aecfd2256b512c Mon Sep 17 00:00:00 2001 From: Francesco Novy Date: Tue, 28 Mar 2023 13:12:24 +0200 Subject: [PATCH 1/2] feat(tracing): Ensure `pageload` transaction starts at timeOrigin --- .../tracing/browsertracing/pageload/init.js | 11 ++++++++ .../tracing/browsertracing/pageload/test.ts | 5 ++++ .../browsertracing/pageloadDelayed/init.js | 14 ++++++++++ .../browsertracing/pageloadDelayed/test.ts | 26 +++++++++++++++++++ .../tracing-internal/src/browser/router.ts | 4 ++- 5 files changed, 59 insertions(+), 1 deletion(-) create mode 100644 packages/browser-integration-tests/suites/tracing/browsertracing/pageload/init.js create mode 100644 packages/browser-integration-tests/suites/tracing/browsertracing/pageloadDelayed/init.js create mode 100644 packages/browser-integration-tests/suites/tracing/browsertracing/pageloadDelayed/test.ts diff --git a/packages/browser-integration-tests/suites/tracing/browsertracing/pageload/init.js b/packages/browser-integration-tests/suites/tracing/browsertracing/pageload/init.js new file mode 100644 index 000000000000..2340df528aa7 --- /dev/null +++ b/packages/browser-integration-tests/suites/tracing/browsertracing/pageload/init.js @@ -0,0 +1,11 @@ +import * as Sentry from '@sentry/browser'; +import { Integrations } from '@sentry/tracing'; + +window.Sentry = Sentry; +window._testBaseTimestamp = performance.timeOrigin / 1000; + +Sentry.init({ + dsn: 'https://public@dsn.ingest.sentry.io/1337', + integrations: [new Integrations.BrowserTracing()], + tracesSampleRate: 1, +}); diff --git a/packages/browser-integration-tests/suites/tracing/browsertracing/pageload/test.ts b/packages/browser-integration-tests/suites/tracing/browsertracing/pageload/test.ts index 7624b26466e5..1469073ddd01 100644 --- a/packages/browser-integration-tests/suites/tracing/browsertracing/pageload/test.ts +++ b/packages/browser-integration-tests/suites/tracing/browsertracing/pageload/test.ts @@ -12,6 +12,11 @@ sentryTest('should create a pageload transaction', async ({ getLocalTestPath, pa const url = await getLocalTestPath({ testDir: __dirname }); const eventData = await getFirstSentryEnvelopeRequest(page, url); + const timeOrigin = await page.evaluate('window._testBaseTimestamp'); + + const { start_timestamp: startTimestamp } = eventData; + + expect(startTimestamp).toBeCloseTo(timeOrigin); expect(eventData.contexts?.trace?.op).toBe('pageload'); expect(eventData.spans?.length).toBeGreaterThan(0); diff --git a/packages/browser-integration-tests/suites/tracing/browsertracing/pageloadDelayed/init.js b/packages/browser-integration-tests/suites/tracing/browsertracing/pageloadDelayed/init.js new file mode 100644 index 000000000000..ff6345dec8f2 --- /dev/null +++ b/packages/browser-integration-tests/suites/tracing/browsertracing/pageloadDelayed/init.js @@ -0,0 +1,14 @@ +import * as Sentry from '@sentry/browser'; +import { Integrations } from '@sentry/tracing'; + +window.Sentry = Sentry; +window._testBaseTimestamp = performance.timeOrigin / 1000; + +setTimeout(() => { + window._testTimeoutTimestamp = (performance.timeOrigin + performance.now()) / 1000; + Sentry.init({ + dsn: 'https://public@dsn.ingest.sentry.io/1337', + integrations: [new Integrations.BrowserTracing()], + tracesSampleRate: 1, + }); +}, 250); diff --git a/packages/browser-integration-tests/suites/tracing/browsertracing/pageloadDelayed/test.ts b/packages/browser-integration-tests/suites/tracing/browsertracing/pageloadDelayed/test.ts new file mode 100644 index 000000000000..dd3d0598b782 --- /dev/null +++ b/packages/browser-integration-tests/suites/tracing/browsertracing/pageloadDelayed/test.ts @@ -0,0 +1,26 @@ +import { expect } from '@playwright/test'; +import type { Event } from '@sentry/types'; + +import { sentryTest } from '../../../../utils/fixtures'; +import { getFirstSentryEnvelopeRequest, shouldSkipTracingTest } from '../../../../utils/helpers'; + +sentryTest('should create a pageload transaction when initialized delayed', async ({ getLocalTestPath, page }) => { + if (shouldSkipTracingTest()) { + sentryTest.skip(); + } + + const url = await getLocalTestPath({ testDir: __dirname }); + + const eventData = await getFirstSentryEnvelopeRequest(page, url); + const timeOrigin = await page.evaluate('window._testBaseTimestamp'); + const timeoutTimestamp = await page.evaluate('window._testTimeoutTimestamp'); + + const { start_timestamp: startTimestamp } = eventData; + + expect(startTimestamp).toBeCloseTo(timeOrigin); + expect(startTimestamp).toBeLessThan(timeoutTimestamp); + + expect(eventData.contexts?.trace?.op).toBe('pageload'); + expect(eventData.spans?.length).toBeGreaterThan(0); + expect(eventData.transaction_info?.source).toEqual('url'); +}); diff --git a/packages/tracing-internal/src/browser/router.ts b/packages/tracing-internal/src/browser/router.ts index b66fdee30e9d..e4e5f901dd0b 100644 --- a/packages/tracing-internal/src/browser/router.ts +++ b/packages/tracing-internal/src/browser/router.ts @@ -1,5 +1,5 @@ import type { Transaction, TransactionContext } from '@sentry/types'; -import { addInstrumentationHandler, logger } from '@sentry/utils'; +import { addInstrumentationHandler, browserPerformanceTimeOrigin, logger } from '@sentry/utils'; import { WINDOW } from './types'; @@ -22,6 +22,8 @@ export function instrumentRoutingWithDefaults( if (startTransactionOnPageLoad) { activeTransaction = customStartTransaction({ name: WINDOW.location.pathname, + // pageload should always start at timeOrigin + startTimestamp: browserPerformanceTimeOrigin, op: 'pageload', metadata: { source: 'url' }, }); From b2867b4480a46706c6bd71b2a6ff35923bb6686e Mon Sep 17 00:00:00 2001 From: Francesco Novy Date: Tue, 28 Mar 2023 14:51:55 +0200 Subject: [PATCH 2/2] unflake test --- .../suites/tracing/browsertracing/pageload/test.ts | 2 +- .../suites/tracing/browsertracing/pageloadDelayed/test.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/browser-integration-tests/suites/tracing/browsertracing/pageload/test.ts b/packages/browser-integration-tests/suites/tracing/browsertracing/pageload/test.ts index 1469073ddd01..6a186b63b02a 100644 --- a/packages/browser-integration-tests/suites/tracing/browsertracing/pageload/test.ts +++ b/packages/browser-integration-tests/suites/tracing/browsertracing/pageload/test.ts @@ -16,7 +16,7 @@ sentryTest('should create a pageload transaction', async ({ getLocalTestPath, pa const { start_timestamp: startTimestamp } = eventData; - expect(startTimestamp).toBeCloseTo(timeOrigin); + expect(startTimestamp).toBeCloseTo(timeOrigin, 1); expect(eventData.contexts?.trace?.op).toBe('pageload'); expect(eventData.spans?.length).toBeGreaterThan(0); diff --git a/packages/browser-integration-tests/suites/tracing/browsertracing/pageloadDelayed/test.ts b/packages/browser-integration-tests/suites/tracing/browsertracing/pageloadDelayed/test.ts index dd3d0598b782..882c08d23c5e 100644 --- a/packages/browser-integration-tests/suites/tracing/browsertracing/pageloadDelayed/test.ts +++ b/packages/browser-integration-tests/suites/tracing/browsertracing/pageloadDelayed/test.ts @@ -17,7 +17,7 @@ sentryTest('should create a pageload transaction when initialized delayed', asyn const { start_timestamp: startTimestamp } = eventData; - expect(startTimestamp).toBeCloseTo(timeOrigin); + expect(startTimestamp).toBeCloseTo(timeOrigin, 1); expect(startTimestamp).toBeLessThan(timeoutTimestamp); expect(eventData.contexts?.trace?.op).toBe('pageload');