diff --git a/dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/navigation-aborting-pageload/init.js b/dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/navigation-aborting-pageload/init.js index ad357eee8cc6..06caf2c2c239 100644 --- a/dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/navigation-aborting-pageload/init.js +++ b/dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/navigation-aborting-pageload/init.js @@ -4,7 +4,7 @@ window.Sentry = Sentry; Sentry.init({ dsn: 'https://public@dsn.ingest.sentry.io/1337', - integrations: [Sentry.browserTracingIntegration({ idleTimeout: 2000 })], + integrations: [Sentry.browserTracingIntegration({ idleTimeout: 2000, detectRedirects: false })], tracesSampleRate: 1, }); diff --git a/dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/navigation-redirect/keypress-early/init.js b/dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/navigation-redirect/keypress-early/init.js deleted file mode 100644 index 83abe7de1b7a..000000000000 --- a/dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/navigation-redirect/keypress-early/init.js +++ /dev/null @@ -1,23 +0,0 @@ -import * as Sentry from '@sentry/browser'; - -window.Sentry = Sentry; - -Sentry.init({ - dsn: 'https://public@dsn.ingest.sentry.io/1337', - integrations: [Sentry.browserTracingIntegration()], - tracesSampleRate: 1, - debug: true, -}); - -document.getElementById('btn1').addEventListener('click', () => { - // Trigger navigation later than click, so the last click is more than 300ms ago - setTimeout(() => { - window.history.pushState({}, '', '/sub-page'); - - // then trigger redirect inside of this navigation, which should be detected as a redirect - // because the last click was more than 300ms ago - setTimeout(() => { - window.history.pushState({}, '', '/sub-page-redirect'); - }, 100); - }, 400); -}); diff --git a/dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/navigation-redirect/keypress-early/test.ts b/dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/navigation-redirect/keypress-early/test.ts deleted file mode 100644 index 7f1da4860719..000000000000 --- a/dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/navigation-redirect/keypress-early/test.ts +++ /dev/null @@ -1,42 +0,0 @@ -import { expect } from '@playwright/test'; -import { sentryTest } from '../../../../../utils/fixtures'; -import { envelopeRequestParser, shouldSkipTracingTest, waitForTransactionRequest } from '../../../../../utils/helpers'; - -sentryTest( - 'should create a navigation.redirect span if a keypress happened more than 300ms before navigation', - async ({ getLocalTestUrl, page }) => { - if (shouldSkipTracingTest()) { - sentryTest.skip(); - } - - const url = await getLocalTestUrl({ testDir: __dirname }); - - const pageloadRequestPromise = waitForTransactionRequest(page, event => event.contexts?.trace?.op === 'pageload'); - const navigationRequestPromise = waitForTransactionRequest( - page, - event => event.contexts?.trace?.op === 'navigation', - ); - - await page.goto(url); - - await pageloadRequestPromise; - - // Now trigger navigation, and then a redirect in the navigation - await page.focus('#btn1'); - await page.keyboard.press('Enter'); - - const navigationRequest = envelopeRequestParser(await navigationRequestPromise); - - expect(navigationRequest.contexts?.trace?.op).toBe('navigation'); - expect(navigationRequest.transaction).toEqual('/sub-page'); - - const spans = navigationRequest.spans || []; - - expect(spans).toContainEqual( - expect.objectContaining({ - op: 'navigation.redirect', - description: '/sub-page-redirect', - }), - ); - }, -); diff --git a/dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/navigation-redirect/multiple-redirects/init.js b/dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/navigation-redirect/multiple-redirects/init.js new file mode 100644 index 000000000000..484a12682a2d --- /dev/null +++ b/dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/navigation-redirect/multiple-redirects/init.js @@ -0,0 +1,36 @@ +import * as Sentry from '@sentry/browser'; + +window.Sentry = Sentry; + +Sentry.init({ + dsn: 'https://public@dsn.ingest.sentry.io/1337', + integrations: [Sentry.browserTracingIntegration()], + tracesSampleRate: 1, +}); + +window.history.pushState({}, '', '/sub-page-redirect-1'); + +setTimeout(() => { + window.history.pushState({}, '', '/sub-page-redirect-2'); +}, 400); + +setTimeout(() => { + window.history.pushState({}, '', '/sub-page-redirect-3'); +}, 800); + +document.getElementById('btn1').addEventListener('click', () => { + window.history.pushState({}, '', '/next-page'); +}); + +setTimeout(() => { + document.getElementById('btn1').click(); + // 1s is still within the 1.5s time window, but the click should trigger a new navigation root span +}, 1000); + +setTimeout(() => { + window.history.pushState({}, '', '/next-page-redirect-1'); +}, 1100); + +setTimeout(() => { + window.history.pushState({}, '', '/next-page-redirect-2'); +}, 2000); diff --git a/dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/navigation-redirect/click/template.html b/dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/navigation-redirect/multiple-redirects/template.html similarity index 100% rename from dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/navigation-redirect/click/template.html rename to dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/navigation-redirect/multiple-redirects/template.html diff --git a/dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/navigation-redirect/multiple-redirects/test.ts b/dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/navigation-redirect/multiple-redirects/test.ts new file mode 100644 index 000000000000..58be1f6ff9a4 --- /dev/null +++ b/dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/navigation-redirect/multiple-redirects/test.ts @@ -0,0 +1,78 @@ +import { expect } from '@playwright/test'; +import { + SEMANTIC_ATTRIBUTE_SENTRY_OP, + SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN, + SEMANTIC_ATTRIBUTE_SENTRY_SAMPLE_RATE, + SEMANTIC_ATTRIBUTE_SENTRY_SOURCE, +} from '@sentry/core'; +import { sentryTest } from '../../../../../utils/fixtures'; +import { envelopeRequestParser, shouldSkipTracingTest, waitForTransactionRequest } from '../../../../../utils/helpers'; + +sentryTest( + 'creates a pageload and navigation root spans each with multiple navigation.redirect childspans', + async ({ getLocalTestUrl, page }) => { + if (shouldSkipTracingTest()) { + sentryTest.skip(); + } + + const url = await getLocalTestUrl({ testDir: __dirname }); + + const pageloadRequestPromise = waitForTransactionRequest(page, event => event.contexts?.trace?.op === 'pageload'); + const navigationRequestPromise = waitForTransactionRequest( + page, + event => event.contexts?.trace?.op === 'navigation' && event.transaction === '/next-page', + ); + + await page.goto(url); + + const pageloadRequest = envelopeRequestParser(await pageloadRequestPromise); + const navigationRequest = envelopeRequestParser(await navigationRequestPromise); + + expect(pageloadRequest.contexts?.trace?.op).toBe('pageload'); + + expect(pageloadRequest.contexts?.trace?.data).toMatchObject({ + [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'auto.pageload.browser', + [SEMANTIC_ATTRIBUTE_SENTRY_SAMPLE_RATE]: 1, + [SEMANTIC_ATTRIBUTE_SENTRY_SOURCE]: 'url', + [SEMANTIC_ATTRIBUTE_SENTRY_OP]: 'pageload', + ['sentry.idle_span_finish_reason']: 'cancelled', + }); + + expect(pageloadRequest.request).toEqual({ + headers: { + 'User-Agent': expect.any(String), + }, + url: 'http://sentry-test.io/index.html', + }); + + const spans = pageloadRequest.spans || []; + + const redirectSpans = spans.filter(span => span.op === 'navigation.redirect'); + expect(redirectSpans).toHaveLength(3); + + redirectSpans.forEach(redirectSpan => { + expect(redirectSpan?.timestamp).toEqual(redirectSpan?.start_timestamp); + expect(redirectSpan).toEqual({ + data: { + 'sentry.op': 'navigation.redirect', + 'sentry.origin': 'auto.navigation.browser', + 'sentry.source': 'url', + }, + description: expect.stringContaining('/sub-page-redirect-'), + op: 'navigation.redirect', + origin: 'auto.navigation.browser', + parent_span_id: pageloadRequest.contexts!.trace!.span_id, + span_id: expect.any(String), + start_timestamp: expect.any(Number), + timestamp: expect.any(Number), + trace_id: expect.any(String), + }); + }); + + expect(navigationRequest.contexts?.trace?.op).toBe('navigation'); + expect(navigationRequest.transaction).toEqual('/next-page'); + + // 2 subsequent redirects belonging to the navigation root span + expect(navigationRequest.spans?.filter(span => span.op === 'navigation.redirect')).toHaveLength(2); + }, +); diff --git a/dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/navigation-redirect/navigation-navigation-click/init.js b/dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/navigation-redirect/navigation-navigation-click/init.js new file mode 100644 index 000000000000..c3e90ce95430 --- /dev/null +++ b/dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/navigation-redirect/navigation-navigation-click/init.js @@ -0,0 +1,27 @@ +import * as Sentry from '@sentry/browser'; + +window.Sentry = Sentry; + +Sentry.init({ + dsn: 'https://public@dsn.ingest.sentry.io/1337', + integrations: [Sentry.browserTracingIntegration()], + tracesSampleRate: 1, + debug: true, +}); + +document.getElementById('btn1').addEventListener('click', () => { + window.history.pushState({}, '', '/sub-page'); + + // then trigger redirect inside of this navigation, which should not be detected as a redirect + // because the last click was less than 1.5s ago + setTimeout(() => { + document.getElementById('btn2').click(); + }, 100); +}); + +document.getElementById('btn2').addEventListener('click', () => { + setTimeout(() => { + // navigation happens ~1100ms after the last navigation + window.history.pushState({}, '', '/sub-page-2'); + }, 1000); +}); diff --git a/dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/navigation-redirect/navigation-navigation-click/template.html b/dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/navigation-redirect/navigation-navigation-click/template.html new file mode 100644 index 000000000000..d892beb72de0 --- /dev/null +++ b/dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/navigation-redirect/navigation-navigation-click/template.html @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/navigation-redirect/navigation-navigation-click/test.ts b/dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/navigation-redirect/navigation-navigation-click/test.ts new file mode 100644 index 000000000000..a88987209bcd --- /dev/null +++ b/dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/navigation-redirect/navigation-navigation-click/test.ts @@ -0,0 +1,47 @@ +import { expect } from '@playwright/test'; +import { sentryTest } from '../../../../../utils/fixtures'; +import { envelopeRequestParser, shouldSkipTracingTest, waitForTransactionRequest } from '../../../../../utils/helpers'; + +sentryTest( + 'creates navigation root span if click happened within 1.5s of the last navigation', + async ({ getLocalTestUrl, page }) => { + if (shouldSkipTracingTest()) { + sentryTest.skip(); + } + + const url = await getLocalTestUrl({ testDir: __dirname }); + + const pageloadRequestPromise = waitForTransactionRequest(page, event => event.contexts?.trace?.op === 'pageload'); + const navigationRequestPromise = waitForTransactionRequest( + page, + event => event.contexts?.trace?.op === 'navigation' && event.transaction === '/sub-page', + ); + const navigation2RequestPromise = waitForTransactionRequest( + page, + event => event.contexts?.trace?.op === 'navigation' && event.transaction === '/sub-page-2', + ); + + await page.goto(url); + + await pageloadRequestPromise; + + // Now trigger navigation (since no span is active), and then a redirect in the navigation, with + await page.click('#btn1'); + + const navigationRequest = envelopeRequestParser(await navigationRequestPromise); + const navigation2Request = envelopeRequestParser(await navigation2RequestPromise); + + expect(navigationRequest.contexts?.trace?.op).toBe('navigation'); + expect(navigationRequest.transaction).toEqual('/sub-page'); + + const spans = (navigationRequest.spans || []).filter(s => s.op === 'navigation.redirect'); + + expect(spans).toHaveLength(0); + + expect(navigation2Request.contexts?.trace?.op).toBe('navigation'); + expect(navigation2Request.transaction).toEqual('/sub-page-2'); + + const spans2 = (navigation2Request.spans || []).filter(s => s.op === 'navigation.redirect'); + expect(spans2).toHaveLength(0); + }, +); diff --git a/dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/navigation-redirect/click-early/init.js b/dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/navigation-redirect/navigation-navigation-keypress/init.js similarity index 74% rename from dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/navigation-redirect/click-early/init.js rename to dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/navigation-redirect/navigation-navigation-keypress/init.js index 83abe7de1b7a..f9d8db46d3d9 100644 --- a/dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/navigation-redirect/click-early/init.js +++ b/dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/navigation-redirect/navigation-navigation-keypress/init.js @@ -21,3 +21,10 @@ document.getElementById('btn1').addEventListener('click', () => { }, 100); }, 400); }); + +document.getElementById('btn2').addEventListener('click', () => { + // Trigger navigation later than click, so the last click is more than 300ms ago + setTimeout(() => { + window.history.pushState({}, '', '/sub-page-2'); + }, 400); +}); diff --git a/dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/navigation-redirect/keypress-early/template.html b/dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/navigation-redirect/navigation-navigation-keypress/template.html similarity index 72% rename from dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/navigation-redirect/keypress-early/template.html rename to dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/navigation-redirect/navigation-navigation-keypress/template.html index d364e6680b41..d18d7bb98e5c 100644 --- a/dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/navigation-redirect/keypress-early/template.html +++ b/dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/navigation-redirect/navigation-navigation-keypress/template.html @@ -4,4 +4,5 @@ + diff --git a/dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/navigation-redirect/navigation-navigation-keypress/test.ts b/dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/navigation-redirect/navigation-navigation-keypress/test.ts new file mode 100644 index 000000000000..fe152feda462 --- /dev/null +++ b/dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/navigation-redirect/navigation-navigation-keypress/test.ts @@ -0,0 +1,54 @@ +import { expect } from '@playwright/test'; +import { sentryTest } from '../../../../../utils/fixtures'; +import { envelopeRequestParser, shouldSkipTracingTest, waitForTransactionRequest } from '../../../../../utils/helpers'; + +sentryTest( + 'creates a navigation root span if a keypress happened within the last 1.5s', + async ({ getLocalTestUrl, page }) => { + if (shouldSkipTracingTest()) { + sentryTest.skip(); + } + + const url = await getLocalTestUrl({ testDir: __dirname }); + + const pageloadRequestPromise = waitForTransactionRequest(page, event => event.contexts?.trace?.op === 'pageload'); + const navigationRequestPromise = waitForTransactionRequest( + page, + event => event.contexts?.trace?.op === 'navigation' && event.transaction === '/sub-page', + ); + + const navigationRequest2Promise = waitForTransactionRequest( + page, + event => event.contexts?.trace?.op === 'navigation' && event.transaction === '/sub-page-2', + ); + + await page.goto(url); + + await pageloadRequestPromise; + + await page.focus('#btn1'); + await page.keyboard.press('Enter'); + + await page.waitForTimeout(500); + + await page.focus('#btn2'); + await page.keyboard.press('Enter'); + + const navigationRequest = envelopeRequestParser(await navigationRequestPromise); + const navigationRequest2 = envelopeRequestParser(await navigationRequest2Promise); + + expect(navigationRequest.contexts?.trace?.op).toBe('navigation'); + expect(navigationRequest.transaction).toEqual('/sub-page'); + + const redirectSpans = navigationRequest.spans?.filter(span => span.op === 'navigation.redirect') || []; + expect(redirectSpans).toHaveLength(1); + + expect(redirectSpans[0].description).toEqual('/sub-page-redirect'); + + expect(navigationRequest2.contexts?.trace?.op).toBe('navigation'); + expect(navigationRequest2.transaction).toEqual('/sub-page-2'); + + const redirectSpans2 = navigationRequest2.spans?.filter(span => span.op === 'navigation.redirect') || []; + expect(redirectSpans2).toHaveLength(0); + }, +); diff --git a/dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/navigation-redirect/navigation-redirect/init.js b/dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/navigation-redirect/navigation-redirect/init.js new file mode 100644 index 000000000000..5cf45a1f0b06 --- /dev/null +++ b/dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/navigation-redirect/navigation-redirect/init.js @@ -0,0 +1,20 @@ +import * as Sentry from '@sentry/browser'; + +window.Sentry = Sentry; + +Sentry.init({ + dsn: 'https://public@dsn.ingest.sentry.io/1337', + integrations: [Sentry.browserTracingIntegration()], + tracesSampleRate: 1, + debug: true, +}); + +document.getElementById('btn1').addEventListener('click', () => { + window.history.pushState({}, '', '/sub-page'); + + // then trigger redirect inside of this navigation, which should be detected as a redirect + // because the last navigation was less than 1.5s ago + setTimeout(() => { + window.history.pushState({}, '', '/sub-page-redirect'); + }, 750); +}); diff --git a/dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/navigation-redirect/click-early/template.html b/dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/navigation-redirect/navigation-redirect/template.html similarity index 100% rename from dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/navigation-redirect/click-early/template.html rename to dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/navigation-redirect/navigation-redirect/template.html diff --git a/dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/navigation-redirect/click-early/test.ts b/dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/navigation-redirect/navigation-redirect/test.ts similarity index 85% rename from dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/navigation-redirect/click-early/test.ts rename to dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/navigation-redirect/navigation-redirect/test.ts index 97cbc67c8af8..71fe35c8bcc9 100644 --- a/dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/navigation-redirect/click-early/test.ts +++ b/dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/navigation-redirect/navigation-redirect/test.ts @@ -3,7 +3,7 @@ import { sentryTest } from '../../../../../utils/fixtures'; import { envelopeRequestParser, shouldSkipTracingTest, waitForTransactionRequest } from '../../../../../utils/helpers'; sentryTest( - 'should create a navigation.redirect span if a click happened more than 300ms before navigation', + 'creates a navigation root span and redirect child span if no click happened within the last 1.5s', async ({ getLocalTestUrl, page }) => { if (shouldSkipTracingTest()) { sentryTest.skip(); @@ -21,7 +21,7 @@ sentryTest( await pageloadRequestPromise; - // Now trigger navigation, and then a redirect in the navigation, with + // Now trigger navigation (since no span is active), and then a redirect in the navigation, with await page.click('#btn1'); const navigationRequest = envelopeRequestParser(await navigationRequestPromise); diff --git a/dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/navigation-redirect/opt-out/test.ts b/dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/navigation-redirect/opt-out/test.ts index e96e9e650122..a25cc01f086f 100644 --- a/dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/navigation-redirect/opt-out/test.ts +++ b/dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/navigation-redirect/opt-out/test.ts @@ -3,7 +3,7 @@ import { sentryTest } from '../../../../../utils/fixtures'; import { envelopeRequestParser, shouldSkipTracingTest, waitForTransactionRequest } from '../../../../../utils/helpers'; sentryTest( - 'should not create a navigation.redirect span if `detectRedirects` is set to false', + "doesn't create a navigation.redirect span if `detectRedirects` is set to false", async ({ getLocalTestUrl, page }) => { if (shouldSkipTracingTest()) { sentryTest.skip(); diff --git a/dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/navigation-redirect/click/init.js b/dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/navigation-redirect/pageload-navigation-click/init.js similarity index 100% rename from dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/navigation-redirect/click/init.js rename to dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/navigation-redirect/pageload-navigation-click/init.js diff --git a/dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/navigation-redirect/click/subject.js b/dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/navigation-redirect/pageload-navigation-click/subject.js similarity index 100% rename from dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/navigation-redirect/click/subject.js rename to dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/navigation-redirect/pageload-navigation-click/subject.js diff --git a/dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/navigation-redirect/keypress/template.html b/dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/navigation-redirect/pageload-navigation-click/template.html similarity index 100% rename from dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/navigation-redirect/keypress/template.html rename to dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/navigation-redirect/pageload-navigation-click/template.html diff --git a/dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/navigation-redirect/late/test.ts b/dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/navigation-redirect/pageload-navigation-click/test.ts similarity index 83% rename from dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/navigation-redirect/late/test.ts rename to dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/navigation-redirect/pageload-navigation-click/test.ts index f1108cdbc1c5..771b07afaba6 100644 --- a/dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/navigation-redirect/late/test.ts +++ b/dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/navigation-redirect/pageload-navigation-click/test.ts @@ -3,7 +3,7 @@ import { sentryTest } from '../../../../../utils/fixtures'; import { envelopeRequestParser, shouldSkipTracingTest, waitForTransactionRequest } from '../../../../../utils/helpers'; sentryTest( - 'should not create a navigation.redirect span if redirect happened more than 300ms after pageload', + "doesn't create a navigation.redirect span if a click happened before navigation", async ({ getLocalTestUrl, page }) => { if (shouldSkipTracingTest()) { sentryTest.skip(); @@ -23,9 +23,9 @@ sentryTest( // Ensure a navigation span is sent, too await navigationRequestPromise; - const spans = pageloadRequest.spans || []; + const pageloadTxnSpans = pageloadRequest.spans || []; - expect(spans).not.toContainEqual( + expect(pageloadTxnSpans).not.toContainEqual( expect.objectContaining({ op: 'navigation.redirect', }), diff --git a/dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/navigation-redirect/keypress/init.js b/dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/navigation-redirect/pageload-navigation-keypress/init.js similarity index 100% rename from dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/navigation-redirect/keypress/init.js rename to dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/navigation-redirect/pageload-navigation-keypress/init.js diff --git a/dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/navigation-redirect/keypress/subject.js b/dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/navigation-redirect/pageload-navigation-keypress/subject.js similarity index 100% rename from dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/navigation-redirect/keypress/subject.js rename to dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/navigation-redirect/pageload-navigation-keypress/subject.js diff --git a/dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/navigation-redirect/pageload-navigation-keypress/template.html b/dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/navigation-redirect/pageload-navigation-keypress/template.html new file mode 100644 index 000000000000..316bec83030d --- /dev/null +++ b/dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/navigation-redirect/pageload-navigation-keypress/template.html @@ -0,0 +1,7 @@ + + + + + + + diff --git a/dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/navigation-redirect/keypress/test.ts b/dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/navigation-redirect/pageload-navigation-keypress/test.ts similarity index 92% rename from dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/navigation-redirect/keypress/test.ts rename to dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/navigation-redirect/pageload-navigation-keypress/test.ts index 8213d2723b08..e77e08936466 100644 --- a/dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/navigation-redirect/keypress/test.ts +++ b/dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/navigation-redirect/pageload-navigation-keypress/test.ts @@ -3,7 +3,7 @@ import { sentryTest } from '../../../../../utils/fixtures'; import { envelopeRequestParser, shouldSkipTracingTest, waitForTransactionRequest } from '../../../../../utils/helpers'; sentryTest( - 'should not create a navigation.redirect span if a keypress happened before navigation', + "doesn't create a navigation.redirect span if a keypress happened before navigation", async ({ getLocalTestUrl, page }) => { if (shouldSkipTracingTest()) { sentryTest.skip(); diff --git a/dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/navigation-redirect/late/init.js b/dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/navigation-redirect/pageload-navigation-time/init.js similarity index 96% rename from dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/navigation-redirect/late/init.js rename to dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/navigation-redirect/pageload-navigation-time/init.js index 686f72903a89..f317a550e2a7 100644 --- a/dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/navigation-redirect/late/init.js +++ b/dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/navigation-redirect/pageload-navigation-time/init.js @@ -11,4 +11,4 @@ Sentry.init({ // trigger redirect later setTimeout(() => { window.history.pushState({}, '', '/sub-page'); -}, 400); +}, 1550); diff --git a/dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/navigation-redirect/click/test.ts b/dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/navigation-redirect/pageload-navigation-time/test.ts similarity index 91% rename from dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/navigation-redirect/click/test.ts rename to dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/navigation-redirect/pageload-navigation-time/test.ts index 4a5cb9acd73b..6b5925f52cd1 100644 --- a/dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/navigation-redirect/click/test.ts +++ b/dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/navigation-redirect/pageload-navigation-time/test.ts @@ -3,7 +3,7 @@ import { sentryTest } from '../../../../../utils/fixtures'; import { envelopeRequestParser, shouldSkipTracingTest, waitForTransactionRequest } from '../../../../../utils/helpers'; sentryTest( - 'should not create a navigation.redirect span if a click happened before navigation', + "doesn't create a navigation.redirect span if redirect happened more than 1.5s after pageload", async ({ getLocalTestUrl, page }) => { if (shouldSkipTracingTest()) { sentryTest.skip(); diff --git a/dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/navigation-redirect/immediately/init.js b/dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/navigation-redirect/pageload-redirect/init.js similarity index 100% rename from dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/navigation-redirect/immediately/init.js rename to dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/navigation-redirect/pageload-redirect/init.js diff --git a/dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/navigation-redirect/immediately/test.ts b/dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/navigation-redirect/pageload-redirect/test.ts similarity index 85% rename from dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/navigation-redirect/immediately/test.ts rename to dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/navigation-redirect/pageload-redirect/test.ts index f2b3e885f6ce..1fa0a081fa85 100644 --- a/dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/navigation-redirect/immediately/test.ts +++ b/dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/navigation-redirect/pageload-redirect/test.ts @@ -8,7 +8,7 @@ import { import { sentryTest } from '../../../../../utils/fixtures'; import { envelopeRequestParser, shouldSkipTracingTest, waitForTransactionRequest } from '../../../../../utils/helpers'; -sentryTest('should create a pageload transaction with navigation.redirect span', async ({ getLocalTestUrl, page }) => { +sentryTest('creates a pageload root span with navigation.redirect childspan', async ({ getLocalTestUrl, page }) => { if (shouldSkipTracingTest()) { sentryTest.skip(); } @@ -46,9 +46,9 @@ sentryTest('should create a pageload transaction with navigation.redirect span', }), ); - const navigationSpan = spans.find(span => span.op === 'navigation.redirect'); - expect(navigationSpan?.timestamp).toEqual(navigationSpan?.start_timestamp); - expect(navigationSpan).toEqual({ + const redirectSpan = spans.find(span => span.op === 'navigation.redirect'); + expect(redirectSpan?.timestamp).toEqual(redirectSpan?.start_timestamp); + expect(redirectSpan).toEqual({ data: { 'sentry.op': 'navigation.redirect', 'sentry.origin': 'auto.navigation.browser', diff --git a/packages/browser/src/tracing/browserTracingIntegration.ts b/packages/browser/src/tracing/browserTracingIntegration.ts index 2a38f7afe7be..d2224f141797 100644 --- a/packages/browser/src/tracing/browserTracingIntegration.ts +++ b/packages/browser/src/tracing/browserTracingIntegration.ts @@ -504,6 +504,11 @@ export const browserTracingIntegration = ((_options: Partial never consider this a redirect const startTimestamp = spanData.start_timestamp; if (now - startTimestamp > REDIRECT_THRESHOLD) { return false; } - // A click happened in the last 300ms? + // A click happened in the last REDIRECT_THRESHOLD seconds? // --> never consider this a redirect if (lastInteractionTimestamp && now - lastInteractionTimestamp <= REDIRECT_THRESHOLD) { return false; diff --git a/packages/browser/test/tracing/browserTracingIntegration.test.ts b/packages/browser/test/tracing/browserTracingIntegration.test.ts index e39da8cdda39..84aea8b13c9e 100644 --- a/packages/browser/test/tracing/browserTracingIntegration.test.ts +++ b/packages/browser/test/tracing/browserTracingIntegration.test.ts @@ -154,7 +154,7 @@ describe('browserTracingIntegration', () => { expect(spanIsSampled(span!)).toBe(false); }); - it('starts navigation when URL changes after > 300ms', () => { + it('starts navigation when URL changes after > 1.5s', () => { const client = new BrowserClient( getDefaultBrowserClientOptions({ tracesSampleRate: 1, @@ -187,7 +187,7 @@ describe('browserTracingIntegration', () => { const dom = new JSDOM(undefined, { url: 'https://example.com/test' }); Object.defineProperty(global, 'location', { value: dom.window.document.location, writable: true }); - vi.advanceTimersByTime(400); + vi.advanceTimersByTime(1600); WINDOW.history.pushState({}, '', '/test'); expect(span!.isRecording()).toBe(false);