Skip to content

Commit db91022

Browse files
committed
Merge branch 'main' into capture-app-start-errors-v7
2 parents f1e4ec4 + 180638b commit db91022

File tree

10 files changed

+179
-97
lines changed

10 files changed

+179
-97
lines changed

CHANGELOG.md

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,15 @@
88
99
## Unreleased
1010

11+
### Fixes
12+
13+
- Fix for missing `replay_id` from metrics ([#5483](https://github.com/getsentry/sentry-react-native/pull/5483))
14+
1115
### Dependencies
1216

13-
- Bump JavaScript SDK from v10.30.0 to v10.31.0 ([#5480](https://github.com/getsentry/sentry-react-native/pull/5480))
14-
- [changelog](https://github.com/getsentry/sentry-javascript/blob/develop/CHANGELOG.md#10310)
15-
- [diff](https://github.com/getsentry/sentry-javascript/compare/10.30.0...10.31.0)
17+
- Bump JavaScript SDK from v10.30.0 to v10.32.0 ([#5480](https://github.com/getsentry/sentry-react-native/pull/5480), [#5487](https://github.com/getsentry/sentry-react-native/pull/5487))
18+
- [changelog](https://github.com/getsentry/sentry-javascript/blob/develop/CHANGELOG.md#10320)
19+
- [diff](https://github.com/getsentry/sentry-javascript/compare/10.30.0...10.32.0)
1620

1721
## 7.8.0
1822

dev-packages/e2e-tests/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
"devDependencies": {
1414
"@babel/preset-env": "^7.25.3",
1515
"@babel/preset-typescript": "^7.18.6",
16-
"@sentry/core": "10.31.0",
16+
"@sentry/core": "10.32.0",
1717
"@sentry/react-native": "7.8.0",
1818
"@types/node": "^20.9.3",
1919
"@types/react": "^18.2.64",

packages/core/package.json

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -69,20 +69,20 @@
6969
},
7070
"dependencies": {
7171
"@sentry/babel-plugin-component-annotate": "4.6.1",
72-
"@sentry/browser": "10.31.0",
72+
"@sentry/browser": "10.32.0",
7373
"@sentry/cli": "2.58.4",
74-
"@sentry/core": "10.31.0",
75-
"@sentry/react": "10.31.0",
76-
"@sentry/types": "10.31.0"
74+
"@sentry/core": "10.32.0",
75+
"@sentry/react": "10.32.0",
76+
"@sentry/types": "10.32.0"
7777
},
7878
"devDependencies": {
7979
"@babel/core": "^7.26.7",
8080
"@expo/metro-config": "~0.20.0",
8181
"@mswjs/interceptors": "^0.25.15",
8282
"@react-native/babel-preset": "0.80.0",
83-
"@sentry-internal/eslint-config-sdk": "10.31.0",
84-
"@sentry-internal/eslint-plugin-sdk": "10.31.0",
85-
"@sentry-internal/typescript": "10.31.0",
83+
"@sentry-internal/eslint-config-sdk": "10.32.0",
84+
"@sentry-internal/eslint-plugin-sdk": "10.32.0",
85+
"@sentry-internal/typescript": "10.32.0",
8686
"@sentry/wizard": "6.10.0",
8787
"@testing-library/react-native": "^13.2.2",
8888
"@types/jest": "^29.5.13",

packages/core/src/js/replay/mobilereplay.ts

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import type { Client, DynamicSamplingContext, Event, EventHint, Integration } from '@sentry/core';
1+
import type { Client, DynamicSamplingContext, Event, EventHint, Integration, Metric } from '@sentry/core';
22
import { debug } from '@sentry/core';
33
import { isHardCrash } from '../misc';
44
import { hasHooks } from '../utils/clientutils';
@@ -253,6 +253,15 @@ export const mobileReplayIntegration = (initOptions: MobileReplayOptions = defau
253253
}
254254
});
255255

256+
client.on('processMetric', (metric: Metric) => {
257+
// Add replay_id to metric attributes to link metrics to replays
258+
const currentReplayId = getCachedReplayId();
259+
if (currentReplayId) {
260+
metric.attributes = metric.attributes || {};
261+
metric.attributes.replay_id = currentReplayId;
262+
}
263+
});
264+
256265
client.on('beforeAddBreadcrumb', enrichXhrBreadcrumbsForMobileReplay);
257266
}
258267

packages/core/test/metrics.test.ts

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import { getClient, metrics, setCurrentClient } from '@sentry/core';
22
import { ReactNativeClient } from '../src/js';
3+
import { mobileReplayIntegration } from '../src/js/replay/mobilereplay';
34
import { getDefaultTestClientOptions } from './mocks/client';
45
import { NATIVE } from './mockWrapper';
56

@@ -176,5 +177,61 @@ describe('Metrics', () => {
176177
const sentMetric = beforeSendMetric.mock.calls[0]?.[0];
177178
expect(sentMetric).toBeDefined();
178179
});
180+
181+
it('metrics include replay_id when mobile replay integration is active', async () => {
182+
const mockReplayId = 'test-replay-id-123';
183+
(NATIVE.getCurrentReplayId as jest.Mock).mockReturnValue(mockReplayId);
184+
185+
const beforeSendMetric = jest.fn(metric => metric);
186+
187+
const client = new ReactNativeClient({
188+
...getDefaultTestClientOptions({
189+
dsn: EXAMPLE_DSN,
190+
enableMetrics: true,
191+
beforeSendMetric,
192+
integrations: [mobileReplayIntegration()],
193+
replaysSessionSampleRate: 1.0,
194+
}),
195+
});
196+
197+
setCurrentClient(client);
198+
client.init();
199+
200+
// Send a metric
201+
metrics.count('test_metric', 1);
202+
203+
jest.advanceTimersByTime(10000);
204+
expect(beforeSendMetric).toHaveBeenCalled();
205+
const sentMetric = beforeSendMetric.mock.calls[0]?.[0];
206+
expect(sentMetric).toBeDefined();
207+
expect(sentMetric.attributes).toBeDefined();
208+
expect(sentMetric.attributes?.replay_id).toBe(mockReplayId);
209+
});
210+
211+
it('metrics do not include replay_id when replay integration is not active', async () => {
212+
(NATIVE.getCurrentReplayId as jest.Mock).mockReturnValue(null);
213+
214+
const beforeSendMetric = jest.fn(metric => metric);
215+
216+
const client = new ReactNativeClient({
217+
...getDefaultTestClientOptions({
218+
dsn: EXAMPLE_DSN,
219+
enableMetrics: true,
220+
beforeSendMetric,
221+
}),
222+
});
223+
224+
setCurrentClient(client);
225+
client.init();
226+
227+
// Send a metric
228+
metrics.count('test_metric', 1);
229+
230+
jest.advanceTimersByTime(10000);
231+
expect(beforeSendMetric).toHaveBeenCalled();
232+
const sentMetric = beforeSendMetric.mock.calls[0]?.[0];
233+
expect(sentMetric).toBeDefined();
234+
expect(sentMetric.attributes?.replay_id).toBeUndefined();
235+
});
179236
});
180237
});

performance-tests/Gemfile.lock

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,19 +11,19 @@ GEM
1111
artifactory (3.0.17)
1212
atomos (0.1.3)
1313
aws-eventstream (1.4.0)
14-
aws-partitions (1.1181.0)
15-
aws-sdk-core (3.236.0)
14+
aws-partitions (1.1196.0)
15+
aws-sdk-core (3.240.0)
1616
aws-eventstream (~> 1, >= 1.3.0)
1717
aws-partitions (~> 1, >= 1.992.0)
1818
aws-sigv4 (~> 1.9)
1919
base64
2020
bigdecimal
2121
jmespath (~> 1, >= 1.6.1)
2222
logger
23-
aws-sdk-kms (1.117.0)
24-
aws-sdk-core (~> 3, >= 3.234.0)
23+
aws-sdk-kms (1.118.0)
24+
aws-sdk-core (~> 3, >= 3.239.1)
2525
aws-sigv4 (~> 1.5)
26-
aws-sdk-s3 (1.203.0)
26+
aws-sdk-s3 (1.208.0)
2727
aws-sdk-core (~> 3, >= 3.234.0)
2828
aws-sdk-kms (~> 1)
2929
aws-sigv4 (~> 1.5)

samples/react-native-macos/Gemfile.lock

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -17,24 +17,28 @@ GEM
1717
json (>= 1.5.1)
1818
artifactory (3.0.17)
1919
atomos (0.1.3)
20-
aws-eventstream (1.3.0)
21-
aws-partitions (1.994.0)
22-
aws-sdk-core (3.211.0)
20+
aws-eventstream (1.4.0)
21+
aws-partitions (1.1196.0)
22+
aws-sdk-core (3.240.0)
2323
aws-eventstream (~> 1, >= 1.3.0)
2424
aws-partitions (~> 1, >= 1.992.0)
2525
aws-sigv4 (~> 1.9)
26+
base64
27+
bigdecimal
2628
jmespath (~> 1, >= 1.6.1)
27-
aws-sdk-kms (1.95.0)
28-
aws-sdk-core (~> 3, >= 3.210.0)
29+
logger
30+
aws-sdk-kms (1.118.0)
31+
aws-sdk-core (~> 3, >= 3.239.1)
2932
aws-sigv4 (~> 1.5)
30-
aws-sdk-s3 (1.169.0)
31-
aws-sdk-core (~> 3, >= 3.210.0)
33+
aws-sdk-s3 (1.208.0)
34+
aws-sdk-core (~> 3, >= 3.234.0)
3235
aws-sdk-kms (~> 1)
3336
aws-sigv4 (~> 1.5)
34-
aws-sigv4 (1.10.1)
37+
aws-sigv4 (1.12.1)
3538
aws-eventstream (~> 1, >= 1.0.2)
3639
babosa (1.0.4)
3740
base64 (0.2.0)
41+
bigdecimal (4.0.1)
3842
claide (1.1.0)
3943
cocoapods (1.15.2)
4044
addressable (~> 2.8)
@@ -210,6 +214,7 @@ GEM
210214
json (2.7.3)
211215
jwt (2.9.3)
212216
base64
217+
logger (1.7.0)
213218
mini_magick (4.13.2)
214219
mini_mime (1.1.5)
215220
minitest (5.25.1)

samples/react-native-macos/package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,8 @@
1616
"@react-navigation/bottom-tabs": "^6.5.12",
1717
"@react-navigation/native": "^6.1.9",
1818
"@react-navigation/stack": "^6.3.20",
19-
"@sentry/core": "10.31.0",
20-
"@sentry/react": "10.31.0",
19+
"@sentry/core": "10.32.0",
20+
"@sentry/react": "10.32.0",
2121
"@sentry/react-native": "7.8.0",
2222
"delay": "^6.0.0",
2323
"react": "18.2.0",

samples/react-native/package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,8 +44,8 @@
4444
"@react-navigation/native-stack": "^7.3.24",
4545
"@react-navigation/stack": "^7.4.5",
4646
"@reduxjs/toolkit": "^2.8.2",
47-
"@sentry/core": "10.31.0",
48-
"@sentry/react": "10.31.0",
47+
"@sentry/core": "10.32.0",
48+
"@sentry/react": "10.32.0",
4949
"@sentry/react-native": "7.8.0",
5050
"@shopify/flash-list": "^2.0.2",
5151
"delay": "^6.0.0",

0 commit comments

Comments
 (0)