@nativescript-community/sentry 3.1.4 → 4.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +28 -0
- package/README.md +2 -6
- package/client.d.ts +38 -3
- package/client.js +143 -5
- package/client.js.map +1 -1
- package/index.d.ts +7 -11
- package/index.js +28 -12
- package/index.js.map +1 -1
- package/integrations/debugsymbolicator.d.ts +4 -4
- package/integrations/debugsymbolicator.js +11 -22
- package/integrations/debugsymbolicator.js.map +1 -1
- package/integrations/devicecontext.js +22 -5
- package/integrations/devicecontext.js.map +1 -1
- package/integrations/eventorigin.d.ts +7 -7
- package/integrations/eventorigin.js +9 -9
- package/integrations/eventorigin.js.map +1 -1
- package/integrations/nativescripterrorhandlers.d.ts +15 -5
- package/integrations/nativescripterrorhandlers.js +55 -44
- package/integrations/nativescripterrorhandlers.js.map +1 -1
- package/integrations/release.js +10 -8
- package/integrations/release.js.map +1 -1
- package/integrations/sdkinfo.d.ts +4 -1
- package/integrations/sdkinfo.js +17 -10
- package/integrations/sdkinfo.js.map +1 -1
- package/measurement.d.ts +4 -0
- package/measurement.js +50 -0
- package/measurement.js.map +1 -0
- package/measurements.d.ts +4 -0
- package/measurements.js +50 -0
- package/measurements.js.map +1 -0
- package/misc.d.ts +8 -0
- package/misc.js +17 -0
- package/misc.js.map +1 -0
- package/options.d.ts +125 -0
- package/options.js +2 -0
- package/options.js.map +1 -0
- package/package.json +9 -12
- package/platforms/android/buildscript.gradle +6 -2
- package/platforms/android/include.gradle +1 -1
- package/platforms/android/native-api-usage.json +4 -0
- package/platforms/android/sentry.aar +0 -0
- package/platforms/ios/Podfile +1 -1
- package/platforms/ios/src/NSSentry.h +8 -3
- package/platforms/ios/src/NSSentry.m +41 -0
- package/scope.d.ts +1 -45
- package/scope.js +90 -68
- package/scope.js.map +1 -1
- package/sdk.d.ts +27 -3
- package/sdk.js +105 -30
- package/sdk.js.map +1 -1
- package/tracing/index.d.ts +2 -1
- package/tracing/index.js +14 -6
- package/tracing/index.js.map +1 -1
- package/tracing/nativeframes.d.ts +68 -0
- package/tracing/nativeframes.js +175 -0
- package/tracing/nativeframes.js.map +1 -0
- package/tracing/nstracing.d.ts +98 -47
- package/tracing/nstracing.js +164 -44
- package/tracing/nstracing.js.map +1 -1
- package/tracing/routingInstrumentation.d.ts +46 -0
- package/tracing/routingInstrumentation.js +33 -0
- package/tracing/routingInstrumentation.js.map +1 -0
- package/tracing/stalltracking.d.ts +92 -0
- package/tracing/stalltracking.js +258 -0
- package/tracing/stalltracking.js.map +1 -0
- package/tracing/types.d.ts +13 -0
- package/tracing/types.js +2 -0
- package/tracing/types.js.map +1 -0
- package/tracing/utils.d.ts +22 -1
- package/tracing/utils.js +51 -2
- package/tracing/utils.js.map +1 -1
- package/transports/TextEncoder.d.ts +2 -0
- package/transports/TextEncoder.js +12 -0
- package/transports/TextEncoder.js.map +1 -0
- package/transports/native.d.ts +20 -8
- package/transports/native.js +21 -13
- package/transports/native.js.map +1 -1
- package/utils/envelope.d.ts +11 -0
- package/utils/envelope.js +21 -0
- package/utils/envelope.js.map +1 -0
- package/utils/outcome.d.ts +5 -0
- package/utils/outcome.js +19 -0
- package/utils/outcome.js.map +1 -0
- package/utils/safe.d.ts +17 -0
- package/utils/safe.js +46 -0
- package/utils/safe.js.map +1 -0
- package/vendor/buffer/index.d.ts +1 -0
- package/vendor/buffer/index.js +2 -0
- package/vendor/buffer/index.js.map +1 -0
- package/vendor/buffer/utf8ToBytes.d.ts +9 -0
- package/vendor/buffer/utf8ToBytes.js +81 -0
- package/vendor/buffer/utf8ToBytes.js.map +1 -0
- package/vendor/index.d.ts +1 -0
- package/vendor/index.js +2 -0
- package/vendor/index.js.map +1 -0
- package/version.d.ts +2 -1
- package/version.js +2 -1
- package/version.js.map +1 -1
- package/wrapper.android.d.ts +30 -0
- package/wrapper.android.js +952 -0
- package/wrapper.android.js.map +1 -0
- package/wrapper.d.ts +88 -0
- package/wrapper.ios.d.ts +34 -0
- package/wrapper.ios.js +497 -0
- package/wrapper.ios.js.map +1 -0
- package/pnpm-lock.yaml +0 -914
package/tracing/nstracing.js
CHANGED
@@ -1,84 +1,204 @@
|
|
1
|
-
import { defaultRequestInstrumentationOptions,
|
1
|
+
import { defaultRequestInstrumentationOptions, instrumentOutgoingRequests, startIdleTransaction } from '@sentry/tracing';
|
2
2
|
import { logger } from '@sentry/utils';
|
3
|
-
|
4
|
-
import {
|
5
|
-
|
3
|
+
import { NATIVE } from '../wrapper';
|
4
|
+
import { NativeFramesInstrumentation } from './nativeframes';
|
5
|
+
import { StallTrackingInstrumentation } from './stalltracking';
|
6
|
+
import { adjustTransactionDuration, getTimeOriginMilliseconds, isNearToNow } from './utils';
|
7
|
+
const defaultNativescriptTracingOptions = Object.assign(Object.assign({}, defaultRequestInstrumentationOptions), { idleTimeout: 1000, maxTransactionDuration: 600, ignoreEmptyBackNavigationTransactions: true, beforeNavigate: (context) => context, enableAppStartTracking: true, enableNativeFramesTracking: true, enableStallTracking: true });
|
6
8
|
/**
|
7
|
-
|
8
|
-
|
9
|
-
export class
|
9
|
+
* Tracing integration for React Native.
|
10
|
+
*/
|
11
|
+
export class NativescriptTracing {
|
10
12
|
constructor(options = {}) {
|
11
13
|
/**
|
12
|
-
|
13
|
-
|
14
|
-
this.name =
|
15
|
-
this.
|
14
|
+
* @inheritDoc
|
15
|
+
*/
|
16
|
+
this.name = NativescriptTracing.id;
|
17
|
+
this.useAppStartWithProfiler = false;
|
18
|
+
this.options = Object.assign(Object.assign({}, defaultNativescriptTracingOptions), options);
|
16
19
|
}
|
17
20
|
/**
|
18
|
-
|
19
|
-
|
21
|
+
* Registers routing and request instrumentation.
|
22
|
+
*/
|
20
23
|
setupOnce(
|
21
24
|
// @ts-ignore TODO
|
22
25
|
addGlobalEventProcessor, getCurrentHub) {
|
23
26
|
// eslint-disable-next-line @typescript-eslint/unbound-method
|
24
27
|
const { traceFetch, traceXHR, tracingOrigins,
|
25
28
|
// @ts-ignore TODO
|
26
|
-
shouldCreateSpanForRequest,
|
27
|
-
// routingInstrumentation,
|
28
|
-
} = this.options;
|
29
|
+
shouldCreateSpanForRequest, routingInstrumentation, enableAppStartTracking, enableNativeFramesTracking, enableStallTracking, } = this.options;
|
29
30
|
this._getCurrentHub = getCurrentHub;
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
31
|
+
console.log('NativescriptTracing', this.options);
|
32
|
+
if (enableAppStartTracking) {
|
33
|
+
void this._instrumentAppStart();
|
34
|
+
}
|
35
|
+
if (enableNativeFramesTracking) {
|
36
|
+
this.nativeFramesInstrumentation = new NativeFramesInstrumentation(addGlobalEventProcessor, () => {
|
37
|
+
const self = getCurrentHub().getIntegration(NativescriptTracing);
|
38
|
+
if (self) {
|
39
|
+
return !!self.nativeFramesInstrumentation;
|
40
|
+
}
|
41
|
+
return false;
|
42
|
+
});
|
43
|
+
}
|
44
|
+
else {
|
45
|
+
NATIVE.disableNativeFramesTracking();
|
46
|
+
}
|
47
|
+
if (enableStallTracking) {
|
48
|
+
this.stallTrackingInstrumentation = new StallTrackingInstrumentation();
|
49
|
+
}
|
50
|
+
if (routingInstrumentation) {
|
51
|
+
routingInstrumentation.registerRoutingInstrumentation(this._onRouteWillChange.bind(this), this.options.beforeNavigate, this._onConfirmRoute.bind(this));
|
52
|
+
}
|
53
|
+
else {
|
54
|
+
logger.log('[NativescriptTracing] Not instrumenting route changes as routingInstrumentation has not been set.');
|
55
|
+
}
|
56
|
+
instrumentOutgoingRequests({
|
39
57
|
traceFetch,
|
40
58
|
traceXHR,
|
41
59
|
tracingOrigins,
|
42
60
|
shouldCreateSpanForRequest,
|
43
61
|
});
|
44
|
-
|
45
|
-
|
46
|
-
|
62
|
+
}
|
63
|
+
/**
|
64
|
+
* To be called on a transaction start. Can have async methods
|
65
|
+
*/
|
66
|
+
onTransactionStart(transaction) {
|
67
|
+
var _a, _b;
|
68
|
+
if (isNearToNow(transaction.startTimestamp)) {
|
69
|
+
// Only if this method is called at or within margin of error to the start timestamp.
|
70
|
+
(_a = this.nativeFramesInstrumentation) === null || _a === void 0 ? void 0 : _a.onTransactionStart(transaction);
|
71
|
+
(_b = this.stallTrackingInstrumentation) === null || _b === void 0 ? void 0 : _b.onTransactionStart(transaction);
|
72
|
+
}
|
73
|
+
}
|
74
|
+
/**
|
75
|
+
* To be called on a transaction finish. Cannot have async methods.
|
76
|
+
*/
|
77
|
+
onTransactionFinish(transaction, endTimestamp) {
|
78
|
+
var _a, _b;
|
79
|
+
(_a = this.nativeFramesInstrumentation) === null || _a === void 0 ? void 0 : _a.onTransactionFinish(transaction);
|
80
|
+
(_b = this.stallTrackingInstrumentation) === null || _b === void 0 ? void 0 : _b.onTransactionFinish(transaction, endTimestamp);
|
81
|
+
}
|
82
|
+
/**
|
83
|
+
* Called by the NativescriptProfiler component on first component mount.
|
84
|
+
*/
|
85
|
+
onAppStartFinish(endTimestamp) {
|
86
|
+
this._appStartFinishTimestamp = endTimestamp;
|
87
|
+
}
|
88
|
+
/**
|
89
|
+
* Instruments the app start measurements on the first route transaction.
|
90
|
+
* Starts a route transaction if there isn't routing instrumentation.
|
91
|
+
*/
|
92
|
+
async _instrumentAppStart() {
|
93
|
+
if (!this.options.enableAppStartTracking || !NATIVE.enableNative) {
|
94
|
+
return;
|
95
|
+
}
|
96
|
+
const appStart = await NATIVE.fetchNativeAppStart();
|
97
|
+
if (!appStart || appStart.didFetchAppStart) {
|
98
|
+
return;
|
99
|
+
}
|
100
|
+
if (!this.useAppStartWithProfiler) {
|
101
|
+
this._appStartFinishTimestamp = getTimeOriginMilliseconds() / 1000;
|
102
|
+
}
|
103
|
+
if (this.options.routingInstrumentation) {
|
104
|
+
this._awaitingAppStartData = appStart;
|
105
|
+
}
|
106
|
+
else {
|
107
|
+
const appStartTimeSeconds = appStart.appStartTime / 1000;
|
108
|
+
const idleTransaction = this._createRouteTransaction({
|
109
|
+
name: 'App Start',
|
110
|
+
op: 'ui.load',
|
111
|
+
startTimestamp: appStartTimeSeconds,
|
112
|
+
});
|
113
|
+
if (idleTransaction) {
|
114
|
+
this._addAppStartData(idleTransaction, appStart);
|
47
115
|
}
|
48
|
-
|
116
|
+
}
|
117
|
+
}
|
118
|
+
/**
|
119
|
+
* Adds app start measurements and starts a child span on a transaction.
|
120
|
+
*/
|
121
|
+
_addAppStartData(transaction, appStart) {
|
122
|
+
if (!this._appStartFinishTimestamp) {
|
123
|
+
logger.warn('App start was never finished.');
|
124
|
+
return;
|
125
|
+
}
|
126
|
+
const appStartTimeSeconds = appStart.appStartTime / 1000;
|
127
|
+
const appStartMode = appStart.isColdStart ? 'app_start_cold' : 'app_start_warm';
|
128
|
+
transaction.startChild({
|
129
|
+
description: appStart.isColdStart ? 'Cold App Start' : 'Warm App Start',
|
130
|
+
op: appStartMode,
|
131
|
+
startTimestamp: appStartTimeSeconds,
|
132
|
+
endTimestamp: this._appStartFinishTimestamp,
|
49
133
|
});
|
134
|
+
const appStartDurationMilliseconds = this._appStartFinishTimestamp * 1000 - appStart.appStartTime;
|
135
|
+
transaction.setMeasurement(appStartMode, appStartDurationMilliseconds);
|
50
136
|
}
|
51
137
|
/** To be called when the route changes, but BEFORE the components of the new route mount. */
|
52
138
|
_onRouteWillChange(context) {
|
53
|
-
// TODO: Consider more features on route change, one example is setting a tag of what route the user is on
|
54
139
|
return this._createRouteTransaction(context);
|
55
140
|
}
|
141
|
+
/**
|
142
|
+
* Creates a breadcrumb and sets the current route as a tag.
|
143
|
+
*/
|
144
|
+
_onConfirmRoute(context) {
|
145
|
+
var _a;
|
146
|
+
(_a = this._getCurrentHub) === null || _a === void 0 ? void 0 : _a.call(this).configureScope((scope) => {
|
147
|
+
var _a;
|
148
|
+
if (context.data) {
|
149
|
+
const contextData = context.data;
|
150
|
+
scope.addBreadcrumb({
|
151
|
+
category: 'navigation',
|
152
|
+
type: 'navigation',
|
153
|
+
// We assume that context.name is the name of the route.
|
154
|
+
message: `Navigation to ${context.name}`,
|
155
|
+
data: {
|
156
|
+
from: (_a = contextData.previousRoute) === null || _a === void 0 ? void 0 : _a.name,
|
157
|
+
to: contextData.route.name,
|
158
|
+
},
|
159
|
+
});
|
160
|
+
}
|
161
|
+
scope.setTag('routing.route.name', context.name);
|
162
|
+
});
|
163
|
+
}
|
56
164
|
/** Create routing idle transaction. */
|
57
165
|
_createRouteTransaction(context) {
|
58
166
|
if (!this._getCurrentHub) {
|
59
|
-
logger.warn(`[
|
167
|
+
logger.warn(`[NativescriptTracing] Did not create ${context.op} transaction because _getCurrentHub is invalid.`);
|
60
168
|
return undefined;
|
61
169
|
}
|
62
170
|
// eslint-disable-next-line @typescript-eslint/unbound-method
|
63
|
-
const {
|
171
|
+
const { idleTimeout, maxTransactionDuration } = this.options;
|
64
172
|
const expandedContext = Object.assign(Object.assign({}, context), { trimEnd: true });
|
65
|
-
const modifiedContext = typeof beforeNavigate === 'function'
|
66
|
-
? beforeNavigate(expandedContext)
|
67
|
-
: expandedContext;
|
68
|
-
if (modifiedContext.sampled === false) {
|
69
|
-
logger.log(`[NSTracing] Will not send ${context.op} transaction.`);
|
70
|
-
}
|
71
173
|
const hub = this._getCurrentHub();
|
72
|
-
const idleTransaction = startIdleTransaction(hub,
|
73
|
-
|
174
|
+
const idleTransaction = startIdleTransaction(hub, expandedContext, idleTimeout, idleTimeout, // BREAKCHANGE: check the correct parameter here
|
175
|
+
true);
|
176
|
+
this.onTransactionStart(idleTransaction);
|
177
|
+
logger.log(`[NativescriptTracing] Starting ${context.op} transaction "${context.name}" on scope`);
|
178
|
+
idleTransaction.registerBeforeFinishCallback((transaction, endTimestamp) => {
|
179
|
+
this.onTransactionFinish(transaction, endTimestamp);
|
180
|
+
});
|
181
|
+
idleTransaction.registerBeforeFinishCallback((transaction) => {
|
182
|
+
if (this.options.enableAppStartTracking && this._awaitingAppStartData) {
|
183
|
+
transaction.startTimestamp =
|
184
|
+
this._awaitingAppStartData.appStartTime / 1000;
|
185
|
+
transaction.op = 'ui.load';
|
186
|
+
this._addAppStartData(transaction, this._awaitingAppStartData);
|
187
|
+
this._awaitingAppStartData = undefined;
|
188
|
+
}
|
189
|
+
});
|
74
190
|
idleTransaction.registerBeforeFinishCallback((transaction, endTimestamp) => {
|
75
191
|
adjustTransactionDuration(maxTransactionDuration, transaction, endTimestamp);
|
76
192
|
});
|
77
193
|
if (this.options.ignoreEmptyBackNavigationTransactions) {
|
78
194
|
idleTransaction.registerBeforeFinishCallback((transaction) => {
|
79
|
-
|
195
|
+
var _a, _b;
|
196
|
+
if (
|
197
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
|
198
|
+
((_b = (_a = transaction.data) === null || _a === void 0 ? void 0 : _a.route) === null || _b === void 0 ? void 0 : _b.hasBeenSeen) &&
|
80
199
|
(!transaction.spanRecorder ||
|
81
200
|
transaction.spanRecorder.spans.filter((span) => span.spanId !== transaction.spanId).length === 0)) {
|
201
|
+
logger.log('[NativescriptTracing] Not sampling transaction as route has been seen before. Pass ignoreEmptyBackNavigationTransactions = false to disable this feature.');
|
82
202
|
// Route has been seen before and has no child spans.
|
83
203
|
transaction.sampled = false;
|
84
204
|
}
|
@@ -88,7 +208,7 @@ export class NSTracing {
|
|
88
208
|
}
|
89
209
|
}
|
90
210
|
/**
|
91
|
-
|
92
|
-
|
93
|
-
|
211
|
+
* @inheritDoc
|
212
|
+
*/
|
213
|
+
NativescriptTracing.id = 'NativescriptTracing';
|
94
214
|
//# sourceMappingURL=nstracing.js.map
|
package/tracing/nstracing.js.map
CHANGED
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"nstracing.js","sourceRoot":"","sources":["../../src/tracing/nstracing.ts"],"names":[],"mappings":"
|
1
|
+
{"version":3,"file":"nstracing.js","sourceRoot":"","sources":["../../src/tracing/nstracing.ts"],"names":[],"mappings":"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"}
|
@@ -0,0 +1,46 @@
|
|
1
|
+
import { Hub } from '@sentry/hub';
|
2
|
+
import { Transaction, TransactionContext } from '@sentry/types';
|
3
|
+
import { BeforeNavigate } from './types';
|
4
|
+
export declare type TransactionCreator = (context: TransactionContext) => Transaction | undefined;
|
5
|
+
export declare type OnConfirmRoute = (context: TransactionContext) => void;
|
6
|
+
export interface RoutingInstrumentationInstance {
|
7
|
+
/**
|
8
|
+
* Registers a listener that's called on every route change with a `TransactionContext`.
|
9
|
+
*
|
10
|
+
* Do not overwrite this unless you know what you are doing.
|
11
|
+
*
|
12
|
+
* @param listener A `RouteListener`
|
13
|
+
* @param beforeNavigate BeforeNavigate
|
14
|
+
* @param inConfirmRoute OnConfirmRoute
|
15
|
+
*/
|
16
|
+
registerRoutingInstrumentation(listener: TransactionCreator, beforeNavigate: BeforeNavigate, onConfirmRoute: OnConfirmRoute): void;
|
17
|
+
/**
|
18
|
+
* To be called when the route changes, BEFORE the new route mounts.
|
19
|
+
* If this is called after a route mounts the child spans will not be correctly attached.
|
20
|
+
*
|
21
|
+
* @param context A `TransactionContext` used to initialize the transaction.
|
22
|
+
*/
|
23
|
+
onRouteWillChange(context: TransactionContext): Transaction | undefined;
|
24
|
+
}
|
25
|
+
/**
|
26
|
+
* Base Routing Instrumentation. Can be used by users to manually instrument custom routers.
|
27
|
+
* Pass this to the tracing integration, and call `onRouteWillChange` every time before a route changes.
|
28
|
+
*/
|
29
|
+
export declare class RoutingInstrumentation implements RoutingInstrumentationInstance {
|
30
|
+
static instrumentationName: string;
|
31
|
+
protected _getCurrentHub?: () => Hub;
|
32
|
+
protected _beforeNavigate?: BeforeNavigate;
|
33
|
+
protected _onConfirmRoute?: OnConfirmRoute;
|
34
|
+
protected _tracingListener?: TransactionCreator;
|
35
|
+
/** @inheritdoc */
|
36
|
+
registerRoutingInstrumentation(listener: TransactionCreator, beforeNavigate: BeforeNavigate, onConfirmRoute: OnConfirmRoute): void;
|
37
|
+
/** @inheritdoc */
|
38
|
+
onRouteWillChange(context: TransactionContext): Transaction | undefined;
|
39
|
+
}
|
40
|
+
/**
|
41
|
+
* Internal base routing instrumentation where `_onConfirmRoute` is not called in onRouteWillChange
|
42
|
+
*/
|
43
|
+
export declare class InternalRoutingInstrumentation extends RoutingInstrumentation {
|
44
|
+
/** @inheritdoc */
|
45
|
+
onRouteWillChange(context: TransactionContext): Transaction | undefined;
|
46
|
+
}
|
@@ -0,0 +1,33 @@
|
|
1
|
+
/**
|
2
|
+
* Base Routing Instrumentation. Can be used by users to manually instrument custom routers.
|
3
|
+
* Pass this to the tracing integration, and call `onRouteWillChange` every time before a route changes.
|
4
|
+
*/
|
5
|
+
export class RoutingInstrumentation {
|
6
|
+
/** @inheritdoc */
|
7
|
+
registerRoutingInstrumentation(listener, beforeNavigate, onConfirmRoute) {
|
8
|
+
this._tracingListener = listener;
|
9
|
+
this._beforeNavigate = beforeNavigate;
|
10
|
+
this._onConfirmRoute = onConfirmRoute;
|
11
|
+
}
|
12
|
+
/** @inheritdoc */
|
13
|
+
onRouteWillChange(context) {
|
14
|
+
var _a, _b;
|
15
|
+
const transaction = (_a = this._tracingListener) === null || _a === void 0 ? void 0 : _a.call(this, context);
|
16
|
+
if (transaction) {
|
17
|
+
(_b = this._onConfirmRoute) === null || _b === void 0 ? void 0 : _b.call(this, context);
|
18
|
+
}
|
19
|
+
return transaction;
|
20
|
+
}
|
21
|
+
}
|
22
|
+
RoutingInstrumentation.instrumentationName = 'base-routing-instrumentation';
|
23
|
+
/**
|
24
|
+
* Internal base routing instrumentation where `_onConfirmRoute` is not called in onRouteWillChange
|
25
|
+
*/
|
26
|
+
export class InternalRoutingInstrumentation extends RoutingInstrumentation {
|
27
|
+
/** @inheritdoc */
|
28
|
+
onRouteWillChange(context) {
|
29
|
+
var _a;
|
30
|
+
return (_a = this._tracingListener) === null || _a === void 0 ? void 0 : _a.call(this, context);
|
31
|
+
}
|
32
|
+
}
|
33
|
+
//# sourceMappingURL=routingInstrumentation.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"routingInstrumentation.js","sourceRoot":"","sources":["../../src/tracing/routingInstrumentation.ts"],"names":[],"mappings":"AAmCA;;;GAGG;AACH,MAAM,OAAO,sBAAsB;IAQ/B,kBAAkB;IACX,8BAA8B,CACjC,QAA4B,EAC5B,cAA8B,EAC9B,cAA8B;QAE9B,IAAI,CAAC,gBAAgB,GAAG,QAAQ,CAAC;QACjC,IAAI,CAAC,eAAe,GAAG,cAAc,CAAC;QACtC,IAAI,CAAC,eAAe,GAAG,cAAc,CAAC;IAC1C,CAAC;IAED,kBAAkB;IACX,iBAAiB,CACpB,OAA2B;;QAE3B,MAAM,WAAW,GAAG,MAAA,IAAI,CAAC,gBAAgB,qDAAG,OAAO,CAAC,CAAC;QAErD,IAAI,WAAW,EAAE;YACb,MAAA,IAAI,CAAC,eAAe,qDAAG,OAAO,CAAC,CAAC;SACnC;QAED,OAAO,WAAW,CAAC;IACvB,CAAC;;AA7Ba,0CAAmB,GAAW,8BAA8B,CAAC;AAgC/E;;GAEG;AACH,MAAM,OAAO,8BAA+B,SAAQ,sBAAsB;IACtE,kBAAkB;IACX,iBAAiB,CACpB,OAA2B;;QAE3B,OAAO,MAAA,IAAI,CAAC,gBAAgB,qDAAG,OAAO,CAAC,CAAC;IAC5C,CAAC;CACJ"}
|
@@ -0,0 +1,92 @@
|
|
1
|
+
import { IdleTransaction, Transaction } from '@sentry/tracing';
|
2
|
+
import { MeasurementUnit, Measurements } from '@sentry/types';
|
3
|
+
export interface StallMeasurements extends Measurements {
|
4
|
+
'stall_count': {
|
5
|
+
value: number;
|
6
|
+
unit: MeasurementUnit;
|
7
|
+
};
|
8
|
+
'stall_total_time': {
|
9
|
+
value: number;
|
10
|
+
unit: MeasurementUnit;
|
11
|
+
};
|
12
|
+
'stall_longest_time': {
|
13
|
+
value: number;
|
14
|
+
unit: MeasurementUnit;
|
15
|
+
};
|
16
|
+
}
|
17
|
+
export interface StallTrackingOptions {
|
18
|
+
/**
|
19
|
+
* How long in milliseconds an event loop iteration can be delayed for before being considered a "stall."
|
20
|
+
* @default 100
|
21
|
+
*/
|
22
|
+
minimumStallThreshold: number;
|
23
|
+
}
|
24
|
+
/**
|
25
|
+
* Stall measurement tracker inspired by the `JSEventLoopWatchdog` used internally in React Native:
|
26
|
+
* https://github.com/facebook/react-native/blob/006f5afe120c290a37cf6ff896748fbc062bf7ed/Libraries/Interaction/JSEventLoopWatchdog.js
|
27
|
+
*
|
28
|
+
* However, we modified the interval implementation to instead have a fixed loop timeout interval of `LOOP_TIMEOUT_INTERVAL_MS`.
|
29
|
+
* We then would consider that iteration a stall when the total time for that interval to run is greater than `LOOP_TIMEOUT_INTERVAL_MS + minimumStallThreshold`
|
30
|
+
*/
|
31
|
+
export declare class StallTrackingInstrumentation {
|
32
|
+
isTracking: boolean;
|
33
|
+
private _minimumStallThreshold;
|
34
|
+
/** Total amount of time of all stalls that occurred during the current tracking session */
|
35
|
+
private _totalStallTime;
|
36
|
+
/** Total number of stalls that occurred during the current tracking session */
|
37
|
+
private _stallCount;
|
38
|
+
/** The last timestamp the iteration ran in milliseconds */
|
39
|
+
private _lastIntervalMs;
|
40
|
+
private _timeout;
|
41
|
+
private _statsByTransaction;
|
42
|
+
constructor(options?: StallTrackingOptions);
|
43
|
+
/**
|
44
|
+
* @inheritDoc
|
45
|
+
* Not used for this integration. Instead call `registerTransactionStart` to start tracking.
|
46
|
+
*/
|
47
|
+
setupOnce(): void;
|
48
|
+
/**
|
49
|
+
* Register a transaction as started. Starts stall tracking if not already running.
|
50
|
+
* @returns A finish method that returns the stall measurements.
|
51
|
+
*/
|
52
|
+
onTransactionStart(transaction: Transaction): void;
|
53
|
+
/**
|
54
|
+
* Logs a transaction as finished.
|
55
|
+
* Stops stall tracking if no more transactions are running.
|
56
|
+
* @returns The stall measurements
|
57
|
+
*/
|
58
|
+
onTransactionFinish(transaction: Transaction | IdleTransaction, passedEndTimestamp?: number): void;
|
59
|
+
/**
|
60
|
+
* Logs the finish time of the span for use in `trimEnd: true` transactions.
|
61
|
+
*/
|
62
|
+
private _markSpanFinish;
|
63
|
+
/**
|
64
|
+
* Get the current stats for a transaction at a given time.
|
65
|
+
*/
|
66
|
+
private _getCurrentStats;
|
67
|
+
/**
|
68
|
+
* Start tracking stalls
|
69
|
+
*/
|
70
|
+
private _startTracking;
|
71
|
+
/**
|
72
|
+
* Stops the stall tracking interval and calls reset().
|
73
|
+
*/
|
74
|
+
private _stopTracking;
|
75
|
+
/**
|
76
|
+
* Will stop tracking if there are no more transactions.
|
77
|
+
*/
|
78
|
+
private _shouldStopTracking;
|
79
|
+
/**
|
80
|
+
* Clears all the collected stats
|
81
|
+
*/
|
82
|
+
private _reset;
|
83
|
+
/**
|
84
|
+
* Iteration of the stall tracking interval. Measures how long the timer strayed from its expected time of running, and how
|
85
|
+
* long the stall is for.
|
86
|
+
*/
|
87
|
+
private _iteration;
|
88
|
+
/**
|
89
|
+
* Deletes leaked transactions (Earliest transactions when we have more than MAX_RUNNING_TRANSACTIONS transactions.)
|
90
|
+
*/
|
91
|
+
private _flushLeakedTransactions;
|
92
|
+
}
|