UNPKG

@zendesk/retrace

Version:

define and capture Product Operation Traces along with computed metrics with an optional friendly React beacon API

139 lines (138 loc) 12 kB
import type { SpanAnnotation } from './spanAnnotationTypes'; import type { Attributes, Span, SpanStatus, SpanType } from './spanTypes'; import type { RecordedSpan } from './traceRecordingTypes'; import type { DraftTraceContext, MapSchemaToTypes, RelationSchemasBase, TraceContext } from './types'; import type { UnionToIntersection } from './typeUtils'; export declare const INACTIVE_CONTEXT: DraftTraceContext<any, any, any>; export interface PublicSpanMatcherTags { /** * Only applicable for 'requiredSpans' list: it will opt-out of the default behavior, * which interrupts the trace if the requiredSpan has an error status. */ continueWithErrorStatus?: boolean; /** * If multiple matches are found, this specifies which match to use. * It can be set to a negative number to match from the end of the operation (backwards, with syntax like Array.prototype.slice()). * This only has an effect on matchers that run when the recording is complete, * e.g. in startSpan and endSpan for defining computed spans. */ nthMatch?: number; /** * Do not consider entries before this index. * This only has an effect on matchers that run when the recording is complete. */ lowestIndexToConsider?: number; /** * Index of last entry to consider. Will stop considering entries beyond this index. * This only has an effect on matchers that run when the recording is complete. */ highestIndexToConsider?: number; } export interface SpanMatcherTags extends PublicSpanMatcherTags { /** * @internal * Enables the idle-regression check. * Only has an effect in for component-lifecycle entries in 'requiredSpans' matchers list. */ idleCheck?: boolean; /** * @internal */ requiredSpan?: boolean; } export interface SpanAndAnnotationForMatching<RelationSchemasT extends RelationSchemasBase<RelationSchemasT>> { span: Span<RelationSchemasT> | RecordedSpan<RelationSchemasT>; annotation?: SpanAnnotation; } /** * Function type for matching performance entries. */ export interface SpanMatcherFn<SelectedRelationNameT extends keyof RelationSchemasT, RelationSchemasT extends RelationSchemasBase<RelationSchemasT>, VariantsT extends string> extends SpanMatcherTags { (spanAndAnnotation: SpanAndAnnotationForMatching<RelationSchemasT>, context: DraftTraceContext<SelectedRelationNameT, RelationSchemasT, VariantsT> | undefined): boolean; /** source definition object for debugging (if converted from object) */ fromDefinition?: SpanMatchDefinition<SelectedRelationNameT, RelationSchemasT, VariantsT>; } export type NameMatcher<RelationSchemaT> = string | RegExp | ((name: string, inputRelation: MapSchemaToTypes<RelationSchemaT> | undefined) => boolean); export interface SpanMatchDefinition<SelectedRelationNameT extends keyof RelationSchemasT, RelationSchemasT extends RelationSchemasBase<RelationSchemasT>, VariantsT extends string> extends PublicSpanMatcherTags { name?: NameMatcher<RelationSchemasT[SelectedRelationNameT]>; performanceEntryName?: NameMatcher<RelationSchemasT[SelectedRelationNameT]>; type?: SpanType; status?: SpanStatus; attributes?: Attributes; id?: string; matchingRelations?: (keyof UnionToIntersection<RelationSchemasT[SelectedRelationNameT]>)[] | boolean; /** The index of the reoccurrence within the span, calculated based on the span's type+name combination */ occurrence?: number | ((occurrence: number) => boolean); isIdle?: boolean; label?: string; renderCount?: number; fn?: SpanMatcherFn<SelectedRelationNameT, RelationSchemasT, VariantsT>; oneOf?: SpanMatchDefinition<SelectedRelationNameT, RelationSchemasT, VariantsT>[]; not?: SpanMatchDefinition<SelectedRelationNameT, RelationSchemasT, VariantsT>; } export type SpanMatch<SelectedRelationNameT extends keyof RelationSchemasT, RelationSchemasT extends RelationSchemasBase<RelationSchemasT>, VariantsT extends string> = SpanMatcherFn<SelectedRelationNameT, RelationSchemasT, VariantsT> | SpanMatchDefinition<SelectedRelationNameT, RelationSchemasT, VariantsT>; export interface ParentSpanMatcher<SelectedRelationNameT extends keyof RelationSchemasT, RelationSchemasT extends RelationSchemasBase<RelationSchemasT>, VariantsT extends string> { /** * Define the scope of the search for the parent span. * 'span-created-tick' will only search for spans created in the current tick, * while 'entire-recording' will search through all recorded spans * in the trace that was running when the span was created. * * Note that search === 'entire-recording' only works * when running the matcher when traceContext is available * (i.e. before Trace is disposed - while it's active, and when first creating the recording) */ search: 'span-created-tick' | 'span-ended-tick' | 'entire-recording'; searchDirection: 'after-self' | 'before-self'; match: SpanMatch<SelectedRelationNameT, RelationSchemasT, VariantsT>; } /** * The common name of the span to match. Can be a string, RegExp, or function. */ export declare function withName<const SelectedRelationNameT extends keyof RelationSchemasT, const RelationSchemasT extends RelationSchemasBase<RelationSchemasT>, const VariantsT extends string>(value: NameMatcher<RelationSchemasT[SelectedRelationNameT]>): SpanMatcherFn<SelectedRelationNameT, RelationSchemasT, VariantsT>; export declare function withLabel<const SelectedRelationNameT extends keyof RelationSchemasT, const RelationSchemasT extends RelationSchemasBase<RelationSchemasT>, const VariantsT extends string>(value: string): SpanMatcherFn<SelectedRelationNameT, RelationSchemasT, VariantsT>; /** * The PerformanceEntry.name of the entry to match. Can be a string, RegExp, or function. */ export declare function withPerformanceEntryName<const SelectedRelationNameT extends keyof RelationSchemasT, const RelationSchemasT extends RelationSchemasBase<RelationSchemasT>, const VariantsT extends string>(value: NameMatcher<RelationSchemasT[SelectedRelationNameT]>): SpanMatcherFn<SelectedRelationNameT, RelationSchemasT, VariantsT>; export declare function withType<const SelectedRelationNameT extends keyof RelationSchemasT, const RelationSchemasT extends RelationSchemasBase<RelationSchemasT>, const VariantsT extends string>(value: SpanType): SpanMatcherFn<SelectedRelationNameT, RelationSchemasT, VariantsT>; export declare function withStatus<const SelectedRelationNameT extends keyof RelationSchemasT, const RelationSchemasT extends RelationSchemasBase<RelationSchemasT>, const VariantsT extends string>(value: SpanStatus): SpanMatcherFn<SelectedRelationNameT, RelationSchemasT, VariantsT>; /** * The subset of attributes (metadata) to match against the span. */ export declare function withAttributes<const SelectedRelationNameT extends keyof RelationSchemasT, const RelationSchemasT extends RelationSchemasBase<RelationSchemasT>, const VariantsT extends string>(attrs: Attributes): SpanMatcherFn<SelectedRelationNameT, RelationSchemasT, VariantsT>; export declare function withId<const SelectedRelationNameT extends keyof RelationSchemasT, const RelationSchemasT extends RelationSchemasBase<RelationSchemasT>, const VariantsT extends string>(value: string): SpanMatcherFn<SelectedRelationNameT, RelationSchemasT, VariantsT>; /** * A list of keys of trace's relations to match against the span's. */ export declare function withMatchingRelations<const SelectedRelationNameT extends keyof RelationSchemasT, const RelationSchemasT extends RelationSchemasBase<RelationSchemasT>, const VariantsT extends string>(keys?: NoInfer<keyof UnionToIntersection<RelationSchemasT[SelectedRelationNameT]>>[] | true): SpanMatcherFn<SelectedRelationNameT, RelationSchemasT, VariantsT>; /** * The occurrence of the span with the same name and type within the operation. */ export declare function withOccurrence<const SelectedRelationNameT extends keyof RelationSchemasT, const RelationSchemasT extends RelationSchemasBase<RelationSchemasT>, const VariantsT extends string>(value: number | ((occurrence: number) => boolean)): SpanMatcherFn<SelectedRelationNameT, RelationSchemasT, VariantsT>; export declare function withComponentRenderCount<const SelectedRelationNameT extends keyof RelationSchemasT, const RelationSchemasT extends RelationSchemasBase<RelationSchemasT>, const VariantsT extends string>(name: NameMatcher<RelationSchemasT[SelectedRelationNameT]>, renderCount: number): SpanMatcherFn<SelectedRelationNameT, RelationSchemasT, VariantsT>; /** * only applicable for component-lifecycle entries */ export declare function whenIdle<const SelectedRelationNameT extends keyof RelationSchemasT, const RelationSchemasT extends RelationSchemasBase<RelationSchemasT>, const VariantsT extends string>(value?: boolean): SpanMatcherFn<SelectedRelationNameT, RelationSchemasT, VariantsT>; /** * @internal * tag matcher with a special, internal matcher tag, and match on span.status === 'error' */ export declare function requiredSpanWithErrorStatus<const SelectedRelationNameT extends keyof RelationSchemasT, const RelationSchemasT extends RelationSchemasBase<RelationSchemasT>, const VariantsT extends string>(): SpanMatcherFn<SelectedRelationNameT, RelationSchemasT, VariantsT>; /** * Only applicable for 'requiredSpans' list: it will opt-out of the default behavior, * which interrupts the trace if the requiredSpan has an error status. */ export declare function continueWithErrorStatus<const SelectedRelationNameT extends keyof RelationSchemasT, const RelationSchemasT extends RelationSchemasBase<RelationSchemasT>, const VariantsT extends string>(): SpanMatcherFn<SelectedRelationNameT, RelationSchemasT, VariantsT>; export declare function withAllConditions<const SelectedRelationNameT extends keyof RelationSchemasT, const RelationSchemasT extends RelationSchemasBase<RelationSchemasT>, const VariantsT extends string>(...matchers: SpanMatcherFn<SelectedRelationNameT, RelationSchemasT, VariantsT>[]): SpanMatcherFn<SelectedRelationNameT, RelationSchemasT, VariantsT>; export declare function withOneOfConditions<const SelectedRelationNameT extends keyof RelationSchemasT, const RelationSchemasT extends RelationSchemasBase<RelationSchemasT>, const VariantsT extends string>(...matchers: SpanMatcherFn<SelectedRelationNameT, RelationSchemasT, VariantsT>[]): SpanMatcherFn<SelectedRelationNameT, RelationSchemasT, VariantsT>; export declare function not<const SelectedRelationNameT extends keyof RelationSchemasT, const RelationSchemasT extends RelationSchemasBase<RelationSchemasT>, const VariantsT extends string>(matcher: SpanMatcherFn<SelectedRelationNameT, RelationSchemasT, VariantsT>): SpanMatcherFn<SelectedRelationNameT, RelationSchemasT, VariantsT>; export declare function fromDefinition<const SelectedRelationNameT extends keyof RelationSchemasT, const RelationSchemasT extends RelationSchemasBase<RelationSchemasT>, const VariantsT extends string>(definition: SpanMatchDefinition<SelectedRelationNameT, RelationSchemasT, VariantsT>): SpanMatcherFn<SelectedRelationNameT, RelationSchemasT, VariantsT>; /** * Evaluates a span matcher against an entry array. * Respects matching index, lowestIndexToConsider, and highestIndexToConsider. */ export declare function findMatchingSpan<const SelectedRelationNameT extends keyof RelationSchemasT, const RelationSchemasT extends RelationSchemasBase<RelationSchemasT>, const VariantsT extends string, const RecordedItem extends SpanAndAnnotationForMatching<RelationSchemasT>>(matcher: SpanMatcherFn<SelectedRelationNameT, RelationSchemasT, VariantsT>, recordedItemsArray: readonly RecordedItem[], context: TraceContext<SelectedRelationNameT, RelationSchemasT, VariantsT> | undefined, /** config argument can be used to override tags from matcher: */ { lowestIndexToConsider, highestIndexToConsider: highestIndexToConsiderInput, nthMatch, }?: PublicSpanMatcherTags): RecordedItem | undefined;