UNPKG

@zendesk/retrace

Version:

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

469 lines (468 loc) 28.1 kB
import type { Observable } from 'rxjs'; import { Subject } from 'rxjs'; import type { AddSpanToRecordingEvent, DefinitionModifiedEvent, RequiredSpanSeenEvent, StateTransitionEvent } from './debugTypes'; import { type CPUIdleLongTaskProcessor, type PerformanceEntryLike } from './firstCPUIdle'; import { type SpanMatcherFn } from './matchSpan'; import type { SpanAndAnnotation, SpanAnnotationRecord } from './spanAnnotationTypes'; import { type ActiveTraceConfig, type DraftTraceInput, type Span } from './spanTypes'; import type { TraceRecording } from './traceRecordingTypes'; import type { CompleteTraceDefinition, DraftTraceContext, InterruptionReasonPayload, RelationSchemasBase, TraceContext, TraceDefinitionModifications, TraceInterruptionReason, TraceModifications, TraceUtilities, TransitionDraftOptions } from './types'; import type { DistributiveOmit, StateHandlerPayloads } from './typeUtils'; declare const INITIAL_STATE = "draft"; type InitialTraceState = typeof INITIAL_STATE; export type NonTerminalTraceStates = InitialTraceState | 'active' | 'debouncing' | 'waiting-for-interactive' | 'waiting-for-children'; export declare const TERMINAL_STATES: readonly ["interrupted", "complete"]; type TerminalTraceStates = (typeof TERMINAL_STATES)[number]; export type TraceStates = NonTerminalTraceStates | TerminalTraceStates; export declare const isTerminalState: (state: TraceStates) => state is TerminalTraceStates; export declare const isEnteringTerminalState: <RelationSchemasT extends RelationSchemasBase<RelationSchemasT>>(onEnterState: OnEnterStatePayload<RelationSchemasT>) => onEnterState is FinalTransition<RelationSchemasT>; export declare const shouldPropagateChildInterruptToParent: (childTraceInterruptionReason: TraceInterruptionReason) => boolean; interface OnEnterActive { transitionToState: 'active'; transitionFromState: NonTerminalTraceStates; } interface OnEnterInterrupted<RelationSchemasT extends RelationSchemasBase<RelationSchemasT>> { transitionToState: 'interrupted'; transitionFromState: NonTerminalTraceStates; interruption: InterruptionReasonPayload<RelationSchemasT>; lastRelevantSpanAndAnnotation: SpanAndAnnotation<RelationSchemasT> | undefined; } interface OnEnterComplete<RelationSchemasT extends RelationSchemasBase<RelationSchemasT>> { transitionToState: 'complete'; transitionFromState: NonTerminalTraceStates; interruption?: InterruptionReasonPayload<RelationSchemasT>; cpuIdleSpanAndAnnotation: SpanAndAnnotation<RelationSchemasT> | undefined; completeSpanAndAnnotation: SpanAndAnnotation<RelationSchemasT> | undefined; lastRequiredSpanAndAnnotation: SpanAndAnnotation<RelationSchemasT> | undefined; lastRelevantSpanAndAnnotation: SpanAndAnnotation<RelationSchemasT> | undefined; } export type FinalTransition<RelationSchemasT extends RelationSchemasBase<RelationSchemasT>> = OnEnterInterrupted<RelationSchemasT> | OnEnterComplete<RelationSchemasT>; interface OnEnterWaitingForInteractive { transitionToState: 'waiting-for-interactive'; transitionFromState: NonTerminalTraceStates; } interface OnEnterWaitingForChildren { transitionToState: 'waiting-for-children'; transitionFromState: NonTerminalTraceStates; } interface OnEnterDebouncing { transitionToState: 'debouncing'; transitionFromState: NonTerminalTraceStates; } export type OnEnterStatePayload<RelationSchemasT extends RelationSchemasBase<RelationSchemasT>> = OnEnterActive | OnEnterInterrupted<RelationSchemasT> | OnEnterComplete<RelationSchemasT> | OnEnterDebouncing | OnEnterWaitingForInteractive | OnEnterWaitingForChildren; export type Transition<RelationSchemasT extends RelationSchemasBase<RelationSchemasT>> = DistributiveOmit<OnEnterStatePayload<RelationSchemasT>, 'transitionFromState'>; export type States<SelectedRelationNameT extends keyof RelationSchemasT, RelationSchemasT extends RelationSchemasBase<RelationSchemasT>, VariantsT extends string> = TraceStateMachine<SelectedRelationNameT, RelationSchemasT, VariantsT>['states']; interface ChildEndEvent<RelationSchemasT extends RelationSchemasBase<RelationSchemasT>> { childTrace: AllPossibleTraces<RelationSchemasT>; terminalState: 'complete' | 'interrupted'; interruption?: InterruptionReasonPayload<RelationSchemasT>; } interface TraceStateMachineSideEffectHandlers<RelationSchemasT extends RelationSchemasBase<RelationSchemasT>> { readonly addSpanToRecording: (spanAndAnnotation: SpanAndAnnotation<RelationSchemasT>) => void; readonly onTerminalStateReached: (transition: FinalTransition<RelationSchemasT>) => void; readonly onError: (error: Error) => void; } type EntryType<RelationSchemasT extends RelationSchemasBase<RelationSchemasT>> = PerformanceEntryLike & { entry: SpanAndAnnotation<RelationSchemasT>; }; interface StateMachineContext<SelectedRelationNameT extends keyof RelationSchemasT, RelationSchemasT extends RelationSchemasBase<RelationSchemasT>, VariantsT extends string> extends DraftTraceContext<SelectedRelationNameT, RelationSchemasT, VariantsT> { sideEffectFns: TraceStateMachineSideEffectHandlers<RelationSchemasT>; children: ReadonlySet<AllPossibleTraces<RelationSchemasT>>; terminalStateChildren: ReadonlySet<AllPossibleTraces<RelationSchemasT>>; eventSubjects: { 'state-transition': Subject<StateTransitionEvent<SelectedRelationNameT, RelationSchemasT, VariantsT>>; 'required-span-seen': Subject<RequiredSpanSeenEvent<SelectedRelationNameT, RelationSchemasT, VariantsT>>; 'add-span-to-recording': Subject<AddSpanToRecordingEvent<SelectedRelationNameT, RelationSchemasT, VariantsT>>; 'definition-modified': Subject<DefinitionModifiedEvent<SelectedRelationNameT, RelationSchemasT, VariantsT>>; }; } type DeadlineType = 'global' | 'debounce' | 'interactive' | 'next-quiet-window'; export declare class TraceStateMachine<SelectedRelationNameT extends keyof RelationSchemasT, RelationSchemasT extends RelationSchemasBase<RelationSchemasT>, const VariantsT extends string> { #private; constructor(context: StateMachineContext<SelectedRelationNameT, RelationSchemasT, VariantsT>); readonly successfullyMatchedRequiredSpanMatchers: Set<SpanMatcherFn<SelectedRelationNameT, RelationSchemasT, VariantsT>>; get sideEffectFns(): TraceStateMachineSideEffectHandlers<RelationSchemasT>; currentState: TraceStates; /** the span that ended at the furthest point in time */ lastRelevant: SpanAndAnnotation<RelationSchemasT> | undefined; lastRequiredSpan: SpanAndAnnotation<RelationSchemasT> | undefined; /** it is set once the LRS value is established */ completeSpan: SpanAndAnnotation<RelationSchemasT> | undefined; cpuIdleLongTaskProcessor: CPUIdleLongTaskProcessor<EntryType<RelationSchemasT>> | undefined; nextDeadlineRef: ReturnType<typeof setTimeout> | undefined; setDeadline(deadlineType: Exclude<DeadlineType, 'global'>, deadlineEpoch: number): void; setGlobalDeadline(deadline: number): void; clearDeadline(): void; /** * while debouncing, we need to buffer any spans that come in so they can be re-processed * once we transition to the 'waiting-for-interactive' state * otherwise we might miss out on spans that are relevant to calculating the interactive * * if we have long tasks before FMP, we want to use them as a potential grouping post FMP. */ debouncingSpanBuffer: SpanAndAnnotation<RelationSchemasT>[]; readonly states: { draft: { onEnterState: () => void; onMakeActive: () => { transitionToState: "active"; }; onProcessSpan: (spanAndAnnotation: SpanAndAnnotation<RelationSchemasT>) => { readonly transitionToState: "interrupted"; readonly interruption: { readonly reason: "timeout"; }; readonly lastRelevantSpanAndAnnotation: undefined; } | { readonly transitionToState: "interrupted"; readonly interruption: { readonly reason: "matched-on-interrupt" | "matched-on-required-span-with-error"; }; readonly lastRelevantSpanAndAnnotation: undefined; } | undefined; onInterrupt: (reasonPayload: InterruptionReasonPayload<RelationSchemasT>) => { readonly transitionToState: "interrupted"; readonly interruption: InterruptionReasonPayload<RelationSchemasT>; readonly lastRelevantSpanAndAnnotation: undefined; }; onDeadline: (deadlineType: DeadlineType) => { readonly transitionToState: "interrupted"; readonly interruption: { readonly reason: "timeout"; }; readonly lastRelevantSpanAndAnnotation: undefined; } | undefined; onChildEnd: (event: ChildEndEvent<RelationSchemasT>) => { readonly transitionToState: "interrupted"; readonly interruption: { readonly reason: "child-interrupted" | "child-timeout"; }; readonly lastRelevantSpanAndAnnotation: undefined; } | undefined; }; active: { onEnterState: (_transition: OnEnterActive) => Transition<RelationSchemasT> | undefined; onProcessSpan: (spanAndAnnotation: SpanAndAnnotation<RelationSchemasT>) => { transitionToState: "interrupted"; interruption: { reason: "timeout"; }; lastRelevantSpanAndAnnotation: SpanAndAnnotation<RelationSchemasT> | undefined; } | { transitionToState: "interrupted"; interruption: { reason: "matched-on-interrupt" | "matched-on-required-span-with-error"; }; lastRelevantSpanAndAnnotation: SpanAndAnnotation<RelationSchemasT>; } | { transitionToState: "debouncing"; interruption?: undefined; lastRelevantSpanAndAnnotation?: undefined; } | undefined; onInterrupt: (reasonPayload: InterruptionReasonPayload<RelationSchemasT>) => { transitionToState: "interrupted"; interruption: InterruptionReasonPayload<RelationSchemasT>; lastRelevantSpanAndAnnotation: SpanAndAnnotation<RelationSchemasT> | undefined; }; onDeadline: (deadlineType: DeadlineType) => { transitionToState: "interrupted"; interruption: { reason: "timeout"; }; lastRelevantSpanAndAnnotation: SpanAndAnnotation<RelationSchemasT> | undefined; } | undefined; onChildEnd: (event: ChildEndEvent<RelationSchemasT>) => { transitionToState: "interrupted"; interruption: { reason: "child-interrupted" | "child-timeout"; }; lastRelevantSpanAndAnnotation: SpanAndAnnotation<RelationSchemasT> | undefined; } | undefined; }; debouncing: { onEnterState: (_payload: OnEnterDebouncing) => { transitionToState: "interrupted"; interruption: { reason: "invalid-state-transition"; }; lastRelevantSpanAndAnnotation: undefined; } | { transitionToState: "waiting-for-interactive"; interruption?: undefined; lastRelevantSpanAndAnnotation?: undefined; } | undefined; onDeadline: (deadlineType: DeadlineType) => { transitionToState: "interrupted"; interruption: { reason: "timeout"; }; lastRelevantSpanAndAnnotation: SpanAndAnnotation<RelationSchemasT> | undefined; } | { transitionToState: "waiting-for-children"; interruption?: undefined; lastRelevantSpanAndAnnotation?: undefined; } | { transitionToState: "waiting-for-interactive"; interruption?: undefined; lastRelevantSpanAndAnnotation?: undefined; } | undefined; onProcessSpan: (spanAndAnnotation: SpanAndAnnotation<RelationSchemasT>) => { transitionToState: "interrupted"; interruption: { reason: "timeout"; }; lastRelevantSpanAndAnnotation: SpanAndAnnotation<RelationSchemasT> | undefined; } | { transitionToState: "interrupted"; interruption: { reason: "matched-on-interrupt" | "matched-on-required-span-with-error"; }; lastRelevantSpanAndAnnotation: SpanAndAnnotation<RelationSchemasT>; } | { transitionToState: "waiting-for-interactive"; interruption?: undefined; lastRelevantSpanAndAnnotation?: undefined; } | { transitionToState: "interrupted"; interruption: { reason: "idle-component-no-longer-idle"; }; lastRelevantSpanAndAnnotation: SpanAndAnnotation<RelationSchemasT> | undefined; } | undefined; onInterrupt: (reasonPayload: InterruptionReasonPayload<RelationSchemasT>) => { transitionToState: "interrupted"; interruption: InterruptionReasonPayload<RelationSchemasT>; lastRelevantSpanAndAnnotation: SpanAndAnnotation<RelationSchemasT> | undefined; }; onChildEnd: (event: ChildEndEvent<RelationSchemasT>) => { transitionToState: "interrupted"; interruption: { reason: "child-interrupted" | "child-timeout"; }; lastRelevantSpanAndAnnotation: SpanAndAnnotation<RelationSchemasT> | undefined; } | undefined; }; 'waiting-for-interactive': { onEnterState: (_payload: OnEnterWaitingForInteractive) => Transition<RelationSchemasT> | undefined; onDeadline: (deadlineType: DeadlineType) => { transitionToState: "complete"; interruption: { reason: "timeout"; }; completeSpanAndAnnotation: SpanAndAnnotation<RelationSchemasT> | undefined; lastRequiredSpanAndAnnotation: SpanAndAnnotation<RelationSchemasT> | undefined; lastRelevantSpanAndAnnotation: SpanAndAnnotation<RelationSchemasT> | undefined; cpuIdleSpanAndAnnotation: undefined; } | { transitionToState: "complete"; lastRequiredSpanAndAnnotation: SpanAndAnnotation<RelationSchemasT> | undefined; completeSpanAndAnnotation: SpanAndAnnotation<RelationSchemasT> | undefined; cpuIdleSpanAndAnnotation: SpanAndAnnotation<RelationSchemasT>; lastRelevantSpanAndAnnotation: SpanAndAnnotation<RelationSchemasT> | undefined; interruption?: undefined; } | undefined; onProcessSpan: (spanAndAnnotation: SpanAndAnnotation<RelationSchemasT>) => { transitionToState: "waiting-for-children"; readonly lastRequiredSpanAndAnnotation?: undefined; readonly completeSpanAndAnnotation?: undefined; readonly cpuIdleSpanAndAnnotation?: undefined; lastRelevantSpanAndAnnotation?: undefined; interruption?: undefined; readonly interruptionReason?: undefined; } | { transitionToState: "complete"; lastRequiredSpanAndAnnotation: SpanAndAnnotation<RelationSchemasT> | undefined; completeSpanAndAnnotation: SpanAndAnnotation<RelationSchemasT> | undefined; cpuIdleSpanAndAnnotation: SpanAndAnnotation<RelationSchemasT>; lastRelevantSpanAndAnnotation: SpanAndAnnotation<RelationSchemasT> | undefined; interruption?: undefined; readonly interruptionReason?: undefined; } | { transitionToState: "complete"; interruption: { reason: "timeout"; }; lastRequiredSpanAndAnnotation: SpanAndAnnotation<RelationSchemasT> | undefined; completeSpanAndAnnotation: SpanAndAnnotation<RelationSchemasT> | undefined; lastRelevantSpanAndAnnotation: SpanAndAnnotation<RelationSchemasT> | undefined; cpuIdleSpanAndAnnotation: undefined; readonly interruptionReason?: undefined; } | { transitionToState: "complete"; interruption: { reason: "waiting-for-interactive-timeout"; }; lastRequiredSpanAndAnnotation: SpanAndAnnotation<RelationSchemasT> | undefined; completeSpanAndAnnotation: SpanAndAnnotation<RelationSchemasT> | undefined; lastRelevantSpanAndAnnotation: SpanAndAnnotation<RelationSchemasT> | undefined; cpuIdleSpanAndAnnotation: undefined; readonly interruptionReason?: undefined; } | { readonly transitionToState: "waiting-for-children"; readonly interruptionReason: { reason: string; }; readonly lastRequiredSpanAndAnnotation?: undefined; readonly completeSpanAndAnnotation?: undefined; readonly cpuIdleSpanAndAnnotation?: undefined; lastRelevantSpanAndAnnotation?: undefined; interruption?: undefined; } | { readonly transitionToState: "complete"; readonly interruption: { reason: "matched-on-required-span-with-error"; } | { reason: "matched-on-interrupt"; }; readonly lastRequiredSpanAndAnnotation: SpanAndAnnotation<RelationSchemasT> | undefined; readonly completeSpanAndAnnotation: SpanAndAnnotation<RelationSchemasT> | undefined; readonly lastRelevantSpanAndAnnotation: SpanAndAnnotation<RelationSchemasT> | undefined; readonly cpuIdleSpanAndAnnotation: undefined; readonly interruptionReason?: undefined; } | undefined; onInterrupt: (reasonPayload: InterruptionReasonPayload<RelationSchemasT>) => { transitionToState: "complete"; interruption: InterruptionReasonPayload<RelationSchemasT>; lastRequiredSpanAndAnnotation: SpanAndAnnotation<RelationSchemasT> | undefined; completeSpanAndAnnotation: SpanAndAnnotation<RelationSchemasT> | undefined; lastRelevantSpanAndAnnotation: SpanAndAnnotation<RelationSchemasT> | undefined; cpuIdleSpanAndAnnotation: undefined; }; onChildEnd: (event: ChildEndEvent<RelationSchemasT>) => { transitionToState: "interrupted"; interruption: { reason: "child-interrupted" | "child-timeout"; }; lastRelevantSpanAndAnnotation: SpanAndAnnotation<RelationSchemasT> | undefined; } | undefined; }; 'waiting-for-children': { onEnterState: (_payload: OnEnterWaitingForChildren) => { transitionToState: "complete"; completeSpanAndAnnotation: SpanAndAnnotation<RelationSchemasT> | undefined; cpuIdleSpanAndAnnotation: undefined; lastRequiredSpanAndAnnotation: SpanAndAnnotation<RelationSchemasT> | undefined; lastRelevantSpanAndAnnotation: SpanAndAnnotation<RelationSchemasT> | undefined; } | undefined; onChildEnd: (event: ChildEndEvent<RelationSchemasT>) => { transitionToState: "interrupted"; interruption: { reason: "child-interrupted" | "child-timeout"; }; lastRelevantSpanAndAnnotation: SpanAndAnnotation<RelationSchemasT> | undefined; readonly completeSpanAndAnnotation?: undefined; readonly cpuIdleSpanAndAnnotation?: undefined; readonly lastRequiredSpanAndAnnotation?: undefined; } | { transitionToState: "complete"; completeSpanAndAnnotation: SpanAndAnnotation<RelationSchemasT> | undefined; cpuIdleSpanAndAnnotation: undefined; lastRequiredSpanAndAnnotation: SpanAndAnnotation<RelationSchemasT> | undefined; lastRelevantSpanAndAnnotation: SpanAndAnnotation<RelationSchemasT> | undefined; interruption?: undefined; } | undefined; onProcessSpan: (spanAndAnnotation: SpanAndAnnotation<RelationSchemasT>) => undefined; onInterrupt: (reasonPayload: InterruptionReasonPayload<RelationSchemasT>) => { transitionToState: "interrupted"; interruption: InterruptionReasonPayload<RelationSchemasT>; lastRelevantSpanAndAnnotation: SpanAndAnnotation<RelationSchemasT> | undefined; }; onDeadline: (deadlineType: DeadlineType) => { transitionToState: "interrupted"; interruption: { reason: "timeout"; }; lastRelevantSpanAndAnnotation: SpanAndAnnotation<RelationSchemasT> | undefined; } | undefined; }; interrupted: { onEnterState: (transition: OnEnterInterrupted<RelationSchemasT>) => void; }; complete: { onEnterState: (transition: OnEnterComplete<RelationSchemasT>) => void; }; }; /** * @returns the last OnEnterState event if a transition was made */ emit<EventName extends keyof StateHandlerPayloads<SelectedRelationNameT, RelationSchemasT, VariantsT>>(event: EventName, payload: StateHandlerPayloads<SelectedRelationNameT, RelationSchemasT, VariantsT>[EventName], /** if called recursively inside of an event handler, it must be set to true to avoid double handling of terminal state */ internal?: boolean): OnEnterStatePayload<RelationSchemasT> | undefined; } export declare class Trace<const SelectedRelationNameT extends keyof RelationSchemasT, const RelationSchemasT extends RelationSchemasBase<RelationSchemasT>, const VariantsT extends string> implements TraceContext<SelectedRelationNameT, RelationSchemasT, VariantsT> { readonly sourceDefinition: CompleteTraceDefinition<SelectedRelationNameT, RelationSchemasT, VariantsT>; /** the source-of-truth - local copy of a final, mutable definition of this specific trace */ definition: CompleteTraceDefinition<SelectedRelationNameT, RelationSchemasT, VariantsT>; wasActivated: boolean; get activeInput(): ActiveTraceConfig<SelectedRelationNameT, RelationSchemasT, VariantsT>; set activeInput(value: ActiveTraceConfig<SelectedRelationNameT, RelationSchemasT, VariantsT>); wasReplaced: boolean; input: DraftTraceInput<RelationSchemasT[SelectedRelationNameT], VariantsT>; readonly traceUtilities: TraceUtilities<RelationSchemasT>; get isDraft(): boolean; recordedItems: Map<string, SpanAndAnnotation<RelationSchemasT>>; occurrenceCounters: Map<string, number>; processedPerformanceEntries: WeakMap<PerformanceEntry, SpanAndAnnotation<RelationSchemasT>>; persistedDefinitionModifications: Set<TraceDefinitionModifications<SelectedRelationNameT, RelationSchemasT, VariantsT>>; readonly recordedItemsByLabel: { [label: string]: Set<SpanAndAnnotation<RelationSchemasT>>; }; stateMachine: TraceStateMachine<SelectedRelationNameT, RelationSchemasT, VariantsT>; children: Set<AllPossibleTraces<RelationSchemasT>>; terminalStateChildren: Set<AllPossibleTraces<RelationSchemasT>>; adoptChild(childTrace: AllPossibleTraces<RelationSchemasT>): void; onChildEnd(childTrace: AllPossibleTraces<RelationSchemasT>, stateTransition: FinalTransition<RelationSchemasT>, traceRecording: TraceRecording<keyof RelationSchemasT, RelationSchemasT> | undefined): void; canAdoptChild(childTraceName: string): boolean; eventSubjects: { 'state-transition': Subject<StateTransitionEvent<SelectedRelationNameT, RelationSchemasT, VariantsT>>; 'required-span-seen': Subject<RequiredSpanSeenEvent<SelectedRelationNameT, RelationSchemasT, VariantsT>>; 'add-span-to-recording': Subject<AddSpanToRecordingEvent<SelectedRelationNameT, RelationSchemasT, VariantsT>>; 'definition-modified': Subject<DefinitionModifiedEvent<SelectedRelationNameT, RelationSchemasT, VariantsT>>; }; when(event: 'state-transition'): Observable<StateTransitionEvent<SelectedRelationNameT, RelationSchemasT, VariantsT>>; when(event: 'required-span-seen'): Observable<RequiredSpanSeenEvent<SelectedRelationNameT, RelationSchemasT, VariantsT>>; when(event: 'add-span-to-recording'): Observable<AddSpanToRecordingEvent<SelectedRelationNameT, RelationSchemasT, VariantsT>>; when(event: 'definition-modified'): Observable<DefinitionModifiedEvent<SelectedRelationNameT, RelationSchemasT, VariantsT>>; constructor(data: { definition: CompleteTraceDefinition<SelectedRelationNameT, RelationSchemasT, VariantsT>; input: DraftTraceInput<RelationSchemasT[SelectedRelationNameT], VariantsT>; definitionModifications?: TraceDefinitionModifications<SelectedRelationNameT, RelationSchemasT, VariantsT>; traceUtilities: TraceUtilities<RelationSchemasT>; } | { importFrom: Trace<SelectedRelationNameT, RelationSchemasT, VariantsT>; definitionModifications: TraceDefinitionModifications<SelectedRelationNameT, RelationSchemasT, VariantsT>; }); toJSON(): { input: DraftTraceInput<RelationSchemasT[SelectedRelationNameT], VariantsT>; definition: { name: string; }; }; sideEffectFns: TraceStateMachineSideEffectHandlers<RelationSchemasT>; private postProcessSpans; interrupt(reasonPayload: InterruptionReasonPayload<RelationSchemasT>): void; transitionDraftToActive(inputAndDefinitionModifications: TraceModifications<SelectedRelationNameT, RelationSchemasT, VariantsT>, { previouslyActivatedBehavior, invalidRelatedToBehavior, }?: TransitionDraftOptions): void; /** * The additions to the definition may come from either the variant at transition from draft to active * @param definitionModifications */ private applyDefinitionModifications; /** * This is used for importing spans when recreating a Trace from another Trace * if the definition was modified */ private replayItems; processSpan<SpanT extends Span<RelationSchemasT>>(span: SpanT): { spanAndAnnotation: SpanAndAnnotation<RelationSchemasT>; annotationRecord: SpanAnnotationRecord; } | undefined; /** * Creates a new trace that adds additional required spans or debounce spans. * Note: This recreates the Trace instance with the modified definition * and replays all the recorded spans immediately. */ recreateTraceWithDefinitionModifications(definitionModifications: TraceDefinitionModifications<SelectedRelationNameT, RelationSchemasT, VariantsT>): Trace<SelectedRelationNameT, RelationSchemasT, VariantsT>; private getSpanLabels; } export type AllPossibleTraces<RelationSchemasT extends RelationSchemasBase<RelationSchemasT>> = Trace<any, RelationSchemasT, any>; export {};