From 93d0c46b0994870ede0b6cfd22c72e778b8d70c7 Mon Sep 17 00:00:00 2001 From: Billy Vong Date: Wed, 4 Jan 2023 16:56:39 -0500 Subject: [PATCH 1/5] feat(replay): Move sample rate tags into `replay_event` Similar to #6658 but waiting on https://github.com/getsentry/replay-backend/issues/226 --- packages/replay/src/util/sendReplayRequest.ts | 14 ++++---------- .../test/integration/errorSampleRate.test.ts | 12 ++++-------- packages/replay/test/integration/events.test.ts | 6 ++---- .../test/unit/util/createReplayEnvelope.test.ts | 15 +++++++++------ packages/types/src/replay.ts | 2 ++ 5 files changed, 21 insertions(+), 28 deletions(-) diff --git a/packages/replay/src/util/sendReplayRequest.ts b/packages/replay/src/util/sendReplayRequest.ts index 3c797a5bab2f..6b1a092cfb93 100644 --- a/packages/replay/src/util/sendReplayRequest.ts +++ b/packages/replay/src/util/sendReplayRequest.ts @@ -52,6 +52,8 @@ export async function sendReplayRequest({ replay_id: replayId, segment_id, replay_type: session.sampled, + session_sample_rate: options.sessionSampleRate, + error_sample_rate: options.errorSampleRate, }; const replayEvent = await prepareReplayEvent({ scope, client, replayId, event: baseEvent }); @@ -63,12 +65,6 @@ export async function sendReplayRequest({ return; } - replayEvent.tags = { - ...replayEvent.tags, - sessionSampleRate: options.sessionSampleRate, - errorSampleRate: options.errorSampleRate, - }; - /* For reference, the fully built event looks something like this: { @@ -86,6 +82,8 @@ export async function sendReplayRequest({ "replay_id": "eventId", "segment_id": 3, "replay_type": "error", + "session_sample_rate": 1, + "error_sample_rate": 0, "platform": "javascript", "event_id": "eventId", "environment": "production", @@ -98,10 +96,6 @@ export async function sendReplayRequest({ "version": "7.25.0" }, "sdkProcessingMetadata": {}, - "tags": { - "sessionSampleRate": 1, - "errorSampleRate": 0, - } } */ diff --git a/packages/replay/test/integration/errorSampleRate.test.ts b/packages/replay/test/integration/errorSampleRate.test.ts index 2b52e6c7d96c..7c8d4452c1a7 100644 --- a/packages/replay/test/integration/errorSampleRate.test.ts +++ b/packages/replay/test/integration/errorSampleRate.test.ts @@ -63,10 +63,8 @@ describe('Integration | errorSampleRate', () => { recordingPayloadHeader: { segment_id: 0 }, replayEventPayload: expect.objectContaining({ replay_type: 'error', - tags: expect.objectContaining({ - errorSampleRate: 1, - sessionSampleRate: 0, - }), + error_sample_rate: 1, + session_sample_rate: 0, }), recordingData: JSON.stringify([ { data: { isCheckout: true }, timestamp: BASE_TIMESTAMP, type: 2 }, @@ -93,10 +91,8 @@ describe('Integration | errorSampleRate', () => { recordingPayloadHeader: { segment_id: 1 }, replayEventPayload: expect.objectContaining({ replay_type: 'error', - tags: expect.objectContaining({ - errorSampleRate: 1, - sessionSampleRate: 0, - }), + error_sample_rate: 1, + session_sample_rate: 0, }), recordingData: JSON.stringify([{ data: { isCheckout: true }, timestamp: BASE_TIMESTAMP + 5020, type: 2 }]), }); diff --git a/packages/replay/test/integration/events.test.ts b/packages/replay/test/integration/events.test.ts index 5168426dfd79..80fd32926e07 100644 --- a/packages/replay/test/integration/events.test.ts +++ b/packages/replay/test/integration/events.test.ts @@ -130,11 +130,9 @@ describe('Integration | events', () => { expect(replay).toHaveLastSentReplay({ replayEventPayload: expect.objectContaining({ replay_start_timestamp: (BASE_TIMESTAMP - 10000) / 1000, + error_sample_rate: 0, + session_sample_rate: 1, urls: ['http://localhost/'], // this doesn't truly test if we are capturing the right URL as we don't change URLs, but good enough - tags: expect.objectContaining({ - errorSampleRate: 0, - sessionSampleRate: 1, - }), }), }); }); diff --git a/packages/replay/test/unit/util/createReplayEnvelope.test.ts b/packages/replay/test/unit/util/createReplayEnvelope.test.ts index d0245d0d2f5f..66b3d48befab 100644 --- a/packages/replay/test/unit/util/createReplayEnvelope.test.ts +++ b/packages/replay/test/unit/util/createReplayEnvelope.test.ts @@ -24,10 +24,9 @@ describe('Unit | util | createReplayEnvelope', () => { version: '7.25.0', }, replay_type: 'error', - tags: { - sessionSampleRate: 1, - errorSampleRate: 0, - }, + error_sample_rate: 0, + session_sample_rate: 1, + tags: {}, }; const payloadWithSequence = 'payload'; @@ -56,13 +55,15 @@ describe('Unit | util | createReplayEnvelope', () => { { environment: 'production', error_ids: ['errorId'], + error_sample_rate: 0, event_id: REPLAY_ID, platform: 'javascript', replay_id: REPLAY_ID, replay_type: 'error', sdk: { integrations: ['BrowserTracing', 'Replay'], name: 'sentry.javascript.unknown', version: '7.25.0' }, segment_id: 3, - tags: { errorSampleRate: 0, sessionSampleRate: 1 }, + session_sample_rate: 1, + tags: {}, timestamp: 1670837008.634, trace_ids: ['traceId'], type: 'replay_event', @@ -90,13 +91,15 @@ describe('Unit | util | createReplayEnvelope', () => { { environment: 'production', error_ids: ['errorId'], + error_sample_rate: 0, event_id: REPLAY_ID, platform: 'javascript', replay_id: REPLAY_ID, sdk: { integrations: ['BrowserTracing', 'Replay'], name: 'sentry.javascript.unknown', version: '7.25.0' }, segment_id: 3, replay_type: 'error', - tags: { errorSampleRate: 0, sessionSampleRate: 1 }, + session_sample_rate: 1, + tags: {}, timestamp: 1670837008.634, trace_ids: ['traceId'], type: 'replay_event', diff --git a/packages/types/src/replay.ts b/packages/types/src/replay.ts index 79bbce4c6eb4..e4519358afda 100644 --- a/packages/types/src/replay.ts +++ b/packages/types/src/replay.ts @@ -11,6 +11,8 @@ export interface ReplayEvent extends Event { replay_id: string; segment_id: number; replay_type: ReplayRecordingMode; + session_sample_rate: number; + error_sample_rate: number; } /** From 1ec3319c004536cacd3513bfdb815321bf851228 Mon Sep 17 00:00:00 2001 From: Billy Vong Date: Wed, 18 Jan 2023 14:53:38 -0500 Subject: [PATCH 2/5] tests --- packages/replay/test/unit/util/prepareReplayEvent.test.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/packages/replay/test/unit/util/prepareReplayEvent.test.ts b/packages/replay/test/unit/util/prepareReplayEvent.test.ts index 0a278334de68..3d9d50266715 100644 --- a/packages/replay/test/unit/util/prepareReplayEvent.test.ts +++ b/packages/replay/test/unit/util/prepareReplayEvent.test.ts @@ -48,6 +48,8 @@ describe('Unit | util | prepareReplayEvent', () => { replay_id: replayId, replay_type: 'session', segment_id: 3, + error_sample_rate: 1.0, + session_sample_rate: 0.1, }; const replayEvent = await prepareReplayEvent({ scope, client, replayId, event }); @@ -66,6 +68,8 @@ describe('Unit | util | prepareReplayEvent', () => { platform: 'javascript', event_id: 'replay-ID', environment: 'production', + error_sample_rate: 1.0, + session_sample_rate: 0.1, sdk: { name: 'sentry.javascript.testSdk', version: '1.0.0', From af12c6ffbf2bab65946e5d53684c46233ee6855b Mon Sep 17 00:00:00 2001 From: Billy Vong Date: Wed, 25 Jan 2023 11:11:49 -0500 Subject: [PATCH 3/5] wip move to context --- .../suites/replay/captureReplay/test.ts | 2 +- packages/replay/src/util/sendReplayRequest.ts | 19 +++++++++++---- .../test/integration/errorSampleRate.test.ts | 16 +++++++++---- .../replay/test/integration/events.test.ts | 8 +++++-- .../unit/util/createReplayEnvelope.test.ts | 24 ++++++++++++++----- .../test/unit/util/prepareReplayEvent.test.ts | 16 +++++++++---- packages/types/src/replay.ts | 2 -- 7 files changed, 64 insertions(+), 23 deletions(-) diff --git a/packages/integration-tests/suites/replay/captureReplay/test.ts b/packages/integration-tests/suites/replay/captureReplay/test.ts index 3bb54fe4647a..2e69b03cb33d 100644 --- a/packages/integration-tests/suites/replay/captureReplay/test.ts +++ b/packages/integration-tests/suites/replay/captureReplay/test.ts @@ -67,7 +67,7 @@ sentryTest('should capture replays', async ({ getLocalTestPath, page }) => { }, }, platform: 'javascript', - tags: { sessionSampleRate: 1, errorSampleRate: 0 }, + contexts: { replay: { session_sample_rate: 1, error_sample_rate: 0 } }, }); expect(replayEvent1).toBeDefined(); diff --git a/packages/replay/src/util/sendReplayRequest.ts b/packages/replay/src/util/sendReplayRequest.ts index 6b1a092cfb93..c98bc211d0b8 100644 --- a/packages/replay/src/util/sendReplayRequest.ts +++ b/packages/replay/src/util/sendReplayRequest.ts @@ -52,8 +52,6 @@ export async function sendReplayRequest({ replay_id: replayId, segment_id, replay_type: session.sampled, - session_sample_rate: options.sessionSampleRate, - error_sample_rate: options.errorSampleRate, }; const replayEvent = await prepareReplayEvent({ scope, client, replayId, event: baseEvent }); @@ -65,6 +63,15 @@ export async function sendReplayRequest({ return; } + replayEvent.contexts = { + ...replayEvent.contexts, + replay: { + ...(replayEvent.contexts && replayEvent.contexts.replay), + session_sample_rate: options.sessionSampleRate, + error_sample_rate: options.errorSampleRate, + }, + }; + /* For reference, the fully built event looks something like this: { @@ -82,8 +89,6 @@ export async function sendReplayRequest({ "replay_id": "eventId", "segment_id": 3, "replay_type": "error", - "session_sample_rate": 1, - "error_sample_rate": 0, "platform": "javascript", "event_id": "eventId", "environment": "production", @@ -96,6 +101,12 @@ export async function sendReplayRequest({ "version": "7.25.0" }, "sdkProcessingMetadata": {}, + "contexts": { + "replay": { + "session_sample_rate": 1, + "error_sample_rate": 0, + }, + }, } */ diff --git a/packages/replay/test/integration/errorSampleRate.test.ts b/packages/replay/test/integration/errorSampleRate.test.ts index 7c8d4452c1a7..31505ef1f334 100644 --- a/packages/replay/test/integration/errorSampleRate.test.ts +++ b/packages/replay/test/integration/errorSampleRate.test.ts @@ -63,8 +63,12 @@ describe('Integration | errorSampleRate', () => { recordingPayloadHeader: { segment_id: 0 }, replayEventPayload: expect.objectContaining({ replay_type: 'error', - error_sample_rate: 1, - session_sample_rate: 0, + contexts: { + replay: { + error_sample_rate: 1, + session_sample_rate: 0, + }, + }, }), recordingData: JSON.stringify([ { data: { isCheckout: true }, timestamp: BASE_TIMESTAMP, type: 2 }, @@ -91,8 +95,12 @@ describe('Integration | errorSampleRate', () => { recordingPayloadHeader: { segment_id: 1 }, replayEventPayload: expect.objectContaining({ replay_type: 'error', - error_sample_rate: 1, - session_sample_rate: 0, + contexts: { + replay: { + error_sample_rate: 1, + session_sample_rate: 0, + }, + }, }), recordingData: JSON.stringify([{ data: { isCheckout: true }, timestamp: BASE_TIMESTAMP + 5020, type: 2 }]), }); diff --git a/packages/replay/test/integration/events.test.ts b/packages/replay/test/integration/events.test.ts index 80fd32926e07..af71eab9b8da 100644 --- a/packages/replay/test/integration/events.test.ts +++ b/packages/replay/test/integration/events.test.ts @@ -130,8 +130,12 @@ describe('Integration | events', () => { expect(replay).toHaveLastSentReplay({ replayEventPayload: expect.objectContaining({ replay_start_timestamp: (BASE_TIMESTAMP - 10000) / 1000, - error_sample_rate: 0, - session_sample_rate: 1, + contexts: { + replay: { + error_sample_rate: 0, + session_sample_rate: 1, + }, + }, urls: ['http://localhost/'], // this doesn't truly test if we are capturing the right URL as we don't change URLs, but good enough }), }); diff --git a/packages/replay/test/unit/util/createReplayEnvelope.test.ts b/packages/replay/test/unit/util/createReplayEnvelope.test.ts index 66b3d48befab..e62c2f410d6a 100644 --- a/packages/replay/test/unit/util/createReplayEnvelope.test.ts +++ b/packages/replay/test/unit/util/createReplayEnvelope.test.ts @@ -24,8 +24,12 @@ describe('Unit | util | createReplayEnvelope', () => { version: '7.25.0', }, replay_type: 'error', - error_sample_rate: 0, - session_sample_rate: 1, + contexts: { + replay: { + error_sample_rate: 0, + session_sample_rate: 1, + }, + }, tags: {}, }; @@ -53,16 +57,20 @@ describe('Unit | util | createReplayEnvelope', () => { [ { type: 'replay_event' }, { + contexts: { + replay: { + error_sample_rate: 0, + session_sample_rate: 1, + }, + }, environment: 'production', error_ids: ['errorId'], - error_sample_rate: 0, event_id: REPLAY_ID, platform: 'javascript', replay_id: REPLAY_ID, replay_type: 'error', sdk: { integrations: ['BrowserTracing', 'Replay'], name: 'sentry.javascript.unknown', version: '7.25.0' }, segment_id: 3, - session_sample_rate: 1, tags: {}, timestamp: 1670837008.634, trace_ids: ['traceId'], @@ -89,16 +97,20 @@ describe('Unit | util | createReplayEnvelope', () => { [ { type: 'replay_event' }, { + contexts: { + replay: { + error_sample_rate: 0, + session_sample_rate: 1, + }, + }, environment: 'production', error_ids: ['errorId'], - error_sample_rate: 0, event_id: REPLAY_ID, platform: 'javascript', replay_id: REPLAY_ID, sdk: { integrations: ['BrowserTracing', 'Replay'], name: 'sentry.javascript.unknown', version: '7.25.0' }, segment_id: 3, replay_type: 'error', - session_sample_rate: 1, tags: {}, timestamp: 1670837008.634, trace_ids: ['traceId'], diff --git a/packages/replay/test/unit/util/prepareReplayEvent.test.ts b/packages/replay/test/unit/util/prepareReplayEvent.test.ts index 3d9d50266715..b0f121e1256a 100644 --- a/packages/replay/test/unit/util/prepareReplayEvent.test.ts +++ b/packages/replay/test/unit/util/prepareReplayEvent.test.ts @@ -48,8 +48,12 @@ describe('Unit | util | prepareReplayEvent', () => { replay_id: replayId, replay_type: 'session', segment_id: 3, - error_sample_rate: 1.0, - session_sample_rate: 0.1, + contexts: { + replay: { + error_sample_rate: 1.0, + session_sample_rate: 0.1, + }, + }, }; const replayEvent = await prepareReplayEvent({ scope, client, replayId, event }); @@ -68,8 +72,12 @@ describe('Unit | util | prepareReplayEvent', () => { platform: 'javascript', event_id: 'replay-ID', environment: 'production', - error_sample_rate: 1.0, - session_sample_rate: 0.1, + contexts: { + replay: { + error_sample_rate: 1.0, + session_sample_rate: 0.1, + }, + }, sdk: { name: 'sentry.javascript.testSdk', version: '1.0.0', diff --git a/packages/types/src/replay.ts b/packages/types/src/replay.ts index e4519358afda..79bbce4c6eb4 100644 --- a/packages/types/src/replay.ts +++ b/packages/types/src/replay.ts @@ -11,8 +11,6 @@ export interface ReplayEvent extends Event { replay_id: string; segment_id: number; replay_type: ReplayRecordingMode; - session_sample_rate: number; - error_sample_rate: number; } /** From c1ea3804bcaa1276d024b4b09cce6de683354c70 Mon Sep 17 00:00:00 2001 From: Billy Vong Date: Thu, 26 Jan 2023 12:44:09 -0500 Subject: [PATCH 4/5] fix test --- packages/integration-tests/suites/replay/captureReplay/test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/integration-tests/suites/replay/captureReplay/test.ts b/packages/integration-tests/suites/replay/captureReplay/test.ts index 2e69b03cb33d..e1319c3d0d6b 100644 --- a/packages/integration-tests/suites/replay/captureReplay/test.ts +++ b/packages/integration-tests/suites/replay/captureReplay/test.ts @@ -105,6 +105,6 @@ sentryTest('should capture replays', async ({ getLocalTestPath, page }) => { }, }, platform: 'javascript', - tags: { sessionSampleRate: 1, errorSampleRate: 0 }, + contexts: { replay: { session_sample_rate: 1, error_sample_rate: 0 } }, }); }); From 2404d7fdf169eccf1888169ce72b05a15562a61f Mon Sep 17 00:00:00 2001 From: Billy Vong Date: Thu, 26 Jan 2023 13:49:40 -0500 Subject: [PATCH 5/5] update integration test --- .../suites/replay/captureReplayViaBrowser/test.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/integration-tests/suites/replay/captureReplayViaBrowser/test.ts b/packages/integration-tests/suites/replay/captureReplayViaBrowser/test.ts index 374d845acecd..f670ac28dfef 100644 --- a/packages/integration-tests/suites/replay/captureReplayViaBrowser/test.ts +++ b/packages/integration-tests/suites/replay/captureReplayViaBrowser/test.ts @@ -68,7 +68,7 @@ sentryTest('should capture replays (@sentry/browser export)', async ({ getLocalT }, }, platform: 'javascript', - tags: { sessionSampleRate: 1, errorSampleRate: 0 }, + contexts: { replay: { session_sample_rate: 1, error_sample_rate: 0 } }, }); expect(replayEvent1).toBeDefined(); @@ -106,6 +106,6 @@ sentryTest('should capture replays (@sentry/browser export)', async ({ getLocalT }, }, platform: 'javascript', - tags: { sessionSampleRate: 1, errorSampleRate: 0 }, + contexts: { replay: { session_sample_rate: 1, error_sample_rate: 0 } }, }); });