Skip to content

Commit dce131b

Browse files
fix(app-start): Use ms to calculate app start age threshold
1 parent 4bec795 commit dce131b

File tree

3 files changed

+31
-12
lines changed

3 files changed

+31
-12
lines changed

CHANGELOG.md

+1
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212

1313
- Avoid silent failure when JS bundle was not created due to Sentry Xcode scripts failure ([#4690](https://github.com/getsentry/sentry-react-native/pull/4690))
1414
- Prevent crash on iOS during profiling stop when debug images are missing ([#4738](https://github.com/getsentry/sentry-react-native/pull/4738))
15+
- Attach only App Starts within the 60s threshold (fixed comparison units, use ms) ([#4746](https://github.com/getsentry/sentry-react-native/pull/4746))
1516

1617
### Dependencies
1718

packages/core/src/js/tracing/integrations/appStart.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -297,7 +297,7 @@ export const appStartIntegration = ({
297297
}
298298

299299
const isAppStartWithinBounds =
300-
!!event.start_timestamp && appStartTimestampMs >= event.start_timestamp - MAX_APP_START_AGE_MS;
300+
!!event.start_timestamp && appStartTimestampMs >= event.start_timestamp * 1_000 - MAX_APP_START_AGE_MS;
301301
if (!__DEV__ && !isAppStartWithinBounds) {
302302
logger.warn('[AppStart] App start timestamp is too far in the past to be used for app start span.');
303303
return;

packages/core/test/tracing/integrations/appStart.test.ts

+29-11
Original file line numberDiff line numberDiff line change
@@ -128,11 +128,15 @@ describe('App Start Integration', () => {
128128

129129
it('Does add App Start Span older than threshold in development builds', async () => {
130130
set__DEV__(true);
131-
const [timeOriginMilliseconds, appStartTimeMilliseconds] = mockTooOldAppStart();
131+
const [timeOriginMilliseconds, appStartTimeMilliseconds, appStartDurationMilliseconds] = mockTooOldAppStart();
132132

133133
const actualEvent = await captureStandAloneAppStart();
134134
expect(actualEvent).toEqual(
135-
expectEventWithStandaloneWarmAppStart(actualEvent, { timeOriginMilliseconds, appStartTimeMilliseconds }),
135+
expectEventWithStandaloneWarmAppStart(actualEvent, {
136+
timeOriginMilliseconds,
137+
appStartTimeMilliseconds,
138+
appStartDurationMilliseconds,
139+
}),
136140
);
137141
});
138142

@@ -433,21 +437,27 @@ describe('App Start Integration', () => {
433437

434438
it('Does not add App Start Span older than threshold', async () => {
435439
set__DEV__(false);
436-
mockTooOldAppStart();
440+
const [timeOriginMilliseconds] = mockTooOldAppStart();
437441

438-
const actualEvent = await processEvent(getMinimalTransactionEvent());
439-
expect(actualEvent).toStrictEqual(getMinimalTransactionEvent());
442+
const actualEvent = await processEvent(
443+
getMinimalTransactionEvent({ startTimestampSeconds: timeOriginMilliseconds }),
444+
);
445+
expect(actualEvent).toStrictEqual(getMinimalTransactionEvent({ startTimestampSeconds: timeOriginMilliseconds }));
440446
});
441447

442448
it('Does add App Start Span older than threshold in development builds', async () => {
443449
set__DEV__(true);
444-
const [timeOriginMilliseconds, appStartTimeMilliseconds] = mockTooOldAppStart();
450+
const [timeOriginMilliseconds, appStartTimeMilliseconds, appStartDurationMilliseconds] = mockTooOldAppStart();
445451

446452
const actualEvent = await processEvent(
447453
getMinimalTransactionEvent({ startTimestampSeconds: timeOriginMilliseconds }),
448454
);
449455
expect(actualEvent).toEqual(
450-
expectEventWithAttachedWarmAppStart({ timeOriginMilliseconds, appStartTimeMilliseconds }),
456+
expectEventWithAttachedWarmAppStart({
457+
timeOriginMilliseconds,
458+
appStartTimeMilliseconds,
459+
appStartDurationMilliseconds,
460+
}),
451461
);
452462
});
453463

@@ -901,9 +911,11 @@ function expectEventWithAttachedColdAppStart({
901911
function expectEventWithAttachedWarmAppStart({
902912
timeOriginMilliseconds,
903913
appStartTimeMilliseconds,
914+
appStartDurationMilliseconds,
904915
}: {
905916
timeOriginMilliseconds: number;
906917
appStartTimeMilliseconds: number;
918+
appStartDurationMilliseconds?: number;
907919
}) {
908920
return expect.objectContaining<TransactionEvent>({
909921
type: 'transaction',
@@ -920,7 +932,7 @@ function expectEventWithAttachedWarmAppStart({
920932
}),
921933
measurements: expect.objectContaining({
922934
[APP_START_WARM_MEASUREMENT]: {
923-
value: timeOriginMilliseconds - appStartTimeMilliseconds,
935+
value: appStartDurationMilliseconds || timeOriginMilliseconds - appStartTimeMilliseconds,
924936
unit: 'millisecond',
925937
},
926938
}),
@@ -1006,9 +1018,11 @@ function expectEventWithStandaloneWarmAppStart(
10061018
{
10071019
timeOriginMilliseconds,
10081020
appStartTimeMilliseconds,
1021+
appStartDurationMilliseconds,
10091022
}: {
10101023
timeOriginMilliseconds: number;
10111024
appStartTimeMilliseconds: number;
1025+
appStartDurationMilliseconds?: number;
10121026
},
10131027
) {
10141028
return expect.objectContaining<TransactionEvent>({
@@ -1026,7 +1040,7 @@ function expectEventWithStandaloneWarmAppStart(
10261040
}),
10271041
measurements: expect.objectContaining({
10281042
[APP_START_WARM_MEASUREMENT]: {
1029-
value: timeOriginMilliseconds - appStartTimeMilliseconds,
1043+
value: appStartDurationMilliseconds || timeOriginMilliseconds - appStartTimeMilliseconds,
10301044
unit: 'millisecond',
10311045
},
10321046
}),
@@ -1107,7 +1121,10 @@ function mockTooLongAppStart() {
11071121

11081122
function mockTooOldAppStart() {
11091123
const timeOriginMilliseconds = Date.now();
1124+
// Ensures app start is old (more than 1 minute before transaction start)
11101125
const appStartTimeMilliseconds = timeOriginMilliseconds - 65000;
1126+
const appStartEndTimestampMilliseconds = appStartTimeMilliseconds + 5000;
1127+
const appStartDurationMilliseconds = appStartEndTimestampMilliseconds - appStartTimeMilliseconds;
11111128
const mockAppStartResponse: NativeAppStartResponse = {
11121129
type: 'warm',
11131130
app_start_timestamp_ms: appStartTimeMilliseconds,
@@ -1116,13 +1133,14 @@ function mockTooOldAppStart() {
11161133
};
11171134

11181135
// App start finish timestamp
1119-
_setAppStartEndTimestampMs(timeOriginMilliseconds);
1136+
// App start length is 5 seconds
1137+
_setAppStartEndTimestampMs(appStartEndTimestampMilliseconds);
11201138
mockFunction(getTimeOriginMilliseconds).mockReturnValue(timeOriginMilliseconds - 64000);
11211139
mockFunction(NATIVE.fetchNativeAppStart).mockResolvedValue(mockAppStartResponse);
11221140
// Transaction start timestamp
11231141
mockFunction(timestampInSeconds).mockReturnValue(timeOriginMilliseconds / 1000 + 65);
11241142

1125-
return [timeOriginMilliseconds, appStartTimeMilliseconds];
1143+
return [timeOriginMilliseconds, appStartTimeMilliseconds, appStartDurationMilliseconds];
11261144
}
11271145

11281146
/**

0 commit comments

Comments
 (0)