From f8dd6ed030c6ced14f16357f3bf38a1cc7923fdd Mon Sep 17 00:00:00 2001 From: Antonis Lilis Date: Mon, 22 Dec 2025 14:39:54 +0100 Subject: [PATCH 1/3] fix(e2e): Fix captureReplay e2e failure on iOS --- dev-packages/e2e-tests/maestro/utils/sentryApi.js | 7 ++++++- dev-packages/e2e-tests/patch-scripts/rn.patch.app.js | 9 ++++++--- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/dev-packages/e2e-tests/maestro/utils/sentryApi.js b/dev-packages/e2e-tests/maestro/utils/sentryApi.js index 39f10ed298..3530e26aa5 100644 --- a/dev-packages/e2e-tests/maestro/utils/sentryApi.js +++ b/dev-packages/e2e-tests/maestro/utils/sentryApi.js @@ -63,7 +63,12 @@ switch (fetch) { } case 'replay': { const event = json(fetchFromSentry(`${baseUrl}/events/${eventId}/json/`)); - const replayId = event._dsc.replay_id.replace(/\-/g, ''); + const replayIdRaw = event._dsc?.replay_id; + if (!replayIdRaw) { + console.error('Event DSC:', JSON.stringify(event._dsc, null, 2)); + throw new Error(`Event ${eventId} does not have a replay_id in DSC. Replay might not be configured properly. Check that replaysOnErrorSampleRate or replaysSessionSampleRate is set.`); + } + const replayId = replayIdRaw.replace(/\-/g, ''); const replay = json(fetchFromSentry(`${baseUrl}/replays/${replayId}/`)); const segment = fetchFromSentry(`${baseUrl}/replays/${replayId}/videos/0/`); diff --git a/dev-packages/e2e-tests/patch-scripts/rn.patch.app.js b/dev-packages/e2e-tests/patch-scripts/rn.patch.app.js index 2a6ac3b14d..9c68c021af 100755 --- a/dev-packages/e2e-tests/patch-scripts/rn.patch.app.js +++ b/dev-packages/e2e-tests/patch-scripts/rn.patch.app.js @@ -23,13 +23,14 @@ import * as Sentry from '@sentry/react-native'; import { EndToEndTestsScreen } from 'sentry-react-native-e2e-tests'; import { LaunchArguments } from "react-native-launch-arguments"; +const launchArgs = LaunchArguments.value(); + Sentry.init({ release: '${SENTRY_RELEASE}', dist: '${SENTRY_DIST}', dsn: 'https://1df17bd4e543fdb31351dee1768bb679@o447951.ingest.sentry.io/5428561', - _experiments: { - replaysOnErrorSampleRate: LaunchArguments.value().replaysOnErrorSampleRate, - }, + replaysOnErrorSampleRate: launchArgs.replaysOnErrorSampleRate, + replaysSessionSampleRate: launchArgs.replaysSessionSampleRate, integrations: [ Sentry.mobileReplayIntegration(), Sentry.feedbackIntegration({ @@ -37,6 +38,8 @@ Sentry.init({ }), ], }); + +console.log('[E2E] Initialized with replaysOnErrorSampleRate:', launchArgs.replaysOnErrorSampleRate); `; const e2eComponentPatch = ''; const lastImportRex = /^([^]*)(import\s+[^;]*?;$)/m; From 7cd56f0186c721705337f48130b9d8f998d9477b Mon Sep 17 00:00:00 2001 From: Antonis Lilis Date: Mon, 22 Dec 2025 15:58:29 +0100 Subject: [PATCH 2/3] Add logs --- .../e2e-tests/patch-scripts/rn.patch.app.js | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/dev-packages/e2e-tests/patch-scripts/rn.patch.app.js b/dev-packages/e2e-tests/patch-scripts/rn.patch.app.js index 9c68c021af..8378d84b29 100755 --- a/dev-packages/e2e-tests/patch-scripts/rn.patch.app.js +++ b/dev-packages/e2e-tests/patch-scripts/rn.patch.app.js @@ -24,13 +24,22 @@ import { EndToEndTestsScreen } from 'sentry-react-native-e2e-tests'; import { LaunchArguments } from "react-native-launch-arguments"; const launchArgs = LaunchArguments.value(); +const replaysOnErrorSampleRate = launchArgs.replaysOnErrorSampleRate !== undefined + ? parseFloat(launchArgs.replaysOnErrorSampleRate) + : undefined; +const replaysSessionSampleRate = launchArgs.replaysSessionSampleRate !== undefined + ? parseFloat(launchArgs.replaysSessionSampleRate) + : undefined; + +console.log('[E2E] LaunchArguments:', launchArgs); +console.log('[E2E] Parsed replaysOnErrorSampleRate:', replaysOnErrorSampleRate); Sentry.init({ release: '${SENTRY_RELEASE}', dist: '${SENTRY_DIST}', dsn: 'https://1df17bd4e543fdb31351dee1768bb679@o447951.ingest.sentry.io/5428561', - replaysOnErrorSampleRate: launchArgs.replaysOnErrorSampleRate, - replaysSessionSampleRate: launchArgs.replaysSessionSampleRate, + replaysOnErrorSampleRate: replaysOnErrorSampleRate, + replaysSessionSampleRate: replaysSessionSampleRate, integrations: [ Sentry.mobileReplayIntegration(), Sentry.feedbackIntegration({ @@ -38,8 +47,6 @@ Sentry.init({ }), ], }); - -console.log('[E2E] Initialized with replaysOnErrorSampleRate:', launchArgs.replaysOnErrorSampleRate); `; const e2eComponentPatch = ''; const lastImportRex = /^([^]*)(import\s+[^;]*?;$)/m; From 94144f325ae939f17c7c43a25d7db4b9dcba4431 Mon Sep 17 00:00:00 2001 From: Antonis Lilis Date: Mon, 22 Dec 2025 17:07:51 +0100 Subject: [PATCH 3/3] more logs --- .../e2e-tests/patch-scripts/rn.patch.app.js | 23 ++++++++++++------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/dev-packages/e2e-tests/patch-scripts/rn.patch.app.js b/dev-packages/e2e-tests/patch-scripts/rn.patch.app.js index 8378d84b29..edf23e0e2b 100755 --- a/dev-packages/e2e-tests/patch-scripts/rn.patch.app.js +++ b/dev-packages/e2e-tests/patch-scripts/rn.patch.app.js @@ -24,15 +24,22 @@ import { EndToEndTestsScreen } from 'sentry-react-native-e2e-tests'; import { LaunchArguments } from "react-native-launch-arguments"; const launchArgs = LaunchArguments.value(); -const replaysOnErrorSampleRate = launchArgs.replaysOnErrorSampleRate !== undefined - ? parseFloat(launchArgs.replaysOnErrorSampleRate) - : undefined; -const replaysSessionSampleRate = launchArgs.replaysSessionSampleRate !== undefined - ? parseFloat(launchArgs.replaysSessionSampleRate) - : undefined; -console.log('[E2E] LaunchArguments:', launchArgs); -console.log('[E2E] Parsed replaysOnErrorSampleRate:', replaysOnErrorSampleRate); +// Parse launch arguments, handling both number and string types +const parseRate = (value) => { + if (value === undefined || value === null || value === 'undefined') { + return undefined; + } + const parsed = typeof value === 'number' ? value : parseFloat(value); + return isNaN(parsed) ? undefined : parsed; +}; + +const replaysOnErrorSampleRate = parseRate(launchArgs.replaysOnErrorSampleRate); +const replaysSessionSampleRate = parseRate(launchArgs.replaysSessionSampleRate); + +console.log('[E2E] LaunchArguments raw:', JSON.stringify(launchArgs)); +console.log('[E2E] Parsed replaysOnErrorSampleRate:', replaysOnErrorSampleRate, typeof replaysOnErrorSampleRate); +console.log('[E2E] Parsed replaysSessionSampleRate:', replaysSessionSampleRate, typeof replaysSessionSampleRate); Sentry.init({ release: '${SENTRY_RELEASE}',