@goliapkg/sentori-react-native 1.0.0-rc.9 → 1.1.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/bin/sentori-rn-upload-source-bundle.cjs +193 -0
- package/lib/capture.d.ts +34 -0
- package/lib/capture.d.ts.map +1 -1
- package/lib/capture.js +96 -2
- package/lib/capture.js.map +1 -1
- package/lib/config.d.ts +3 -0
- package/lib/config.d.ts.map +1 -1
- package/lib/config.js.map +1 -1
- package/lib/heartbeat.d.ts +9 -0
- package/lib/heartbeat.d.ts.map +1 -0
- package/lib/heartbeat.js +140 -0
- package/lib/heartbeat.js.map +1 -0
- package/lib/index.d.ts +30 -3
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +30 -4
- package/lib/index.js.map +1 -1
- package/lib/init.d.ts +9 -0
- package/lib/init.d.ts.map +1 -1
- package/lib/init.js +19 -0
- package/lib/init.js.map +1 -1
- package/lib/install-id.d.ts +17 -0
- package/lib/install-id.d.ts.map +1 -0
- package/lib/install-id.js +125 -0
- package/lib/install-id.js.map +1 -0
- package/lib/lifecycle.d.ts +28 -0
- package/lib/lifecycle.d.ts.map +1 -0
- package/lib/lifecycle.js +73 -0
- package/lib/lifecycle.js.map +1 -0
- package/lib/metrics.d.ts +18 -1
- package/lib/metrics.d.ts.map +1 -1
- package/lib/metrics.js +19 -2
- package/lib/metrics.js.map +1 -1
- package/lib/navigation.d.ts +1 -0
- package/lib/navigation.d.ts.map +1 -1
- package/lib/navigation.js +20 -0
- package/lib/navigation.js.map +1 -1
- package/lib/replay.d.ts +3 -1
- package/lib/replay.d.ts.map +1 -1
- package/lib/replay.js +8 -3
- package/lib/replay.js.map +1 -1
- package/lib/report-security.d.ts +40 -0
- package/lib/report-security.d.ts.map +1 -0
- package/lib/report-security.js +159 -0
- package/lib/report-security.js.map +1 -0
- package/lib/track.d.ts +34 -0
- package/lib/track.d.ts.map +1 -0
- package/lib/track.js +98 -0
- package/lib/track.js.map +1 -0
- package/lib/transport.d.ts +15 -0
- package/lib/transport.d.ts.map +1 -1
- package/lib/transport.js +23 -0
- package/lib/transport.js.map +1 -1
- package/lib/trust-score.d.ts +20 -0
- package/lib/trust-score.d.ts.map +1 -0
- package/lib/trust-score.js +151 -0
- package/lib/trust-score.js.map +1 -0
- package/package.json +7 -3
- package/src/__tests__/install-id.test.ts +60 -0
- package/src/__tests__/report-security.test.ts +106 -0
- package/src/__tests__/track.test.ts +91 -0
- package/src/capture.ts +111 -3
- package/src/config.ts +3 -0
- package/src/heartbeat.ts +158 -0
- package/src/index.ts +59 -2
- package/src/init.ts +27 -0
- package/src/install-id.ts +146 -0
- package/src/lifecycle.ts +76 -0
- package/src/metrics.ts +19 -1
- package/src/navigation.ts +26 -0
- package/src/replay.ts +11 -4
- package/src/report-security.ts +165 -0
- package/src/track.ts +114 -0
- package/src/transport.ts +35 -0
- package/src/trust-score.ts +176 -0
package/lib/index.d.ts
CHANGED
|
@@ -4,16 +4,24 @@ import { clearMaskQuery, registerMaskQuery } from './mask';
|
|
|
4
4
|
import { measureFn } from './measure';
|
|
5
5
|
import { getColdStartMs, markTimeToFullDisplay } from './mobile-vitals';
|
|
6
6
|
import { bindState, recordState, unbindState } from './state-snapshots';
|
|
7
|
-
import { startMoment } from '@goliapkg/sentori-core';
|
|
7
|
+
import { startMoment, startSpan, startTrace, withScopedSpan } from '@goliapkg/sentori-core';
|
|
8
|
+
import { getInstallId } from './install-id';
|
|
8
9
|
import { flushMetrics, recordMetric } from './metrics';
|
|
10
|
+
import { close, flush } from './lifecycle';
|
|
11
|
+
import { linkFederatedIdentity, reportPinMismatch, reportSecurity } from './report-security';
|
|
12
|
+
import { flushTrack, track } from './track';
|
|
13
|
+
import { queryTrustScore } from './trust-score';
|
|
9
14
|
import { RageTapCapture } from './rage-tap';
|
|
10
15
|
export declare const sentori: {
|
|
11
16
|
init: (options: import("./init").InitOptions) => void;
|
|
12
17
|
addBreadcrumb: (input: import("./breadcrumbs").AddBreadcrumbInput) => void;
|
|
13
18
|
setUser: (user: import("@goliapkg/sentori-core").User | null) => void;
|
|
14
19
|
getUser: () => import("@goliapkg/sentori-core").User | null;
|
|
20
|
+
setTag: (key: string, value: string) => void;
|
|
21
|
+
setTags: (record: Record<string, string>) => void;
|
|
15
22
|
captureError: (error: Error, extras?: import("./capture").CaptureExtras) => void;
|
|
16
23
|
captureException: (error: Error, extras?: import("./capture").CaptureExtras) => void;
|
|
24
|
+
captureMessage: (message: string, opts?: import("@goliapkg/sentori-core").CaptureMessageOptions | undefined) => void | undefined;
|
|
17
25
|
captureStep: (label: string, opts?: Partial<import("@goliapkg/sentori-core").TrailStep>) => void;
|
|
18
26
|
sendUserFeedback: (input: {
|
|
19
27
|
body: string;
|
|
@@ -27,8 +35,18 @@ export declare const sentori: {
|
|
|
27
35
|
}>;
|
|
28
36
|
recordMetric: typeof recordMetric;
|
|
29
37
|
flushMetrics: typeof flushMetrics;
|
|
38
|
+
track: typeof track;
|
|
39
|
+
flushTrack: typeof flushTrack;
|
|
40
|
+
getInstallId: typeof getInstallId;
|
|
41
|
+
reportSecurity: typeof reportSecurity;
|
|
42
|
+
reportPinMismatch: typeof reportPinMismatch;
|
|
43
|
+
queryTrustScore: typeof queryTrustScore;
|
|
44
|
+
linkFederatedIdentity: typeof linkFederatedIdentity;
|
|
30
45
|
measureFn: typeof measureFn;
|
|
31
46
|
startMoment: typeof startMoment;
|
|
47
|
+
startSpan: typeof startSpan;
|
|
48
|
+
startTrace: typeof startTrace;
|
|
49
|
+
withScopedSpan: typeof withScopedSpan;
|
|
32
50
|
bindState: typeof bindState;
|
|
33
51
|
recordState: typeof recordState;
|
|
34
52
|
unbindState: typeof unbindState;
|
|
@@ -46,19 +64,28 @@ export declare const sentori: {
|
|
|
46
64
|
startSession: () => void;
|
|
47
65
|
endSession: (status?: "exited") => void;
|
|
48
66
|
markSessionCrashed: () => void;
|
|
67
|
+
flush: typeof flush;
|
|
68
|
+
close: typeof close;
|
|
49
69
|
};
|
|
50
70
|
export default sentori;
|
|
51
71
|
export { init, init as initSentori } from './init';
|
|
52
72
|
export { addBreadcrumb } from './breadcrumbs';
|
|
53
|
-
export { captureError, captureException, captureStep, getUser, sendUserFeedback, setUser, } from './capture';
|
|
73
|
+
export { captureError, captureException, captureMessage, captureStep, getUser, sendUserFeedback, setTag, setTags, setUser, } from './capture';
|
|
74
|
+
export { startMoment, startSpan, startTrace, withScopedSpan, type SpanContextLike, type StartSpanOptions, } from '@goliapkg/sentori-core';
|
|
75
|
+
export { close, flush } from './lifecycle';
|
|
76
|
+
export type { CaptureMessageOptions, MessageLevel, } from '@goliapkg/sentori-core';
|
|
54
77
|
export { ErrorBoundary } from './error-boundary';
|
|
55
78
|
export { FeedbackButton, type FeedbackButtonHandle, type FeedbackButtonProps } from './feedback-widget';
|
|
56
79
|
export { clearAllFeatureFlags, clearFeatureFlag, getFeatureFlags, setFeatureFlag, } from './feature-flags';
|
|
57
80
|
export { clearMaskQuery, registerMaskQuery } from './mask';
|
|
58
81
|
export { flushMetrics, recordMetric } from './metrics';
|
|
82
|
+
export { flushTrack, track, type TrackEvent, type TrackProps } from './track';
|
|
83
|
+
export { getInstallId, peekInstallId } from './install-id';
|
|
84
|
+
export { linkFederatedIdentity, reportPinMismatch, reportSecurity, type SecurityReportData, } from './report-security';
|
|
85
|
+
export { queryTrustScore, type TrustScore, type TrustSignal, } from './trust-score';
|
|
59
86
|
export { measureFn } from './measure';
|
|
60
87
|
export { getColdStartMs, markTimeToFullDisplay, type TimeToFullDisplayHandle, } from './mobile-vitals';
|
|
61
|
-
export { MomentHandle, type MomentProperties
|
|
88
|
+
export { MomentHandle, type MomentProperties } from '@goliapkg/sentori-core';
|
|
62
89
|
export { bindState, recordState, type StateSnapshot, unbindState, } from './state-snapshots';
|
|
63
90
|
export { RageTapCapture } from './rage-tap';
|
|
64
91
|
export { probeNativeScreenshot, probeNativeWireframe, startAnrWatchdog, stopAnrWatchdog, triggerNativeCrash, } from './native';
|
package/lib/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/lib/index.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { init } from './init';
|
|
2
2
|
import { addBreadcrumb } from './breadcrumbs';
|
|
3
|
-
import { captureError, captureException, captureStep, getUser, sendUserFeedback, setUser, } from './capture';
|
|
3
|
+
import { captureError, captureException, captureMessage, captureStep, getUser, sendUserFeedback, setTag, setTags, setUser, } from './capture';
|
|
4
4
|
import { ErrorBoundary } from './error-boundary';
|
|
5
5
|
import { FeedbackButton } from './feedback-widget';
|
|
6
6
|
import { clearAllFeatureFlags, clearFeatureFlag, getFeatureFlags, setFeatureFlag, } from './feature-flags';
|
|
@@ -8,8 +8,13 @@ import { clearMaskQuery, registerMaskQuery } from './mask';
|
|
|
8
8
|
import { measureFn } from './measure';
|
|
9
9
|
import { getColdStartMs, markTimeToFullDisplay, } from './mobile-vitals';
|
|
10
10
|
import { bindState, recordState, unbindState } from './state-snapshots';
|
|
11
|
-
import { startMoment } from '@goliapkg/sentori-core';
|
|
11
|
+
import { startMoment, startSpan, startTrace, withScopedSpan, } from '@goliapkg/sentori-core';
|
|
12
|
+
import { getInstallId } from './install-id';
|
|
12
13
|
import { flushMetrics, recordMetric } from './metrics';
|
|
14
|
+
import { close, flush } from './lifecycle';
|
|
15
|
+
import { linkFederatedIdentity, reportPinMismatch, reportSecurity } from './report-security';
|
|
16
|
+
import { flushTrack, track } from './track';
|
|
17
|
+
import { queryTrustScore } from './trust-score';
|
|
13
18
|
import { RageTapCapture } from './rage-tap';
|
|
14
19
|
import { endSession, markSessionCrashed, startSession, } from './session-tracker';
|
|
15
20
|
export const sentori = {
|
|
@@ -17,14 +22,27 @@ export const sentori = {
|
|
|
17
22
|
addBreadcrumb,
|
|
18
23
|
setUser,
|
|
19
24
|
getUser,
|
|
25
|
+
setTag,
|
|
26
|
+
setTags,
|
|
20
27
|
captureError,
|
|
21
28
|
captureException,
|
|
29
|
+
captureMessage,
|
|
22
30
|
captureStep,
|
|
23
31
|
sendUserFeedback,
|
|
24
32
|
recordMetric,
|
|
25
33
|
flushMetrics,
|
|
34
|
+
track,
|
|
35
|
+
flushTrack,
|
|
36
|
+
getInstallId,
|
|
37
|
+
reportSecurity,
|
|
38
|
+
reportPinMismatch,
|
|
39
|
+
queryTrustScore,
|
|
40
|
+
linkFederatedIdentity,
|
|
26
41
|
measureFn,
|
|
27
42
|
startMoment,
|
|
43
|
+
startSpan,
|
|
44
|
+
startTrace,
|
|
45
|
+
withScopedSpan,
|
|
28
46
|
bindState,
|
|
29
47
|
recordState,
|
|
30
48
|
unbindState,
|
|
@@ -42,19 +60,27 @@ export const sentori = {
|
|
|
42
60
|
startSession,
|
|
43
61
|
endSession,
|
|
44
62
|
markSessionCrashed,
|
|
63
|
+
flush,
|
|
64
|
+
close,
|
|
45
65
|
};
|
|
46
66
|
export default sentori;
|
|
47
67
|
export { init, init as initSentori } from './init';
|
|
48
68
|
export { addBreadcrumb } from './breadcrumbs';
|
|
49
|
-
export { captureError, captureException, captureStep, getUser, sendUserFeedback, setUser, } from './capture';
|
|
69
|
+
export { captureError, captureException, captureMessage, captureStep, getUser, sendUserFeedback, setTag, setTags, setUser, } from './capture';
|
|
70
|
+
export { startMoment, startSpan, startTrace, withScopedSpan, } from '@goliapkg/sentori-core';
|
|
71
|
+
export { close, flush } from './lifecycle';
|
|
50
72
|
export { ErrorBoundary } from './error-boundary';
|
|
51
73
|
export { FeedbackButton } from './feedback-widget';
|
|
52
74
|
export { clearAllFeatureFlags, clearFeatureFlag, getFeatureFlags, setFeatureFlag, } from './feature-flags';
|
|
53
75
|
export { clearMaskQuery, registerMaskQuery } from './mask';
|
|
54
76
|
export { flushMetrics, recordMetric } from './metrics';
|
|
77
|
+
export { flushTrack, track } from './track';
|
|
78
|
+
export { getInstallId, peekInstallId } from './install-id';
|
|
79
|
+
export { linkFederatedIdentity, reportPinMismatch, reportSecurity, } from './report-security';
|
|
80
|
+
export { queryTrustScore, } from './trust-score';
|
|
55
81
|
export { measureFn } from './measure';
|
|
56
82
|
export { getColdStartMs, markTimeToFullDisplay, } from './mobile-vitals';
|
|
57
|
-
export { MomentHandle
|
|
83
|
+
export { MomentHandle } from '@goliapkg/sentori-core';
|
|
58
84
|
export { bindState, recordState, unbindState, } from './state-snapshots';
|
|
59
85
|
export { RageTapCapture } from './rage-tap';
|
|
60
86
|
export { probeNativeScreenshot, probeNativeWireframe, startAnrWatchdog, stopAnrWatchdog, triggerNativeCrash, } from './native';
|
package/lib/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAC9B,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,EACL,YAAY,EACZ,gBAAgB,EAChB,WAAW,EACX,OAAO,EACP,gBAAgB,EAChB,OAAO,GACR,MAAM,WAAW,CAAC;AACnB,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,cAAc,EAAuD,MAAM,mBAAmB,CAAC;AACxG,OAAO,EACL,oBAAoB,EACpB,gBAAgB,EAChB,eAAe,EACf,cAAc,GACf,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,QAAQ,CAAC;AAC3D,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EACL,cAAc,EACd,qBAAqB,GAEtB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACxE,OAAO,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/lib/init.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { type HeartbeatOptions } from './heartbeat';
|
|
1
2
|
import { type PreCrashChannel } from './pre-crash-sentinel';
|
|
2
3
|
import type { AttachmentMeta } from './types';
|
|
3
4
|
export type InitOptions = {
|
|
@@ -69,6 +70,11 @@ export type InitOptions = {
|
|
|
69
70
|
flushMs?: number;
|
|
70
71
|
sampleMs?: number;
|
|
71
72
|
};
|
|
73
|
+
/** Analytics v1 — live-presence heartbeat. Foreground 1/min
|
|
74
|
+
* default; opt out with `false`, or pass an options object
|
|
75
|
+
* to tune. Powers the Audience > Live dashboard.
|
|
76
|
+
* Iron-rule budget: < 1 KB / min, < 1 ms / call. */
|
|
77
|
+
heartbeat?: boolean | HeartbeatOptions;
|
|
72
78
|
/** v0.9.0 #3 — launch-crash loop guard. When two consecutive
|
|
73
79
|
* launches don't reach `markLaunchCompleted()` (typical of an
|
|
74
80
|
* OTA update with a fatal bug), invoke the host callback with
|
|
@@ -89,6 +95,9 @@ export type InitOptions = {
|
|
|
89
95
|
sampling?: {
|
|
90
96
|
errors?: null | number;
|
|
91
97
|
traces?: null | number;
|
|
98
|
+
/** v2.0 — sampling rate for `kind: 'message'` events emitted
|
|
99
|
+
* via `sentori.captureMessage()`. `null` / absent → keep all. */
|
|
100
|
+
messages?: null | number;
|
|
92
101
|
};
|
|
93
102
|
};
|
|
94
103
|
export declare const init: (options: InitOptions) => void;
|
package/lib/init.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../src/init.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../src/init.ts"],"names":[],"mappings":"AAeA,OAAO,EAAkB,KAAK,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAKpE,OAAO,EAAyB,KAAK,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAUnF,OAAO,KAAK,EAAkB,cAAc,EAA2B,MAAM,SAAS,CAAC;AAIvF,MAAM,MAAM,WAAW,GAAG;IACxB,sDAAsD;IACtD,KAAK,EAAE,MAAM,CAAC;IACd,4DAA4D;IAC5D,OAAO,EAAE,MAAM,CAAC;IAChB,sEAAsE;IACtE,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,qFAAqF;IACrF,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,iEAAiE;IACjE,OAAO,CAAC,EAAE;QACR,YAAY,CAAC,EAAE,OAAO,CAAC;QACvB,iBAAiB,CAAC,EAAE,OAAO,CAAC;QAC5B,OAAO,CAAC,EACJ,OAAO,GACP;YACE;;qEAEyD;YACzD,OAAO,CAAC,EAAE,OAAO,CAAC;SACnB,CAAC;QACN;;8DAEsD;QACtD,QAAQ,CAAC,EAAE,OAAO,CAAC;QACnB;;;;;;;uBAOe;QACf,UAAU,CAAC,EAAE,OAAO,CAAC;QACrB;;;6CAGqC;QACrC,YAAY,CAAC,EAAE,OAAO,CAAC;QACvB;;;;6CAIqC;QACrC,gBAAgB,CAAC,EAAE,OAAO,CAAC;QAC3B,gBAAgB,CAAC,EAAE,eAAe,EAAE,CAAC;QACrC;;;;6CAIqC;QACrC,eAAe,CAAC,EAAE,OAAO,GAAG;YAAE,WAAW,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC;QACrD;;;mEAG2D;QAC3D,MAAM,CAAC,EAAE,KAAK,GAAG,WAAW,GAAG;YAAE,EAAE,CAAC,EAAE,MAAM,CAAC;YAAC,IAAI,EAAE,KAAK,GAAG,WAAW,CAAA;SAAE,CAAC;QAC1E;;;;uCAI+B;QAC/B,cAAc,CAAC,EAAE,OAAO,GAAG;YAAE,OAAO,CAAC,EAAE,MAAM,CAAC;YAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC;QACnE;;;6DAGqD;QACrD,SAAS,CAAC,EAAE,OAAO,GAAG,gBAAgB,CAAC;QACvC;;;sEAG8D;QAC9D,gBAAgB,CAAC,EAAE;YACjB,OAAO,EAAE,OAAO,CAAC;YACjB,qBAAqB,CAAC,EAAE,CACtB,IAAI,EAAE,OAAO,sBAAsB,EAAE,eAAe,KAElD,OAAO,sBAAsB,EAAE,iBAAiB,GAChD,OAAO,CAAC,OAAO,sBAAsB,EAAE,iBAAiB,CAAC,CAAC;YAC9D,SAAS,CAAC,EAAE,MAAM,CAAC;YACnB,SAAS,CAAC,EAAE,MAAM,CAAC;SACpB,CAAC;KACH,CAAC;IACF;;;;;gEAK4D;IAC5D,QAAQ,CAAC,EAAE;QACT,MAAM,CAAC,EAAE,IAAI,GAAG,MAAM,CAAC;QACvB,MAAM,CAAC,EAAE,IAAI,GAAG,MAAM,CAAC;QACvB;0EACkE;QAClE,QAAQ,CAAC,EAAE,IAAI,GAAG,MAAM,CAAC;KAC1B,CAAC;CACH,CAAC;AAIF,eAAO,MAAM,IAAI,GAAI,SAAS,WAAW,KAAG,IAwL3C,CAAC;AAiBF,YAAY,EAAE,cAAc,EAAE,CAAC"}
|
package/lib/init.js
CHANGED
|
@@ -5,9 +5,12 @@ import { installPromiseHandler } from './handlers/promise';
|
|
|
5
5
|
import { installNetworkHandler } from './handlers/network';
|
|
6
6
|
import { getBundleInfo } from './bundle-info';
|
|
7
7
|
import { markLaunchCompleted, runLaunchCrashGuard, } from './launch-crash-guard';
|
|
8
|
+
import { getInstallId } from './install-id';
|
|
8
9
|
import { startMetricsTimer } from './metrics';
|
|
10
|
+
import { startTrackTimer } from './track';
|
|
9
11
|
import { drainNativePending, markNativeJsBridgeReady, setNativeConfig } from './native';
|
|
10
12
|
import { getColdStartMs } from './mobile-vitals';
|
|
13
|
+
import { startHeartbeat } from './heartbeat';
|
|
11
14
|
import { startSpan } from '@goliapkg/sentori-core';
|
|
12
15
|
import { startControlChannel } from './control-channel';
|
|
13
16
|
import { startLongTaskMonitor } from './long-task-monitor';
|
|
@@ -44,6 +47,7 @@ export const init = (options) => {
|
|
|
44
47
|
screenshotsEnabled: options.capture?.screenshot === true,
|
|
45
48
|
errorSampleRate: options.sampling?.errors ?? null,
|
|
46
49
|
traceSampleRate: options.sampling?.traces ?? null,
|
|
50
|
+
messageSampleRate: options.sampling?.messages ?? null,
|
|
47
51
|
sessionTrailEnabled: options.capture?.sessionTrail === true,
|
|
48
52
|
});
|
|
49
53
|
// Tell the native crash handler about the config so the JSON it writes
|
|
@@ -80,6 +84,13 @@ export const init = (options) => {
|
|
|
80
84
|
startNetworkTypeWatch();
|
|
81
85
|
// v0.8.3 — drain custom-metric ring every 30 s.
|
|
82
86
|
startMetricsTimer();
|
|
87
|
+
// v1.1 chunk B — drain `sentori.track()` ring every 30 s.
|
|
88
|
+
startTrackTimer();
|
|
89
|
+
// v1.1 chunk S1 — warm the install-id cache. Fire-and-forget;
|
|
90
|
+
// any event captured before the first resolve simply omits
|
|
91
|
+
// `device.installId`. Subsequent captures pick it up via the
|
|
92
|
+
// sync `peekInstallId()` read in collectDevice().
|
|
93
|
+
void getInstallId();
|
|
83
94
|
// v0.9.1 +S4 — pre-crash sentinel. Off by default; opt-in via
|
|
84
95
|
// `capture.preCrashSentinel: true`.
|
|
85
96
|
if (options.capture?.preCrashSentinel === true) {
|
|
@@ -129,6 +140,14 @@ export const init = (options) => {
|
|
|
129
140
|
startSession();
|
|
130
141
|
installLifecycleHandler();
|
|
131
142
|
}
|
|
143
|
+
// Analytics v1 — live-presence heartbeat. Foreground 1/min by
|
|
144
|
+
// default; pass `capture.heartbeat = false` to opt out, or
|
|
145
|
+
// `{ intervalMs: 30_000 }` to override. The default budget is well
|
|
146
|
+
// under the "几乎不能造成性能抖动" rule (CLAUDE.md).
|
|
147
|
+
const heartbeatOpt = capture.heartbeat;
|
|
148
|
+
if (heartbeatOpt !== false) {
|
|
149
|
+
startHeartbeat(typeof heartbeatOpt === 'object' ? heartbeatOpt : {});
|
|
150
|
+
}
|
|
132
151
|
// Drain events persisted from previous session (best-effort):
|
|
133
152
|
// - native crashes from <Documents>/sentori/pending/*.json
|
|
134
153
|
// - JS transport offline queue from AsyncStorage
|
package/lib/init.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.js","sourceRoot":"","sources":["../src/init.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AACrC,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AACzD,OAAO,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AAC/D,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAC3D,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAC3D,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,EACL,mBAAmB,EACnB,mBAAmB,GACpB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAC9C,OAAO,EAAE,kBAAkB,EAAE,uBAAuB,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AACxF,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACnD,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,qBAAqB,EAAE,MAAM,WAAW,CAAC;AAClD,OAAO,EAAE,qBAAqB,EAAwB,MAAM,sBAAsB,CAAC;AACnF,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AACvC,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EACL,iBAAiB,EACjB,OAAO,EACP,cAAc,EACd,gBAAgB,GACjB,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../src/init.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Resolve the device's stable install id, generating one if absent.
|
|
3
|
+
* Cached in memory after first resolve so subsequent calls are sync-
|
|
4
|
+
* adjacent (no storage I/O). Idempotent under concurrent calls — a
|
|
5
|
+
* second caller during the first resolve awaits the same promise.
|
|
6
|
+
*/
|
|
7
|
+
export declare function getInstallId(): Promise<string>;
|
|
8
|
+
/** Sync read of the currently-cached install id. `null` before the
|
|
9
|
+
* first `getInstallId()` resolves. Use this in hot paths (event
|
|
10
|
+
* payload assembly) that can't await storage; callers should kick
|
|
11
|
+
* off `getInstallId()` once at startup to warm the cache. */
|
|
12
|
+
export declare function peekInstallId(): null | string;
|
|
13
|
+
export declare function __resetInstallIdForTests(): void;
|
|
14
|
+
/** For tests + advanced operator flows that need to seed an id from
|
|
15
|
+
* an external secure-storage migration. */
|
|
16
|
+
export declare function __setInstallIdForTests(id: string): void;
|
|
17
|
+
//# sourceMappingURL=install-id.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"install-id.d.ts","sourceRoot":"","sources":["../src/install-id.ts"],"names":[],"mappings":"AA0EA;;;;;GAKG;AACH,wBAAsB,YAAY,IAAI,OAAO,CAAC,MAAM,CAAC,CA8CpD;AAED;;;8DAG8D;AAC9D,wBAAgB,aAAa,IAAI,IAAI,GAAG,MAAM,CAE7C;AAED,wBAAgB,wBAAwB,IAAI,IAAI,CAG/C;AAED;4CAC4C;AAC5C,wBAAgB,sBAAsB,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAEvD"}
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
// v1.1 chunk S1 — stable per-install identifier.
|
|
2
|
+
//
|
|
3
|
+
// `getInstallId()` returns a UUIDv7 generated on first call and
|
|
4
|
+
// persisted to device storage. The id survives app restarts and, on
|
|
5
|
+
// iOS specifically, app reinstalls (because the Keychain backend is
|
|
6
|
+
// preserved across uninstall — that's the whole point).
|
|
7
|
+
//
|
|
8
|
+
// Storage tier order:
|
|
9
|
+
// 1. `react-native-keychain` (optional peer; iOS + Android Keystore)
|
|
10
|
+
// 2. AsyncStorage (host already needs this for launch-crash-guard /
|
|
11
|
+
// offline queue, so we don't add a hard new peer dep)
|
|
12
|
+
// 3. Process-memory only (no persistence — covers SSR / tests)
|
|
13
|
+
//
|
|
14
|
+
// Opaque to the host. The id is NOT tied to a `setUser` call; the
|
|
15
|
+
// server doesn't auto-correlate to user identity. It exists purely
|
|
16
|
+
// as a stable device key so the security posture engine (S3) can
|
|
17
|
+
// score per-install signals independently of authentication state.
|
|
18
|
+
import { uuidV7 } from '@goliapkg/sentori-core';
|
|
19
|
+
import { isAnyNativeModuleLinked } from './native-loader';
|
|
20
|
+
const KEYCHAIN_SERVICE = 'sentori.install-id';
|
|
21
|
+
const ASYNC_STORAGE_KEY = '@sentori/install-id';
|
|
22
|
+
let _cached = null;
|
|
23
|
+
let _inflight = null;
|
|
24
|
+
function loadKeychain() {
|
|
25
|
+
// react-native-keychain is the recommended secure-storage peer.
|
|
26
|
+
// Optional: if the host hasn't installed it we fall through to
|
|
27
|
+
// AsyncStorage. The Keychain backend is what gives the iOS
|
|
28
|
+
// "survives reinstall" guarantee.
|
|
29
|
+
try {
|
|
30
|
+
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
31
|
+
const mod = require('react-native-keychain');
|
|
32
|
+
if (typeof mod.getGenericPassword !== 'function')
|
|
33
|
+
return null;
|
|
34
|
+
return mod;
|
|
35
|
+
}
|
|
36
|
+
catch {
|
|
37
|
+
return null;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
function loadAsyncStorage() {
|
|
41
|
+
if (!isAnyNativeModuleLinked(['RNCAsyncStorage', 'AsyncStorageModule'])) {
|
|
42
|
+
return null;
|
|
43
|
+
}
|
|
44
|
+
try {
|
|
45
|
+
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
46
|
+
const mod = require('@react-native-async-storage/async-storage');
|
|
47
|
+
return mod.default ?? mod;
|
|
48
|
+
}
|
|
49
|
+
catch {
|
|
50
|
+
return null;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Resolve the device's stable install id, generating one if absent.
|
|
55
|
+
* Cached in memory after first resolve so subsequent calls are sync-
|
|
56
|
+
* adjacent (no storage I/O). Idempotent under concurrent calls — a
|
|
57
|
+
* second caller during the first resolve awaits the same promise.
|
|
58
|
+
*/
|
|
59
|
+
export async function getInstallId() {
|
|
60
|
+
if (_cached !== null)
|
|
61
|
+
return _cached;
|
|
62
|
+
if (_inflight !== null)
|
|
63
|
+
return _inflight;
|
|
64
|
+
_inflight = (async () => {
|
|
65
|
+
try {
|
|
66
|
+
const kc = loadKeychain();
|
|
67
|
+
if (kc) {
|
|
68
|
+
const existing = await kc
|
|
69
|
+
.getGenericPassword({ service: KEYCHAIN_SERVICE })
|
|
70
|
+
.catch(() => false);
|
|
71
|
+
if (existing && existing.password) {
|
|
72
|
+
_cached = existing.password;
|
|
73
|
+
return existing.password;
|
|
74
|
+
}
|
|
75
|
+
const fresh = uuidV7();
|
|
76
|
+
await kc
|
|
77
|
+
.setGenericPassword('sentori', fresh, { service: KEYCHAIN_SERVICE })
|
|
78
|
+
.catch(() => undefined);
|
|
79
|
+
_cached = fresh;
|
|
80
|
+
return fresh;
|
|
81
|
+
}
|
|
82
|
+
const storage = loadAsyncStorage();
|
|
83
|
+
if (storage) {
|
|
84
|
+
const existing = await storage
|
|
85
|
+
.getItem(ASYNC_STORAGE_KEY)
|
|
86
|
+
.catch(() => null);
|
|
87
|
+
if (existing) {
|
|
88
|
+
_cached = existing;
|
|
89
|
+
return existing;
|
|
90
|
+
}
|
|
91
|
+
const fresh = uuidV7();
|
|
92
|
+
await storage.setItem(ASYNC_STORAGE_KEY, fresh).catch(() => undefined);
|
|
93
|
+
_cached = fresh;
|
|
94
|
+
return fresh;
|
|
95
|
+
}
|
|
96
|
+
// No storage available — generate but don't persist. The id is
|
|
97
|
+
// still stable for the lifetime of the process which is good
|
|
98
|
+
// enough for tests / SSR / no-native-modules contexts.
|
|
99
|
+
const fresh = uuidV7();
|
|
100
|
+
_cached = fresh;
|
|
101
|
+
return fresh;
|
|
102
|
+
}
|
|
103
|
+
finally {
|
|
104
|
+
_inflight = null;
|
|
105
|
+
}
|
|
106
|
+
})();
|
|
107
|
+
return _inflight;
|
|
108
|
+
}
|
|
109
|
+
/** Sync read of the currently-cached install id. `null` before the
|
|
110
|
+
* first `getInstallId()` resolves. Use this in hot paths (event
|
|
111
|
+
* payload assembly) that can't await storage; callers should kick
|
|
112
|
+
* off `getInstallId()` once at startup to warm the cache. */
|
|
113
|
+
export function peekInstallId() {
|
|
114
|
+
return _cached;
|
|
115
|
+
}
|
|
116
|
+
export function __resetInstallIdForTests() {
|
|
117
|
+
_cached = null;
|
|
118
|
+
_inflight = null;
|
|
119
|
+
}
|
|
120
|
+
/** For tests + advanced operator flows that need to seed an id from
|
|
121
|
+
* an external secure-storage migration. */
|
|
122
|
+
export function __setInstallIdForTests(id) {
|
|
123
|
+
_cached = id;
|
|
124
|
+
}
|
|
125
|
+
//# sourceMappingURL=install-id.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"install-id.js","sourceRoot":"","sources":["../src/install-id.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Force-flush every pending Sentori buffer (events, metrics,
|
|
3
|
+
* track). Returns when the flush settles or the timeout fires —
|
|
4
|
+
* whichever happens first.
|
|
5
|
+
*
|
|
6
|
+
* Never rejects: per the NEVER rule, individual flush failures
|
|
7
|
+
* are silently absorbed (and self-reported via the internal
|
|
8
|
+
* circuit-breaker), and the resolved promise's value is undefined.
|
|
9
|
+
*
|
|
10
|
+
* await sentori.flush(5_000) // wait up to 5 s, then move on
|
|
11
|
+
* process.exit(0)
|
|
12
|
+
*/
|
|
13
|
+
export declare function flush(timeoutMs?: number): Promise<void>;
|
|
14
|
+
/**
|
|
15
|
+
* Flush + shut down. After `close()`, further capture* calls remain
|
|
16
|
+
* silent no-ops via `_closed` gate. Idempotent — re-calling is safe.
|
|
17
|
+
*
|
|
18
|
+
* await sentori.close()
|
|
19
|
+
* // SDK is asleep; no more events go out.
|
|
20
|
+
*/
|
|
21
|
+
export declare function close(timeoutMs?: number): Promise<void>;
|
|
22
|
+
/** Test hook — reset the shutdown latch so unit tests don't have to
|
|
23
|
+
* re-init the whole SDK between cases. */
|
|
24
|
+
export declare function __resetLifecycleForTests(): void;
|
|
25
|
+
/** Internal — capture* implementations check this to short-circuit
|
|
26
|
+
* after `close()`. */
|
|
27
|
+
export declare function isClosed(): boolean;
|
|
28
|
+
//# sourceMappingURL=lifecycle.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lifecycle.d.ts","sourceRoot":"","sources":["../src/lifecycle.ts"],"names":[],"mappings":"AAiBA;;;;;;;;;;;GAWG;AACH,wBAAsB,KAAK,CAAC,SAAS,GAAE,MAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAsBpE;AAED;;;;;;GAMG;AACH,wBAAsB,KAAK,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAG7D;AAED;2CAC2C;AAC3C,wBAAgB,wBAAwB,IAAI,IAAI,CAE/C;AAED;uBACuB;AACvB,wBAAgB,QAAQ,IAAI,OAAO,CAElC"}
|
package/lib/lifecycle.js
ADDED
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
// v2.0 W3 — top-level lifecycle: flush / close.
|
|
2
|
+
//
|
|
3
|
+
// Sentry / OTel parity: a single `flush(timeoutMs?)` that drains
|
|
4
|
+
// every in-flight buffer (events / metrics / track), gated by a
|
|
5
|
+
// timeout so a slow network doesn't hang the host's shutdown path.
|
|
6
|
+
//
|
|
7
|
+
// Use before short-lived process exit (CLI / serverless function /
|
|
8
|
+
// fixture cleanup) to ensure pending captures land before the
|
|
9
|
+
// process dies.
|
|
10
|
+
import { flush as flushTransport } from './transport';
|
|
11
|
+
import { flushMetrics } from './metrics';
|
|
12
|
+
import { flushTrack } from './track';
|
|
13
|
+
import { reportInternal } from '@goliapkg/sentori-core';
|
|
14
|
+
let _closed = false;
|
|
15
|
+
/**
|
|
16
|
+
* Force-flush every pending Sentori buffer (events, metrics,
|
|
17
|
+
* track). Returns when the flush settles or the timeout fires —
|
|
18
|
+
* whichever happens first.
|
|
19
|
+
*
|
|
20
|
+
* Never rejects: per the NEVER rule, individual flush failures
|
|
21
|
+
* are silently absorbed (and self-reported via the internal
|
|
22
|
+
* circuit-breaker), and the resolved promise's value is undefined.
|
|
23
|
+
*
|
|
24
|
+
* await sentori.flush(5_000) // wait up to 5 s, then move on
|
|
25
|
+
* process.exit(0)
|
|
26
|
+
*/
|
|
27
|
+
export async function flush(timeoutMs = 5_000) {
|
|
28
|
+
if (_closed)
|
|
29
|
+
return;
|
|
30
|
+
try {
|
|
31
|
+
const drainAll = Promise.all([
|
|
32
|
+
flushTransport().catch((err) => {
|
|
33
|
+
reportInternal('flush.transport', err);
|
|
34
|
+
}),
|
|
35
|
+
flushMetrics().catch((err) => {
|
|
36
|
+
reportInternal('flush.metrics', err);
|
|
37
|
+
}),
|
|
38
|
+
flushTrack().catch((err) => {
|
|
39
|
+
reportInternal('flush.track', err);
|
|
40
|
+
}),
|
|
41
|
+
]).then(() => undefined);
|
|
42
|
+
const timer = new Promise((resolve) => setTimeout(resolve, timeoutMs));
|
|
43
|
+
await Promise.race([drainAll, timer]);
|
|
44
|
+
}
|
|
45
|
+
catch (err) {
|
|
46
|
+
// Belt-and-braces: even though each branch already has its own
|
|
47
|
+
// catch, the wrapping race shouldn't be able to surface a
|
|
48
|
+
// failure to the host either. NEVER rule.
|
|
49
|
+
reportInternal('flush', err);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Flush + shut down. After `close()`, further capture* calls remain
|
|
54
|
+
* silent no-ops via `_closed` gate. Idempotent — re-calling is safe.
|
|
55
|
+
*
|
|
56
|
+
* await sentori.close()
|
|
57
|
+
* // SDK is asleep; no more events go out.
|
|
58
|
+
*/
|
|
59
|
+
export async function close(timeoutMs) {
|
|
60
|
+
await flush(timeoutMs);
|
|
61
|
+
_closed = true;
|
|
62
|
+
}
|
|
63
|
+
/** Test hook — reset the shutdown latch so unit tests don't have to
|
|
64
|
+
* re-init the whole SDK between cases. */
|
|
65
|
+
export function __resetLifecycleForTests() {
|
|
66
|
+
_closed = false;
|
|
67
|
+
}
|
|
68
|
+
/** Internal — capture* implementations check this to short-circuit
|
|
69
|
+
* after `close()`. */
|
|
70
|
+
export function isClosed() {
|
|
71
|
+
return _closed;
|
|
72
|
+
}
|
|
73
|
+
//# sourceMappingURL=lifecycle.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lifecycle.js","sourceRoot":"","sources":["../src/lifecycle.ts"],"names":[],"mappings":"AAAA,gDAAgD;AAChD,EAAE;AACF,iEAAiE;AACjE,gEAAgE;AAChE,mEAAmE;AACnE,EAAE;AACF,mEAAmE;AACnE,8DAA8D;AAC9D,gBAAgB;AAEhB,OAAO,EAAE,KAAK,IAAI,cAAc,EAAE,MAAM,aAAa,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAExD,IAAI,OAAO,GAAG,KAAK,CAAC;AAEpB;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,KAAK,UAAU,KAAK,CAAC,YAAoB,KAAK;IACnD,IAAI,OAAO;QAAE,OAAO;IACpB,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC;YAC3B,cAAc,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;gBAC7B,cAAc,CAAC,iBAAiB,EAAE,GAAG,CAAC,CAAC;YACzC,CAAC,CAAC;YACF,YAAY,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;gBAC3B,cAAc,CAAC,eAAe,EAAE,GAAG,CAAC,CAAC;YACvC,CAAC,CAAC;YACF,UAAU,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;gBACzB,cAAc,CAAC,aAAa,EAAE,GAAG,CAAC,CAAC;YACrC,CAAC,CAAC;SACH,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;QACzB,MAAM,KAAK,GAAG,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC,CAAC;QAC7E,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC;IACxC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,+DAA+D;QAC/D,0DAA0D;QAC1D,0CAA0C;QAC1C,cAAc,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;IAC/B,CAAC;AACH,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,KAAK,CAAC,SAAkB;IAC5C,MAAM,KAAK,CAAC,SAAS,CAAC,CAAC;IACvB,OAAO,GAAG,IAAI,CAAC;AACjB,CAAC;AAED;2CAC2C;AAC3C,MAAM,UAAU,wBAAwB;IACtC,OAAO,GAAG,KAAK,CAAC;AAClB,CAAC;AAED;uBACuB;AACvB,MAAM,UAAU,QAAQ;IACtB,OAAO,OAAO,CAAC;AACjB,CAAC"}
|
package/lib/metrics.d.ts
CHANGED
|
@@ -1,4 +1,21 @@
|
|
|
1
|
-
|
|
1
|
+
/**
|
|
2
|
+
* Record a numeric metric point. Cheap to call from a render hook —
|
|
3
|
+
* pushes into a 500-slot ring drained every 30 s (or on overflow).
|
|
4
|
+
*
|
|
5
|
+
* v2.0 — accepts an optional `parent: SpanContextLike` so a metric
|
|
6
|
+
* can be correlated to a span. The dashboard span-detail view joins
|
|
7
|
+
* metric points by `tags.span_id` / `tags.trace_id`.
|
|
8
|
+
*
|
|
9
|
+
* const span = sentori.startSpan({ name: 'db.query users' })
|
|
10
|
+
* sentori.recordMetric('db.query.duration_ms', 42, undefined, { parent: span })
|
|
11
|
+
* span.end({ status: 'ok' })
|
|
12
|
+
*/
|
|
13
|
+
export declare function recordMetric(name: string, value: number, tags?: Record<string, string>, opts?: {
|
|
14
|
+
parent?: {
|
|
15
|
+
spanId: string;
|
|
16
|
+
traceId: string;
|
|
17
|
+
};
|
|
18
|
+
}): void;
|
|
2
19
|
export declare function flushMetrics(): Promise<void>;
|
|
3
20
|
/**
|
|
4
21
|
* Start the 30 s flush timer. Called once from `init()`. Idempotent.
|
package/lib/metrics.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"metrics.d.ts","sourceRoot":"","sources":["../src/metrics.ts"],"names":[],"mappings":"AA6BA,wBAAgB,YAAY,CAC1B,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,EACb,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,
|
|
1
|
+
{"version":3,"file":"metrics.d.ts","sourceRoot":"","sources":["../src/metrics.ts"],"names":[],"mappings":"AA6BA;;;;;;;;;;;GAWG;AACH,wBAAgB,YAAY,CAC1B,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,EACb,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAC7B,IAAI,CAAC,EAAE;IAAE,MAAM,CAAC,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAA;CAAE,GACtD,IAAI,CAcN;AAED,wBAAsB,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC,CAOlD;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,IAAI,IAAI,CAQxC;AAED,wBAAgB,sBAAsB,IAAI,IAAI,CAM7C"}
|
package/lib/metrics.js
CHANGED
|
@@ -16,7 +16,19 @@ const MAX_BUFFER = 500;
|
|
|
16
16
|
const FLUSH_INTERVAL_MS = 30_000;
|
|
17
17
|
let _buf = [];
|
|
18
18
|
let _timer = null;
|
|
19
|
-
|
|
19
|
+
/**
|
|
20
|
+
* Record a numeric metric point. Cheap to call from a render hook —
|
|
21
|
+
* pushes into a 500-slot ring drained every 30 s (or on overflow).
|
|
22
|
+
*
|
|
23
|
+
* v2.0 — accepts an optional `parent: SpanContextLike` so a metric
|
|
24
|
+
* can be correlated to a span. The dashboard span-detail view joins
|
|
25
|
+
* metric points by `tags.span_id` / `tags.trace_id`.
|
|
26
|
+
*
|
|
27
|
+
* const span = sentori.startSpan({ name: 'db.query users' })
|
|
28
|
+
* sentori.recordMetric('db.query.duration_ms', 42, undefined, { parent: span })
|
|
29
|
+
* span.end({ status: 'ok' })
|
|
30
|
+
*/
|
|
31
|
+
export function recordMetric(name, value, tags, opts) {
|
|
20
32
|
if (!isInitialized())
|
|
21
33
|
return;
|
|
22
34
|
if (typeof name !== 'string' || name.length === 0 || name.length > 200)
|
|
@@ -25,7 +37,12 @@ export function recordMetric(name, value, tags) {
|
|
|
25
37
|
return;
|
|
26
38
|
if (tags && Object.keys(tags).length > 20)
|
|
27
39
|
return;
|
|
28
|
-
|
|
40
|
+
// Merge span-context tags so the dashboard can join metric points
|
|
41
|
+
// to the span that produced them without a separate schema column.
|
|
42
|
+
const finalTags = opts?.parent
|
|
43
|
+
? { ...(tags ?? {}), span_id: opts.parent.spanId, trace_id: opts.parent.traceId }
|
|
44
|
+
: tags;
|
|
45
|
+
_buf.push({ name, tags: finalTags, ts: new Date().toISOString(), value });
|
|
29
46
|
if (_buf.length >= MAX_BUFFER) {
|
|
30
47
|
void flushMetrics();
|
|
31
48
|
}
|