UNPKG

@sentry/react-native

Version:
99 lines 4.25 kB
/** * Per-(module, method, kind) aggregation of TurboModule invocations. * * The wrap layer in `wrapTurboModule` already measures each call's duration * and outcome. Sending one span per call would explode span counts on hot * async paths (every `RNSentry.captureEnvelope`, every JSI lookup, …) so * instead we keep O(1) per-key counters + a fixed-bucket histogram and flush * the aggregate at coarse-grained points (transaction finish, periodic timer). * * See https://github.com/getsentry/sentry-react-native/issues/6164. */ import type { TurboModuleCallKind } from './turboModuleTracker'; /** Upper-exclusive bucket boundaries in milliseconds, matching the issue. */ export declare const HISTOGRAM_BUCKETS_MS: readonly number[]; /** Suffixes used when serialising bucket counts (e.g. as span attributes). */ export declare const HISTOGRAM_BUCKET_LABELS: readonly string[]; /** * Aggregate counters for a single `(module, method, kind)` triplet. */ export interface TurboModuleAggregate { /** TurboModule name, e.g. `RNSentry`. */ name: string; /** Method name, e.g. `captureEnvelope`. */ method: string; /** Whether the invocation was `sync` (blocking) or `async` (returns a Promise). */ kind: TurboModuleCallKind; /** Number of calls recorded since the last drain. */ callCount: number; /** Number of calls that threw / rejected since the last drain. */ errorCount: number; /** Sum of call durations in milliseconds since the last drain. */ totalDurationMs: number; /** Largest single-call duration in milliseconds since the last drain. */ maxDurationMs: number; /** * Per-bucket call counts, aligned with {@link HISTOGRAM_BUCKETS_MS}. The * final entry is the overflow bucket (`>=500ms`). */ buckets: number[]; } /** * Replaces the set of TurboModule names whose calls should NOT be aggregated. * * Per the issue, users may want to opt-out specific modules (e.g. `RNSentry` * itself, to keep the signal clean of SDK overhead). An empty list (default) * means every wrapped module is aggregated. */ export declare function setIgnoredTurboModules(names: ReadonlyArray<string> | undefined): void; /** * Records a single TurboModule method invocation into the aggregate. * * Must be O(1): called on every wrapped method invocation, including hot * async paths. Negative durations (a clock skew artefact between push/pop) * are clamped to zero so they still increment counters but don't poison * totals or buckets. */ export declare function recordTurboModuleCall(args: { name: string; method: string; kind: TurboModuleCallKind; durationMs: number; errored: boolean; }): void; /** * Registers a callback fired exactly once when the aggregator transitions * from empty to non-empty — i.e. when the first record after a drain (or * after init) lands. The integration uses this to lazily schedule a periodic * flush only when there's work to do, so idle sessions don't churn timers. * * Pass `undefined` to unregister. */ export declare function setOnFirstTurboModuleRecord(cb: (() => void) | undefined): void; /** * Master switch for the aggregator. When disabled, `recordTurboModuleCall` * short-circuits and existing entries are cleared, so wrapped TurboModule * calls can't accumulate into a map that nothing ever drains (e.g. when the * integration was constructed with `enableAggregateStats: false`). * * Default: enabled. */ export declare function setAggregateRecordingEnabled(enabled: boolean): void; /** * Drains and returns the current aggregate, clearing the internal state. * * The returned array is a shallow copy: callers may freely mutate it (e.g. * to slice top-N) without affecting the next interval. `buckets` arrays on * each entry are also new instances. */ export declare function drainTurboModuleAggregate(): TurboModuleAggregate[]; /** * Returns whether the aggregator has anything to flush right now. Useful for * the periodic timer to skip a no-op send. */ export declare function hasTurboModuleAggregateData(): boolean; /** * Resets the aggregator. Tests only. */ export declare function _resetTurboModuleAggregator(): void; //# sourceMappingURL=turboModuleAggregator.d.ts.map