Skip to content

Commit 982b55d

Browse files
fix(sdk): Rename app start measurements to match other SDKs (#2855)
1 parent 2416f09 commit 982b55d

File tree

7 files changed

+64
-29
lines changed

7 files changed

+64
-29
lines changed

CHANGELOG.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,12 @@
66

77
- Add App Context `in_foreground` ([#2826](https://github.com/getsentry/sentry-react-native/pull/2826))
88

9+
### Fixes
10+
11+
- Match app start measurements naming with other SDKs ([#2855](https://github.com/getsentry/sentry-react-native/pull/2855))
12+
- `app.start.cold` to `app_start_cold`
13+
- `app.start.warm` to `app_start_warm`
14+
915
### Dependencies
1016

1117
- Bump Cocoa SDK from v8.0.0 to v8.2.0 ([#2776](https://github.com/getsentry/sentry-react-native/pull/2776))

src/js/measurements.ts

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,14 @@ import { getCurrentHub, getMainCarrier } from '@sentry/core';
33
import type { Transaction } from '@sentry/tracing';
44
import type { CustomSamplingContext, Span, SpanContext, TransactionContext } from '@sentry/types';
55

6-
import { ReactNativeTracing } from './tracing';
6+
import { DEFAULT,ReactNativeTracing } from './tracing';
77

8-
const SPAN_OP_DEFAULT = 'default';
8+
export const APP_START_WARM = 'app_start_warm';
9+
export const APP_START_COLD = 'app_start_cold';
10+
11+
export const STALL_COUNT = 'stall_count';
12+
export const STALL_TOTAL_TIME = 'stall_total_time';
13+
export const STALL_LONGEST_TIME = 'stall_longest_time';
914

1015
/**
1116
* Adds React Native's extensions. Needs to be called after @sentry/tracing's extension methods are added
@@ -53,7 +58,7 @@ const _patchStartTransaction = (
5358
): Transaction {
5459
// Native SDKs require op to be set - for JS Relay sets `default`
5560
if (!transactionContext.op) {
56-
transactionContext.op = SPAN_OP_DEFAULT;
61+
transactionContext.op = DEFAULT;
5762
}
5863

5964
const transaction: Transaction = originalStartTransaction.apply(this, [
@@ -67,7 +72,7 @@ const _patchStartTransaction = (
6772
return originalStartChild({
6873
...spanContext,
6974
// Native SDKs require op to be set
70-
op: spanContext?.op || SPAN_OP_DEFAULT,
75+
op: spanContext?.op || DEFAULT,
7176
});
7277
};
7378

src/js/tracing/index.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,3 +20,5 @@ export {
2020
} from './types';
2121

2222
export { ReactNativeProfiler } from './reactnativeprofiler';
23+
24+
export * from './ops';

src/js/tracing/ops.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
2+
export const DEFAULT = 'default';
3+
export const UI_LOAD = 'ui.load';
4+
export const NAVIGATION = 'navigation';
5+
6+
export const APP_START_COLD = 'app.start.cold';
7+
export const APP_START_WARM = 'app.start.warm';

src/js/tracing/reactnativetracing.ts

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,16 @@ import type {
1818
} from '@sentry/types';
1919
import { logger } from '@sentry/utils';
2020

21+
import { APP_START_COLD, APP_START_WARM } from '../measurements';
2122
import type { NativeAppStartResponse } from '../NativeRNSentry';
2223
import type { RoutingInstrumentationInstance } from '../tracing/routingInstrumentation';
2324
import { NATIVE } from '../wrapper';
2425
import { NativeFramesInstrumentation } from './nativeframes';
26+
import {
27+
APP_START_COLD as APP_START_COLD_OP,
28+
APP_START_WARM as APP_START_WARM_OP,
29+
UI_LOAD,
30+
} from './ops';
2531
import { StallTrackingInstrumentation } from './stalltracking';
2632
import type { BeforeNavigate, RouteChangeContextData } from './types';
2733
import {
@@ -291,7 +297,7 @@ export class ReactNativeTracing implements Integration {
291297

292298
const idleTransaction = this._createRouteTransaction({
293299
name: 'App Start',
294-
op: 'ui.load',
300+
op: UI_LOAD,
295301
startTimestamp: appStartTimeSeconds,
296302
});
297303

@@ -315,10 +321,10 @@ export class ReactNativeTracing implements Integration {
315321

316322
const appStartTimeSeconds = appStart.appStartTime / 1000;
317323

318-
const appStartMode = appStart.isColdStart ? 'app.start.cold' : 'app.start.warm';
324+
const op = appStart.isColdStart ? APP_START_COLD_OP : APP_START_WARM_OP;
319325
transaction.startChild({
320326
description: appStart.isColdStart ? 'Cold App Start' : 'Warm App Start',
321-
op: appStartMode,
327+
op,
322328
startTimestamp: appStartTimeSeconds,
323329
endTimestamp: this._appStartFinishTimestamp,
324330
});
@@ -333,7 +339,8 @@ export class ReactNativeTracing implements Integration {
333339
return;
334340
}
335341

336-
transaction.setMeasurement(appStartMode, appStartDurationMilliseconds, 'millisecond');
342+
const measurement = appStart.isColdStart ? APP_START_COLD : APP_START_WARM;
343+
transaction.setMeasurement(measurement, appStartDurationMilliseconds, 'millisecond');
337344
}
338345

339346
/** To be called when the route changes, but BEFORE the components of the new route mount. */

src/js/tracing/stalltracking.ts

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,12 @@ import type { IdleTransaction, Span, Transaction } from '@sentry/tracing';
33
import type { Measurements, MeasurementUnit } from '@sentry/types';
44
import { logger, timestampInSeconds } from '@sentry/utils';
55

6+
import { STALL_COUNT, STALL_LONGEST_TIME, STALL_TOTAL_TIME } from '../measurements';
7+
68
export interface StallMeasurements extends Measurements {
7-
'stall_count': { value: number, unit: MeasurementUnit };
8-
'stall_total_time': { value: number, unit: MeasurementUnit };
9-
'stall_longest_time': { value: number, unit: MeasurementUnit };
9+
[STALL_COUNT]: { value: number, unit: MeasurementUnit };
10+
[STALL_TOTAL_TIME]: { value: number, unit: MeasurementUnit };
11+
[STALL_LONGEST_TIME]: { value: number, unit: MeasurementUnit };
1012
}
1113

1214
export type StallTrackingOptions = {
@@ -211,17 +213,17 @@ export class StallTrackingInstrumentation {
211213
return;
212214
}
213215

214-
transaction.setMeasurement('stall_count',
216+
transaction.setMeasurement(STALL_COUNT,
215217
statsOnFinish.stall_count.value -
216218
transactionStats.atStart.stall_count.value,
217219
transactionStats.atStart.stall_count.unit);
218220

219-
transaction.setMeasurement('stall_total_time',
221+
transaction.setMeasurement(STALL_TOTAL_TIME,
220222
statsOnFinish.stall_total_time.value -
221223
transactionStats.atStart.stall_total_time.value,
222224
transactionStats.atStart.stall_total_time.unit);
223225

224-
transaction.setMeasurement('stall_longest_time',
226+
transaction.setMeasurement(STALL_LONGEST_TIME,
225227
statsOnFinish.stall_longest_time.value,
226228
statsOnFinish.stall_longest_time.unit);
227229
}

test/tracing/reactnativetracing.test.ts

Lines changed: 21 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,12 @@ const getMockHub = () => {
5757

5858
import type { BrowserClientOptions } from '@sentry/browser/types/client';
5959

60+
import { APP_START_COLD, APP_START_WARM } from '../../src/js/measurements';
61+
import {
62+
APP_START_COLD as APP_START_COLD_OP,
63+
APP_START_WARM as APP_START_WARM_OP,
64+
UI_LOAD,
65+
} from '../../src/js/tracing';
6066
import { ReactNativeTracing } from '../../src/js/tracing/reactnativetracing';
6167
import { getTimeOriginMilliseconds } from '../../src/js/tracing/utils';
6268
import { NATIVE } from '../../src/js/wrapper';
@@ -110,15 +116,15 @@ describe('ReactNativeTracing', () => {
110116
expect(transaction.startTimestamp).toBe(
111117
appStartTimeMilliseconds / 1000
112118
);
113-
expect(transaction.op).toBe('ui.load');
119+
expect(transaction.op).toBe(UI_LOAD);
114120

115121
expect(
116122
// @ts-ignore access private for test
117-
transaction._measurements['app.start.cold'].value
123+
transaction._measurements[APP_START_COLD].value
118124
).toEqual(timeOriginMilliseconds - appStartTimeMilliseconds);
119125
expect(
120126
// @ts-ignore access private for test
121-
transaction._measurements['app.start.cold'].unit).toBe('millisecond');
127+
transaction._measurements[APP_START_COLD].unit).toBe('millisecond');
122128

123129
done();
124130
}
@@ -157,15 +163,15 @@ describe('ReactNativeTracing', () => {
157163
expect(transaction.startTimestamp).toBe(
158164
appStartTimeMilliseconds / 1000
159165
);
160-
expect(transaction.op).toBe('ui.load');
166+
expect(transaction.op).toBe(UI_LOAD);
161167

162168
expect(
163169
// @ts-ignore access private for test
164-
transaction._measurements['app.start.warm'].value
170+
transaction._measurements[APP_START_WARM].value
165171
).toEqual(timeOriginMilliseconds - appStartTimeMilliseconds);
166172
expect(
167173
// @ts-ignore access private for test
168-
transaction._measurements['app.start.warm'].unit).toBe('millisecond');
174+
transaction._measurements[APP_START_WARM].unit).toBe('millisecond');
169175

170176
done();
171177
}
@@ -203,12 +209,12 @@ describe('ReactNativeTracing', () => {
203209
if (transaction) {
204210
expect(
205211
// @ts-ignore access private for test
206-
transaction._measurements['app.start.warm']
212+
transaction._measurements[APP_START_WARM]
207213
).toBeUndefined();
208214

209215
expect(
210216
// @ts-ignore access private for test
211-
transaction._measurements['app.start.cold']
217+
transaction._measurements[APP_START_COLD]
212218
).toBeUndefined();
213219

214220
done();
@@ -301,11 +307,11 @@ describe('ReactNativeTracing', () => {
301307
jest.advanceTimersByTime(DEFAULT_IDLE_TIMEOUT);
302308

303309
// @ts-ignore access private for test
304-
expect(routeTransaction._measurements['app.start.cold'].value).toBe(
310+
expect(routeTransaction._measurements[APP_START_COLD].value).toBe(
305311
timeOriginMilliseconds - appStartTimeMilliseconds
306312
);
307313

308-
expect(routeTransaction.op).toBe('ui.load');
314+
expect(routeTransaction.op).toBe(UI_LOAD);
309315
expect(routeTransaction.startTimestamp).toBe(
310316
appStartTimeMilliseconds / 1000
311317
);
@@ -316,7 +322,7 @@ describe('ReactNativeTracing', () => {
316322

317323
const span = spanRecorder?.spans[spanRecorder?.spans.length - 1];
318324

319-
expect(span?.op).toBe('app.start.cold');
325+
expect(span?.op).toBe(APP_START_COLD_OP);
320326
expect(span?.description).toBe('Cold App Start');
321327
expect(span?.startTimestamp).toBe(appStartTimeMilliseconds / 1000);
322328
expect(span?.endTimestamp).toBe(timeOriginMilliseconds / 1000);
@@ -364,11 +370,11 @@ describe('ReactNativeTracing', () => {
364370
jest.advanceTimersByTime(DEFAULT_IDLE_TIMEOUT);
365371

366372
// @ts-ignore access private for test
367-
expect(routeTransaction._measurements['app.start.warm'].value).toBe(
373+
expect(routeTransaction._measurements[APP_START_WARM].value).toBe(
368374
timeOriginMilliseconds - appStartTimeMilliseconds
369375
);
370376

371-
expect(routeTransaction.op).toBe('ui.load');
377+
expect(routeTransaction.op).toBe(UI_LOAD);
372378
expect(routeTransaction.startTimestamp).toBe(
373379
appStartTimeMilliseconds / 1000
374380
);
@@ -379,7 +385,7 @@ describe('ReactNativeTracing', () => {
379385

380386
const span = spanRecorder?.spans[spanRecorder?.spans.length - 1];
381387

382-
expect(span?.op).toBe('app.start.warm');
388+
expect(span?.op).toBe(APP_START_WARM_OP);
383389
expect(span?.description).toBe('Warm App Start');
384390
expect(span?.startTimestamp).toBe(appStartTimeMilliseconds / 1000);
385391
expect(span?.endTimestamp).toBe(timeOriginMilliseconds / 1000);
@@ -429,7 +435,7 @@ describe('ReactNativeTracing', () => {
429435
// @ts-ignore access private for test
430436
expect(routeTransaction._measurements).toMatchObject({});
431437

432-
expect(routeTransaction.op).not.toBe('ui.load');
438+
expect(routeTransaction.op).not.toBe(UI_LOAD);
433439
expect(routeTransaction.startTimestamp).not.toBe(
434440
appStartTimeMilliseconds / 1000
435441
);

0 commit comments

Comments
 (0)