From 9f58116f7197a27b0217788995ba89100fcd3dac Mon Sep 17 00:00:00 2001 From: Ash Anand Date: Fri, 3 Mar 2023 18:28:49 -0500 Subject: [PATCH 01/12] feat(tracing): Track PerformanceObserver interactions as spans --- .../tracing/src/browser/browsertracing.ts | 8 +++++- packages/tracing/src/browser/metrics/index.ts | 28 +++++++++++++++++++ 2 files changed, 35 insertions(+), 1 deletion(-) diff --git a/packages/tracing/src/browser/browsertracing.ts b/packages/tracing/src/browser/browsertracing.ts index 9030e8a11400..c1520fba9f09 100644 --- a/packages/tracing/src/browser/browsertracing.ts +++ b/packages/tracing/src/browser/browsertracing.ts @@ -8,7 +8,12 @@ import type { IdleTransaction } from '../idletransaction'; import { DEFAULT_FINAL_TIMEOUT, DEFAULT_HEARTBEAT_INTERVAL, DEFAULT_IDLE_TIMEOUT } from '../idletransaction'; import { extractTraceparentData } from '../utils'; import { registerBackgroundTabDetection } from './backgroundtab'; -import { addPerformanceEntries, startTrackingLongTasks, startTrackingWebVitals } from './metrics'; +import { + addPerformanceEntries, + startTrackingInteractions, + startTrackingLongTasks, + startTrackingWebVitals, +} from './metrics'; import type { RequestInstrumentationOptions } from './request'; import { defaultRequestInstrumentationOptions, instrumentOutgoingRequests } from './request'; import { instrumentRoutingWithDefaults } from './router'; @@ -187,6 +192,7 @@ export class BrowserTracing implements Integration { } startTrackingWebVitals(); + startTrackingInteractions(); if (this.options.enableLongTask) { startTrackingLongTasks(); } diff --git a/packages/tracing/src/browser/metrics/index.ts b/packages/tracing/src/browser/metrics/index.ts index b59f344899d2..c15e6f7df74c 100644 --- a/packages/tracing/src/browser/metrics/index.ts +++ b/packages/tracing/src/browser/metrics/index.ts @@ -64,6 +64,34 @@ export function startTrackingLongTasks(): void { observe('longtask', entryHandler); } +/** + * Start tracking interaction events. + */ +export function startTrackingInteractions(): void { + const entryHandler = (entries: PerformanceEventTiming[]): void => { + for (const entry of entries) { + const transaction = getActiveTransaction() as IdleTransaction | undefined; + if (!transaction) { + return; + } + + if (entry.name === 'click') { + const startTime = msToSec((browserPerformanceTimeOrigin as number) + entry.startTime); + const duration = msToSec(entry.duration); + + transaction.startChild({ + description: htmlTreeAsString(entry.target), + op: `ui.action.${entry.name}`, + startTimestamp: startTime, + endTimestamp: startTime + duration, + }); + } + } + }; + + observe('event', entryHandler, { durationThreshold: 10 }); +} + /** Starts tracking the Cumulative Layout Shift on the current page. */ function _trackCLS(): void { // See: From deb0c4e7b6e8d0fd5dfc8c0d06d8628d93857ed3 Mon Sep 17 00:00:00 2001 From: Ash Anand Date: Fri, 3 Mar 2023 18:33:00 -0500 Subject: [PATCH 02/12] Track interactions only if experimental flag is enabled --- packages/tracing/src/browser/browsertracing.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/tracing/src/browser/browsertracing.ts b/packages/tracing/src/browser/browsertracing.ts index c1520fba9f09..d56bb273d6aa 100644 --- a/packages/tracing/src/browser/browsertracing.ts +++ b/packages/tracing/src/browser/browsertracing.ts @@ -192,10 +192,12 @@ export class BrowserTracing implements Integration { } startTrackingWebVitals(); - startTrackingInteractions(); if (this.options.enableLongTask) { startTrackingLongTasks(); } + if (this.options._experiments.enableInteractions) { + startTrackingInteractions(); + } } /** From e076c6838cd3a92ec664286c0849bbf7c358eeff Mon Sep 17 00:00:00 2001 From: Ash Anand Date: Mon, 6 Mar 2023 11:02:55 -0500 Subject: [PATCH 03/12] Add missing target property on PerformanceEventTiming --- packages/tracing/src/browser/web-vitals/types.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/tracing/src/browser/web-vitals/types.ts b/packages/tracing/src/browser/web-vitals/types.ts index ef8de70c12bb..b4096b2678f6 100644 --- a/packages/tracing/src/browser/web-vitals/types.ts +++ b/packages/tracing/src/browser/web-vitals/types.ts @@ -135,6 +135,7 @@ declare global { interface PerformanceEventTiming extends PerformanceEntry { duration: DOMHighResTimeStamp; interactionId?: number; + readonly target: Node | null; } // https://wicg.github.io/layout-instability/#sec-layout-shift-attribution From 075f2283da5639e934dac02a6147a0395f01f6ca Mon Sep 17 00:00:00 2001 From: Ash Anand Date: Mon, 6 Mar 2023 13:00:16 -0500 Subject: [PATCH 04/12] Update test to consider interaction spans in the transaction --- .../browsertracing/interactions/test.ts | 25 ++++++++----------- 1 file changed, 11 insertions(+), 14 deletions(-) diff --git a/packages/integration-tests/suites/tracing/browsertracing/interactions/test.ts b/packages/integration-tests/suites/tracing/browsertracing/interactions/test.ts index b9a70ebda3ec..66209c2eeb5e 100644 --- a/packages/integration-tests/suites/tracing/browsertracing/interactions/test.ts +++ b/packages/integration-tests/suites/tracing/browsertracing/interactions/test.ts @@ -6,7 +6,9 @@ import { sentryTest } from '../../../../utils/fixtures'; import { getFirstSentryEnvelopeRequest, getMultipleSentryEnvelopeRequests } from '../../../../utils/helpers'; sentryTest('should capture interaction transaction.', async ({ browserName, getLocalTestPath, page }) => { - if (browserName !== 'chromium') { + const supportedBrowsers = ['chromium', 'firefox']; + + if (!supportedBrowsers.includes(browserName)) { sentryTest.skip(); } @@ -21,17 +23,12 @@ sentryTest('should capture interaction transaction.', async ({ browserName, getL const envelopes = await getMultipleSentryEnvelopeRequests(page, 1); const eventData = envelopes[0]; - expect(eventData).toEqual( - expect.objectContaining({ - contexts: expect.objectContaining({ - trace: expect.objectContaining({ - op: 'ui.action.click', - }), - }), - platform: 'javascript', - spans: [], - tags: {}, - type: 'transaction', - }), - ); + expect(eventData.contexts).toMatchObject({ trace: { op: 'ui.action.click' } }); + expect(eventData.platform).toBe('javascript'); + expect(eventData.type).toBe('transaction'); + + expect(eventData.spans).toBeDefined(); + const interactionSpan = eventData.spans![0]; + expect(interactionSpan.op).toBe('ui.action.click'); + expect(interactionSpan.description).toBe('body > button'); }); From fff6f8071bd28fa50eb63c3711bf12359c2a2853 Mon Sep 17 00:00:00 2001 From: Ash Anand Date: Mon, 6 Mar 2023 13:44:56 -0500 Subject: [PATCH 05/12] Add new test to confirm one txn per interaction --- .../browsertracing/interactions/test.ts | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/packages/integration-tests/suites/tracing/browsertracing/interactions/test.ts b/packages/integration-tests/suites/tracing/browsertracing/interactions/test.ts index 66209c2eeb5e..b6a322ec061d 100644 --- a/packages/integration-tests/suites/tracing/browsertracing/interactions/test.ts +++ b/packages/integration-tests/suites/tracing/browsertracing/interactions/test.ts @@ -32,3 +32,30 @@ sentryTest('should capture interaction transaction.', async ({ browserName, getL expect(interactionSpan.op).toBe('ui.action.click'); expect(interactionSpan.description).toBe('body > button'); }); + +sentryTest('should create only one transaction per interaction', async ({ browserName, getLocalTestPath, page }) => { + const supportedBrowsers = ['chromium', 'firefox']; + + if (!supportedBrowsers.includes(browserName)) { + sentryTest.skip(); + } + + await page.route('**/path/to/script.js', (route: Route) => route.fulfill({ path: `${__dirname}/assets/script.js` })); + + const url = await getLocalTestPath({ testDir: __dirname }); + + await getFirstSentryEnvelopeRequest(page, url); + + for (let i = 0; i < 4; i++) { + setTimeout(async () => { + await page.locator('[data-test-id=interaction-button]').click(); + }, i * 100); + } + + const envelopes = await getMultipleSentryEnvelopeRequests(page, 4); + expect(envelopes).toHaveLength(4); + + envelopes.forEach(event => { + expect(event.spans).toHaveLength(1); + }); +}); From f187f55a0d33a7e527fb6cc075648753834f97bb Mon Sep 17 00:00:00 2001 From: Ash Anand Date: Mon, 6 Mar 2023 13:56:31 -0500 Subject: [PATCH 06/12] Check for length on spans property instead of defined --- .../suites/tracing/browsertracing/interactions/test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/integration-tests/suites/tracing/browsertracing/interactions/test.ts b/packages/integration-tests/suites/tracing/browsertracing/interactions/test.ts index b6a322ec061d..ae5b9f94962b 100644 --- a/packages/integration-tests/suites/tracing/browsertracing/interactions/test.ts +++ b/packages/integration-tests/suites/tracing/browsertracing/interactions/test.ts @@ -27,7 +27,7 @@ sentryTest('should capture interaction transaction.', async ({ browserName, getL expect(eventData.platform).toBe('javascript'); expect(eventData.type).toBe('transaction'); - expect(eventData.spans).toBeDefined(); + expect(eventData.spans).toHaveLength(1); const interactionSpan = eventData.spans![0]; expect(interactionSpan.op).toBe('ui.action.click'); expect(interactionSpan.description).toBe('body > button'); From b69008e62ebfc7bf6c6c3e8aa3cfd51dade1174c Mon Sep 17 00:00:00 2001 From: Ash Anand Date: Mon, 6 Mar 2023 15:06:28 -0500 Subject: [PATCH 07/12] Try adding artificial delay on button --- .../tracing/browsertracing/interactions/assets/script.js | 8 ++++++-- .../tracing/browsertracing/interactions/template.html | 2 +- .../suites/tracing/browsertracing/interactions/test.ts | 2 +- 3 files changed, 8 insertions(+), 4 deletions(-) diff --git a/packages/integration-tests/suites/tracing/browsertracing/interactions/assets/script.js b/packages/integration-tests/suites/tracing/browsertracing/interactions/assets/script.js index 5a2aef02028d..407c621f1d9d 100644 --- a/packages/integration-tests/suites/tracing/browsertracing/interactions/assets/script.js +++ b/packages/integration-tests/suites/tracing/browsertracing/interactions/assets/script.js @@ -1,4 +1,4 @@ -(() => { +const delay = () => { const startTime = Date.now(); function getElasped() { @@ -9,4 +9,8 @@ while (getElasped() < 105) { // } -})(); +}; + +document.getElementById('interaction-button').addEventListener('click', delay); + +delay(); diff --git a/packages/integration-tests/suites/tracing/browsertracing/interactions/template.html b/packages/integration-tests/suites/tracing/browsertracing/interactions/template.html index e74a9c17eeb2..a10f71da99b8 100644 --- a/packages/integration-tests/suites/tracing/browsertracing/interactions/template.html +++ b/packages/integration-tests/suites/tracing/browsertracing/interactions/template.html @@ -6,6 +6,6 @@
Rendered Before Long Task
- + diff --git a/packages/integration-tests/suites/tracing/browsertracing/interactions/test.ts b/packages/integration-tests/suites/tracing/browsertracing/interactions/test.ts index ae5b9f94962b..6a8aef8cfe01 100644 --- a/packages/integration-tests/suites/tracing/browsertracing/interactions/test.ts +++ b/packages/integration-tests/suites/tracing/browsertracing/interactions/test.ts @@ -30,7 +30,7 @@ sentryTest('should capture interaction transaction.', async ({ browserName, getL expect(eventData.spans).toHaveLength(1); const interactionSpan = eventData.spans![0]; expect(interactionSpan.op).toBe('ui.action.click'); - expect(interactionSpan.description).toBe('body > button'); + expect(interactionSpan.description).toBe('body > button#interaction-button'); }); sentryTest('should create only one transaction per interaction', async ({ browserName, getLocalTestPath, page }) => { From ed5f8e29f0372c9c1cfacf06db8806a705a6d008 Mon Sep 17 00:00:00 2001 From: Ash Anand Date: Mon, 6 Mar 2023 15:26:27 -0500 Subject: [PATCH 08/12] Revert delay change --- .../tracing/browsertracing/interactions/assets/script.js | 8 ++------ .../tracing/browsertracing/interactions/template.html | 2 +- .../suites/tracing/browsertracing/interactions/test.ts | 2 +- 3 files changed, 4 insertions(+), 8 deletions(-) diff --git a/packages/integration-tests/suites/tracing/browsertracing/interactions/assets/script.js b/packages/integration-tests/suites/tracing/browsertracing/interactions/assets/script.js index 407c621f1d9d..5a2aef02028d 100644 --- a/packages/integration-tests/suites/tracing/browsertracing/interactions/assets/script.js +++ b/packages/integration-tests/suites/tracing/browsertracing/interactions/assets/script.js @@ -1,4 +1,4 @@ -const delay = () => { +(() => { const startTime = Date.now(); function getElasped() { @@ -9,8 +9,4 @@ const delay = () => { while (getElasped() < 105) { // } -}; - -document.getElementById('interaction-button').addEventListener('click', delay); - -delay(); +})(); diff --git a/packages/integration-tests/suites/tracing/browsertracing/interactions/template.html b/packages/integration-tests/suites/tracing/browsertracing/interactions/template.html index a10f71da99b8..e74a9c17eeb2 100644 --- a/packages/integration-tests/suites/tracing/browsertracing/interactions/template.html +++ b/packages/integration-tests/suites/tracing/browsertracing/interactions/template.html @@ -6,6 +6,6 @@
Rendered Before Long Task
- + diff --git a/packages/integration-tests/suites/tracing/browsertracing/interactions/test.ts b/packages/integration-tests/suites/tracing/browsertracing/interactions/test.ts index 6a8aef8cfe01..ae5b9f94962b 100644 --- a/packages/integration-tests/suites/tracing/browsertracing/interactions/test.ts +++ b/packages/integration-tests/suites/tracing/browsertracing/interactions/test.ts @@ -30,7 +30,7 @@ sentryTest('should capture interaction transaction.', async ({ browserName, getL expect(eventData.spans).toHaveLength(1); const interactionSpan = eventData.spans![0]; expect(interactionSpan.op).toBe('ui.action.click'); - expect(interactionSpan.description).toBe('body > button#interaction-button'); + expect(interactionSpan.description).toBe('body > button'); }); sentryTest('should create only one transaction per interaction', async ({ browserName, getLocalTestPath, page }) => { From c512effb181ceb5aa63c18d7e94766d4354d52a6 Mon Sep 17 00:00:00 2001 From: Ash Anand Date: Mon, 6 Mar 2023 15:41:00 -0500 Subject: [PATCH 09/12] Try durationThreshold 0 --- packages/tracing/src/browser/metrics/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/tracing/src/browser/metrics/index.ts b/packages/tracing/src/browser/metrics/index.ts index c15e6f7df74c..5046f46974a3 100644 --- a/packages/tracing/src/browser/metrics/index.ts +++ b/packages/tracing/src/browser/metrics/index.ts @@ -89,7 +89,7 @@ export function startTrackingInteractions(): void { } }; - observe('event', entryHandler, { durationThreshold: 10 }); + observe('event', entryHandler, { durationThreshold: 0 }); } /** Starts tracking the Cumulative Layout Shift on the current page. */ From 9cd9b4a2415e7fbe592577290c5219a280f97a30 Mon Sep 17 00:00:00 2001 From: Ash Anand Date: Wed, 8 Mar 2023 16:09:50 -0500 Subject: [PATCH 10/12] Fix test flakiness --- .../interactions/assets/script.js | 10 +++++-- .../browsertracing/interactions/init.js | 1 + .../browsertracing/interactions/template.html | 2 +- .../browsertracing/interactions/test.ts | 29 +++++++++++++++---- packages/tracing/src/browser/metrics/index.ts | 2 +- 5 files changed, 33 insertions(+), 11 deletions(-) diff --git a/packages/integration-tests/suites/tracing/browsertracing/interactions/assets/script.js b/packages/integration-tests/suites/tracing/browsertracing/interactions/assets/script.js index 5a2aef02028d..89d814bd397d 100644 --- a/packages/integration-tests/suites/tracing/browsertracing/interactions/assets/script.js +++ b/packages/integration-tests/suites/tracing/browsertracing/interactions/assets/script.js @@ -1,4 +1,4 @@ -(() => { +const delay = e => { const startTime = Date.now(); function getElasped() { @@ -6,7 +6,11 @@ return time - startTime; } - while (getElasped() < 105) { + while (getElasped() < 70) { // } -})(); + + e.target.classList.add('clicked'); +}; + +document.querySelector('[data-test-id=interaction-button]').addEventListener('click', delay); diff --git a/packages/integration-tests/suites/tracing/browsertracing/interactions/init.js b/packages/integration-tests/suites/tracing/browsertracing/interactions/init.js index 5229401c2ef5..d30222b7f47e 100644 --- a/packages/integration-tests/suites/tracing/browsertracing/interactions/init.js +++ b/packages/integration-tests/suites/tracing/browsertracing/interactions/init.js @@ -10,6 +10,7 @@ Sentry.init({ idleTimeout: 1000, _experiments: { enableInteractions: true, + enableLongTask: false, }, }), ], diff --git a/packages/integration-tests/suites/tracing/browsertracing/interactions/template.html b/packages/integration-tests/suites/tracing/browsertracing/interactions/template.html index e74a9c17eeb2..e16deb9ee519 100644 --- a/packages/integration-tests/suites/tracing/browsertracing/interactions/template.html +++ b/packages/integration-tests/suites/tracing/browsertracing/interactions/template.html @@ -5,7 +5,7 @@
Rendered Before Long Task
- + diff --git a/packages/integration-tests/suites/tracing/browsertracing/interactions/test.ts b/packages/integration-tests/suites/tracing/browsertracing/interactions/test.ts index ae5b9f94962b..2fc61af115df 100644 --- a/packages/integration-tests/suites/tracing/browsertracing/interactions/test.ts +++ b/packages/integration-tests/suites/tracing/browsertracing/interactions/test.ts @@ -1,10 +1,17 @@ import type { Route } from '@playwright/test'; import { expect } from '@playwright/test'; -import type { Event } from '@sentry/types'; +import type { Event, Span, SpanContext, Transaction } from '@sentry/types'; import { sentryTest } from '../../../../utils/fixtures'; import { getFirstSentryEnvelopeRequest, getMultipleSentryEnvelopeRequests } from '../../../../utils/helpers'; +type TransactionJSON = ReturnType & { + spans: ReturnType[]; + contexts: SpanContext; + platform: string; + type: string; +}; + sentryTest('should capture interaction transaction.', async ({ browserName, getLocalTestPath, page }) => { const supportedBrowsers = ['chromium', 'firefox']; @@ -16,21 +23,31 @@ sentryTest('should capture interaction transaction.', async ({ browserName, getL const url = await getLocalTestPath({ testDir: __dirname }); - await getFirstSentryEnvelopeRequest(page, url); + await page.goto(url); + + await getFirstSentryEnvelopeRequest(page); await page.locator('[data-test-id=interaction-button]').click(); + await page.locator('.clicked[data-test-id=interaction-button]').isVisible(); + + const envelopes = await getMultipleSentryEnvelopeRequests(page, 1); + expect(envelopes).toHaveLength(1); - const envelopes = await getMultipleSentryEnvelopeRequests(page, 1); const eventData = envelopes[0]; expect(eventData.contexts).toMatchObject({ trace: { op: 'ui.action.click' } }); expect(eventData.platform).toBe('javascript'); expect(eventData.type).toBe('transaction'); - expect(eventData.spans).toHaveLength(1); + const interactionSpan = eventData.spans![0]; - expect(interactionSpan.op).toBe('ui.action.click'); - expect(interactionSpan.description).toBe('body > button'); + expect(interactionSpan.op).toBe('ui.interaction.click'); + expect(interactionSpan.description).toBe('body > button.clicked'); + expect(interactionSpan.timestamp).toBeDefined(); + + const interactionSpanDuration = (interactionSpan.timestamp! - interactionSpan.start_timestamp) * 1000; + expect(interactionSpanDuration).toBeGreaterThan(70); + expect(interactionSpanDuration).toBeLessThan(200); }); sentryTest('should create only one transaction per interaction', async ({ browserName, getLocalTestPath, page }) => { diff --git a/packages/tracing/src/browser/metrics/index.ts b/packages/tracing/src/browser/metrics/index.ts index 5046f46974a3..e3ef9a373b58 100644 --- a/packages/tracing/src/browser/metrics/index.ts +++ b/packages/tracing/src/browser/metrics/index.ts @@ -81,7 +81,7 @@ export function startTrackingInteractions(): void { transaction.startChild({ description: htmlTreeAsString(entry.target), - op: `ui.action.${entry.name}`, + op: `ui.interaction.${entry.name}`, startTimestamp: startTime, endTimestamp: startTime + duration, }); From 90fe2bb625884f247b753dac41b99a6cfbd81e04 Mon Sep 17 00:00:00 2001 From: Ash Anand Date: Wed, 8 Mar 2023 17:12:51 -0500 Subject: [PATCH 11/12] Fix second test timing problem --- .../browsertracing/interactions/test.ts | 21 +++++++------------ 1 file changed, 8 insertions(+), 13 deletions(-) diff --git a/packages/integration-tests/suites/tracing/browsertracing/interactions/test.ts b/packages/integration-tests/suites/tracing/browsertracing/interactions/test.ts index 2fc61af115df..6530c6137558 100644 --- a/packages/integration-tests/suites/tracing/browsertracing/interactions/test.ts +++ b/packages/integration-tests/suites/tracing/browsertracing/interactions/test.ts @@ -12,6 +12,8 @@ type TransactionJSON = ReturnType & { type: string; }; +const wait = (time: number) => new Promise(res => setTimeout(res, time)); + sentryTest('should capture interaction transaction.', async ({ browserName, getLocalTestPath, page }) => { const supportedBrowsers = ['chromium', 'firefox']; @@ -24,7 +26,6 @@ sentryTest('should capture interaction transaction.', async ({ browserName, getL const url = await getLocalTestPath({ testDir: __dirname }); await page.goto(url); - await getFirstSentryEnvelopeRequest(page); await page.locator('[data-test-id=interaction-button]').click(); @@ -60,19 +61,13 @@ sentryTest('should create only one transaction per interaction', async ({ browse await page.route('**/path/to/script.js', (route: Route) => route.fulfill({ path: `${__dirname}/assets/script.js` })); const url = await getLocalTestPath({ testDir: __dirname }); - - await getFirstSentryEnvelopeRequest(page, url); + await page.goto(url); + await getFirstSentryEnvelopeRequest(page); for (let i = 0; i < 4; i++) { - setTimeout(async () => { - await page.locator('[data-test-id=interaction-button]').click(); - }, i * 100); + await wait(100); + page.locator('[data-test-id=interaction-button]').click(); + const envelope = await getMultipleSentryEnvelopeRequests(page, 1); + expect(envelope[0].spans).toHaveLength(1); } - - const envelopes = await getMultipleSentryEnvelopeRequests(page, 4); - expect(envelopes).toHaveLength(4); - - envelopes.forEach(event => { - expect(event.spans).toHaveLength(1); - }); }); From a8a8910a8b28791bc39b9528adf7b48905e7fb0f Mon Sep 17 00:00:00 2001 From: Abhijeet Prasad Date: Thu, 9 Mar 2023 09:40:34 +0100 Subject: [PATCH 12/12] add await call for test --- .../suites/tracing/browsertracing/interactions/test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/integration-tests/suites/tracing/browsertracing/interactions/test.ts b/packages/integration-tests/suites/tracing/browsertracing/interactions/test.ts index 6530c6137558..faff888fc2e8 100644 --- a/packages/integration-tests/suites/tracing/browsertracing/interactions/test.ts +++ b/packages/integration-tests/suites/tracing/browsertracing/interactions/test.ts @@ -66,7 +66,7 @@ sentryTest('should create only one transaction per interaction', async ({ browse for (let i = 0; i < 4; i++) { await wait(100); - page.locator('[data-test-id=interaction-button]').click(); + await page.locator('[data-test-id=interaction-button]').click(); const envelope = await getMultipleSentryEnvelopeRequests(page, 1); expect(envelope[0].spans).toHaveLength(1); }