autotel-edge 3.0.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/LICENSE +21 -0
- package/README.md +333 -0
- package/dist/chunk-F32WSLNX.js +309 -0
- package/dist/chunk-F32WSLNX.js.map +1 -0
- package/dist/events.d.ts +86 -0
- package/dist/events.js +157 -0
- package/dist/events.js.map +1 -0
- package/dist/index.d.ts +326 -0
- package/dist/index.js +921 -0
- package/dist/index.js.map +1 -0
- package/dist/logger.d.ts +89 -0
- package/dist/logger.js +81 -0
- package/dist/logger.js.map +1 -0
- package/dist/sampling.d.ts +166 -0
- package/dist/sampling.js +108 -0
- package/dist/sampling.js.map +1 -0
- package/dist/testing.d.ts +2 -0
- package/dist/testing.js +3 -0
- package/dist/testing.js.map +1 -0
- package/dist/types-Dj85cPUj.d.ts +182 -0
- package/package.json +88 -0
- package/src/api/logger.test.ts +367 -0
- package/src/api/logger.ts +197 -0
- package/src/compose.ts +243 -0
- package/src/core/buffer.ts +16 -0
- package/src/core/config.test.ts +388 -0
- package/src/core/config.ts +167 -0
- package/src/core/context.ts +224 -0
- package/src/core/exporter.ts +99 -0
- package/src/core/provider.ts +45 -0
- package/src/core/span.ts +222 -0
- package/src/core/spanprocessor.test.ts +521 -0
- package/src/core/spanprocessor.ts +232 -0
- package/src/core/trace-context.ts +66 -0
- package/src/core/tracer.test.ts +123 -0
- package/src/core/tracer.ts +216 -0
- package/src/events/index.test.ts +242 -0
- package/src/events/index.ts +338 -0
- package/src/events.ts +6 -0
- package/src/functional.test.ts +702 -0
- package/src/functional.ts +846 -0
- package/src/index.ts +81 -0
- package/src/logger.ts +13 -0
- package/src/sampling/index.test.ts +297 -0
- package/src/sampling/index.ts +276 -0
- package/src/sampling.ts +6 -0
- package/src/testing/index.ts +9 -0
- package/src/testing.ts +6 -0
- package/src/types.ts +267 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/core/span.ts","../src/core/tracer.ts","../src/core/context.ts","../src/core/provider.ts","../src/core/buffer.ts","../src/core/trace-context.ts","../src/functional.ts"],"names":["context","api_context","sanitizeAttributes","span","trace","wrappedFunction","otelTrace","result"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Lightweight Span implementation for edge environments\n */\n\nimport type {\n Attributes,\n AttributeValue,\n Exception,\n HrTime,\n Link,\n Span,\n SpanContext,\n SpanKind,\n SpanStatus,\n SpanStatusCode,\n TimeInput,\n} from '@opentelemetry/api';\nimport {\n hrTimeDuration,\n type InstrumentationScope,\n isAttributeValue,\n isTimeInput,\n sanitizeAttributes,\n} from '@opentelemetry/core';\nimport type { Resource } from '@opentelemetry/resources';\nimport type { ReadableSpan, TimedEvent } from '@opentelemetry/sdk-trace-base';\nimport { SEMATTRS_EXCEPTION_MESSAGE, SEMATTRS_EXCEPTION_STACKTRACE, SEMATTRS_EXCEPTION_TYPE } from '@opentelemetry/semantic-conventions';\n\ntype OnSpanEnd = (span: Span) => void;\n\ninterface SpanInit {\n attributes: unknown;\n name: string;\n onEnd: OnSpanEnd;\n resource: Resource;\n spanContext: SpanContext;\n parentSpanContext?: SpanContext;\n links?: Link[];\n parentSpanId?: string;\n spanKind?: SpanKind;\n startTime?: TimeInput;\n}\n\nfunction transformExceptionAttributes(exception: Exception): Attributes {\n const attributes: Attributes = {};\n if (typeof exception === 'string') {\n attributes[SEMATTRS_EXCEPTION_MESSAGE] = exception;\n } else {\n if (exception.code) {\n attributes[SEMATTRS_EXCEPTION_TYPE] = exception.code.toString();\n } else if (exception.name) {\n attributes[SEMATTRS_EXCEPTION_TYPE] = exception.name;\n }\n if (exception.message) {\n attributes[SEMATTRS_EXCEPTION_MESSAGE] = exception.message;\n }\n if (exception.stack) {\n attributes[SEMATTRS_EXCEPTION_STACKTRACE] = exception.stack;\n }\n }\n return attributes;\n}\n\nfunction millisToHr(millis: number): HrTime {\n return [Math.trunc(millis / 1000), (millis % 1000) * 1e6];\n}\n\nfunction getHrTime(input?: TimeInput): HrTime {\n const now = Date.now();\n if (!input) {\n return millisToHr(now);\n } else if (input instanceof Date) {\n return millisToHr(input.getTime());\n } else if (typeof input === 'number') {\n return millisToHr(input);\n } else if (Array.isArray(input)) {\n return input;\n }\n\n const v: never = input;\n throw new Error(`unreachable value: ${JSON.stringify(v)}`);\n}\n\n// Previously exported from OTel, now private\nfunction isAttributeKey(key: unknown): key is string {\n return typeof key === 'string' && key.length > 0;\n}\n\n/**\n * Lightweight Span implementation for edge runtimes\n */\nexport class SpanImpl implements Span, ReadableSpan {\n name: string;\n private readonly _spanContext: SpanContext;\n private readonly onEnd: OnSpanEnd;\n readonly parentSpanId?: string;\n readonly parentSpanContext?: SpanContext | undefined;\n readonly kind: SpanKind;\n readonly attributes: Attributes;\n status: SpanStatus = {\n code: 0 as SpanStatusCode, // SpanStatusCode.UNSET\n };\n endTime: HrTime = [0, 0];\n private _duration: HrTime = [0, 0];\n readonly startTime: HrTime;\n readonly events: TimedEvent[] = [];\n readonly links: Link[];\n readonly resource: Resource;\n instrumentationScope: InstrumentationScope = {\n name: 'autotel-edge',\n };\n private _ended: boolean = false;\n private _droppedAttributesCount: number = 0;\n private _droppedEventsCount: number = 0;\n private _droppedLinksCount: number = 0;\n\n constructor(init: SpanInit) {\n this.name = init.name;\n this._spanContext = init.spanContext;\n this.parentSpanId = init.parentSpanId;\n this.parentSpanContext = init.parentSpanContext;\n this.kind = init.spanKind || (0 as SpanKind); // SpanKind.INTERNAL\n this.attributes = sanitizeAttributes(init.attributes);\n this.startTime = getHrTime(init.startTime);\n this.links = init.links || [];\n this.resource = init.resource;\n this.onEnd = init.onEnd;\n }\n\n addLink(link: Link): this {\n this.links.push(link);\n return this;\n }\n\n addLinks(links: Link[]): this {\n this.links.push(...links);\n return this;\n }\n\n spanContext(): SpanContext {\n return this._spanContext;\n }\n\n setAttribute(key: string, value?: AttributeValue): this {\n if (isAttributeKey(key) && isAttributeValue(value)) {\n this.attributes[key] = value;\n }\n return this;\n }\n\n setAttributes(attributes: Attributes): this {\n for (const [key, value] of Object.entries(attributes)) {\n this.setAttribute(key, value);\n }\n return this;\n }\n\n addEvent(\n name: string,\n attributesOrStartTime?: Attributes | TimeInput,\n startTime?: TimeInput,\n ): this {\n if (isTimeInput(attributesOrStartTime)) {\n startTime = attributesOrStartTime;\n attributesOrStartTime = undefined;\n }\n\n const attributes = sanitizeAttributes(attributesOrStartTime);\n const time = getHrTime(startTime);\n this.events.push({ name, attributes, time });\n return this;\n }\n\n setStatus(status: SpanStatus): this {\n this.status = status;\n return this;\n }\n\n updateName(name: string): this {\n this.name = name;\n return this;\n }\n\n end(endTime?: TimeInput): void {\n if (this._ended) {\n return;\n }\n this._ended = true;\n this.endTime = getHrTime(endTime);\n this._duration = hrTimeDuration(this.startTime, this.endTime);\n this.onEnd(this);\n }\n\n isRecording(): boolean {\n return !this._ended;\n }\n\n recordException(exception: Exception, time?: TimeInput): void {\n const attributes = transformExceptionAttributes(exception);\n this.addEvent('exception', attributes, time);\n }\n\n get duration(): HrTime {\n return this._duration;\n }\n\n get ended(): boolean {\n return this._ended;\n }\n\n get droppedAttributesCount(): number {\n return this._droppedAttributesCount;\n }\n\n get droppedEventsCount(): number {\n return this._droppedEventsCount;\n }\n\n get droppedLinksCount(): number {\n return this._droppedLinksCount;\n }\n}\n","/**\n * Lightweight WorkerTracer for edge environments\n */\n\nimport type {\n Attributes,\n Tracer,\n Span,\n SpanKind,\n SpanOptions,\n Context,\n} from '@opentelemetry/api';\nimport {\n context as api_context,\n trace,\n type SpanContext,\n} from '@opentelemetry/api';\nimport { sanitizeAttributes } from '@opentelemetry/core';\nimport type { Resource } from '@opentelemetry/resources';\nimport {\n type SpanProcessor,\n RandomIdGenerator,\n type ReadableSpan,\n SamplingDecision,\n} from '@opentelemetry/sdk-trace-base';\n\nimport { SpanImpl } from './span';\nimport type { TraceFlushableSpanProcessor } from '../types';\n\nconst NewTraceFlags = {\n RANDOM_TRACE_ID_SET: 2,\n RANDOM_TRACE_ID_UNSET: 0,\n} as const;\n\ntype NewTraceFlagValues =\n | typeof NewTraceFlags.RANDOM_TRACE_ID_SET\n | typeof NewTraceFlags.RANDOM_TRACE_ID_UNSET;\n\nconst idGenerator: RandomIdGenerator = new RandomIdGenerator();\n\nlet withNextSpanAttributes: Attributes;\n\nfunction getFlagAt(flagSequence: number, position: number): number {\n return ((flagSequence >> (position - 1)) & 1) * position;\n}\n\n/**\n * WorkerTracer - Lightweight tracer for edge environments\n */\nexport class WorkerTracer implements Tracer {\n private readonly spanProcessors: TraceFlushableSpanProcessor[];\n private readonly resource: Resource;\n private headSampler: any; // Will be set via setHeadSampler\n\n constructor(spanProcessors: SpanProcessor[], resource: Resource) {\n this.spanProcessors = spanProcessors as TraceFlushableSpanProcessor[];\n this.resource = resource;\n }\n\n /**\n * Set the head sampler (called from config)\n */\n setHeadSampler(sampler: any): void {\n this.headSampler = sampler;\n }\n\n /**\n * Force flush spans for a specific trace\n */\n async forceFlush(traceId?: string) {\n const promises = this.spanProcessors.map(async (spanProcessor) => {\n await spanProcessor.forceFlush(traceId);\n });\n await Promise.allSettled(promises);\n }\n\n /**\n * Add extra resource attributes\n */\n addToResource(extra: Resource) {\n this.resource.merge(extra);\n }\n\n /**\n * Start a new span\n */\n startSpan(\n name: string,\n options: SpanOptions = {},\n context = api_context.active(),\n ): Span {\n if (options.root) {\n context = trace.deleteSpan(context);\n }\n\n if (!this.headSampler) {\n throw new Error(\n 'Head sampler not configured. This is a bug in the instrumentation logic',\n );\n }\n\n const parentSpanContext = trace.getSpan(context)?.spanContext();\n const { traceId, randomTraceFlag } = getTraceInfo(parentSpanContext);\n\n const spanKind = options.kind || (0 as SpanKind); // SpanKind.INTERNAL\n const sanitisedAttrs = sanitizeAttributes(options.attributes);\n\n // Use per-span sampler if provided, otherwise use head sampler\n const optionsWithSampler = options as any;\n const sampler = optionsWithSampler.sampler || this.headSampler;\n\n const samplingDecision = sampler.shouldSample(\n context,\n traceId,\n name,\n spanKind,\n sanitisedAttrs,\n [],\n );\n const { decision, traceState, attributes: attrs } = samplingDecision;\n\n const attributes = Object.assign(\n {},\n options.attributes,\n attrs,\n withNextSpanAttributes,\n );\n withNextSpanAttributes = {};\n\n const spanId = idGenerator.generateSpanId();\n const parentSpanId = parentSpanContext?.spanId;\n\n const sampleFlag =\n decision === SamplingDecision.RECORD_AND_SAMPLED ? 1 : 0; // TraceFlags.SAMPLED : TraceFlags.NONE\n const traceFlags = sampleFlag + randomTraceFlag;\n const spanContext: SpanContext = { traceId, spanId, traceFlags, traceState };\n\n const span = new SpanImpl({\n attributes: sanitizeAttributes(attributes),\n name,\n onEnd: (span) => {\n for (const sp of this.spanProcessors) {\n sp.onEnd(span as unknown as ReadableSpan);\n }\n },\n resource: this.resource,\n spanContext,\n parentSpanContext,\n parentSpanId,\n spanKind,\n startTime: options.startTime,\n });\n\n for (const sp of this.spanProcessors) {\n //@ts-ignore - OTel type quirk\n sp.onStart(span, context);\n }\n\n return span;\n }\n\n /**\n * Start an active span (with automatic context management)\n */\n startActiveSpan<F extends (span: Span) => ReturnType<F>>(\n name: string,\n fn: F,\n ): ReturnType<F>;\n startActiveSpan<F extends (span: Span) => ReturnType<F>>(\n name: string,\n options: SpanOptions,\n fn: F,\n ): ReturnType<F>;\n startActiveSpan<F extends (span: Span) => ReturnType<F>>(\n name: string,\n options: SpanOptions,\n context: Context,\n fn: F,\n ): ReturnType<F>;\n startActiveSpan<F extends (span: Span) => ReturnType<F>>(\n name: string,\n ...args: unknown[]\n ): ReturnType<F> {\n const options = args.length > 1 ? (args[0] as SpanOptions) : undefined;\n const parentContext =\n args.length > 2 ? (args[1] as Context) : api_context.active();\n const fn = args.at(-1) as F;\n\n const span = this.startSpan(name, options, parentContext);\n const contextWithSpanSet = trace.setSpan(parentContext, span);\n\n return api_context.with(contextWithSpanSet, fn, undefined, span);\n }\n}\n\n/**\n * Set attributes for the next span created\n */\nexport function withNextSpan(attrs: Attributes) {\n withNextSpanAttributes = Object.assign({}, withNextSpanAttributes, attrs);\n}\n\nfunction getTraceInfo(parentSpanContext?: SpanContext): {\n traceId: string;\n randomTraceFlag: NewTraceFlagValues;\n} {\n if (parentSpanContext && trace.isSpanContextValid(parentSpanContext)) {\n const { traceId, traceFlags } = parentSpanContext;\n return { traceId, randomTraceFlag: getFlagAt(traceFlags, 2) as NewTraceFlagValues };\n } else {\n return {\n traceId: idGenerator.generateTraceId(),\n randomTraceFlag: NewTraceFlags.RANDOM_TRACE_ID_SET,\n };\n }\n}\n","/**\n * AsyncLocalStorage-based context manager for edge environments\n *\n * Copyright The OpenTelemetry Authors\n * Licensed under the Apache License, Version 2.0\n */\n\nimport type { ContextManager, Context } from '@opentelemetry/api';\nimport { ROOT_CONTEXT } from '@opentelemetry/api';\n\n//@ts-ignore - node:async_hooks available in CF Workers with nodejs_compat\nimport { AsyncLocalStorage } from 'node:async_hooks';\n//@ts-ignore\nimport { EventEmitter } from 'node:events';\n\ntype Func<T> = (...args: unknown[]) => T;\n\n/**\n * Store a map for each event of all original listeners and their \"patched\"\n * version. So when a listener is removed by the user, the corresponding\n * patched function will be also removed.\n */\ninterface PatchMap {\n [name: string]: WeakMap<Func<void>, Func<void>>;\n}\n\nconst ADD_LISTENER_METHODS = [\n 'addListener' as const,\n 'on' as const,\n 'once' as const,\n 'prependListener' as const,\n 'prependOnceListener' as const,\n];\n\nabstract class AbstractAsyncHooksContextManager implements ContextManager {\n abstract active(): Context;\n\n abstract with<A extends unknown[], F extends (...args: A) => ReturnType<F>>(\n context: Context,\n fn: F,\n thisArg?: ThisParameterType<F>,\n ...args: A\n ): ReturnType<F>;\n\n abstract enable(): this;\n\n abstract disable(): this;\n\n /**\n * Binds a context to the target function or event emitter\n */\n bind<T>(context: Context, target: T): T {\n if (target instanceof EventEmitter) {\n return this._bindEventEmitter(context, target);\n }\n\n if (typeof target === 'function') {\n return this._bindFunction(context, target);\n }\n return target;\n }\n\n private _bindFunction<T extends Function>(context: Context, target: T): T {\n const manager = this;\n const contextWrapper = function (this: never, ...args: unknown[]) {\n return manager.with(context, () => target.apply(this, args));\n };\n Object.defineProperty(contextWrapper, 'length', {\n enumerable: false,\n configurable: true,\n writable: false,\n value: target.length,\n });\n return contextWrapper as any;\n }\n\n /**\n * By default, EventEmitter calls callbacks with their context, which we do\n * not want. Instead we bind a specific context to all callbacks.\n */\n private _bindEventEmitter<T extends EventEmitter>(\n context: Context,\n ee: T,\n ): T {\n const map = this._getPatchMap(ee);\n if (map !== undefined) return ee;\n this._createPatchMap(ee);\n\n // Patch methods that add a listener to propagate context\n for (const methodName of ADD_LISTENER_METHODS) {\n if (ee[methodName] === undefined) continue;\n ee[methodName] = this._patchAddListener(ee, ee[methodName], context);\n }\n\n // Patch methods that remove a listener\n if (typeof ee.removeListener === 'function') {\n ee.removeListener = this._patchRemoveListener(ee, ee.removeListener);\n }\n if (typeof ee.off === 'function') {\n ee.off = this._patchRemoveListener(ee, ee.off);\n }\n\n // Patch method that removes all listeners\n if (typeof ee.removeAllListeners === 'function') {\n ee.removeAllListeners = this._patchRemoveAllListeners(\n ee,\n ee.removeAllListeners,\n );\n }\n return ee;\n }\n\n private _patchRemoveListener(ee: EventEmitter, original: Function) {\n const contextManager = this;\n return function (this: never, event: string, listener: Func<void>) {\n const events = contextManager._getPatchMap(ee)?.[event];\n if (events === undefined) {\n return original.call(this, event, listener);\n }\n const patchedListener = events.get(listener);\n return original.call(this, event, patchedListener || listener);\n };\n }\n\n private _patchRemoveAllListeners(ee: EventEmitter, original: Function) {\n const contextManager = this;\n return function (this: never, event: string) {\n const map = contextManager._getPatchMap(ee);\n if (map !== undefined) {\n if (arguments.length === 0) {\n contextManager._createPatchMap(ee);\n } else if (map[event] !== undefined) {\n delete map[event];\n }\n }\n return Reflect.apply(original, this, arguments);\n };\n }\n\n private _patchAddListener(\n ee: EventEmitter,\n original: Function,\n context: Context,\n ) {\n const contextManager = this;\n return function (this: never, event: string, listener: Func<void>) {\n /**\n * This check prevents double-wrapping the listener.\n * The implementation for ee.once wraps the listener and calls ee.on.\n * Without this check, we would wrap that wrapped listener.\n */\n if (contextManager._wrapped) {\n return original.call(this, event, listener);\n }\n let map = contextManager._getPatchMap(ee);\n if (map === undefined) {\n map = contextManager._createPatchMap(ee);\n }\n let listeners = map[event];\n if (listeners === undefined) {\n listeners = new WeakMap();\n map[event] = listeners;\n }\n const patchedListener = contextManager.bind(context, listener);\n // Store a weak reference of the user listener to ours\n listeners.set(listener, patchedListener);\n\n contextManager._wrapped = true;\n try {\n return original.call(this, event, patchedListener);\n } finally {\n contextManager._wrapped = false;\n }\n };\n }\n\n private _createPatchMap(ee: EventEmitter): PatchMap {\n const map = Object.create(null);\n (ee as any)[this._kOtListeners] = map;\n return map;\n }\n\n private _getPatchMap(ee: EventEmitter): PatchMap | undefined {\n return (ee as never)[this._kOtListeners];\n }\n\n private readonly _kOtListeners = Symbol('OtListeners');\n private _wrapped = false;\n}\n\n/**\n * AsyncLocalStorage-based context manager for edge runtimes\n */\nexport class AsyncLocalStorageContextManager extends AbstractAsyncHooksContextManager {\n private _asyncLocalStorage: AsyncLocalStorage<Context>;\n\n constructor() {\n super();\n this._asyncLocalStorage = new AsyncLocalStorage();\n }\n\n active(): Context {\n return this._asyncLocalStorage.getStore() ?? ROOT_CONTEXT;\n }\n\n with<A extends unknown[], F extends (...args: A) => ReturnType<F>>(\n context: Context,\n fn: F,\n thisArg?: ThisParameterType<F>,\n ...args: A\n ): ReturnType<F> {\n const cb = thisArg == null ? fn : fn.bind(thisArg);\n return this._asyncLocalStorage.run(context, cb as never, ...args);\n }\n\n enable(): this {\n return this;\n }\n\n disable(): this {\n this._asyncLocalStorage.disable();\n return this;\n }\n}\n","/**\n * Tracer provider for edge environments\n */\n\nimport { trace } from '@opentelemetry/api';\nimport type { Resource } from '@opentelemetry/resources';\nimport type { SpanProcessor, TracerConfig } from '@opentelemetry/sdk-trace-base';\nimport { WorkerTracer } from './tracer';\nimport { AsyncLocalStorageContextManager } from './context';\n\n/**\n * WorkerTracerProvider - Registers tracer globally\n */\nexport class WorkerTracerProvider {\n private tracer: WorkerTracer;\n private contextManager: AsyncLocalStorageContextManager;\n\n constructor(spanProcessors: SpanProcessor[], resource: Resource) {\n this.tracer = new WorkerTracer(spanProcessors, resource);\n this.contextManager = new AsyncLocalStorageContextManager();\n }\n\n /**\n * Get the tracer instance\n */\n getTracer(_name: string, _version?: string, _config?: TracerConfig): WorkerTracer {\n return this.tracer;\n }\n\n /**\n * Register this provider as the global tracer\n */\n register(): void {\n // Enable context manager\n this.contextManager.enable();\n\n // Set tracer provider\n const provider = {\n getTracer: (_name: string, _version?: string) => this.tracer,\n };\n\n // @ts-ignore - OTel types\n trace.setGlobalTracerProvider(provider);\n }\n}\n","/**\n * Buffer polyfill for edge environments\n *\n * Cloudflare Workers and other edge runtimes need the Buffer global\n * for OpenTelemetry OTLP serialization.\n */\n\n//@ts-ignore - node:buffer available in CF Workers with nodejs_compat\nimport { Buffer } from 'node:buffer';\n\n//@ts-ignore\nglobalThis.Buffer = Buffer;\n\n\n\nexport {Buffer} from 'node:buffer';","/**\n * Trace context types and utilities\n */\n\nimport type { Span, SpanStatusCode } from '@opentelemetry/api';\n\n/**\n * WeakMap to store span names for active spans.\n * Enables retrieving span names for correlation helpers.\n */\nconst spanNameMap = new WeakMap<Span, string>();\n\n/**\n * Base trace context containing trace identifiers\n */\nexport interface TraceContextBase {\n traceId: string;\n spanId: string;\n correlationId: string;\n 'code.function'?: string;\n}\n\n/**\n * Span methods available on trace context\n */\nexport interface SpanMethods {\n setAttribute(key: string, value: string | number | boolean): void;\n setAttributes(attrs: Record<string, string | number | boolean>): void;\n setStatus(status: { code: SpanStatusCode; message?: string }): void;\n recordException(exception: Error): void;\n}\n\n/**\n * Complete trace context that merges base context and span methods\n *\n * This is the ctx parameter passed to factory functions in trace().\n * It provides access to trace IDs and span manipulation methods.\n */\nexport type TraceContext = TraceContextBase & SpanMethods;\n\n/**\n * Create a TraceContext from an OpenTelemetry Span\n *\n * This utility extracts trace context information from a span\n * and provides span manipulation methods in a consistent format.\n */\nexport function createTraceContext(span: Span): TraceContext {\n const spanContext = span.spanContext();\n return {\n traceId: spanContext.traceId,\n spanId: spanContext.spanId,\n correlationId: spanContext.traceId.slice(0, 16),\n 'code.function': spanNameMap.get(span),\n setAttribute: span.setAttribute.bind(span),\n setAttributes: span.setAttributes.bind(span),\n setStatus: span.setStatus.bind(span),\n recordException: span.recordException.bind(span),\n };\n}\n\n/**\n * Store the span name for later retrieval via trace context helpers.\n */\nexport function setSpanName(span: Span, name: string): void {\n spanNameMap.set(span, name);\n}\n","/**\n * Functional API for autotel-edge\n *\n * Provides zero-boilerplate tracing helpers that mirror the Node.js runtime\n * implementation while staying optimized for edge environments.\n */\n\nimport {\n trace as otelTrace,\n SpanStatusCode,\n type Span,\n type AttributeValue,\n} from '@opentelemetry/api';\nimport type { Sampler } from '@opentelemetry/sdk-trace-base';\nimport type { TraceContext } from './core/trace-context';\nimport { createTraceContext, setSpanName } from './core/trace-context';\n\n// Re-export for convenience\nexport type { TraceContext } from './core/trace-context';\n\ntype AnyFn = (...args: any[]) => any;\n\nconst TRACE_FACTORY_SYMBOL = Symbol.for('autotel.edge.functional.factory');\nconst FACTORY_NAME_HINTS = new Set(['ctx', '_ctx', 'context', 'tracecontext', 'tracectx']);\n\nconst SINGLE_LINE_COMMENT_REGEX = /\\/\\/.*$/gm;\nconst MULTI_LINE_COMMENT_REGEX = /\\/\\*[\\s\\S]*?\\*\\//gm;\nconst PARAM_TOKEN_SANITIZE_REGEX = new RegExp(String.raw`[{}\\[\\]\\s]`, 'g');\n\ninterface TraceFactoryMarked {\n [TRACE_FACTORY_SYMBOL]?: true;\n}\n\nfunction markAsTraceFactory(fn: AnyFn): void {\n try {\n Object.defineProperty(fn, TRACE_FACTORY_SYMBOL, {\n value: true,\n configurable: true,\n });\n } catch {\n (fn as TraceFactoryMarked)[TRACE_FACTORY_SYMBOL] = true;\n }\n}\n\nfunction hasFactoryMark(fn: AnyFn): boolean {\n return Boolean((fn as TraceFactoryMarked)[TRACE_FACTORY_SYMBOL]);\n}\n\nfunction sanitizeParameterToken(token: string): string {\n const [firstToken] = token.split('=');\n return (firstToken ?? '').replaceAll(PARAM_TOKEN_SANITIZE_REGEX, '').trim();\n}\n\nfunction getFirstParameterToken(fn: AnyFn): string | null {\n let source = Function.prototype.toString.call(fn);\n source = source\n .replaceAll(MULTI_LINE_COMMENT_REGEX, '')\n .replaceAll(SINGLE_LINE_COMMENT_REGEX, '')\n .trim();\n\n const arrowMatch = source.match(/^(?:async\\s*)?(?:\\(([^)]*)\\)|([^=()]+))\\s*=>/);\n if (arrowMatch) {\n const params = (arrowMatch[1] ?? arrowMatch[2] ?? '').split(',');\n const first = params[0]?.trim();\n if (first) {\n return sanitizeParameterToken(first);\n }\n return null;\n }\n\n const functionMatch = source.match(/^[^(]*\\(([^)]*)\\)/);\n if (functionMatch) {\n const params = functionMatch[1]?.split(',');\n const first = params?.[0]?.trim();\n if (first) {\n return sanitizeParameterToken(first);\n }\n }\n\n return null;\n}\n\nfunction looksLikeTraceFactory(fn: AnyFn): boolean {\n if (hasFactoryMark(fn)) {\n return true;\n }\n\n if (fn.length === 0) {\n return false;\n }\n\n const firstParam = getFirstParameterToken(fn);\n if (!firstParam) {\n return false;\n }\n\n const normalized = firstParam.toLowerCase();\n if (\n FACTORY_NAME_HINTS.has(normalized) ||\n normalized.startsWith('ctx') ||\n normalized.startsWith('_ctx') ||\n normalized.startsWith('trace')\n ) {\n return true;\n }\n\n return false;\n}\n\n/**\n * Check if a function that takes ctx returns another function (factory pattern)\n * vs returning a value directly (immediate execution pattern)\n */\nfunction isFactoryReturningFunction(\n fnWithCtx: (ctx: TraceContext) => unknown,\n): boolean {\n try {\n const result = fnWithCtx(createDummyCtx());\n return typeof result === 'function';\n } catch {\n // If the function throws when called with dummy ctx, assume it's immediate execution\n // since factory functions typically just return a function and don't execute logic\n return false;\n }\n}\n\nfunction isTraceFactoryFunction<TArgs extends any[], TReturn>(\n fn:\n | ((...args: TArgs) => TReturn | Promise<TReturn>)\n | ((ctx: TraceContext) => (...args: TArgs) => TReturn | Promise<TReturn>),\n): fn is (ctx: TraceContext) => (...args: TArgs) => TReturn | Promise<TReturn> {\n if (typeof fn !== 'function') {\n return false;\n }\n\n if (hasFactoryMark(fn as AnyFn)) {\n return true;\n }\n\n if (looksLikeTraceFactory(fn as AnyFn)) {\n markAsTraceFactory(fn as AnyFn);\n return true;\n }\n\n return false;\n}\n\nfunction ensureTraceFactory<TArgs extends any[], TReturn>(\n fnOrFactory:\n | ((...args: TArgs) => TReturn | Promise<TReturn>)\n | ((ctx: TraceContext) => (...args: TArgs) => TReturn | Promise<TReturn>),\n): (ctx: TraceContext) => (...args: TArgs) => TReturn | Promise<TReturn> {\n if (isTraceFactoryFunction(fnOrFactory)) {\n return fnOrFactory;\n }\n\n const plainFn = fnOrFactory as (...args: TArgs) => TReturn | Promise<TReturn>;\n const factory = (ctx: TraceContext) => {\n void ctx;\n return plainFn;\n };\n markAsTraceFactory(factory);\n return factory;\n}\n\ntype ExtractFunctionSignature<T> = T extends (ctx: TraceContext) => infer F\n ? F extends (...args: infer Args) => infer Return\n ? (...args: Args) => Return\n : never\n : never;\n\ntype WrappedFunction<TArgs extends any[], TReturn> = (...args: TArgs) => TReturn | Promise<TReturn>;\n\n/**\n * trace function options\n */\nexport interface traceOptions<TArgs extends any[] = any[], TReturn = any> {\n name?: string;\n serviceName?: string;\n sampler?: Sampler;\n attributesFromArgs?: (args: TArgs) => Record<string, unknown>;\n attributesFromResult?: (result: TReturn) => Record<string, unknown>;\n attributes?: Record<string, unknown>;\n}\n\nconst MAX_ERROR_MESSAGE_LENGTH = 500;\n\nfunction createDummyCtx(): TraceContext {\n return {\n traceId: '',\n spanId: '',\n correlationId: '',\n setAttribute: () => {},\n setAttributes: () => {},\n setStatus: () => {},\n recordException: () => {},\n } as unknown as TraceContext;\n}\n\nfunction truncateErrorMessage(message: string): string {\n if (message.length <= MAX_ERROR_MESSAGE_LENGTH) {\n return message;\n }\n return `${message.slice(0, MAX_ERROR_MESSAGE_LENGTH)}... (truncated)`;\n}\n\ntype InstrumentableFunction<TArgs extends any[] = any[], TReturn = any> = ((\n ...args: TArgs\n) => TReturn | Promise<TReturn>) & {\n displayName?: string;\n name?: string;\n};\n\nfunction inferFunctionName<TArgs extends any[] = any[], TReturn = any>(\n fn: InstrumentableFunction<TArgs, TReturn>,\n): string | undefined {\n const displayName = (fn as { displayName?: string }).displayName;\n if (displayName) {\n return displayName;\n }\n\n if (fn.name && fn.name !== 'anonymous') {\n return fn.name;\n }\n\n const source = Function.prototype.toString.call(fn);\n const match = source.match(/function\\s+([^(\\s]+)/);\n if (match && match[1] && match[1] !== 'anonymous') {\n return match[1];\n }\n\n return undefined;\n}\n\nfunction getSpanName<TArgs extends any[], TReturn>(\n options: traceOptions<TArgs, TReturn>,\n fn: InstrumentableFunction<TArgs, TReturn>,\n variableName?: string,\n): string {\n if (options.name) {\n return options.name;\n }\n\n let fnName = variableName ?? inferFunctionName(fn);\n fnName = fnName || 'anonymous';\n\n if (options.serviceName) {\n return `${options.serviceName}.${fnName}`;\n }\n\n if (fnName && fnName !== 'anonymous') {\n return fnName;\n }\n\n return 'unknown';\n}\n\nfunction isAsyncFunction(fn: unknown): boolean {\n return typeof fn === 'function' && fn.constructor?.name === 'AsyncFunction';\n}\n\nconst INSTRUMENTED_SYMBOL = Symbol.for('autotel.edge.functional.instrumented');\n\nfunction wrapWithTracingAsync<TArgs extends any[], TReturn>(\n fnFactory: (ctx: TraceContext) => (...args: TArgs) => Promise<TReturn>,\n options: traceOptions<TArgs, TReturn>,\n variableName?: string,\n): (...args: TArgs) => Promise<TReturn> {\n const tempFn = fnFactory(createDummyCtx());\n const spanName = getSpanName(options, tempFn, variableName);\n\n const wrappedFunction = async function wrappedFunction(this: unknown, ...args: TArgs): Promise<TReturn> {\n const tracer = otelTrace.getTracer('autotel-edge');\n const spanOptions: Record<string, unknown> = options.sampler ? { sampler: options.sampler } : {};\n\n return tracer.startActiveSpan(spanName, spanOptions, async (span) => {\n setSpanName(span, spanName);\n\n try {\n const actualFn = fnFactory(createTraceContext(span));\n\n if (options.attributes) {\n span.setAttributes(options.attributes as Record<string, AttributeValue>);\n }\n\n if (options.attributesFromArgs) {\n const argsAttrs = options.attributesFromArgs(args);\n span.setAttributes(argsAttrs as Record<string, AttributeValue>);\n }\n\n const result = await actualFn(...args);\n\n if (options.attributesFromResult) {\n const resultAttrs = options.attributesFromResult(result);\n span.setAttributes(resultAttrs as Record<string, AttributeValue>);\n }\n\n span.setAttribute('code.function', spanName);\n span.setStatus({ code: SpanStatusCode.OK });\n span.end();\n return result;\n } catch (error) {\n const message = truncateErrorMessage(\n error instanceof Error ? error.message : String(error ?? 'Unknown error'),\n );\n span.setAttribute('code.function', spanName);\n span.setStatus({ code: SpanStatusCode.ERROR, message });\n span.recordException(error instanceof Error ? error : new Error(String(error)));\n span.end();\n throw error;\n }\n });\n };\n\n Object.defineProperty(wrappedFunction, 'name', {\n value: tempFn.name || 'trace',\n configurable: true,\n });\n\n (wrappedFunction as any)[INSTRUMENTED_SYMBOL] = true;\n\n return wrappedFunction;\n}\n\nfunction wrapWithTracingSync<TArgs extends any[], TReturn>(\n fnFactory: (ctx: TraceContext) => (...args: TArgs) => TReturn,\n options: traceOptions<TArgs, TReturn>,\n variableName?: string,\n): (...args: TArgs) => TReturn {\n const tempFn = fnFactory(createDummyCtx());\n const spanName = getSpanName(options, tempFn, variableName);\n\n const wrappedFunction = function wrappedFunction(this: unknown, ...args: TArgs): TReturn {\n const tracer = otelTrace.getTracer('autotel-edge');\n const spanOptions: Record<string, unknown> = options.sampler ? { sampler: options.sampler } : {};\n\n return tracer.startActiveSpan(spanName, spanOptions, (span) => {\n setSpanName(span, spanName);\n\n try {\n const actualFn = fnFactory(createTraceContext(span));\n\n if (options.attributes) {\n span.setAttributes(options.attributes as Record<string, AttributeValue>);\n }\n\n if (options.attributesFromArgs) {\n const argsAttrs = options.attributesFromArgs(args);\n span.setAttributes(argsAttrs as Record<string, AttributeValue>);\n }\n\n const result = actualFn(...args);\n\n if (options.attributesFromResult) {\n const resultAttrs = options.attributesFromResult(result as TReturn);\n span.setAttributes(resultAttrs as Record<string, AttributeValue>);\n }\n\n span.setAttribute('code.function', spanName);\n span.setStatus({ code: SpanStatusCode.OK });\n span.end();\n return result;\n } catch (error) {\n const message = truncateErrorMessage(\n error instanceof Error ? error.message : String(error ?? 'Unknown error'),\n );\n span.setAttribute('code.function', spanName);\n span.setStatus({ code: SpanStatusCode.ERROR, message });\n span.recordException(error instanceof Error ? error : new Error(String(error)));\n span.end();\n throw error;\n }\n });\n };\n\n Object.defineProperty(wrappedFunction, 'name', {\n value: tempFn.name || 'trace',\n configurable: true,\n });\n\n (wrappedFunction as any)[INSTRUMENTED_SYMBOL] = true;\n\n return wrappedFunction;\n}\n\nfunction wrapFactoryWithTracing<TArgs extends any[], TReturn>(\n fnOrFactory:\n | ((...args: TArgs) => TReturn | Promise<TReturn>)\n | ((ctx: TraceContext) => (...args: TArgs) => TReturn | Promise<TReturn>),\n options: traceOptions<TArgs, TReturn>,\n variableName?: string,\n): WrappedFunction<TArgs, TReturn> {\n const factory = ensureTraceFactory(fnOrFactory);\n const sampleFn = factory(createDummyCtx());\n const useAsyncWrapper = isAsyncFunction(sampleFn);\n\n if (useAsyncWrapper) {\n return wrapWithTracingAsync(\n factory as (ctx: TraceContext) => (...args: TArgs) => Promise<TReturn>,\n options,\n variableName,\n ) as WrappedFunction<TArgs, TReturn>;\n }\n\n return wrapWithTracingSync(\n factory as (ctx: TraceContext) => (...args: TArgs) => TReturn,\n options,\n variableName,\n ) as WrappedFunction<TArgs, TReturn>;\n}\n\n/**\n * Execute a function immediately within a trace span\n * Used for the immediate execution pattern: trace((ctx) => result)\n */\nfunction executeImmediately<TReturn = any>(\n fn: (ctx: TraceContext) => TReturn | Promise<TReturn>,\n options: traceOptions<any[], any>,\n): TReturn | Promise<TReturn> {\n const tracer = otelTrace.getTracer('@autotel/edge');\n const spanName = options.name || 'anonymous';\n\n return tracer.startActiveSpan(spanName, (span) => {\n try {\n setSpanName(span, spanName);\n const ctxValue = createTraceContext(span);\n\n const onSuccess = (result: TReturn) => {\n span.setStatus({ code: SpanStatusCode.OK });\n if (options.attributes) {\n for (const [key, value] of Object.entries(options.attributes)) {\n span.setAttribute(key, value as AttributeValue);\n }\n }\n span.end();\n return result;\n };\n\n const onError = (error: unknown): never => {\n const errorMessage =\n error instanceof Error ? error.message : 'Unknown error';\n const truncatedMessage = truncateErrorMessage(errorMessage);\n\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: truncatedMessage,\n });\n\n span.setAttribute('error', true);\n span.setAttribute('exception.type',\n error instanceof Error ? error.constructor.name : 'Error');\n span.setAttribute('exception.message', truncatedMessage);\n\n span.recordException(\n error instanceof Error ? error : new Error(String(error)),\n );\n\n span.end();\n throw error;\n };\n\n const result = fn(ctxValue);\n\n // Check if result is a Promise\n if (result instanceof Promise) {\n return result.then(onSuccess, onError);\n }\n\n return onSuccess(result);\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : 'Unknown error';\n const truncatedMessage = truncateErrorMessage(errorMessage);\n\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: truncatedMessage,\n });\n\n span.setAttribute('error', true);\n span.setAttribute('exception.message', truncatedMessage);\n\n span.recordException(\n error instanceof Error ? error : new Error(String(error)),\n );\n\n span.end();\n throw error;\n }\n });\n}\n\n// Sync overloads - Factory pattern with explicit return type helps TypeScript infer\n// Overload 1a: Plain sync function with no args (auto-inferred name)\nexport function trace<TReturn = any>(\n fn: () => TReturn,\n): () => TReturn;\n// Overload 1b: Plain sync function (auto-inferred name)\nexport function trace<TArgs extends any[], TReturn = any>(\n fn: (...args: TArgs) => TReturn,\n): (...args: TArgs) => TReturn;\n\n// Overload 1c: Factory sync function with no args returning explicit type (auto-inferred name)\nexport function trace<TReturn = any>(\n fnFactory: (ctx: TraceContext) => () => TReturn,\n): () => TReturn;\n// Overload 1d: Immediate execution - sync function with context (NEW PATTERN)\nexport function trace<TReturn = any>(\n fn: (ctx: TraceContext) => TReturn,\n): TReturn;\n// Overload 1e: Factory sync function - use conditional type to extract signature (MUST come before generic)\n// This overload is more specific and helps TypeScript infer types from factory functions\nexport function trace<TFactory extends (ctx: TraceContext) => (...args: any[]) => any>(\n fnFactory: TFactory,\n): ExtractFunctionSignature<TFactory>;\n// Overload 1f: Generic factory sync function (fallback)\nexport function trace<TArgs extends any[], TReturn = any>(\n fnFactory: (ctx: TraceContext) => (...args: TArgs) => TReturn,\n): (...args: TArgs) => TReturn;\n\n// Overload 2a: Name + plain sync function\nexport function trace<TArgs extends any[] = any[], TReturn = any>(\n name: string,\n fn: (...args: TArgs) => TReturn,\n): (...args: TArgs) => TReturn;\n\n// Overload 2b: Name + immediate execution sync with context\nexport function trace<TReturn = any>(\n name: string,\n fn: (ctx: TraceContext) => TReturn,\n): TReturn;\n\n// Overload 2c: Name + factory sync function\nexport function trace<TArgs extends any[] = any[], TReturn = any>(\n name: string,\n fnFactory: (ctx: TraceContext) => (...args: TArgs) => TReturn,\n): (...args: TArgs) => TReturn;\n\n// Overload 3a: Options + plain sync function\nexport function trace<TArgs extends any[] = any[], TReturn = any>(\n options: traceOptions<TArgs, TReturn>,\n fn: (...args: TArgs) => TReturn,\n): (...args: TArgs) => TReturn;\n\n// Overload 3b: Options + immediate execution sync with context\nexport function trace<TReturn = any>(\n options: traceOptions<[], TReturn>,\n fn: (ctx: TraceContext) => TReturn,\n): TReturn;\n\n// Overload 3c: Options + factory sync function\nexport function trace<TArgs extends any[] = any[], TReturn = any>(\n options: traceOptions<TArgs, TReturn>,\n fnFactory: (ctx: TraceContext) => (...args: TArgs) => TReturn,\n): (...args: TArgs) => TReturn;\n\n// Async overloads\n// Overload 4a: Plain async function with no args (auto-inferred name)\nexport function trace<TReturn = any>(\n fn: () => Promise<TReturn>,\n): () => Promise<TReturn>;\n// Overload 4b: Plain async function (auto-inferred name)\nexport function trace<TArgs extends any[] = any[], TReturn = any>(\n fn: (...args: TArgs) => Promise<TReturn>,\n): (...args: TArgs) => Promise<TReturn>;\n\n// Overload 4c: Immediate execution - async function with context (NEW PATTERN)\nexport function trace<TReturn = any>(\n fn: (ctx: TraceContext) => Promise<TReturn>,\n): Promise<TReturn>;\n// Overload 4d: Factory async function with no args (auto-inferred name)\nexport function trace<TReturn = any>(\n fnFactory: (ctx: TraceContext) => () => Promise<TReturn>,\n): () => Promise<TReturn>;\n// Overload 4e: Factory async function (auto-inferred name)\nexport function trace<TArgs extends any[] = any[], TReturn = any>(\n fnFactory: (ctx: TraceContext) => (...args: TArgs) => Promise<TReturn>,\n): (...args: TArgs) => Promise<TReturn>;\n\n// Overload 5a: Name + plain async function\nexport function trace<TArgs extends any[] = any[], TReturn = any>(\n name: string,\n fn: (...args: TArgs) => Promise<TReturn>,\n): (...args: TArgs) => Promise<TReturn>;\n\n// Overload 5b: Name + immediate execution async with context\nexport function trace<TReturn = any>(\n name: string,\n fn: (ctx: TraceContext) => Promise<TReturn>,\n): Promise<TReturn>;\n\n// Overload 5c: Name + factory async function\nexport function trace<TArgs extends any[] = any[], TReturn = any>(\n name: string,\n fnFactory: (ctx: TraceContext) => (...args: TArgs) => Promise<TReturn>,\n): (...args: TArgs) => Promise<TReturn>;\n\n// Overload 6a: Options + plain async function\nexport function trace<TArgs extends any[] = any[], TReturn = any>(\n options: traceOptions<TArgs, TReturn>,\n fn: (...args: TArgs) => Promise<TReturn>,\n): (...args: TArgs) => Promise<TReturn>;\n\n// Overload 6b: Options + immediate execution async with context\nexport function trace<TReturn = any>(\n options: traceOptions<[], TReturn>,\n fn: (ctx: TraceContext) => Promise<TReturn>,\n): Promise<TReturn>;\n\n// Overload 6c: Options + factory async function\nexport function trace<TArgs extends any[] = any[], TReturn = any>(\n options: traceOptions<TArgs, TReturn>,\n fnFactory: (ctx: TraceContext) => (...args: TArgs) => Promise<TReturn>,\n): (...args: TArgs) => Promise<TReturn>;\n\n// Implementation\nexport function trace<TArgs extends any[] = any[], TReturn = any>(\n fnOrNameOrOptions:\n | ((...args: TArgs) => TReturn)\n | ((...args: TArgs) => Promise<TReturn>)\n | ((ctx: TraceContext) => (...args: TArgs) => TReturn)\n | ((ctx: TraceContext) => (...args: TArgs) => Promise<TReturn>)\n | ((ctx: TraceContext) => TReturn)\n | ((ctx: TraceContext) => Promise<TReturn>)\n | string\n | traceOptions<TArgs, TReturn>,\n maybeFn?:\n | ((...args: TArgs) => TReturn)\n | ((...args: TArgs) => Promise<TReturn>)\n | ((ctx: TraceContext) => (...args: TArgs) => TReturn)\n | ((ctx: TraceContext) => (...args: TArgs) => Promise<TReturn>)\n | ((ctx: TraceContext) => TReturn)\n | ((ctx: TraceContext) => Promise<TReturn>),\n): WrappedFunction<TArgs, TReturn> | TReturn | Promise<TReturn> {\n // Handle: trace(fn) - single argument\n if (typeof fnOrNameOrOptions === 'function') {\n // Check if it's immediate execution pattern: (ctx) => result\n if (\n looksLikeTraceFactory(fnOrNameOrOptions as AnyFn) &&\n !isFactoryReturningFunction(fnOrNameOrOptions as (ctx: TraceContext) => unknown)\n ) {\n // Immediate execution pattern\n return executeImmediately(\n fnOrNameOrOptions as (ctx: TraceContext) => TReturn | Promise<TReturn>,\n {},\n ) as WrappedFunction<TArgs, TReturn> | TReturn | Promise<TReturn>;\n }\n // Factory pattern or plain function\n return wrapFactoryWithTracing(\n fnOrNameOrOptions as (...args: TArgs) => TReturn,\n {} as traceOptions<TArgs, TReturn>,\n );\n }\n\n // Handle: trace(name, fn) or trace(options, fn) - two arguments\n if (typeof fnOrNameOrOptions === 'string') {\n if (!maybeFn) {\n throw new Error('trace(name, fn): fn is required');\n }\n // Check if it's immediate execution pattern\n if (\n looksLikeTraceFactory(maybeFn as AnyFn) &&\n !isFactoryReturningFunction(maybeFn as (ctx: TraceContext) => unknown)\n ) {\n // Immediate execution pattern with name\n return executeImmediately(\n maybeFn as (ctx: TraceContext) => TReturn | Promise<TReturn>,\n { name: fnOrNameOrOptions },\n ) as WrappedFunction<TArgs, TReturn> | TReturn | Promise<TReturn>;\n }\n return wrapFactoryWithTracing(\n maybeFn as (...args: TArgs) => TReturn,\n { name: fnOrNameOrOptions } as traceOptions<TArgs, TReturn>,\n );\n }\n\n // Handle: trace(options, fn)\n if (!maybeFn) {\n throw new Error('trace(options, fn): fn is required');\n }\n\n // Check if it's immediate execution pattern\n if (\n looksLikeTraceFactory(maybeFn as AnyFn) &&\n !isFactoryReturningFunction(maybeFn as (ctx: TraceContext) => unknown)\n ) {\n // Immediate execution pattern with options\n return executeImmediately(\n maybeFn as (ctx: TraceContext) => TReturn | Promise<TReturn>,\n fnOrNameOrOptions as traceOptions<any[], any>,\n ) as WrappedFunction<TArgs, TReturn> | TReturn | Promise<TReturn>;\n }\n\n return wrapFactoryWithTracing(\n maybeFn as (...args: TArgs) => TReturn,\n fnOrNameOrOptions as traceOptions<TArgs, TReturn>,\n );\n}\n\nexport function withTracing<TArgs extends any[] = any[], TReturn = any>(\n options: Omit<traceOptions<TArgs, TReturn>, 'name'>,\n) {\n return (\n fnOrFactory:\n | ((...args: TArgs) => TReturn | Promise<TReturn>)\n | ((ctx: TraceContext) => (...args: TArgs) => TReturn | Promise<TReturn>)\n ): WrappedFunction<TArgs, TReturn> => wrapFactoryWithTracing(fnOrFactory, options as traceOptions<TArgs, TReturn>);\n}\n\nfunction shouldSkip(key: string, fn: Function, skip?: (string | RegExp | ((key: string, fn: Function) => boolean))[]): boolean {\n if (key.startsWith('_')) {\n return true;\n }\n\n if (!skip || skip.length === 0) {\n return false;\n }\n\n for (const pattern of skip) {\n if (typeof pattern === 'string' && key === pattern) {\n return true;\n }\n if (pattern instanceof RegExp && pattern.test(key)) {\n return true;\n }\n if (typeof pattern === 'function' && pattern(key, fn)) {\n return true;\n }\n }\n\n return false;\n}\n\nexport interface InstrumentOptions extends traceOptions {\n functions: Record<string, any>;\n overrides?: Record<string, Partial<traceOptions>>;\n skip?: (string | RegExp | ((key: string, fn: Function) => boolean))[];\n}\n\nexport function instrument<T extends Record<string, any>>(\n options: InstrumentOptions,\n): T {\n const { functions, ...tracingOptions } = options;\n const instrumented: Record<string, any> = {};\n\n for (const key of Object.keys(functions)) {\n const fn = functions[key];\n\n if (typeof fn !== 'function') {\n instrumented[key] = fn;\n continue;\n }\n\n if (shouldSkip(key, fn, tracingOptions.skip)) {\n instrumented[key] = fn;\n continue;\n }\n\n const fnOptions: traceOptions = {\n ...tracingOptions,\n ...tracingOptions.overrides?.[key],\n name: tracingOptions.overrides?.[key]?.name ?? tracingOptions.name,\n };\n\n const boundFn = fn.bind(functions);\n const fnFactory = (_ctx: TraceContext) => boundFn as AnyFn;\n\n instrumented[key] = wrapFactoryWithTracing(fnFactory, fnOptions, key);\n }\n\n return instrumented as T;\n}\n\nexport interface SpanOptions {\n name: string;\n attributes?: Record<string, string | number | boolean>;\n}\n\nexport function span<T = unknown>(options: SpanOptions, fn: (span: Span) => T): T;\nexport function span<T = unknown>(\n options: SpanOptions,\n fn: (span: Span) => Promise<T>,\n): Promise<T>;\nexport function span<T = unknown>(\n options: SpanOptions,\n fn: (span: Span) => T | Promise<T>,\n): T | Promise<T> {\n const tracer = otelTrace.getTracer('autotel-edge');\n\n const execute = (span: Span) => {\n setSpanName(span, options.name);\n\n try {\n if (options.attributes) {\n for (const [key, value] of Object.entries(options.attributes)) {\n span.setAttribute(key, value);\n }\n }\n\n const result = fn(span);\n\n if (result instanceof Promise) {\n return result\n .then((value) => {\n span.setAttribute('code.function', options.name);\n span.setStatus({ code: SpanStatusCode.OK });\n span.end();\n return value;\n })\n .catch((error) => {\n const message = truncateErrorMessage(\n error instanceof Error ? error.message : String(error ?? 'Unknown error'),\n );\n span.setAttribute('code.function', options.name);\n span.setStatus({ code: SpanStatusCode.ERROR, message });\n span.recordException(error instanceof Error ? error : new Error(String(error)));\n span.end();\n throw error;\n });\n }\n\n span.setAttribute('code.function', options.name);\n span.setStatus({ code: SpanStatusCode.OK });\n span.end();\n return result;\n } catch (error) {\n const message = truncateErrorMessage(\n error instanceof Error ? error.message : String(error ?? 'Unknown error'),\n );\n span.setAttribute('code.function', options.name);\n span.setStatus({ code: SpanStatusCode.ERROR, message });\n span.recordException(error instanceof Error ? error : new Error(String(error)));\n span.end();\n throw error;\n }\n };\n\n const result = tracer.startActiveSpan(options.name, execute);\n\n if (result instanceof Promise) {\n return result;\n }\n\n return result as T;\n}\n\n"]}
|
package/dist/logger.d.ts
ADDED
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Zero-dependency structured logger for edge environments
|
|
3
|
+
*
|
|
4
|
+
* This logger is ~100 LOC and provides:
|
|
5
|
+
* - Structured JSON logging
|
|
6
|
+
* - Auto trace context injection (traceId, spanId)
|
|
7
|
+
* - Dynamic log level control (per-request via context)
|
|
8
|
+
* - Level support (info, error, warn, debug)
|
|
9
|
+
* - Zero dependencies (console-based)
|
|
10
|
+
*
|
|
11
|
+
* Unlike Pino/Winston (~500KB), this is <1KB minified!
|
|
12
|
+
*/
|
|
13
|
+
type LogLevel = 'debug' | 'info' | 'warn' | 'error' | 'none';
|
|
14
|
+
interface EdgeLogger {
|
|
15
|
+
info(msg: string, attrs?: Record<string, any>): void;
|
|
16
|
+
error(msg: string, error?: Error | unknown, attrs?: Record<string, any>): void;
|
|
17
|
+
warn(msg: string, attrs?: Record<string, any>): void;
|
|
18
|
+
debug(msg: string, attrs?: Record<string, any>): void;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Get the active log level from context (if set)
|
|
22
|
+
* Falls back to undefined if no log level is set in context
|
|
23
|
+
*/
|
|
24
|
+
declare function getActiveLogLevel(): LogLevel | undefined;
|
|
25
|
+
/**
|
|
26
|
+
* Run a function with a specific log level
|
|
27
|
+
* The log level is stored in OpenTelemetry context and applies to all logger calls within the callback
|
|
28
|
+
*
|
|
29
|
+
* This works in edge runtimes (uses OTel context, not Node.js AsyncLocalStorage)
|
|
30
|
+
*
|
|
31
|
+
* @example
|
|
32
|
+
* ```typescript
|
|
33
|
+
* // Enable debug logging for a specific request
|
|
34
|
+
* runWithLogLevel('debug', () => {
|
|
35
|
+
* log.debug('This will be logged')
|
|
36
|
+
* processRequest()
|
|
37
|
+
* })
|
|
38
|
+
*
|
|
39
|
+
* // Disable logging temporarily
|
|
40
|
+
* runWithLogLevel('none', () => {
|
|
41
|
+
* log.info('This will NOT be logged')
|
|
42
|
+
* })
|
|
43
|
+
* ```
|
|
44
|
+
*/
|
|
45
|
+
declare function runWithLogLevel<T>(level: LogLevel, callback: () => T): T;
|
|
46
|
+
/**
|
|
47
|
+
* Create a lightweight structured logger
|
|
48
|
+
*
|
|
49
|
+
* @param service - Service name for logging
|
|
50
|
+
* @param options - Optional configuration
|
|
51
|
+
*
|
|
52
|
+
* @example
|
|
53
|
+
* ```typescript
|
|
54
|
+
* const log = createEdgeLogger('user-service')
|
|
55
|
+
*
|
|
56
|
+
* log.info('Creating user', { email: 'test@example.com' })
|
|
57
|
+
* // Output: {"level":"info","service":"user-service","msg":"Creating user",
|
|
58
|
+
* // "email":"test@example.com","traceId":"...","spanId":"..."}
|
|
59
|
+
*
|
|
60
|
+
* // Dynamic log level control per-request
|
|
61
|
+
* runWithLogLevel('debug', () => {
|
|
62
|
+
* log.debug('This will be logged even if logger was created with level: "info"')
|
|
63
|
+
* })
|
|
64
|
+
* ```
|
|
65
|
+
*/
|
|
66
|
+
declare function createEdgeLogger(service: string, options?: {
|
|
67
|
+
level?: LogLevel;
|
|
68
|
+
pretty?: boolean;
|
|
69
|
+
}): EdgeLogger;
|
|
70
|
+
/**
|
|
71
|
+
* Helper to get trace context (useful for BYOL - Bring Your Own Logger)
|
|
72
|
+
*
|
|
73
|
+
* @example
|
|
74
|
+
* ```typescript
|
|
75
|
+
* import bunyan from 'bunyan'
|
|
76
|
+
* import { getEdgeTraceContext } from 'autotel-edge/api/logger'
|
|
77
|
+
*
|
|
78
|
+
* const bunyanLogger = bunyan.createLogger({ name: 'myapp' })
|
|
79
|
+
* const ctx = getEdgeTraceContext()
|
|
80
|
+
* bunyanLogger.info({ ...ctx, email: 'test@example.com' }, 'Creating user')
|
|
81
|
+
* ```
|
|
82
|
+
*/
|
|
83
|
+
declare function getEdgeTraceContext(): {
|
|
84
|
+
traceId: string;
|
|
85
|
+
spanId: string;
|
|
86
|
+
correlationId: string;
|
|
87
|
+
} | null;
|
|
88
|
+
|
|
89
|
+
export { type EdgeLogger, type LogLevel, createEdgeLogger, getActiveLogLevel, getEdgeTraceContext, runWithLogLevel };
|
package/dist/logger.js
ADDED
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import { createContextKey, context, trace } from '@opentelemetry/api';
|
|
2
|
+
|
|
3
|
+
// src/api/logger.ts
|
|
4
|
+
var LOG_LEVEL_KEY = createContextKey("autotel-edge-log-level");
|
|
5
|
+
function getActiveLogLevel() {
|
|
6
|
+
return context.active().getValue(LOG_LEVEL_KEY);
|
|
7
|
+
}
|
|
8
|
+
function runWithLogLevel(level, callback) {
|
|
9
|
+
const ctx = context.active().setValue(LOG_LEVEL_KEY, level);
|
|
10
|
+
return context.with(ctx, callback);
|
|
11
|
+
}
|
|
12
|
+
function getTraceContext() {
|
|
13
|
+
const span = trace.getActiveSpan();
|
|
14
|
+
if (!span) return null;
|
|
15
|
+
const ctx = span.spanContext();
|
|
16
|
+
return {
|
|
17
|
+
traceId: ctx.traceId,
|
|
18
|
+
spanId: ctx.spanId,
|
|
19
|
+
correlationId: ctx.traceId.slice(0, 16)
|
|
20
|
+
// First 16 chars for grouping
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
function createEdgeLogger(service, options) {
|
|
24
|
+
const defaultLevel = options?.level || "info";
|
|
25
|
+
const pretty = options?.pretty || false;
|
|
26
|
+
const levelPriority = {
|
|
27
|
+
none: -1,
|
|
28
|
+
debug: 0,
|
|
29
|
+
info: 1,
|
|
30
|
+
warn: 2,
|
|
31
|
+
error: 3
|
|
32
|
+
};
|
|
33
|
+
const shouldLog = (level) => {
|
|
34
|
+
const activeLevel = getActiveLogLevel() ?? defaultLevel;
|
|
35
|
+
if (activeLevel === "none") return false;
|
|
36
|
+
return levelPriority[level] >= levelPriority[activeLevel];
|
|
37
|
+
};
|
|
38
|
+
const log = (level, msg, attrs) => {
|
|
39
|
+
if (!shouldLog(level)) return;
|
|
40
|
+
const ctx = getTraceContext();
|
|
41
|
+
const logEntry = {
|
|
42
|
+
level,
|
|
43
|
+
service,
|
|
44
|
+
msg,
|
|
45
|
+
...attrs,
|
|
46
|
+
...ctx,
|
|
47
|
+
// Auto-inject traceId, spanId, correlationId
|
|
48
|
+
timestamp: (/* @__PURE__ */ new Date()).toISOString()
|
|
49
|
+
};
|
|
50
|
+
if (pretty) {
|
|
51
|
+
const traceInfo = ctx ? ` [${ctx.traceId.slice(0, 8)}.../${ctx.spanId.slice(0, 8)}...]` : "";
|
|
52
|
+
console.log(
|
|
53
|
+
`[${level.toUpperCase()}]${traceInfo} ${service}: ${msg}`,
|
|
54
|
+
attrs || ""
|
|
55
|
+
);
|
|
56
|
+
} else {
|
|
57
|
+
console.log(JSON.stringify(logEntry));
|
|
58
|
+
}
|
|
59
|
+
};
|
|
60
|
+
return {
|
|
61
|
+
info: (msg, attrs) => log("info", msg, attrs),
|
|
62
|
+
error: (msg, error, attrs) => {
|
|
63
|
+
const errorAttrs = error instanceof Error ? {
|
|
64
|
+
error: error.message,
|
|
65
|
+
stack: error.stack,
|
|
66
|
+
name: error.name,
|
|
67
|
+
...attrs
|
|
68
|
+
} : { error: String(error), ...attrs };
|
|
69
|
+
log("error", msg, errorAttrs);
|
|
70
|
+
},
|
|
71
|
+
warn: (msg, attrs) => log("warn", msg, attrs),
|
|
72
|
+
debug: (msg, attrs) => log("debug", msg, attrs)
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
function getEdgeTraceContext() {
|
|
76
|
+
return getTraceContext();
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
export { createEdgeLogger, getActiveLogLevel, getEdgeTraceContext, runWithLogLevel };
|
|
80
|
+
//# sourceMappingURL=logger.js.map
|
|
81
|
+
//# sourceMappingURL=logger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/api/logger.ts"],"names":["api_context"],"mappings":"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","file":"logger.js","sourcesContent":["/**\n * Zero-dependency structured logger for edge environments\n *\n * This logger is ~100 LOC and provides:\n * - Structured JSON logging\n * - Auto trace context injection (traceId, spanId)\n * - Dynamic log level control (per-request via context)\n * - Level support (info, error, warn, debug)\n * - Zero dependencies (console-based)\n *\n * Unlike Pino/Winston (~500KB), this is <1KB minified!\n */\n\nimport { trace, context as api_context, createContextKey } from '@opentelemetry/api';\n\nexport type LogLevel = 'debug' | 'info' | 'warn' | 'error' | 'none';\n\n/**\n * Context key for storing active log level (enables per-request log levels)\n */\nconst LOG_LEVEL_KEY = createContextKey('autotel-edge-log-level');\n\nexport interface EdgeLogger {\n info(msg: string, attrs?: Record<string, any>): void;\n error(msg: string, error?: Error | unknown, attrs?: Record<string, any>): void;\n warn(msg: string, attrs?: Record<string, any>): void;\n debug(msg: string, attrs?: Record<string, any>): void;\n}\n\n/**\n * Get the active log level from context (if set)\n * Falls back to undefined if no log level is set in context\n */\nexport function getActiveLogLevel(): LogLevel | undefined {\n return api_context.active().getValue(LOG_LEVEL_KEY) as LogLevel | undefined;\n}\n\n/**\n * Run a function with a specific log level\n * The log level is stored in OpenTelemetry context and applies to all logger calls within the callback\n *\n * This works in edge runtimes (uses OTel context, not Node.js AsyncLocalStorage)\n *\n * @example\n * ```typescript\n * // Enable debug logging for a specific request\n * runWithLogLevel('debug', () => {\n * log.debug('This will be logged')\n * processRequest()\n * })\n *\n * // Disable logging temporarily\n * runWithLogLevel('none', () => {\n * log.info('This will NOT be logged')\n * })\n * ```\n */\nexport function runWithLogLevel<T>(level: LogLevel, callback: () => T): T {\n const ctx = api_context.active().setValue(LOG_LEVEL_KEY, level);\n return api_context.with(ctx, callback);\n}\n\n/**\n * Get current trace context from active span\n */\nfunction getTraceContext():\n | { traceId: string; spanId: string; correlationId: string }\n | null {\n const span = trace.getActiveSpan();\n if (!span) return null;\n\n const ctx = span.spanContext();\n return {\n traceId: ctx.traceId,\n spanId: ctx.spanId,\n correlationId: ctx.traceId.slice(0, 16), // First 16 chars for grouping\n };\n}\n\n/**\n * Create a lightweight structured logger\n *\n * @param service - Service name for logging\n * @param options - Optional configuration\n *\n * @example\n * ```typescript\n * const log = createEdgeLogger('user-service')\n *\n * log.info('Creating user', { email: 'test@example.com' })\n * // Output: {\"level\":\"info\",\"service\":\"user-service\",\"msg\":\"Creating user\",\n * // \"email\":\"test@example.com\",\"traceId\":\"...\",\"spanId\":\"...\"}\n *\n * // Dynamic log level control per-request\n * runWithLogLevel('debug', () => {\n * log.debug('This will be logged even if logger was created with level: \"info\"')\n * })\n * ```\n */\nexport function createEdgeLogger(\n service: string,\n options?: {\n level?: LogLevel;\n pretty?: boolean; // For development\n },\n): EdgeLogger {\n const defaultLevel = options?.level || 'info';\n const pretty = options?.pretty || false;\n\n const levelPriority: Record<LogLevel, number> = {\n none: -1,\n debug: 0,\n info: 1,\n warn: 2,\n error: 3,\n };\n\n const shouldLog = (level: LogLevel): boolean => {\n // Priority: context level > options level > 'info' default\n const activeLevel = getActiveLogLevel() ?? defaultLevel;\n\n // 'none' means suppress all logging\n if (activeLevel === 'none') return false;\n\n return levelPriority[level] >= levelPriority[activeLevel];\n };\n\n const log = (\n level: 'info' | 'error' | 'warn' | 'debug',\n msg: string,\n attrs?: Record<string, any>,\n ) => {\n if (!shouldLog(level)) return;\n\n const ctx = getTraceContext();\n const logEntry: Record<string, any> = {\n level,\n service,\n msg,\n ...attrs,\n ...ctx, // Auto-inject traceId, spanId, correlationId\n timestamp: new Date().toISOString(),\n };\n\n if (pretty) {\n // Pretty print for development\n const traceInfo = ctx\n ? ` [${ctx.traceId.slice(0, 8)}.../${ctx.spanId.slice(0, 8)}...]`\n : '';\n console.log(\n `[${level.toUpperCase()}]${traceInfo} ${service}: ${msg}`,\n attrs || '',\n );\n } else {\n // Structured JSON for production\n console.log(JSON.stringify(logEntry));\n }\n };\n\n return {\n info: (msg: string, attrs?: Record<string, any>) => log('info', msg, attrs),\n\n error: (msg: string, error?: Error | unknown, attrs?: Record<string, any>) => {\n const errorAttrs = error instanceof Error\n ? {\n error: error.message,\n stack: error.stack,\n name: error.name,\n ...attrs,\n }\n : { error: String(error), ...attrs };\n\n log('error', msg, errorAttrs);\n },\n\n warn: (msg: string, attrs?: Record<string, any>) => log('warn', msg, attrs),\n\n debug: (msg: string, attrs?: Record<string, any>) => log('debug', msg, attrs),\n };\n}\n\n/**\n * Helper to get trace context (useful for BYOL - Bring Your Own Logger)\n *\n * @example\n * ```typescript\n * import bunyan from 'bunyan'\n * import { getEdgeTraceContext } from 'autotel-edge/api/logger'\n *\n * const bunyanLogger = bunyan.createLogger({ name: 'myapp' })\n * const ctx = getEdgeTraceContext()\n * bunyanLogger.info({ ...ctx, email: 'test@example.com' }, 'Creating user')\n * ```\n */\nexport function getEdgeTraceContext() {\n return getTraceContext();\n}\n"]}
|
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
import { T as TailSampleFn, L as LocalTrace } from './types-Dj85cPUj.js';
|
|
2
|
+
import '@opentelemetry/api';
|
|
3
|
+
import '@opentelemetry/sdk-trace-base';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Sampling strategies for autotel-edge
|
|
7
|
+
*
|
|
8
|
+
* Provides intelligent sampling to reduce telemetry costs while capturing critical data.
|
|
9
|
+
*
|
|
10
|
+
* Key strategies:
|
|
11
|
+
* - Always trace errors and slow requests (critical for debugging)
|
|
12
|
+
* - Adaptive sampling based on load
|
|
13
|
+
* - Baseline random sampling for normal traffic
|
|
14
|
+
*
|
|
15
|
+
* @example
|
|
16
|
+
* ```typescript
|
|
17
|
+
* import { createAdaptiveTailSampler } from 'autotel-edge/sampling'
|
|
18
|
+
*
|
|
19
|
+
* export default instrument(handler, {
|
|
20
|
+
* sampling: {
|
|
21
|
+
* tailSampler: createAdaptiveTailSampler({
|
|
22
|
+
* baselineSampleRate: 0.1, // 10% of normal requests
|
|
23
|
+
* slowThresholdMs: 1000, // Requests > 1s are "slow"
|
|
24
|
+
* })
|
|
25
|
+
* }
|
|
26
|
+
* })
|
|
27
|
+
* ```
|
|
28
|
+
*/
|
|
29
|
+
|
|
30
|
+
interface AdaptiveSamplerOptions {
|
|
31
|
+
/**
|
|
32
|
+
* Baseline sample rate for normal (successful, fast) requests
|
|
33
|
+
* @default 0.1 (10%)
|
|
34
|
+
*/
|
|
35
|
+
baselineSampleRate?: number;
|
|
36
|
+
/**
|
|
37
|
+
* Threshold in milliseconds for "slow" requests
|
|
38
|
+
* Requests taking longer than this will always be trace
|
|
39
|
+
* @default 1000ms
|
|
40
|
+
*/
|
|
41
|
+
slowThresholdMs?: number;
|
|
42
|
+
/**
|
|
43
|
+
* Always trace error spans
|
|
44
|
+
* @default true
|
|
45
|
+
*/
|
|
46
|
+
alwaysSampleErrors?: boolean;
|
|
47
|
+
/**
|
|
48
|
+
* Always trace slow spans
|
|
49
|
+
* @default true
|
|
50
|
+
*/
|
|
51
|
+
alwaysSampleSlow?: boolean;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Create an adaptive tail sampler
|
|
55
|
+
*
|
|
56
|
+
* This sampler ensures you never miss critical issues while keeping costs down:
|
|
57
|
+
* - Always traces errors (status code = ERROR)
|
|
58
|
+
* - Always traces slow requests (duration >= slowThresholdMs)
|
|
59
|
+
* - Uses baseline sample rate for successful fast requests
|
|
60
|
+
*
|
|
61
|
+
* **Recommended for production use.**
|
|
62
|
+
*
|
|
63
|
+
* @example
|
|
64
|
+
* ```typescript
|
|
65
|
+
* const tailSampler = createAdaptiveTailSampler({
|
|
66
|
+
* baselineSampleRate: 0.1, // 10% of normal requests
|
|
67
|
+
* slowThresholdMs: 1000, // Requests > 1s are "slow"
|
|
68
|
+
* alwaysSampleErrors: true, // Always trace errors
|
|
69
|
+
* alwaysSampleSlow: true // Always trace slow requests
|
|
70
|
+
* })
|
|
71
|
+
* ```
|
|
72
|
+
*/
|
|
73
|
+
declare function createAdaptiveTailSampler(options?: AdaptiveSamplerOptions): TailSampleFn;
|
|
74
|
+
/**
|
|
75
|
+
* Create a simple random tail sampler
|
|
76
|
+
*
|
|
77
|
+
* Samples a fixed percentage of all traces regardless of outcome.
|
|
78
|
+
*
|
|
79
|
+
* @example
|
|
80
|
+
* ```typescript
|
|
81
|
+
* const tailSampler = createRandomTailSampler(0.1) // 10% of all requests
|
|
82
|
+
* ```
|
|
83
|
+
*/
|
|
84
|
+
declare function createRandomTailSampler(sampleRate: number): TailSampleFn;
|
|
85
|
+
/**
|
|
86
|
+
* Create a tail sampler that keeps all errors
|
|
87
|
+
*
|
|
88
|
+
* Useful for debugging - captures all failures while dropping successful requests.
|
|
89
|
+
*
|
|
90
|
+
* @example
|
|
91
|
+
* ```typescript
|
|
92
|
+
* const tailSampler = createErrorOnlyTailSampler()
|
|
93
|
+
* ```
|
|
94
|
+
*/
|
|
95
|
+
declare function createErrorOnlyTailSampler(): TailSampleFn;
|
|
96
|
+
/**
|
|
97
|
+
* Create a tail sampler that keeps slow requests
|
|
98
|
+
*
|
|
99
|
+
* Useful for performance debugging - captures slow requests while dropping fast ones.
|
|
100
|
+
*
|
|
101
|
+
* @example
|
|
102
|
+
* ```typescript
|
|
103
|
+
* const tailSampler = createSlowOnlyTailSampler(1000) // Keep requests > 1s
|
|
104
|
+
* ```
|
|
105
|
+
*/
|
|
106
|
+
declare function createSlowOnlyTailSampler(thresholdMs: number): TailSampleFn;
|
|
107
|
+
/**
|
|
108
|
+
* Combine multiple tail samplers with OR logic
|
|
109
|
+
*
|
|
110
|
+
* Keeps a trace if ANY sampler returns true.
|
|
111
|
+
*
|
|
112
|
+
* @example
|
|
113
|
+
* ```typescript
|
|
114
|
+
* const tailSampler = combineTailSamplers(
|
|
115
|
+
* createErrorOnlyTailSampler(),
|
|
116
|
+
* createSlowOnlyTailSampler(1000),
|
|
117
|
+
* createRandomTailSampler(0.01) // 1% baseline
|
|
118
|
+
* )
|
|
119
|
+
* ```
|
|
120
|
+
*/
|
|
121
|
+
declare function combineTailSamplers(...samplers: TailSampleFn[]): TailSampleFn;
|
|
122
|
+
/**
|
|
123
|
+
* Create a tail sampler based on custom predicate
|
|
124
|
+
*
|
|
125
|
+
* @example
|
|
126
|
+
* ```typescript
|
|
127
|
+
* // Keep traces with specific attributes
|
|
128
|
+
* const tailSampler = createCustomTailSampler((trace) => {
|
|
129
|
+
* const attrs = trace.localRootSpan.attributes
|
|
130
|
+
* return attrs['user.id'] === 'vip_123'
|
|
131
|
+
* })
|
|
132
|
+
* ```
|
|
133
|
+
*/
|
|
134
|
+
declare function createCustomTailSampler(predicate: (traceInfo: LocalTrace) => boolean): TailSampleFn;
|
|
135
|
+
/**
|
|
136
|
+
* Common presets for quick setup
|
|
137
|
+
*/
|
|
138
|
+
declare const SamplingPresets: {
|
|
139
|
+
/**
|
|
140
|
+
* Production: 10% baseline, all errors, all slow (>1s)
|
|
141
|
+
* Recommended for most production workloads
|
|
142
|
+
*/
|
|
143
|
+
production: () => TailSampleFn;
|
|
144
|
+
/**
|
|
145
|
+
* High-traffic: 1% baseline, all errors, all slow (>2s)
|
|
146
|
+
* For high-volume services where cost is a concern
|
|
147
|
+
*/
|
|
148
|
+
highTraffic: () => TailSampleFn;
|
|
149
|
+
/**
|
|
150
|
+
* Debugging: All errors, all slow (>500ms), 50% baseline
|
|
151
|
+
* For active debugging sessions
|
|
152
|
+
*/
|
|
153
|
+
debugging: () => TailSampleFn;
|
|
154
|
+
/**
|
|
155
|
+
* Development: 100% sampling
|
|
156
|
+
* For local development and testing
|
|
157
|
+
*/
|
|
158
|
+
development: () => TailSampleFn;
|
|
159
|
+
/**
|
|
160
|
+
* Errors only: Capture all failures, drop all successes
|
|
161
|
+
* For error-focused monitoring
|
|
162
|
+
*/
|
|
163
|
+
errorsOnly: () => TailSampleFn;
|
|
164
|
+
};
|
|
165
|
+
|
|
166
|
+
export { type AdaptiveSamplerOptions, SamplingPresets, combineTailSamplers, createAdaptiveTailSampler, createCustomTailSampler, createErrorOnlyTailSampler, createRandomTailSampler, createSlowOnlyTailSampler };
|
package/dist/sampling.js
ADDED
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
// src/sampling/index.ts
|
|
2
|
+
function createAdaptiveTailSampler(options = {}) {
|
|
3
|
+
const baselineSampleRate = options.baselineSampleRate ?? 0.1;
|
|
4
|
+
const slowThresholdMs = options.slowThresholdMs ?? 1e3;
|
|
5
|
+
const alwaysSampleErrors = options.alwaysSampleErrors ?? true;
|
|
6
|
+
const alwaysSampleSlow = options.alwaysSampleSlow ?? true;
|
|
7
|
+
if (baselineSampleRate < 0 || baselineSampleRate > 1) {
|
|
8
|
+
throw new Error("Baseline sample rate must be between 0 and 1");
|
|
9
|
+
}
|
|
10
|
+
const baselineDecisions = /* @__PURE__ */ new Map();
|
|
11
|
+
return (traceInfo) => {
|
|
12
|
+
const { traceId, localRootSpan } = traceInfo;
|
|
13
|
+
if (!baselineDecisions.has(traceId)) {
|
|
14
|
+
baselineDecisions.set(traceId, Math.random() < baselineSampleRate);
|
|
15
|
+
}
|
|
16
|
+
const baselineDecision = baselineDecisions.get(traceId);
|
|
17
|
+
if (alwaysSampleErrors && localRootSpan.status.code === 2) {
|
|
18
|
+
return true;
|
|
19
|
+
}
|
|
20
|
+
if (alwaysSampleSlow) {
|
|
21
|
+
const duration = getDurationMs(localRootSpan);
|
|
22
|
+
if (duration >= slowThresholdMs) {
|
|
23
|
+
return true;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
return baselineDecision;
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
function createRandomTailSampler(sampleRate) {
|
|
30
|
+
if (sampleRate < 0 || sampleRate > 1) {
|
|
31
|
+
throw new Error("Sample rate must be between 0 and 1");
|
|
32
|
+
}
|
|
33
|
+
const decisions = /* @__PURE__ */ new Map();
|
|
34
|
+
return (traceInfo) => {
|
|
35
|
+
const { traceId } = traceInfo;
|
|
36
|
+
if (!decisions.has(traceId)) {
|
|
37
|
+
decisions.set(traceId, Math.random() < sampleRate);
|
|
38
|
+
}
|
|
39
|
+
return decisions.get(traceId);
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
function createErrorOnlyTailSampler() {
|
|
43
|
+
return (traceInfo) => {
|
|
44
|
+
return traceInfo.localRootSpan.status.code === 2;
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
function createSlowOnlyTailSampler(thresholdMs) {
|
|
48
|
+
return (traceInfo) => {
|
|
49
|
+
const duration = getDurationMs(traceInfo.localRootSpan);
|
|
50
|
+
return duration >= thresholdMs;
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
function combineTailSamplers(...samplers) {
|
|
54
|
+
if (samplers.length === 0) {
|
|
55
|
+
throw new Error("combineTailSamplers requires at least one sampler");
|
|
56
|
+
}
|
|
57
|
+
return (traceInfo) => {
|
|
58
|
+
return samplers.some((sampler) => sampler(traceInfo));
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
function createCustomTailSampler(predicate) {
|
|
62
|
+
return predicate;
|
|
63
|
+
}
|
|
64
|
+
function getDurationMs(span) {
|
|
65
|
+
const start = span.startTime[0] * 1e3 + span.startTime[1] / 1e6;
|
|
66
|
+
const end = span.endTime[0] * 1e3 + span.endTime[1] / 1e6;
|
|
67
|
+
return end - start;
|
|
68
|
+
}
|
|
69
|
+
var SamplingPresets = {
|
|
70
|
+
/**
|
|
71
|
+
* Production: 10% baseline, all errors, all slow (>1s)
|
|
72
|
+
* Recommended for most production workloads
|
|
73
|
+
*/
|
|
74
|
+
production: () => createAdaptiveTailSampler({
|
|
75
|
+
baselineSampleRate: 0.1,
|
|
76
|
+
slowThresholdMs: 1e3
|
|
77
|
+
}),
|
|
78
|
+
/**
|
|
79
|
+
* High-traffic: 1% baseline, all errors, all slow (>2s)
|
|
80
|
+
* For high-volume services where cost is a concern
|
|
81
|
+
*/
|
|
82
|
+
highTraffic: () => createAdaptiveTailSampler({
|
|
83
|
+
baselineSampleRate: 0.01,
|
|
84
|
+
slowThresholdMs: 2e3
|
|
85
|
+
}),
|
|
86
|
+
/**
|
|
87
|
+
* Debugging: All errors, all slow (>500ms), 50% baseline
|
|
88
|
+
* For active debugging sessions
|
|
89
|
+
*/
|
|
90
|
+
debugging: () => createAdaptiveTailSampler({
|
|
91
|
+
baselineSampleRate: 0.5,
|
|
92
|
+
slowThresholdMs: 500
|
|
93
|
+
}),
|
|
94
|
+
/**
|
|
95
|
+
* Development: 100% sampling
|
|
96
|
+
* For local development and testing
|
|
97
|
+
*/
|
|
98
|
+
development: () => () => true,
|
|
99
|
+
/**
|
|
100
|
+
* Errors only: Capture all failures, drop all successes
|
|
101
|
+
* For error-focused monitoring
|
|
102
|
+
*/
|
|
103
|
+
errorsOnly: () => createErrorOnlyTailSampler()
|
|
104
|
+
};
|
|
105
|
+
|
|
106
|
+
export { SamplingPresets, combineTailSamplers, createAdaptiveTailSampler, createCustomTailSampler, createErrorOnlyTailSampler, createRandomTailSampler, createSlowOnlyTailSampler };
|
|
107
|
+
//# sourceMappingURL=sampling.js.map
|
|
108
|
+
//# sourceMappingURL=sampling.js.map
|