autotel-cloudflare 2.14.0 → 2.16.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/README.md +3 -3
- package/dist/bindings.d.ts +0 -19
- package/dist/bindings.js +1 -1
- package/dist/{chunk-4UG2QCPQ.js → chunk-NUNTBJWB.js} +80 -58
- package/dist/chunk-NUNTBJWB.js.map +1 -0
- package/dist/index.js +15 -5
- package/dist/index.js.map +1 -1
- package/package.json +3 -3
- package/src/bindings/ai.test.ts +14 -0
- package/src/bindings/ai.ts +2 -2
- package/src/bindings/analytics-engine.test.ts +15 -0
- package/src/bindings/analytics-engine.ts +2 -2
- package/src/bindings/bindings-cache.test.ts +80 -0
- package/src/bindings/bindings-this-binding.test.ts +258 -0
- package/src/bindings/bindings.ts +80 -48
- package/src/bindings/browser-rendering.test.ts +16 -0
- package/src/bindings/browser-rendering.ts +2 -2
- package/src/bindings/hyperdrive.test.ts +22 -0
- package/src/bindings/hyperdrive.ts +2 -2
- package/src/bindings/images.test.ts +33 -0
- package/src/bindings/images.ts +4 -4
- package/src/bindings/queue-producer.test.ts +32 -0
- package/src/bindings/queue-producer.ts +4 -4
- package/src/bindings/rate-limiter.test.ts +16 -0
- package/src/bindings/rate-limiter.ts +2 -2
- package/src/bindings/vectorize.test.ts +22 -0
- package/src/bindings/vectorize.ts +2 -2
- package/src/global/fetch.test.ts +55 -0
- package/src/global/fetch.ts +4 -2
- package/src/wrappers/instrument.integration.test.ts +103 -0
- package/src/wrappers/instrument.ts +16 -3
- package/dist/chunk-4UG2QCPQ.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/bindings/ai.ts","../src/bindings/vectorize.ts","../src/bindings/hyperdrive.ts","../src/bindings/queue-producer.ts","../src/bindings/analytics-engine.ts","../src/bindings/images.ts","../src/bindings/bindings.ts","../src/bindings/rate-limiter.ts","../src/bindings/browser-rendering.ts"],"names":["trace","SpanKind","SpanStatusCode","target","prop","value","fnTarget","_thisArg","args"],"mappings":"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","file":"chunk-NUNTBJWB.js","sourcesContent":["/**\n * Workers AI binding instrumentation\n */\n\nimport {\n trace,\n SpanKind,\n SpanStatusCode,\n} from '@opentelemetry/api';\nimport type { WorkerTracer } from 'autotel-edge';\nimport { wrap, setAttr } from './common';\n\n/**\n * Instrument Workers AI binding\n */\nexport function instrumentAI<T extends Ai>(ai: T, bindingName?: string): T {\n const name = bindingName || 'ai';\n\n const handler: ProxyHandler<T> = {\n get(target, prop) {\n const value = Reflect.get(target, prop);\n\n if (prop === 'run' && typeof value === 'function') {\n return new Proxy(value, {\n apply: (fnTarget, _thisArg, args) => {\n const [model] = args as [string, unknown, unknown];\n const tracer = trace.getTracer('autotel-edge') as WorkerTracer;\n\n return tracer.startActiveSpan(\n `AI ${name}: run ${model}`,\n {\n kind: SpanKind.CLIENT,\n attributes: {\n 'gen_ai.system': 'cloudflare-workers-ai',\n 'gen_ai.operation.name': 'run',\n 'gen_ai.request.model': model,\n },\n },\n async (span) => {\n try {\n const result = await Reflect.apply(fnTarget, target, args);\n if (result?.usage?.prompt_tokens !== undefined) {\n setAttr(span, 'gen_ai.usage.input_tokens', Number(result.usage.prompt_tokens));\n }\n if (result?.usage?.completion_tokens !== undefined) {\n setAttr(span, 'gen_ai.usage.output_tokens', Number(result.usage.completion_tokens));\n }\n span.setStatus({ code: SpanStatusCode.OK });\n return result;\n } catch (error) {\n span.recordException(error as Error);\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: error instanceof Error ? error.message : String(error),\n });\n throw error;\n } finally {\n span.end();\n }\n },\n );\n },\n });\n }\n\n return value;\n },\n };\n\n return wrap(ai, handler);\n}\n","/**\n * Vectorize binding instrumentation\n */\n\nimport {\n trace,\n SpanKind,\n SpanStatusCode,\n} from '@opentelemetry/api';\nimport type { WorkerTracer } from 'autotel-edge';\nimport { wrap, setAttr } from './common';\n\nconst TRACED_METHODS = ['query', 'insert', 'upsert', 'deleteByIds', 'getByIds', 'describe'] as const;\n\n/**\n * Instrument Vectorize index binding\n */\nexport function instrumentVectorize<T extends VectorizeIndex>(vectorize: T, indexName?: string): T {\n const name = indexName || 'vectorize';\n\n const handler: ProxyHandler<T> = {\n get(target, prop) {\n const value = Reflect.get(target, prop);\n\n if (typeof prop === 'string' && TRACED_METHODS.includes(prop as any) && typeof value === 'function') {\n return new Proxy(value, {\n apply: (fnTarget, _thisArg, args) => {\n const operation = prop as string;\n const tracer = trace.getTracer('autotel-edge') as WorkerTracer;\n\n const attributes: Record<string, string | number> = {\n 'db.system': 'cloudflare-vectorize',\n 'db.operation': operation,\n 'db.collection.name': name,\n };\n\n // Per-operation attributes\n if (operation === 'query') {\n const queryInput = args[0] as { topK?: number } | undefined;\n if (queryInput?.topK !== undefined) {\n attributes['db.vectorize.top_k'] = queryInput.topK;\n }\n }\n\n if ((operation === 'insert' || operation === 'upsert') && Array.isArray(args[0])) {\n attributes['db.vectorize.vectors_count'] = args[0].length;\n }\n\n return tracer.startActiveSpan(\n `Vectorize ${name}: ${operation}`,\n {\n kind: SpanKind.CLIENT,\n attributes,\n },\n async (span) => {\n try {\n const result = await Reflect.apply(fnTarget, target, args);\n\n if (operation === 'query' && result?.matches) {\n setAttr(span, 'db.vectorize.matches_count', result.matches.length);\n }\n\n span.setStatus({ code: SpanStatusCode.OK });\n return result;\n } catch (error) {\n span.recordException(error as Error);\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: error instanceof Error ? error.message : String(error),\n });\n throw error;\n } finally {\n span.end();\n }\n },\n );\n },\n });\n }\n\n return value;\n },\n };\n\n return wrap(vectorize, handler);\n}\n","/**\n * Hyperdrive binding instrumentation\n */\n\nimport {\n trace,\n SpanKind,\n SpanStatusCode,\n} from '@opentelemetry/api';\nimport type { WorkerTracer } from 'autotel-edge';\nimport { wrap, setAttr } from './common';\n\n/**\n * Instrument Hyperdrive binding\n */\nexport function instrumentHyperdrive<T extends Hyperdrive>(hyperdrive: T, bindingName?: string): T {\n const name = bindingName || 'hyperdrive';\n\n const handler: ProxyHandler<T> = {\n get(target, prop) {\n const value = Reflect.get(target, prop);\n\n if (prop === 'connect' && typeof value === 'function') {\n return new Proxy(value, {\n apply: (fnTarget, _thisArg, args) => {\n const tracer = trace.getTracer('autotel-edge') as WorkerTracer;\n\n const attributes: Record<string, string | number> = {\n 'db.system': 'cloudflare-hyperdrive',\n 'db.operation': 'connect',\n };\n\n // Extract connection info safely (never record password)\n try {\n setAttr({ setAttribute: (k: string, v: any) => { if (v !== undefined && v !== null) attributes[k] = v; } }, 'server.address', target.host);\n setAttr({ setAttribute: (k: string, v: any) => { if (v !== undefined && v !== null) attributes[k] = v; } }, 'server.port', target.port);\n setAttr({ setAttribute: (k: string, v: any) => { if (v !== undefined && v !== null) attributes[k] = v; } }, 'db.user', target.user);\n } catch {\n // Properties may not be accessible in all environments\n }\n\n return tracer.startActiveSpan(\n `Hyperdrive ${name}: connect`,\n {\n kind: SpanKind.CLIENT,\n attributes,\n },\n async (span) => {\n try {\n const result = await Reflect.apply(fnTarget, target, args);\n span.setStatus({ code: SpanStatusCode.OK });\n return result;\n } catch (error) {\n span.recordException(error as Error);\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: error instanceof Error ? error.message : String(error),\n });\n throw error;\n } finally {\n span.end();\n }\n },\n );\n },\n });\n }\n\n return value;\n },\n };\n\n return wrap(hyperdrive, handler);\n}\n","/**\n * Queue producer binding instrumentation\n */\n\nimport {\n trace,\n SpanKind,\n SpanStatusCode,\n} from '@opentelemetry/api';\nimport type { WorkerTracer } from 'autotel-edge';\nimport { wrap, setAttr } from './common';\n\n/**\n * Instrument Queue producer binding\n */\nexport function instrumentQueueProducer<T extends Queue>(queue: T, queueName?: string): T {\n const name = queueName || 'queue';\n\n const handler: ProxyHandler<T> = {\n get(target, prop) {\n const value = Reflect.get(target, prop);\n\n if (prop === 'send' && typeof value === 'function') {\n return new Proxy(value, {\n apply: (fnTarget, _thisArg, args) => {\n const tracer = trace.getTracer('autotel-edge') as WorkerTracer;\n\n return tracer.startActiveSpan(\n `Queue ${name}: send`,\n {\n kind: SpanKind.PRODUCER,\n attributes: {\n 'messaging.system': 'cloudflare-queues',\n 'messaging.operation.type': 'publish',\n 'messaging.operation': 'send',\n 'messaging.destination.name': name,\n },\n },\n async (span) => {\n try {\n const result = await Reflect.apply(fnTarget, target, args);\n setAttr(span, 'messaging.message.id', (result as any)?.messageId);\n span.setStatus({ code: SpanStatusCode.OK });\n return result;\n } catch (error) {\n span.recordException(error as Error);\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: error instanceof Error ? error.message : String(error),\n });\n throw error;\n } finally {\n span.end();\n }\n },\n );\n },\n });\n }\n\n if (prop === 'sendBatch' && typeof value === 'function') {\n return new Proxy(value, {\n apply: (fnTarget, _thisArg, args) => {\n const [messages] = args as [{ body: unknown }[]];\n const tracer = trace.getTracer('autotel-edge') as WorkerTracer;\n\n return tracer.startActiveSpan(\n `Queue ${name}: sendBatch`,\n {\n kind: SpanKind.PRODUCER,\n attributes: {\n 'messaging.system': 'cloudflare-queues',\n 'messaging.operation.type': 'publish',\n 'messaging.operation': 'sendBatch',\n 'messaging.destination.name': name,\n 'messaging.batch.message_count': Array.isArray(messages) ? messages.length : 0,\n },\n },\n async (span) => {\n try {\n const result = await Reflect.apply(fnTarget, target, args);\n span.setStatus({ code: SpanStatusCode.OK });\n return result;\n } catch (error) {\n span.recordException(error as Error);\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: error instanceof Error ? error.message : String(error),\n });\n throw error;\n } finally {\n span.end();\n }\n },\n );\n },\n });\n }\n\n return value;\n },\n };\n\n return wrap(queue, handler);\n}\n","/**\n * Analytics Engine binding instrumentation\n */\n\nimport {\n trace,\n SpanKind,\n SpanStatusCode,\n} from '@opentelemetry/api';\nimport type { WorkerTracer } from 'autotel-edge';\nimport { wrap } from './common';\n\n/**\n * Instrument Analytics Engine binding\n */\nexport function instrumentAnalyticsEngine<T extends AnalyticsEngineDataset>(ae: T, datasetName?: string): T {\n const name = datasetName || 'analytics-engine';\n\n const handler: ProxyHandler<T> = {\n get(target, prop) {\n const value = Reflect.get(target, prop);\n\n if (prop === 'writeDataPoint' && typeof value === 'function') {\n return new Proxy(value, {\n apply: (fnTarget, _thisArg, args) => {\n const [dataPoint] = args as [AnalyticsEngineDataPoint | undefined];\n const tracer = trace.getTracer('autotel-edge') as WorkerTracer;\n\n const attributes: Record<string, string | number> = {\n 'analytics.system': 'cloudflare-analytics-engine',\n 'analytics.operation': 'writeDataPoint',\n };\n\n if (dataPoint) {\n if (dataPoint.indexes) {\n attributes['analytics.indexes_count'] = Array.isArray(dataPoint.indexes) ? dataPoint.indexes.length : 1;\n }\n if (dataPoint.doubles) {\n attributes['analytics.doubles_count'] = dataPoint.doubles.length;\n }\n if (dataPoint.blobs) {\n attributes['analytics.blobs_count'] = dataPoint.blobs.length;\n }\n }\n\n return tracer.startActiveSpan(\n `AnalyticsEngine ${name}: writeDataPoint`,\n {\n kind: SpanKind.CLIENT,\n attributes,\n },\n (span) => {\n try {\n // writeDataPoint is synchronous/void\n Reflect.apply(fnTarget, target, args);\n span.setStatus({ code: SpanStatusCode.OK });\n } catch (error) {\n span.recordException(error as Error);\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: error instanceof Error ? error.message : String(error),\n });\n throw error;\n } finally {\n span.end();\n }\n },\n );\n },\n });\n }\n\n return value;\n },\n };\n\n return wrap(ae, handler);\n}\n","/**\n * Images binding instrumentation\n *\n * The Images binding uses a fluent chain: input() -> transform() -> draw() -> output()\n * We only create a span at the terminal output() call to avoid intermediate noise.\n * info() is a standalone operation and gets its own span.\n */\n\nimport {\n trace,\n SpanKind,\n SpanStatusCode,\n} from '@opentelemetry/api';\nimport type { WorkerTracer } from 'autotel-edge';\nimport { wrap, setAttr } from './common';\n\nconst pipelineMetaSymbol = Symbol('images-pipeline-meta');\n\ninterface PipelineMeta {\n operationCount: number;\n}\n\ninterface ImagesLike {\n info(blob: ReadableStream | ArrayBuffer | Blob): Promise<{ width: number; height: number; format: string }>;\n input(blob: ReadableStream | ArrayBuffer | Blob): ImageTransformerLike;\n}\n\ninterface ImageTransformerLike {\n transform(options: unknown): ImageTransformerLike;\n draw(image: unknown, options?: unknown): ImageTransformerLike;\n output(options?: unknown): Promise<ImageOutputLike>;\n}\n\ninterface ImageOutputLike {\n response(): Response;\n blob(): Promise<Blob>;\n arrayBuffer(): Promise<ArrayBuffer>;\n}\n\nfunction proxyTransformer(transformer: ImageTransformerLike, meta: PipelineMeta, bindingName: string): ImageTransformerLike {\n const handler: ProxyHandler<ImageTransformerLike> = {\n get(target, prop) {\n const value = Reflect.get(target, prop);\n\n if ((prop === 'transform' || prop === 'draw') && typeof value === 'function') {\n return new Proxy(value, {\n apply: (fnTarget, _thisArg, args) => {\n meta.operationCount++;\n const result = Reflect.apply(fnTarget, target, args);\n // If the result is the transformer itself (fluent chain), return our proxy\n if (result === target || (result && typeof result === 'object' && 'output' in result)) {\n return proxyTransformer(result as ImageTransformerLike, meta, bindingName);\n }\n return result;\n },\n });\n }\n\n if (prop === 'output' && typeof value === 'function') {\n return new Proxy(value, {\n apply: (fnTarget, _thisArg, args) => {\n const tracer = trace.getTracer('autotel-edge') as WorkerTracer;\n const [formatOrOptions] = args;\n\n const attributes: Record<string, string | number> = {\n 'images.system': 'cloudflare-images',\n 'images.pipeline.operation_count': meta.operationCount,\n };\n\n // Capture output format\n if (typeof formatOrOptions === 'string') {\n attributes['images.output.format'] = formatOrOptions;\n } else if (formatOrOptions && typeof formatOrOptions === 'object') {\n const fmt = (formatOrOptions as any).format;\n if (fmt) attributes['images.output.format'] = fmt;\n }\n\n return tracer.startActiveSpan(\n `Images ${bindingName}: output`,\n {\n kind: SpanKind.CLIENT,\n attributes,\n },\n async (span) => {\n try {\n const result = await Reflect.apply(fnTarget, target, args);\n span.setStatus({ code: SpanStatusCode.OK });\n return result;\n } catch (error) {\n span.recordException(error as Error);\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: error instanceof Error ? error.message : String(error),\n });\n throw error;\n } finally {\n span.end();\n }\n },\n );\n },\n });\n }\n\n return value;\n },\n };\n\n const proxy = new Proxy(transformer, handler);\n Object.defineProperty(proxy, pipelineMetaSymbol, {\n value: meta,\n writable: false,\n enumerable: false,\n configurable: false,\n });\n return proxy;\n}\n\n/**\n * Instrument Images binding\n */\nexport function instrumentImages<T extends ImagesLike>(images: T, bindingName?: string): T {\n const name = bindingName || 'images';\n\n const handler: ProxyHandler<T> = {\n get(target, prop) {\n const value = Reflect.get(target, prop);\n\n if (prop === 'info' && typeof value === 'function') {\n return new Proxy(value, {\n apply: (fnTarget, _thisArg, args) => {\n const tracer = trace.getTracer('autotel-edge') as WorkerTracer;\n\n return tracer.startActiveSpan(\n `Images ${name}: info`,\n {\n kind: SpanKind.CLIENT,\n attributes: {\n 'images.system': 'cloudflare-images',\n 'images.operation': 'info',\n },\n },\n async (span) => {\n try {\n const result = await Reflect.apply(fnTarget, target, args);\n setAttr(span, 'images.width', result?.width);\n setAttr(span, 'images.height', result?.height);\n setAttr(span, 'images.format', result?.format);\n span.setStatus({ code: SpanStatusCode.OK });\n return result;\n } catch (error) {\n span.recordException(error as Error);\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: error instanceof Error ? error.message : String(error),\n });\n throw error;\n } finally {\n span.end();\n }\n },\n );\n },\n });\n }\n\n if (prop === 'input' && typeof value === 'function') {\n return new Proxy(value, {\n apply: (fnTarget, _thisArg, args) => {\n const transformer = Reflect.apply(fnTarget, target, args) as ImageTransformerLike;\n const meta: PipelineMeta = { operationCount: 0 };\n return proxyTransformer(transformer, meta, name);\n },\n });\n }\n\n return value;\n },\n };\n\n return wrap(images, handler);\n}\n","/**\n * Auto-instrumentation for Cloudflare Workers bindings\n * \n * Note: This file uses Cloudflare Workers types (KVNamespace, R2Bucket, D1Database, Fetcher, etc.)\n * which are globally available via @cloudflare/workers-types when listed in tsconfig.json.\n * These types are devDependencies only - they're not runtime dependencies.\n * At runtime, Cloudflare Workers runtime provides the actual implementations.\n * \n * This module provides automatic tracing for Cloudflare bindings:\n * - KV (key-value operations)\n * - R2 (object storage operations)\n * - D1 (database operations)\n * - Service Bindings\n * - Events Engine\n * - Workers AI\n * - Vectorize\n * - Hyperdrive\n */\n\nimport {\n trace,\n SpanKind,\n SpanStatusCode,\n} from '@opentelemetry/api';\nimport { WorkerTracer, getActiveConfig } from 'autotel-edge';\nimport { wrap, isWrapped } from './common';\nimport { instrumentAI } from './ai';\nimport { instrumentVectorize } from './vectorize';\nimport { instrumentHyperdrive } from './hyperdrive';\nimport { instrumentQueueProducer } from './queue-producer';\nimport { instrumentAnalyticsEngine } from './analytics-engine';\nimport { instrumentImages } from './images';\n\ntype DbStatementCapture = 'off' | 'obfuscated' | 'full';\n\n/**\n * Sanitize a SQL statement based on the capture mode.\n * - 'full': returns the statement as-is\n * - 'obfuscated': replaces string literals and numbers with '?'\n * - 'off': returns undefined (attribute not set)\n */\nfunction sanitizeStatement(query: string, mode: DbStatementCapture): string | undefined {\n if (mode === 'off') return undefined;\n if (mode === 'obfuscated') return query.replaceAll(/'[^']*'/g, \"'?'\").replaceAll(/\\b\\d+\\b/g, '?');\n return query;\n}\n\n/**\n * Instrument KV namespace\n */\nexport function instrumentKV<K extends KVNamespace>(kv: K, namespaceName?: string): K {\n const name = namespaceName || 'kv';\n \n const kvHandler: ProxyHandler<K> = {\n get(target, prop) {\n const value = Reflect.get(target, prop);\n \n if (prop === 'get' && typeof value === 'function') {\n return new Proxy(value, {\n apply: (fnTarget, _thisArg, args) => {\n const [key, options] = args as [string, KVNamespaceGetOptions<unknown> | undefined];\n const tracer = trace.getTracer('autotel-edge') as WorkerTracer;\n\n return tracer.startActiveSpan(\n `KV ${name}: get`,\n {\n kind: SpanKind.CLIENT,\n attributes: {\n 'db.system': 'cloudflare-kv',\n 'db.operation': 'get',\n 'db.namespace': name,\n 'db.key': key,\n 'db.cache_hit': options?.cacheTtl !== undefined,\n },\n },\n async (span) => {\n try {\n const result = await Reflect.apply(fnTarget, target, args);\n span.setAttribute('db.result.type', result === null ? 'null' : typeof result);\n span.setStatus({ code: SpanStatusCode.OK });\n return result;\n } catch (error) {\n span.recordException(error as Error);\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: error instanceof Error ? error.message : String(error),\n });\n throw error;\n } finally {\n span.end();\n }\n },\n );\n },\n });\n }\n \n if (prop === 'put' && typeof value === 'function') {\n return new Proxy(value, {\n apply: (fnTarget, _thisArg, args) => {\n const [key] = args as [string, unknown, KVNamespacePutOptions | undefined];\n const tracer = trace.getTracer('autotel-edge') as WorkerTracer;\n\n return tracer.startActiveSpan(\n `KV ${name}: put`,\n {\n kind: SpanKind.CLIENT,\n attributes: {\n 'db.system': 'cloudflare-kv',\n 'db.operation': 'put',\n 'db.namespace': name,\n 'db.key': key,\n },\n },\n async (span) => {\n try {\n const result = await Reflect.apply(fnTarget, target, args);\n span.setStatus({ code: SpanStatusCode.OK });\n return result;\n } catch (error) {\n span.recordException(error as Error);\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: error instanceof Error ? error.message : String(error),\n });\n throw error;\n } finally {\n span.end();\n }\n },\n );\n },\n });\n }\n \n if (prop === 'delete' && typeof value === 'function') {\n return new Proxy(value, {\n apply: (fnTarget, _thisArg, args) => {\n const [key] = args as [string];\n const tracer = trace.getTracer('autotel-edge') as WorkerTracer;\n\n return tracer.startActiveSpan(\n `KV ${name}: delete`,\n {\n kind: SpanKind.CLIENT,\n attributes: {\n 'db.system': 'cloudflare-kv',\n 'db.operation': 'delete',\n 'db.namespace': name,\n 'db.key': key,\n },\n },\n async (span) => {\n try {\n const result = await Reflect.apply(fnTarget, target, args);\n span.setStatus({ code: SpanStatusCode.OK });\n return result;\n } catch (error) {\n span.recordException(error as Error);\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: error instanceof Error ? error.message : String(error),\n });\n throw error;\n } finally {\n span.end();\n }\n },\n );\n },\n });\n }\n \n if (prop === 'list' && typeof value === 'function') {\n return new Proxy(value, {\n apply: (fnTarget, _thisArg, args) => {\n const [options] = args as [KVNamespaceListOptions | undefined];\n const tracer = trace.getTracer('autotel-edge') as WorkerTracer;\n\n return tracer.startActiveSpan(\n `KV ${name}: list`,\n {\n kind: SpanKind.CLIENT,\n attributes: {\n 'db.system': 'cloudflare-kv',\n 'db.operation': 'list',\n 'db.namespace': name,\n 'db.prefix': options?.prefix || undefined,\n 'db.limit': options?.limit || undefined,\n },\n },\n async (span) => {\n try {\n const result = await Reflect.apply(fnTarget, target, args);\n span.setAttribute('db.result.keys_count', result.keys.length);\n span.setStatus({ code: SpanStatusCode.OK });\n return result;\n } catch (error) {\n span.recordException(error as Error);\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: error instanceof Error ? error.message : String(error),\n });\n throw error;\n } finally {\n span.end();\n }\n },\n );\n },\n });\n }\n \n return value;\n },\n };\n \n return wrap(kv, kvHandler);\n}\n\n/**\n * Instrument R2 bucket\n */\nexport function instrumentR2<R extends R2Bucket>(r2: R, bucketName?: string): R {\n const name = bucketName || 'r2';\n \n const r2Handler: ProxyHandler<R> = {\n get(target, prop) {\n const value = Reflect.get(target, prop);\n \n if (prop === 'get' && typeof value === 'function') {\n return new Proxy(value, {\n apply: (fnTarget, _thisArg, args) => {\n const [key] = args as [string, R2GetOptions | undefined];\n const tracer = trace.getTracer('autotel-edge') as WorkerTracer;\n\n return tracer.startActiveSpan(\n `R2 ${name}: get`,\n {\n kind: SpanKind.CLIENT,\n attributes: {\n 'db.system': 'cloudflare-r2',\n 'db.operation': 'get',\n 'db.bucket': name,\n 'db.key': key,\n },\n },\n async (span) => {\n try {\n const result = await Reflect.apply(fnTarget, target, args);\n if (result) {\n span.setAttribute('db.result.size', result.size);\n span.setAttribute('db.result.etag', result.etag);\n span.setAttribute('db.result.content_type', result.httpMetadata?.contentType);\n } else {\n span.setAttribute('db.result.exists', false);\n }\n span.setStatus({ code: SpanStatusCode.OK });\n return result;\n } catch (error) {\n span.recordException(error as Error);\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: error instanceof Error ? error.message : String(error),\n });\n throw error;\n } finally {\n span.end();\n }\n },\n );\n },\n });\n }\n \n if (prop === 'put' && typeof value === 'function') {\n return new Proxy(value, {\n apply: (fnTarget, _thisArg, args) => {\n const [key] = args as [string, ReadableStream | ArrayBuffer | ArrayBufferView | string | null | Blob, R2PutOptions | undefined];\n const tracer = trace.getTracer('autotel-edge') as WorkerTracer;\n\n return tracer.startActiveSpan(\n `R2 ${name}: put`,\n {\n kind: SpanKind.CLIENT,\n attributes: {\n 'db.system': 'cloudflare-r2',\n 'db.operation': 'put',\n 'db.bucket': name,\n 'db.key': key,\n },\n },\n async (span) => {\n try {\n const result = await Reflect.apply(fnTarget, target, args);\n span.setAttribute('db.result.etag', result.etag);\n span.setAttribute('db.result.uploaded', result.uploaded);\n span.setStatus({ code: SpanStatusCode.OK });\n return result;\n } catch (error) {\n span.recordException(error as Error);\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: error instanceof Error ? error.message : String(error),\n });\n throw error;\n } finally {\n span.end();\n }\n },\n );\n },\n });\n }\n \n if (prop === 'delete' && typeof value === 'function') {\n return new Proxy(value, {\n apply: (fnTarget, _thisArg, args) => {\n const keys = args as string[];\n const tracer = trace.getTracer('autotel-edge') as WorkerTracer;\n\n return tracer.startActiveSpan(\n `R2 ${name}: delete`,\n {\n kind: SpanKind.CLIENT,\n attributes: {\n 'db.system': 'cloudflare-r2',\n 'db.operation': 'delete',\n 'db.bucket': name,\n 'db.keys_count': keys.length,\n },\n },\n async (span) => {\n try {\n const result = await Reflect.apply(fnTarget, target, args);\n span.setStatus({ code: SpanStatusCode.OK });\n return result;\n } catch (error) {\n span.recordException(error as Error);\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: error instanceof Error ? error.message : String(error),\n });\n throw error;\n } finally {\n span.end();\n }\n },\n );\n },\n });\n }\n \n if (prop === 'list' && typeof value === 'function') {\n return new Proxy(value, {\n apply: (fnTarget, _thisArg, args) => {\n const [options] = args as [R2ListOptions | undefined];\n const tracer = trace.getTracer('autotel-edge') as WorkerTracer;\n\n return tracer.startActiveSpan(\n `R2 ${name}: list`,\n {\n kind: SpanKind.CLIENT,\n attributes: {\n 'db.system': 'cloudflare-r2',\n 'db.operation': 'list',\n 'db.bucket': name,\n 'db.prefix': options?.prefix || undefined,\n 'db.limit': options?.limit || undefined,\n },\n },\n async (span) => {\n try {\n const result = await Reflect.apply(fnTarget, target, args);\n span.setAttribute('db.result.objects_count', result.objects.length);\n span.setAttribute('db.result.truncated', result.truncated);\n span.setStatus({ code: SpanStatusCode.OK });\n return result;\n } catch (error) {\n span.recordException(error as Error);\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: error instanceof Error ? error.message : String(error),\n });\n throw error;\n } finally {\n span.end();\n }\n },\n );\n },\n });\n }\n \n return value;\n },\n };\n \n return wrap(r2, r2Handler);\n}\n\n/**\n * Instrument D1 database\n */\nexport function instrumentD1<D extends D1Database>(d1: D, databaseName?: string): D {\n const name = databaseName || 'd1';\n \n const d1Handler: ProxyHandler<D> = {\n get(target, prop) {\n const value = Reflect.get(target, prop);\n \n if (prop === 'prepare' && typeof value === 'function') {\n return new Proxy(value, {\n apply: (fnTarget, _thisArg, args) => {\n const [query] = args as [string];\n const tracer = trace.getTracer('autotel-edge') as WorkerTracer;\n\n const prepared = Reflect.apply(fnTarget, target, args);\n \n // Instrument the prepared statement\n const preparedHandler: ProxyHandler<typeof prepared> = {\n get(target, prop) {\n const value = Reflect.get(target, prop);\n \n if (prop === 'first' || prop === 'run' || prop === 'all' || prop === 'raw') {\n return new Proxy(value, {\n apply: (fnTarget, _thisArg, args) => {\n const activeConfig = getActiveConfig();\n const captureMode: DbStatementCapture = activeConfig?.dataSafety?.captureDbStatement ?? 'full';\n const statement = sanitizeStatement(query, captureMode);\n const attributes: Record<string, any> = {\n 'db.system': 'cloudflare-d1',\n 'db.operation': prop,\n 'db.name': name,\n };\n if (statement !== undefined) {\n attributes['db.statement'] = statement;\n }\n return tracer.startActiveSpan(\n `D1 ${name}: ${prop}`,\n {\n kind: SpanKind.CLIENT,\n attributes,\n },\n async (span) => {\n try {\n const result = await Reflect.apply(fnTarget, target, args);\n if (prop === 'all' && Array.isArray(result)) {\n span.setAttribute('db.result.rows_count', result.length);\n } else if (prop === 'first' && result) {\n span.setAttribute('db.result.exists', true);\n }\n span.setStatus({ code: SpanStatusCode.OK });\n return result;\n } catch (error) {\n span.recordException(error as Error);\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: error instanceof Error ? error.message : String(error),\n });\n throw error;\n } finally {\n span.end();\n }\n },\n );\n },\n });\n }\n \n return value;\n },\n };\n \n return wrap(prepared, preparedHandler);\n },\n });\n }\n \n if (prop === 'exec' && typeof value === 'function') {\n return new Proxy(value, {\n apply: (fnTarget, _thisArg, args) => {\n const [query] = args as [string];\n const tracer = trace.getTracer('autotel-edge') as WorkerTracer;\n const activeConfig = getActiveConfig();\n const captureMode: DbStatementCapture = activeConfig?.dataSafety?.captureDbStatement ?? 'full';\n const statement = sanitizeStatement(query, captureMode);\n const attributes: Record<string, any> = {\n 'db.system': 'cloudflare-d1',\n 'db.operation': 'exec',\n 'db.name': name,\n };\n if (statement !== undefined) {\n attributes['db.statement'] = statement;\n }\n\n return tracer.startActiveSpan(\n `D1 ${name}: exec`,\n {\n kind: SpanKind.CLIENT,\n attributes,\n },\n async (span) => {\n try {\n const result = await Reflect.apply(fnTarget, target, args);\n span.setAttribute('db.result.count', result.count);\n span.setStatus({ code: SpanStatusCode.OK });\n return result;\n } catch (error) {\n span.recordException(error as Error);\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: error instanceof Error ? error.message : String(error),\n });\n throw error;\n } finally {\n span.end();\n }\n },\n );\n },\n });\n }\n \n return value;\n },\n };\n \n return wrap(d1, d1Handler);\n}\n\n/**\n * Instrument service binding (Fetcher)\n */\nexport function instrumentServiceBinding<F extends Fetcher>(fetcher: F, serviceName?: string): F {\n const name = serviceName || 'service';\n \n const fetcherHandler: ProxyHandler<F> = {\n get(target, prop) {\n const value = Reflect.get(target, prop);\n \n if (prop === 'fetch' && typeof value === 'function') {\n return new Proxy(value, {\n apply: (fnTarget, _thisArg, args) => {\n const [input, init] = args as [RequestInfo | URL, RequestInit | undefined];\n const request = new Request(input, init);\n const tracer = trace.getTracer('autotel-edge') as WorkerTracer;\n\n return tracer.startActiveSpan(\n `Service ${name}: ${request.method}`,\n {\n kind: SpanKind.CLIENT,\n attributes: {\n 'rpc.system': 'cloudflare-service-binding',\n 'rpc.service': name,\n 'http.request.method': request.method,\n 'url.full': request.url,\n },\n },\n async (span) => {\n try {\n const response = await Reflect.apply(fnTarget, target, args);\n span.setAttribute('http.response.status_code', response.status);\n span.setStatus({ code: SpanStatusCode.OK });\n return response;\n } catch (error) {\n span.recordException(error as Error);\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: error instanceof Error ? error.message : String(error),\n });\n throw error;\n } finally {\n span.end();\n }\n },\n );\n },\n });\n }\n \n return value;\n },\n };\n \n return wrap(fetcher, fetcherHandler);\n}\n\n/**\n * Detection helpers\n */\nconst hasMethod = (obj: any, m: string): boolean =>\n typeof obj?.[m] === 'function';\n\nconst hasExactMethods = (obj: any, methods: string[]): boolean =>\n methods.every(m => hasMethod(obj, m));\n\n/**\n * Auto-instrument all Cloudflare bindings in the environment\n *\n * Detection order (most specific first):\n * 1. R2 — get, put, delete, list, head\n * 2. KV — get, put, delete, list (not head)\n * 3. D1 — prepare, exec\n * 4. Vectorize — query, insert, upsert, describe\n * 5. AI — run + (gateway or models discriminator)\n * 6. Hyperdrive — connect + connectionString + host\n * 7. Queue Producer — send, sendBatch (not get)\n * 8. Analytics Engine — writeDataPoint\n * 9. Images — info, input\n * 10. Service Binding — fetch (broadest, must be last)\n *\n * Not auto-detected (manual only):\n * - Rate Limiter — limit() alone too generic\n * - Browser Rendering — indistinguishable from Service Binding\n */\nconst envCache = new WeakMap<object, Record<string, any>>();\n\nexport function instrumentBindings(env: Record<string, any>): Record<string, any> {\n const cached = envCache.get(env);\n if (cached) return cached;\n\n const instrumented: Record<string, any> = {};\n\n for (const [key, value] of Object.entries(env)) {\n if (!value || typeof value !== 'object') {\n instrumented[key] = value;\n continue;\n }\n\n // Skip already-instrumented bindings\n if (isWrapped(value)) {\n instrumented[key] = value;\n continue;\n }\n\n // 1. R2 — most specific (has head)\n if (hasExactMethods(value, ['get', 'put', 'delete', 'list', 'head'])) {\n instrumented[key] = instrumentR2(value as R2Bucket, key);\n continue;\n }\n\n // 2. KV — like R2 but without head\n if (hasExactMethods(value, ['get', 'put', 'delete', 'list']) && !('head' in value)) {\n instrumented[key] = instrumentKV(value as KVNamespace, key);\n continue;\n }\n\n // 3. D1\n if (hasExactMethods(value, ['prepare', 'exec'])) {\n instrumented[key] = instrumentD1(value as D1Database, key);\n continue;\n }\n\n // 4. Vectorize\n if (hasExactMethods(value, ['query', 'insert', 'upsert', 'describe'])) {\n instrumented[key] = instrumentVectorize(value as VectorizeIndex, key);\n continue;\n }\n\n // 5. AI — has run() + discriminator properties\n if (hasMethod(value, 'run') && ('gateway' in value || 'models' in value)) {\n instrumented[key] = instrumentAI(value as Ai, key);\n continue;\n }\n\n // 6. Hyperdrive — connect + connection properties\n if (hasMethod(value, 'connect') && 'connectionString' in value && 'host' in value) {\n instrumented[key] = instrumentHyperdrive(value as Hyperdrive, key);\n continue;\n }\n\n // 7. Queue Producer — send + sendBatch (not get, to avoid KV collision)\n if (hasExactMethods(value, ['send', 'sendBatch']) && !('get' in value)) {\n instrumented[key] = instrumentQueueProducer(value as Queue, key);\n continue;\n }\n\n // 8. Analytics Engine\n if (hasMethod(value, 'writeDataPoint')) {\n instrumented[key] = instrumentAnalyticsEngine(value as AnalyticsEngineDataset, key);\n continue;\n }\n\n // 9. Images\n if (hasExactMethods(value, ['info', 'input'])) {\n instrumented[key] = instrumentImages(value as any, key);\n continue;\n }\n\n // 10. Service Binding (broadest — must be last)\n if (hasMethod(value, 'fetch')) {\n instrumented[key] = instrumentServiceBinding(value as Fetcher, key);\n continue;\n }\n\n // Unknown binding type — pass through\n instrumented[key] = value;\n }\n\n envCache.set(env, instrumented);\n return instrumented;\n}\n\n","/**\n * Rate Limiter binding instrumentation\n */\n\nimport {\n trace,\n SpanKind,\n SpanStatusCode,\n} from '@opentelemetry/api';\nimport type { WorkerTracer } from 'autotel-edge';\nimport { wrap, setAttr } from './common';\n\ninterface RateLimiterLike {\n limit(options: { key: string }): Promise<{ success: boolean }>;\n}\n\n/**\n * Instrument Rate Limiter binding (manual only — not auto-detected)\n */\nexport function instrumentRateLimiter<T extends RateLimiterLike>(limiter: T, bindingName?: string): T {\n const name = bindingName || 'rate-limiter';\n\n const handler: ProxyHandler<T> = {\n get(target, prop) {\n const value = Reflect.get(target, prop);\n\n if (prop === 'limit' && typeof value === 'function') {\n return new Proxy(value, {\n apply: (fnTarget, _thisArg, args) => {\n const [options] = args as [{ key: string }];\n const tracer = trace.getTracer('autotel-edge') as WorkerTracer;\n\n return tracer.startActiveSpan(\n `RateLimiter ${name}: limit`,\n {\n kind: SpanKind.CLIENT,\n attributes: {\n 'rate_limiter.system': 'cloudflare-rate-limiter',\n 'rate_limiter.key': options?.key,\n },\n },\n async (span) => {\n try {\n const result = await Reflect.apply(fnTarget, target, args);\n setAttr(span, 'rate_limiter.success', result?.success);\n span.setStatus({ code: SpanStatusCode.OK });\n return result;\n } catch (error) {\n span.recordException(error as Error);\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: error instanceof Error ? error.message : String(error),\n });\n throw error;\n } finally {\n span.end();\n }\n },\n );\n },\n });\n }\n\n return value;\n },\n };\n\n return wrap(limiter, handler);\n}\n","/**\n * Browser Rendering binding instrumentation\n */\n\nimport {\n trace,\n SpanKind,\n SpanStatusCode,\n} from '@opentelemetry/api';\nimport type { WorkerTracer } from 'autotel-edge';\nimport { wrap, setAttr } from './common';\n\ninterface BrowserRenderingLike {\n fetch(input: RequestInfo | URL, init?: RequestInit): Promise<Response>;\n}\n\n/**\n * Instrument Browser Rendering binding (manual only — not auto-detected)\n */\nexport function instrumentBrowserRendering<T extends BrowserRenderingLike>(browser: T, bindingName?: string): T {\n const name = bindingName || 'browser';\n\n const handler: ProxyHandler<T> = {\n get(target, prop) {\n const value = Reflect.get(target, prop);\n\n if (prop === 'fetch' && typeof value === 'function') {\n return new Proxy(value, {\n apply: (fnTarget, _thisArg, args) => {\n const [input] = args as [RequestInfo | URL, RequestInit | undefined];\n const url = typeof input === 'string' ? input : input instanceof URL ? input.toString() : input.url;\n const tracer = trace.getTracer('autotel-edge') as WorkerTracer;\n\n return tracer.startActiveSpan(\n `BrowserRendering ${name}: fetch`,\n {\n kind: SpanKind.CLIENT,\n attributes: {\n 'browser.system': 'cloudflare-browser-rendering',\n 'url.full': url,\n },\n },\n async (span) => {\n try {\n const result = await Reflect.apply(fnTarget, target, args);\n setAttr(span, 'http.response.status_code', result?.status);\n span.setStatus({ code: SpanStatusCode.OK });\n return result;\n } catch (error) {\n span.recordException(error as Error);\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: error instanceof Error ? error.message : String(error),\n });\n throw error;\n } finally {\n span.end();\n }\n },\n );\n },\n });\n }\n\n return value;\n },\n };\n\n return wrap(browser, handler);\n}\n"]}
|
package/dist/index.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { instrumentBindings } from './chunk-
|
|
2
|
-
export { instrumentAI, instrumentAnalyticsEngine, instrumentBindings, instrumentBrowserRendering, instrumentD1, instrumentHyperdrive, instrumentImages, instrumentKV, instrumentQueueProducer, instrumentR2, instrumentRateLimiter, instrumentServiceBinding, instrumentVectorize } from './chunk-
|
|
1
|
+
import { instrumentBindings } from './chunk-NUNTBJWB.js';
|
|
2
|
+
export { instrumentAI, instrumentAnalyticsEngine, instrumentBindings, instrumentBrowserRendering, instrumentD1, instrumentHyperdrive, instrumentImages, instrumentKV, instrumentQueueProducer, instrumentR2, instrumentRateLimiter, instrumentServiceBinding, instrumentVectorize } from './chunk-NUNTBJWB.js';
|
|
3
3
|
import { instrumentDO } from './chunk-WDNZVVRW.js';
|
|
4
4
|
export { instrumentDO, instrumentWorkflow } from './chunk-WDNZVVRW.js';
|
|
5
5
|
import { wrap, unwrap, proxyExecutionContext } from './chunk-O4IYKWPJ.js';
|
|
@@ -10,13 +10,15 @@ import { resourceFromAttributes } from '@opentelemetry/resources';
|
|
|
10
10
|
|
|
11
11
|
function gatherRequestAttributes(request) {
|
|
12
12
|
const url = new URL(request.url);
|
|
13
|
+
const config = getActiveConfig();
|
|
14
|
+
const redactQuery = config?.dataSafety?.redactQueryParams === true;
|
|
13
15
|
return {
|
|
14
16
|
"http.request.method": request.method.toUpperCase(),
|
|
15
|
-
"url.full": request.url,
|
|
17
|
+
"url.full": redactQuery ? `${url.origin}${url.pathname}` : request.url,
|
|
16
18
|
"url.scheme": url.protocol.replace(":", ""),
|
|
17
19
|
"server.address": url.host,
|
|
18
20
|
"url.path": url.pathname,
|
|
19
|
-
"url.query": url.search,
|
|
21
|
+
"url.query": redactQuery ? url.search ? "[REDACTED]" : "" : url.search,
|
|
20
22
|
"network.protocol.name": "http",
|
|
21
23
|
"user_agent.original": request.headers.get("user-agent") || void 0
|
|
22
24
|
};
|
|
@@ -222,6 +224,9 @@ function createFetchInstrumentation(config) {
|
|
|
222
224
|
"http.response.status_code": response.status
|
|
223
225
|
}),
|
|
224
226
|
executionSucces: (span, trigger, result) => {
|
|
227
|
+
if (result.status >= 500) {
|
|
228
|
+
span.setStatus({ code: SpanStatusCode.ERROR });
|
|
229
|
+
}
|
|
225
230
|
if (config.handlers.fetch.postProcess) {
|
|
226
231
|
const readableSpan = span;
|
|
227
232
|
config.handlers.fetch.postProcess(span, {
|
|
@@ -409,7 +414,12 @@ var QueueInstrumentation = class {
|
|
|
409
414
|
function headerAttributes(message) {
|
|
410
415
|
const attrs = {};
|
|
411
416
|
if (message.headers instanceof Headers) {
|
|
417
|
+
const config = getActiveConfig();
|
|
418
|
+
const allowlist = config?.dataSafety?.emailHeaderAllowlist;
|
|
412
419
|
for (const [key, value] of message.headers.entries()) {
|
|
420
|
+
if (allowlist && !allowlist.includes(key.toLowerCase())) {
|
|
421
|
+
continue;
|
|
422
|
+
}
|
|
413
423
|
attrs[`email.header.${key}`] = value;
|
|
414
424
|
}
|
|
415
425
|
}
|
|
@@ -472,10 +482,10 @@ function createHandlerFlow(instrumentation) {
|
|
|
472
482
|
const attributes = instrumentation.getAttributesFromResult(result);
|
|
473
483
|
span.setAttributes(attributes);
|
|
474
484
|
}
|
|
485
|
+
span.setStatus({ code: SpanStatusCode.OK });
|
|
475
486
|
if (instrumentation.executionSucces) {
|
|
476
487
|
instrumentation.executionSucces(span, trigger, result);
|
|
477
488
|
}
|
|
478
|
-
span.setStatus({ code: SpanStatusCode.OK });
|
|
479
489
|
return result;
|
|
480
490
|
} catch (error) {
|
|
481
491
|
span.recordException(error);
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/global/fetch.ts","../src/global/cache.ts","../src/wrappers/instrument.ts","../src/wrappers/wrap-module.ts","../src/wrappers/wrap-do.ts"],"names":["api_context","trace","SpanKind","SpanStatusCode","propagation","target","prop","WorkerTracer","context"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Global fetch() instrumentation for autotel-edge\n *\n * Automatically traces all outgoing fetch() calls with:\n * - HTTP method, URL, status code\n * - Request/response headers\n * - Automatic context propagation\n * - Error tracking\n */\n\nimport {\n trace,\n context as api_context,\n propagation,\n SpanStatusCode,\n SpanKind,\n} from '@opentelemetry/api';\nimport { getActiveConfig, WorkerTracer } from 'autotel-edge';\n\n/**\n * Gather HTTP request attributes following OpenTelemetry semantic conventions\n */\nfunction gatherRequestAttributes(request: Request): Record<string, any> {\n const url = new URL(request.url);\n\n return {\n 'http.request.method': request.method.toUpperCase(),\n 'url.full': request.url,\n 'url.scheme': url.protocol.replace(':', ''),\n 'server.address': url.host,\n 'url.path': url.pathname,\n 'url.query': url.search,\n 'network.protocol.name': 'http',\n 'user_agent.original': request.headers.get('user-agent') || undefined,\n };\n}\n\n/**\n * Gather HTTP response attributes\n */\nfunction gatherResponseAttributes(response: Response): Record<string, any> {\n return {\n 'http.response.status_code': response.status,\n 'http.response.body.size': response.headers.get('content-length') || undefined,\n };\n}\n\n/**\n * Instrument the global fetch function\n *\n * This wraps globalThis.fetch to automatically create spans for all outgoing HTTP requests.\n *\n * **Note:** This is called automatically when the library is initialized with\n * `instrumentation.instrumentGlobalFetch: true` (default).\n */\nexport function instrumentGlobalFetch(): void {\n const originalFetch = globalThis.fetch;\n\n const instrumentedFetch = function fetch(\n input: RequestInfo | URL,\n init?: RequestInit,\n ): Promise<Response> {\n const request = new Request(input, init);\n\n // Skip non-HTTP requests\n if (!request.url.startsWith('http')) {\n return originalFetch(input, init);\n }\n\n // Skip if no active config (not initialized yet)\n const config = getActiveConfig();\n if (!config) {\n return originalFetch(input, init);\n }\n\n const tracer = trace.getTracer('autotel-edge') as WorkerTracer;\n const url = new URL(request.url);\n const spanName = `${request.method} ${url.host}`;\n\n return tracer.startActiveSpan(\n spanName,\n {\n kind: SpanKind.CLIENT,\n attributes: gatherRequestAttributes(request),\n },\n async (span) => {\n try {\n // Inject trace context into request headers for distributed tracing\n const shouldIncludeContext =\n typeof config.fetch?.includeTraceContext === 'function'\n ? config.fetch.includeTraceContext(request)\n : (config.fetch?.includeTraceContext ?? true);\n\n if (shouldIncludeContext) {\n propagation.inject(api_context.active(), request.headers, {\n set: (headers, key, value) => {\n if (typeof value === 'string') {\n headers.set(key, value);\n }\n },\n });\n }\n\n // Make the actual fetch call\n const response = await originalFetch(request);\n\n // Add response attributes\n span.setAttributes(gatherResponseAttributes(response));\n\n // Set span status based on response\n if (response.ok) {\n span.setStatus({ code: SpanStatusCode.OK });\n } else {\n span.setStatus({ code: SpanStatusCode.ERROR });\n }\n\n return response;\n } catch (error) {\n span.recordException(error as Error);\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: error instanceof Error ? error.message : String(error),\n });\n throw error;\n } finally {\n span.end();\n }\n },\n );\n };\n\n // Replace global fetch\n globalThis.fetch = instrumentedFetch as typeof fetch;\n}\n","/**\n * Global Cache API instrumentation for Cloudflare Workers\n *\n * Automatically traces cache operations:\n * - cache.match() - Read from cache\n * - cache.put() - Write to cache\n * - cache.delete() - Delete from cache\n */\n\nimport { trace, SpanStatusCode, SpanKind } from '@opentelemetry/api';\nimport { wrap } from '../bindings/common';\nimport { WorkerTracer } from 'autotel-edge';\n\ntype CacheOperation = 'match' | 'put' | 'delete';\n\n/**\n * Sanitize URL for span attributes (remove query params that might contain sensitive data)\n */\nfunction sanitizeURL(url: string): string {\n const u = new URL(url);\n return `${u.protocol}//${u.host}${u.pathname}`;\n}\n\n/**\n * Instrument a cache method (match, put, delete)\n */\nfunction instrumentCacheMethod<T extends Function>(\n fn: T,\n cacheName: string,\n operation: CacheOperation,\n): T {\n const handler: ProxyHandler<T> = {\n async apply(target, thisArg, argArray) {\n const tracer = trace.getTracer('autotel-edge') as WorkerTracer;\n\n // Extract URL from first argument (Request or string)\n const firstArg = argArray[0];\n const url =\n firstArg instanceof Request\n ? firstArg.url\n : typeof firstArg === 'string'\n ? firstArg\n : undefined;\n\n const spanName = `Cache ${cacheName}.${operation}`;\n\n return tracer.startActiveSpan(\n spanName,\n {\n kind: SpanKind.CLIENT,\n attributes: {\n 'cache.name': cacheName,\n 'cache.operation': operation,\n 'cache.key': url ? sanitizeURL(url) : undefined,\n },\n },\n async (span) => {\n try {\n const result = await Reflect.apply(target, thisArg, argArray);\n\n // For match operations, record whether it was a hit or miss\n if (operation === 'match') {\n span.setAttribute('cache.hit', !!result);\n }\n\n span.setStatus({ code: SpanStatusCode.OK });\n return result;\n } catch (error) {\n span.recordException(error as Error);\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: error instanceof Error ? error.message : String(error),\n });\n throw error;\n } finally {\n span.end();\n }\n },\n );\n },\n };\n\n return wrap(fn, handler);\n}\n\n/**\n * Instrument a Cache instance\n */\nfunction instrumentCache(cache: Cache, cacheName: string): Cache {\n const handler: ProxyHandler<Cache> = {\n get(target, prop) {\n const value = Reflect.get(target, prop);\n\n // Instrument the cache operation methods\n if (\n (prop === 'match' || prop === 'put' || prop === 'delete') &&\n typeof value === 'function'\n ) {\n return instrumentCacheMethod(\n value.bind(target),\n cacheName,\n prop as CacheOperation,\n );\n }\n\n // Bind other methods to preserve `this` context\n if (typeof value === 'function') {\n return value.bind(target);\n }\n\n return value;\n },\n };\n\n return wrap(cache, handler);\n}\n\n/**\n * Instrument caches.open()\n */\nfunction instrumentCachesOpen(\n openFn: CacheStorage['open'],\n): CacheStorage['open'] {\n const handler: ProxyHandler<CacheStorage['open']> = {\n async apply(target, thisArg, argArray) {\n const cacheName = argArray[0];\n const cache = await Reflect.apply(target, thisArg, argArray);\n return instrumentCache(cache, cacheName);\n },\n };\n\n return wrap(openFn, handler);\n}\n\n/**\n * Instrument the global caches API\n *\n * This wraps globalThis.caches to automatically create spans for all cache operations.\n *\n * **Note:** This is called automatically when the library is initialized with\n * `instrumentation.instrumentGlobalCache: true` (default).\n */\nexport function instrumentGlobalCache(): void {\n const handler: ProxyHandler<typeof caches> = {\n get(target, prop) {\n if (prop === 'default') {\n // Wrap the default cache\n return instrumentCache(target.default, 'default');\n } else if (prop === 'open') {\n // Wrap the open method\n const openFn = Reflect.get(target, prop);\n if (typeof openFn === 'function') {\n return instrumentCachesOpen(openFn.bind(target));\n }\n }\n\n return Reflect.get(target, prop);\n },\n };\n\n // Replace global caches\n // @ts-ignore - TypeScript doesn't like reassigning globalThis.caches\n globalThis.caches = wrap(caches, handler);\n}\n","/**\n * Handler instrumentation for Cloudflare Workers\n * \n * Note: This file uses Cloudflare Workers types (ExportedHandler, Request, Response, etc.)\n * which are globally available via @cloudflare/workers-types when listed in tsconfig.json.\n * These types are devDependencies only - they're not runtime dependencies.\n * At runtime, Cloudflare Workers runtime provides the actual implementations.\n * \n * Provides automatic OpenTelemetry tracing for:\n * - HTTP handlers (fetch)\n * - Scheduled/cron handlers\n * - Queue handlers (with message tracking)\n * - Email handlers\n * - Auto-instrumentation of Cloudflare bindings (KV, R2, D1, Service Bindings)\n * - Global fetch and cache instrumentation\n * - Post-processor support for span customization\n * - Tail sampling support\n * - Cold start tracking\n */\n\nimport {\n trace,\n context as api_context,\n propagation,\n SpanStatusCode,\n SpanKind,\n} from '@opentelemetry/api';\nimport { resourceFromAttributes } from '@opentelemetry/resources';\nimport type {\n ConfigurationOption,\n ResolvedEdgeConfig,\n Trigger,\n HandlerInstrumentation,\n InitialSpanInfo,\n ReadableSpan,\n} from 'autotel-edge';\nimport {\n createInitialiser,\n setConfig,\n type Initialiser,\n WorkerTracerProvider,\n WorkerTracer,\n} from 'autotel-edge';\nimport { proxyExecutionContext, unwrap, wrap, type PromiseTracker } from '../bindings/common';\nimport { instrumentGlobalFetch } from '../global/fetch';\nimport { instrumentGlobalCache } from '../global/cache';\nimport { instrumentBindings } from '../bindings/bindings';\nimport type { Attributes, Span } from '@opentelemetry/api';\n\ntype FetchHandler = (\n request: Request,\n env: any,\n ctx: ExecutionContext,\n) => Response | Promise<Response>;\n\ntype ScheduledHandler = (\n event: ScheduledController,\n env: any,\n ctx: ExecutionContext,\n) => void | Promise<void>;\n\ntype QueueHandler = (\n batch: MessageBatch,\n env: any,\n ctx: ExecutionContext,\n) => void | Promise<void>;\n\ntype EmailHandler = (\n message: ForwardableEmailMessage,\n env: any,\n ctx: ExecutionContext,\n) => void | Promise<void>;\n\n\n/**\n * Create fetch handler instrumentation with config support for postProcess\n */\n/**\n * Extract Cloudflare-specific attributes from a request\n */\nfunction extractCfAttributes(request: Request): Record<string, string | number | boolean> {\n const cf = (request as any).cf;\n if (!cf) return {};\n\n const attrs: Record<string, string | number | boolean> = {};\n const set = (key: string, value: unknown) => {\n if (value !== undefined && value !== null) {\n attrs[key] = value as string | number | boolean;\n }\n };\n\n set('cloudflare.colo', cf.colo);\n const ray = request.headers.get('cf-ray');\n if (ray) attrs['cloudflare.ray_id'] = ray;\n set('cloudflare.country', cf.country);\n set('cloudflare.city', cf.city);\n set('cloudflare.region', cf.region);\n set('cloudflare.continent', cf.continent);\n set('cloudflare.timezone', cf.timezone);\n set('cloudflare.latitude', cf.latitude);\n set('cloudflare.longitude', cf.longitude);\n set('cloudflare.asn', cf.asn);\n set('cloudflare.as_organization', cf.asOrganization);\n set('cloudflare.http_protocol', cf.httpProtocol);\n set('cloudflare.tls_version', cf.tlsVersion);\n set('cloudflare.client_tcp_rtt', cf.clientTcpRtt);\n\n return attrs;\n}\n\nfunction createFetchInstrumentation(\n config: ResolvedEdgeConfig,\n): HandlerInstrumentation<Request, Response> {\n return {\n getInitialSpanInfo: (request: Request): InitialSpanInfo => {\n const url = new URL(request.url);\n\n const cfAttrs = (config as any).extractCfAttributes === false\n ? {}\n : extractCfAttributes(request);\n\n return {\n name: `${request.method} ${url.pathname}`,\n options: {\n kind: SpanKind.SERVER,\n attributes: {\n 'http.request.method': request.method,\n 'url.full': request.url,\n ...cfAttrs,\n },\n },\n context: propagation.extract(api_context.active(), request.headers),\n };\n },\n getAttributesFromResult: (response: Response) => ({\n 'http.response.status_code': response.status,\n }),\n executionSucces: (span: Span, trigger: Request, result: Response) => {\n // Call postProcess callback if configured\n if (config.handlers.fetch.postProcess) {\n const readableSpan = span as unknown as ReadableSpan;\n config.handlers.fetch.postProcess(span, {\n request: trigger,\n response: result,\n readable: readableSpan,\n });\n }\n },\n };\n}\n\n/**\n * Scheduled handler instrumentation\n */\nconst scheduledInstrumentation: HandlerInstrumentation<ScheduledController, void> = {\n getInitialSpanInfo: (event: ScheduledController): InitialSpanInfo => {\n return {\n name: `scheduledHandler ${event.cron || 'unknown'}`,\n options: {\n kind: SpanKind.INTERNAL,\n attributes: {\n 'faas.trigger': 'timer',\n 'faas.cron': event.cron || 'unknown',\n 'faas.scheduled_time': new Date(event.scheduledTime).toISOString(),\n },\n },\n };\n },\n};\n\n/**\n * Tracks message status counts for queue processing\n */\nclass MessageStatusCount {\n succeeded = 0;\n failed = 0;\n implicitly_acked = 0;\n implicitly_retried = 0;\n readonly total: number;\n\n constructor(total: number) {\n this.total = total;\n }\n\n ack() {\n this.succeeded = this.succeeded + 1;\n }\n\n ackRemaining() {\n this.implicitly_acked = this.total - this.succeeded - this.failed;\n this.succeeded = this.total - this.failed;\n }\n\n retry() {\n this.failed = this.failed + 1;\n }\n\n retryRemaining() {\n this.implicitly_retried = this.total - this.succeeded - this.failed;\n this.failed = this.total - this.succeeded;\n }\n\n toAttributes(): Attributes {\n return {\n 'queue.messages_count': this.total,\n 'queue.messages_success': this.succeeded,\n 'queue.messages_failed': this.failed,\n 'queue.batch_success': this.succeeded === this.total,\n 'queue.implicitly_acked': this.implicitly_acked,\n 'queue.implicitly_retried': this.implicitly_retried,\n };\n }\n}\n\n/**\n * Add event to active span\n */\nfunction addQueueEvent(name: string, msg?: Message, delaySeconds?: number) {\n const attrs: Attributes = {};\n if (msg) {\n attrs['queue.message_id'] = msg.id;\n attrs['queue.message_timestamp'] = msg.timestamp.toISOString();\n // Add attempts if available (from Cloudflare Queues API)\n if ('attempts' in msg && typeof msg.attempts === 'number') {\n attrs['queue.message_attempts'] = msg.attempts;\n }\n }\n if (delaySeconds !== undefined) {\n attrs['queue.retry_delay_seconds'] = delaySeconds;\n }\n trace.getActiveSpan()?.addEvent(name, attrs);\n}\n\n/**\n * Proxy a queue message to track ack/retry operations\n */\nfunction proxyQueueMessage<Q>(msg: Message<Q>, count: MessageStatusCount): Message<Q> {\n const msgHandler: ProxyHandler<Message<Q>> = {\n get: (target, prop) => {\n if (prop === 'ack') {\n const ackFn = Reflect.get(target, prop);\n return new Proxy(ackFn, {\n apply: (fnTarget) => {\n addQueueEvent('messageAck', msg);\n count.ack();\n Reflect.apply(fnTarget, msg, []);\n },\n });\n } else if (prop === 'retry') {\n const retryFn = Reflect.get(target, prop);\n return new Proxy(retryFn, {\n apply: (fnTarget, _thisArg, args) => {\n // Extract delay and content type from retry options if provided\n const retryOptions = args[0] as\n | { delaySeconds?: number; contentType?: string }\n | undefined;\n const delaySeconds = retryOptions?.delaySeconds;\n\n addQueueEvent('messageRetry', msg, delaySeconds);\n\n // Add content type attribute if provided\n if (retryOptions?.contentType) {\n const span = trace.getActiveSpan();\n if (span) {\n span.setAttribute('queue.message.content_type', retryOptions.contentType);\n }\n }\n\n count.retry();\n const result = Reflect.apply(fnTarget, msg, args);\n return result;\n },\n });\n } else {\n return Reflect.get(target, prop, msg);\n }\n },\n };\n return wrap(msg, msgHandler);\n}\n\n/**\n * Proxy MessageBatch to track ackAll/retryAll operations\n */\nfunction proxyMessageBatch(batch: MessageBatch, count: MessageStatusCount): MessageBatch {\n const batchHandler: ProxyHandler<MessageBatch> = {\n get: (target, prop) => {\n if (prop === 'messages') {\n const messages = Reflect.get(target, prop);\n const messagesHandler: ProxyHandler<MessageBatch['messages']> = {\n get: (target, prop) => {\n if (typeof prop === 'string' && !isNaN(parseInt(prop))) {\n const message = Reflect.get(target, prop);\n return proxyQueueMessage(message, count);\n } else {\n return Reflect.get(target, prop);\n }\n },\n };\n return wrap(messages, messagesHandler);\n } else if (prop === 'ackAll') {\n const ackFn = Reflect.get(target, prop);\n return new Proxy(ackFn, {\n apply: (fnTarget) => {\n addQueueEvent('ackAll');\n count.ackRemaining();\n Reflect.apply(fnTarget, batch, []);\n },\n });\n } else if (prop === 'retryAll') {\n const retryFn = Reflect.get(target, prop);\n return new Proxy(retryFn, {\n apply: (fnTarget, _thisArg, args) => {\n // Extract delay from retryAll options if provided\n const retryOptions = args[0] as { delaySeconds?: number } | undefined;\n const delaySeconds = retryOptions?.delaySeconds;\n\n addQueueEvent('retryAll', undefined, delaySeconds);\n count.retryRemaining();\n Reflect.apply(fnTarget, batch, args);\n },\n });\n }\n return Reflect.get(target, prop);\n },\n };\n return wrap(batch, batchHandler);\n}\n\n/**\n * Queue handler instrumentation with message tracking\n */\nclass QueueInstrumentation implements HandlerInstrumentation<MessageBatch, void> {\n private count?: MessageStatusCount;\n\n getInitialSpanInfo(batch: MessageBatch): InitialSpanInfo {\n return {\n name: `queueHandler ${batch.queue || 'unknown'}`,\n options: {\n kind: SpanKind.CONSUMER,\n attributes: {\n 'faas.trigger': 'pubsub',\n 'queue.name': batch.queue || 'unknown',\n },\n },\n };\n }\n\n instrumentTrigger(batch: MessageBatch): MessageBatch {\n this.count = new MessageStatusCount(batch.messages.length);\n return proxyMessageBatch(batch, this.count);\n }\n\n executionSucces(span: Span, _trigger: MessageBatch, _result: void) {\n if (this.count) {\n this.count.ackRemaining();\n span.setAttributes(this.count.toAttributes());\n }\n }\n\n executionFailed(span: Span, _trigger: MessageBatch, _error?: any) {\n if (this.count) {\n this.count.retryRemaining();\n span.setAttributes(this.count.toAttributes());\n }\n }\n}\n\n/**\n * Converts email headers into OpenTelemetry attributes\n */\nfunction headerAttributes(message: { headers: Headers }): Record<string, string> {\n const attrs: Record<string, string> = {};\n if (message.headers instanceof Headers) {\n for (const [key, value] of message.headers.entries()) {\n attrs[`email.header.${key}`] = value;\n }\n }\n return attrs;\n}\n\n/**\n * Email handler instrumentation\n */\nconst emailInstrumentation: HandlerInstrumentation<ForwardableEmailMessage, void> = {\n getInitialSpanInfo: (message: ForwardableEmailMessage): InitialSpanInfo => {\n const attributes: Record<string, string> = {\n 'faas.trigger': 'other',\n 'messaging.destination.name': message.to || 'unknown',\n };\n\n // Add message ID if available\n if ('headers' in message && message.headers instanceof Headers) {\n const messageId = message.headers.get('Message-Id');\n if (messageId) {\n attributes['rpc.message.id'] = messageId;\n }\n // Add all headers as attributes\n Object.assign(attributes, headerAttributes(message));\n }\n\n return {\n name: `emailHandler ${message.to || 'unknown'}`,\n options: {\n kind: SpanKind.CONSUMER,\n attributes,\n },\n };\n },\n};\n\n\n/**\n * Export spans after request completes\n */\nasync function exportSpans(\n traceId: string,\n tracker: PromiseTracker | undefined,\n ctx: ExecutionContext,\n) {\n const tracer = trace.getTracer('autotel-edge');\n if (tracer instanceof WorkerTracer) {\n try {\n // scheduler is available on ExecutionContext at runtime\n const ctxWithScheduler = ctx as ExecutionContext & { scheduler?: { wait(ms: number): Promise<void> } };\n if (ctxWithScheduler.scheduler) {\n await ctxWithScheduler.scheduler.wait(1);\n }\n await tracker?.wait();\n await tracer.forceFlush(traceId);\n } catch (error) {\n // Silently handle exporter errors to prevent worker crashes\n // Exporter failures should not affect the worker's ability to process requests\n // In production, consider logging to a monitoring service\n console.error('[autotel-edge] Failed to export spans:', error);\n }\n }\n}\n\n/**\n * Create handler flow with instrumentation\n */\nfunction createHandlerFlow<T extends Trigger, E, R>(\n instrumentation: HandlerInstrumentation<T, R>,\n) {\n return (\n handlerFn: (trigger: T, env: E, ctx: ExecutionContext) => R | Promise<R>,\n [trigger, env, context]: [T, E, ExecutionContext],\n ) => {\n const { ctx: proxiedCtx, tracker } = proxyExecutionContext(context);\n\n const tracer = trace.getTracer('autotel-edge') as WorkerTracer;\n\n const { name, options, context: spanContext } =\n instrumentation.getInitialSpanInfo(trigger);\n\n // Add cold start tracking\n if (options.attributes) {\n options.attributes['faas.coldstart'] = coldStart;\n } else {\n options.attributes = { 'faas.coldstart': coldStart };\n }\n coldStart = false;\n\n const parentContext = spanContext || api_context.active();\n\n // Instrument trigger if supported (e.g., for queue handler)\n const instrumentedTrigger = instrumentation.instrumentTrigger\n ? instrumentation.instrumentTrigger(trigger)\n : trigger;\n\n return tracer.startActiveSpan(name, options, parentContext, async (span) => {\n try {\n const result = await handlerFn(instrumentedTrigger, env, proxiedCtx);\n\n if (instrumentation.getAttributesFromResult) {\n const attributes = instrumentation.getAttributesFromResult(result);\n span.setAttributes(attributes);\n }\n\n if (instrumentation.executionSucces) {\n instrumentation.executionSucces(span, trigger, result);\n }\n\n span.setStatus({ code: SpanStatusCode.OK });\n return result;\n } catch (error) {\n span.recordException(error as Error);\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: error instanceof Error ? error.message : String(error),\n });\n if (instrumentation.executionFailed) {\n instrumentation.executionFailed(span, trigger, error);\n }\n throw error;\n } finally {\n span.end();\n context.waitUntil(exportSpans(span.spanContext().traceId, tracker, context));\n }\n });\n };\n}\n\n/**\n * Create handler proxy\n */\nfunction createHandlerProxy<T extends Trigger, E, R>(\n _handler: unknown,\n handlerFn: (trigger: T, env: E, ctx: ExecutionContext) => R | Promise<R>,\n initialiser: Initialiser,\n instrumentation: HandlerInstrumentation<T, R>,\n): (trigger: T, env: E, ctx: ExecutionContext) => ReturnType<typeof handlerFn> {\n return (trigger: T, env: E, ctx: ExecutionContext) => {\n const config = initialiser(env, trigger);\n \n // Check if instrumentation is disabled (useful for local dev)\n if (config.instrumentation.disabled) {\n // Return handler as-is without instrumentation\n return handlerFn(trigger, env, ctx);\n }\n \n // Auto-instrument Cloudflare bindings in the environment\n const instrumentedEnv = instrumentBindings(env as Record<string, any>) as E;\n \n const configContext = setConfig(config);\n\n // Initialize provider on first call\n initProvider(config);\n\n const flowFn = createHandlerFlow<T, E, R>(instrumentation);\n\n // Execute the handler flow within the config context\n return api_context.with(configContext, () => {\n return flowFn(handlerFn, [trigger, instrumentedEnv, ctx]) as ReturnType<typeof handlerFn>;\n });\n };\n}\n\n/**\n * Create handler proxy with dynamic instrumentation (for fetch with postProcess)\n */\nfunction createHandlerProxyWithConfig<T extends Trigger, E, R>(\n _handler: unknown,\n handlerFn: (trigger: T, env: E, ctx: ExecutionContext) => R | Promise<R>,\n initialiser: Initialiser,\n createInstrumentation: (config: ResolvedEdgeConfig) => HandlerInstrumentation<T, R>,\n): (trigger: T, env: E, ctx: ExecutionContext) => ReturnType<typeof handlerFn> {\n return (trigger: T, env: E, ctx: ExecutionContext) => {\n const config = initialiser(env, trigger);\n \n // Check if instrumentation is disabled (useful for local dev)\n if (config.instrumentation.disabled) {\n // Return handler as-is without instrumentation\n return handlerFn(trigger, env, ctx);\n }\n \n // Auto-instrument Cloudflare bindings in the environment\n const instrumentedEnv = instrumentBindings(env as Record<string, any>) as E;\n \n const configContext = setConfig(config);\n\n // Initialize provider on first call\n initProvider(config);\n\n // Create instrumentation with config\n const instrumentation = createInstrumentation(config);\n const flowFn = createHandlerFlow<T, E, R>(instrumentation);\n\n // Execute the handler flow within the config context\n return api_context.with(configContext, () => {\n return flowFn(handlerFn, [trigger, instrumentedEnv, ctx]) as ReturnType<typeof handlerFn>;\n });\n };\n}\n\nlet providerInitialized = false;\nlet coldStart = true;\n\n/**\n * Initialize the tracer provider\n */\nfunction initProvider(config: ResolvedEdgeConfig): void {\n if (providerInitialized) return;\n\n // Install global instrumentations\n if (config.instrumentation.instrumentGlobalFetch) {\n instrumentGlobalFetch();\n }\n if (config.instrumentation.instrumentGlobalCache) {\n instrumentGlobalCache();\n }\n\n // Set up propagator\n propagation.setGlobalPropagator(config.propagator);\n\n // Create resource\n const resource = resourceFromAttributes({\n 'service.name': config.service.name,\n 'service.version': config.service.version,\n 'service.namespace': config.service.namespace,\n 'cloud.provider': 'cloudflare',\n 'cloud.platform': 'cloudflare.workers',\n 'telemetry.sdk.name': 'autotel-edge',\n 'telemetry.sdk.language': 'js',\n });\n\n // Create and register provider\n const provider = new WorkerTracerProvider(config.spanProcessors, resource);\n provider.register();\n\n // Set head sampler on tracer\n const tracer = trace.getTracer('autotel-edge') as WorkerTracer;\n tracer.setHeadSampler(config.sampling.headSampler);\n\n providerInitialized = true;\n}\n\n/**\n * Instrument a Cloudflare Workers handler\n *\n * @example\n * ```typescript\n * import { instrument } from 'autotel-edge'\n *\n * const handler = {\n * async fetch(request, env, ctx) {\n * return new Response('Hello World')\n * }\n * }\n *\n * export default instrument(handler, {\n * exporter: {\n * url: env.OTLP_ENDPOINT,\n * headers: { 'x-api-key': env.API_KEY }\n * },\n * service: { name: 'my-worker' }\n * })\n * ```\n */\nexport function instrument<E, Q = any, C = any>(\n handler: ExportedHandler<E, Q, C>,\n config: ConfigurationOption,\n): ExportedHandler<E, Q, C> {\n const initialiser = createInitialiser(config);\n\n if (handler.fetch) {\n const fetcher = unwrap(handler.fetch) as FetchHandler;\n // Create fetch instrumentation with config support\n handler.fetch = createHandlerProxyWithConfig(\n handler,\n fetcher,\n initialiser,\n createFetchInstrumentation,\n );\n }\n\n if (handler.scheduled) {\n const scheduled = unwrap(handler.scheduled) as ScheduledHandler;\n handler.scheduled = createHandlerProxy(\n handler,\n scheduled,\n initialiser,\n scheduledInstrumentation,\n );\n }\n\n if (handler.queue) {\n const queue = unwrap(handler.queue) as QueueHandler;\n handler.queue = createHandlerProxy(\n handler,\n queue,\n initialiser,\n new QueueInstrumentation(),\n );\n }\n\n if (handler.email) {\n const email = unwrap(handler.email) as EmailHandler;\n handler.email = createHandlerProxy(\n handler,\n email,\n initialiser,\n emailInstrumentation,\n );\n }\n\n return handler;\n}\n","/**\n * workers-honeycomb-logger style wrapper API\n *\n * @example\n * ```typescript\n * import { wrapModule } from 'autotel-cloudflare'\n *\n * const handler = {\n * async fetch(req, env, ctx) {\n * return new Response('Hello')\n * }\n * }\n *\n * export default wrapModule(\n * { service: { name: 'my-worker' } },\n * handler\n * )\n * ```\n */\n\nimport { instrument } from './instrument';\nimport type { ConfigurationOption } from 'autotel-edge';\n\n/**\n * Wrap a Cloudflare Workers module-style handler\n * Alternative API style inspired by workers-honeycomb-logger\n *\n * @param config Configuration (can be static object or function)\n * @param handler The worker handler to wrap\n * @returns Instrumented handler\n */\nexport function wrapModule<E, Q = any, C = any>(\n config: ConfigurationOption,\n handler: ExportedHandler<E, Q, C>,\n): ExportedHandler<E, Q, C> {\n return instrument(handler, config);\n}\n","/**\n * Durable Object wrapper\n *\n * @example\n * ```typescript\n * import { wrapDurableObject } from 'autotel-cloudflare'\n *\n * class Counter implements DurableObject {\n * async fetch(request: Request) {\n * return new Response('count')\n * }\n * }\n *\n * export default wrapDurableObject({ service: { name: 'counter-do' } }, Counter)\n * ```\n */\n\nimport { instrumentDO } from '../handlers/durable-objects';\nimport type { ConfigurationOption } from 'autotel-edge';\n\n/**\n * Wrap a Durable Object class with instrumentation\n * Alternative API style inspired by workers-honeycomb-logger\n *\n * @param config Configuration (can be static object or function)\n * @param doClass The Durable Object class to wrap\n * @returns Instrumented Durable Object class\n */\nexport function wrapDurableObject<T extends DurableObject>(\n config: ConfigurationOption,\n doClass: new (state: DurableObjectState, env: any) => T,\n): new (state: DurableObjectState, env: any) => T {\n return instrumentDO(doClass, config);\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/global/fetch.ts","../src/global/cache.ts","../src/wrappers/instrument.ts","../src/wrappers/wrap-module.ts","../src/wrappers/wrap-do.ts"],"names":["api_context","trace","SpanKind","SpanStatusCode","propagation","target","prop","getActiveConfig","WorkerTracer","context"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Global fetch() instrumentation for autotel-edge\n *\n * Automatically traces all outgoing fetch() calls with:\n * - HTTP method, URL, status code\n * - Request/response headers\n * - Automatic context propagation\n * - Error tracking\n */\n\nimport {\n trace,\n context as api_context,\n propagation,\n SpanStatusCode,\n SpanKind,\n} from '@opentelemetry/api';\nimport { getActiveConfig, WorkerTracer } from 'autotel-edge';\n\n/**\n * Gather HTTP request attributes following OpenTelemetry semantic conventions\n */\nfunction gatherRequestAttributes(request: Request): Record<string, any> {\n const url = new URL(request.url);\n const config = getActiveConfig();\n const redactQuery = config?.dataSafety?.redactQueryParams === true;\n\n return {\n 'http.request.method': request.method.toUpperCase(),\n 'url.full': redactQuery ? `${url.origin}${url.pathname}` : request.url,\n 'url.scheme': url.protocol.replace(':', ''),\n 'server.address': url.host,\n 'url.path': url.pathname,\n 'url.query': redactQuery ? (url.search ? '[REDACTED]' : '') : url.search,\n 'network.protocol.name': 'http',\n 'user_agent.original': request.headers.get('user-agent') || undefined,\n };\n}\n\n/**\n * Gather HTTP response attributes\n */\nfunction gatherResponseAttributes(response: Response): Record<string, any> {\n return {\n 'http.response.status_code': response.status,\n 'http.response.body.size': response.headers.get('content-length') || undefined,\n };\n}\n\n/**\n * Instrument the global fetch function\n *\n * This wraps globalThis.fetch to automatically create spans for all outgoing HTTP requests.\n *\n * **Note:** This is called automatically when the library is initialized with\n * `instrumentation.instrumentGlobalFetch: true` (default).\n */\nexport function instrumentGlobalFetch(): void {\n const originalFetch = globalThis.fetch;\n\n const instrumentedFetch = function fetch(\n input: RequestInfo | URL,\n init?: RequestInit,\n ): Promise<Response> {\n const request = new Request(input, init);\n\n // Skip non-HTTP requests\n if (!request.url.startsWith('http')) {\n return originalFetch(input, init);\n }\n\n // Skip if no active config (not initialized yet)\n const config = getActiveConfig();\n if (!config) {\n return originalFetch(input, init);\n }\n\n const tracer = trace.getTracer('autotel-edge') as WorkerTracer;\n const url = new URL(request.url);\n const spanName = `${request.method} ${url.host}`;\n\n return tracer.startActiveSpan(\n spanName,\n {\n kind: SpanKind.CLIENT,\n attributes: gatherRequestAttributes(request),\n },\n async (span) => {\n try {\n // Inject trace context into request headers for distributed tracing\n const shouldIncludeContext =\n typeof config.fetch?.includeTraceContext === 'function'\n ? config.fetch.includeTraceContext(request)\n : (config.fetch?.includeTraceContext ?? true);\n\n if (shouldIncludeContext) {\n propagation.inject(api_context.active(), request.headers, {\n set: (headers, key, value) => {\n if (typeof value === 'string') {\n headers.set(key, value);\n }\n },\n });\n }\n\n // Make the actual fetch call\n const response = await originalFetch(request);\n\n // Add response attributes\n span.setAttributes(gatherResponseAttributes(response));\n\n // Set span status based on response\n if (response.ok) {\n span.setStatus({ code: SpanStatusCode.OK });\n } else {\n span.setStatus({ code: SpanStatusCode.ERROR });\n }\n\n return response;\n } catch (error) {\n span.recordException(error as Error);\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: error instanceof Error ? error.message : String(error),\n });\n throw error;\n } finally {\n span.end();\n }\n },\n );\n };\n\n // Replace global fetch\n globalThis.fetch = instrumentedFetch as typeof fetch;\n}\n","/**\n * Global Cache API instrumentation for Cloudflare Workers\n *\n * Automatically traces cache operations:\n * - cache.match() - Read from cache\n * - cache.put() - Write to cache\n * - cache.delete() - Delete from cache\n */\n\nimport { trace, SpanStatusCode, SpanKind } from '@opentelemetry/api';\nimport { wrap } from '../bindings/common';\nimport { WorkerTracer } from 'autotel-edge';\n\ntype CacheOperation = 'match' | 'put' | 'delete';\n\n/**\n * Sanitize URL for span attributes (remove query params that might contain sensitive data)\n */\nfunction sanitizeURL(url: string): string {\n const u = new URL(url);\n return `${u.protocol}//${u.host}${u.pathname}`;\n}\n\n/**\n * Instrument a cache method (match, put, delete)\n */\nfunction instrumentCacheMethod<T extends Function>(\n fn: T,\n cacheName: string,\n operation: CacheOperation,\n): T {\n const handler: ProxyHandler<T> = {\n async apply(target, thisArg, argArray) {\n const tracer = trace.getTracer('autotel-edge') as WorkerTracer;\n\n // Extract URL from first argument (Request or string)\n const firstArg = argArray[0];\n const url =\n firstArg instanceof Request\n ? firstArg.url\n : typeof firstArg === 'string'\n ? firstArg\n : undefined;\n\n const spanName = `Cache ${cacheName}.${operation}`;\n\n return tracer.startActiveSpan(\n spanName,\n {\n kind: SpanKind.CLIENT,\n attributes: {\n 'cache.name': cacheName,\n 'cache.operation': operation,\n 'cache.key': url ? sanitizeURL(url) : undefined,\n },\n },\n async (span) => {\n try {\n const result = await Reflect.apply(target, thisArg, argArray);\n\n // For match operations, record whether it was a hit or miss\n if (operation === 'match') {\n span.setAttribute('cache.hit', !!result);\n }\n\n span.setStatus({ code: SpanStatusCode.OK });\n return result;\n } catch (error) {\n span.recordException(error as Error);\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: error instanceof Error ? error.message : String(error),\n });\n throw error;\n } finally {\n span.end();\n }\n },\n );\n },\n };\n\n return wrap(fn, handler);\n}\n\n/**\n * Instrument a Cache instance\n */\nfunction instrumentCache(cache: Cache, cacheName: string): Cache {\n const handler: ProxyHandler<Cache> = {\n get(target, prop) {\n const value = Reflect.get(target, prop);\n\n // Instrument the cache operation methods\n if (\n (prop === 'match' || prop === 'put' || prop === 'delete') &&\n typeof value === 'function'\n ) {\n return instrumentCacheMethod(\n value.bind(target),\n cacheName,\n prop as CacheOperation,\n );\n }\n\n // Bind other methods to preserve `this` context\n if (typeof value === 'function') {\n return value.bind(target);\n }\n\n return value;\n },\n };\n\n return wrap(cache, handler);\n}\n\n/**\n * Instrument caches.open()\n */\nfunction instrumentCachesOpen(\n openFn: CacheStorage['open'],\n): CacheStorage['open'] {\n const handler: ProxyHandler<CacheStorage['open']> = {\n async apply(target, thisArg, argArray) {\n const cacheName = argArray[0];\n const cache = await Reflect.apply(target, thisArg, argArray);\n return instrumentCache(cache, cacheName);\n },\n };\n\n return wrap(openFn, handler);\n}\n\n/**\n * Instrument the global caches API\n *\n * This wraps globalThis.caches to automatically create spans for all cache operations.\n *\n * **Note:** This is called automatically when the library is initialized with\n * `instrumentation.instrumentGlobalCache: true` (default).\n */\nexport function instrumentGlobalCache(): void {\n const handler: ProxyHandler<typeof caches> = {\n get(target, prop) {\n if (prop === 'default') {\n // Wrap the default cache\n return instrumentCache(target.default, 'default');\n } else if (prop === 'open') {\n // Wrap the open method\n const openFn = Reflect.get(target, prop);\n if (typeof openFn === 'function') {\n return instrumentCachesOpen(openFn.bind(target));\n }\n }\n\n return Reflect.get(target, prop);\n },\n };\n\n // Replace global caches\n // @ts-ignore - TypeScript doesn't like reassigning globalThis.caches\n globalThis.caches = wrap(caches, handler);\n}\n","/**\n * Handler instrumentation for Cloudflare Workers\n * \n * Note: This file uses Cloudflare Workers types (ExportedHandler, Request, Response, etc.)\n * which are globally available via @cloudflare/workers-types when listed in tsconfig.json.\n * These types are devDependencies only - they're not runtime dependencies.\n * At runtime, Cloudflare Workers runtime provides the actual implementations.\n * \n * Provides automatic OpenTelemetry tracing for:\n * - HTTP handlers (fetch)\n * - Scheduled/cron handlers\n * - Queue handlers (with message tracking)\n * - Email handlers\n * - Auto-instrumentation of Cloudflare bindings (KV, R2, D1, Service Bindings)\n * - Global fetch and cache instrumentation\n * - Post-processor support for span customization\n * - Tail sampling support\n * - Cold start tracking\n */\n\nimport {\n trace,\n context as api_context,\n propagation,\n SpanStatusCode,\n SpanKind,\n} from '@opentelemetry/api';\nimport { resourceFromAttributes } from '@opentelemetry/resources';\nimport type {\n ConfigurationOption,\n ResolvedEdgeConfig,\n Trigger,\n HandlerInstrumentation,\n InitialSpanInfo,\n ReadableSpan,\n} from 'autotel-edge';\nimport {\n createInitialiser,\n setConfig,\n getActiveConfig,\n type Initialiser,\n WorkerTracerProvider,\n WorkerTracer,\n} from 'autotel-edge';\nimport { proxyExecutionContext, unwrap, wrap, type PromiseTracker } from '../bindings/common';\nimport { instrumentGlobalFetch } from '../global/fetch';\nimport { instrumentGlobalCache } from '../global/cache';\nimport { instrumentBindings } from '../bindings/bindings';\nimport type { Attributes, Span } from '@opentelemetry/api';\n\ntype FetchHandler = (\n request: Request,\n env: any,\n ctx: ExecutionContext,\n) => Response | Promise<Response>;\n\ntype ScheduledHandler = (\n event: ScheduledController,\n env: any,\n ctx: ExecutionContext,\n) => void | Promise<void>;\n\ntype QueueHandler = (\n batch: MessageBatch,\n env: any,\n ctx: ExecutionContext,\n) => void | Promise<void>;\n\ntype EmailHandler = (\n message: ForwardableEmailMessage,\n env: any,\n ctx: ExecutionContext,\n) => void | Promise<void>;\n\n\n/**\n * Create fetch handler instrumentation with config support for postProcess\n */\n/**\n * Extract Cloudflare-specific attributes from a request\n */\nfunction extractCfAttributes(request: Request): Record<string, string | number | boolean> {\n const cf = (request as any).cf;\n if (!cf) return {};\n\n const attrs: Record<string, string | number | boolean> = {};\n const set = (key: string, value: unknown) => {\n if (value !== undefined && value !== null) {\n attrs[key] = value as string | number | boolean;\n }\n };\n\n set('cloudflare.colo', cf.colo);\n const ray = request.headers.get('cf-ray');\n if (ray) attrs['cloudflare.ray_id'] = ray;\n set('cloudflare.country', cf.country);\n set('cloudflare.city', cf.city);\n set('cloudflare.region', cf.region);\n set('cloudflare.continent', cf.continent);\n set('cloudflare.timezone', cf.timezone);\n set('cloudflare.latitude', cf.latitude);\n set('cloudflare.longitude', cf.longitude);\n set('cloudflare.asn', cf.asn);\n set('cloudflare.as_organization', cf.asOrganization);\n set('cloudflare.http_protocol', cf.httpProtocol);\n set('cloudflare.tls_version', cf.tlsVersion);\n set('cloudflare.client_tcp_rtt', cf.clientTcpRtt);\n\n return attrs;\n}\n\nfunction createFetchInstrumentation(\n config: ResolvedEdgeConfig,\n): HandlerInstrumentation<Request, Response> {\n return {\n getInitialSpanInfo: (request: Request): InitialSpanInfo => {\n const url = new URL(request.url);\n\n const cfAttrs = (config as any).extractCfAttributes === false\n ? {}\n : extractCfAttributes(request);\n\n return {\n name: `${request.method} ${url.pathname}`,\n options: {\n kind: SpanKind.SERVER,\n attributes: {\n 'http.request.method': request.method,\n 'url.full': request.url,\n ...cfAttrs,\n },\n },\n context: propagation.extract(api_context.active(), request.headers),\n };\n },\n getAttributesFromResult: (response: Response) => ({\n 'http.response.status_code': response.status,\n }),\n executionSucces: (span: Span, trigger: Request, result: Response) => {\n // Override span status for server errors (5xx)\n if (result.status >= 500) {\n span.setStatus({ code: SpanStatusCode.ERROR });\n }\n\n // Call postProcess callback if configured\n if (config.handlers.fetch.postProcess) {\n const readableSpan = span as unknown as ReadableSpan;\n config.handlers.fetch.postProcess(span, {\n request: trigger,\n response: result,\n readable: readableSpan,\n });\n }\n },\n };\n}\n\n/**\n * Scheduled handler instrumentation\n */\nconst scheduledInstrumentation: HandlerInstrumentation<ScheduledController, void> = {\n getInitialSpanInfo: (event: ScheduledController): InitialSpanInfo => {\n return {\n name: `scheduledHandler ${event.cron || 'unknown'}`,\n options: {\n kind: SpanKind.INTERNAL,\n attributes: {\n 'faas.trigger': 'timer',\n 'faas.cron': event.cron || 'unknown',\n 'faas.scheduled_time': new Date(event.scheduledTime).toISOString(),\n },\n },\n };\n },\n};\n\n/**\n * Tracks message status counts for queue processing\n */\nclass MessageStatusCount {\n succeeded = 0;\n failed = 0;\n implicitly_acked = 0;\n implicitly_retried = 0;\n readonly total: number;\n\n constructor(total: number) {\n this.total = total;\n }\n\n ack() {\n this.succeeded = this.succeeded + 1;\n }\n\n ackRemaining() {\n this.implicitly_acked = this.total - this.succeeded - this.failed;\n this.succeeded = this.total - this.failed;\n }\n\n retry() {\n this.failed = this.failed + 1;\n }\n\n retryRemaining() {\n this.implicitly_retried = this.total - this.succeeded - this.failed;\n this.failed = this.total - this.succeeded;\n }\n\n toAttributes(): Attributes {\n return {\n 'queue.messages_count': this.total,\n 'queue.messages_success': this.succeeded,\n 'queue.messages_failed': this.failed,\n 'queue.batch_success': this.succeeded === this.total,\n 'queue.implicitly_acked': this.implicitly_acked,\n 'queue.implicitly_retried': this.implicitly_retried,\n };\n }\n}\n\n/**\n * Add event to active span\n */\nfunction addQueueEvent(name: string, msg?: Message, delaySeconds?: number) {\n const attrs: Attributes = {};\n if (msg) {\n attrs['queue.message_id'] = msg.id;\n attrs['queue.message_timestamp'] = msg.timestamp.toISOString();\n // Add attempts if available (from Cloudflare Queues API)\n if ('attempts' in msg && typeof msg.attempts === 'number') {\n attrs['queue.message_attempts'] = msg.attempts;\n }\n }\n if (delaySeconds !== undefined) {\n attrs['queue.retry_delay_seconds'] = delaySeconds;\n }\n trace.getActiveSpan()?.addEvent(name, attrs);\n}\n\n/**\n * Proxy a queue message to track ack/retry operations\n */\nfunction proxyQueueMessage<Q>(msg: Message<Q>, count: MessageStatusCount): Message<Q> {\n const msgHandler: ProxyHandler<Message<Q>> = {\n get: (target, prop) => {\n if (prop === 'ack') {\n const ackFn = Reflect.get(target, prop);\n return new Proxy(ackFn, {\n apply: (fnTarget) => {\n addQueueEvent('messageAck', msg);\n count.ack();\n Reflect.apply(fnTarget, msg, []);\n },\n });\n } else if (prop === 'retry') {\n const retryFn = Reflect.get(target, prop);\n return new Proxy(retryFn, {\n apply: (fnTarget, _thisArg, args) => {\n // Extract delay and content type from retry options if provided\n const retryOptions = args[0] as\n | { delaySeconds?: number; contentType?: string }\n | undefined;\n const delaySeconds = retryOptions?.delaySeconds;\n\n addQueueEvent('messageRetry', msg, delaySeconds);\n\n // Add content type attribute if provided\n if (retryOptions?.contentType) {\n const span = trace.getActiveSpan();\n if (span) {\n span.setAttribute('queue.message.content_type', retryOptions.contentType);\n }\n }\n\n count.retry();\n const result = Reflect.apply(fnTarget, msg, args);\n return result;\n },\n });\n } else {\n return Reflect.get(target, prop, msg);\n }\n },\n };\n return wrap(msg, msgHandler);\n}\n\n/**\n * Proxy MessageBatch to track ackAll/retryAll operations\n */\nfunction proxyMessageBatch(batch: MessageBatch, count: MessageStatusCount): MessageBatch {\n const batchHandler: ProxyHandler<MessageBatch> = {\n get: (target, prop) => {\n if (prop === 'messages') {\n const messages = Reflect.get(target, prop);\n const messagesHandler: ProxyHandler<MessageBatch['messages']> = {\n get: (target, prop) => {\n if (typeof prop === 'string' && !isNaN(parseInt(prop))) {\n const message = Reflect.get(target, prop);\n return proxyQueueMessage(message, count);\n } else {\n return Reflect.get(target, prop);\n }\n },\n };\n return wrap(messages, messagesHandler);\n } else if (prop === 'ackAll') {\n const ackFn = Reflect.get(target, prop);\n return new Proxy(ackFn, {\n apply: (fnTarget) => {\n addQueueEvent('ackAll');\n count.ackRemaining();\n Reflect.apply(fnTarget, batch, []);\n },\n });\n } else if (prop === 'retryAll') {\n const retryFn = Reflect.get(target, prop);\n return new Proxy(retryFn, {\n apply: (fnTarget, _thisArg, args) => {\n // Extract delay from retryAll options if provided\n const retryOptions = args[0] as { delaySeconds?: number } | undefined;\n const delaySeconds = retryOptions?.delaySeconds;\n\n addQueueEvent('retryAll', undefined, delaySeconds);\n count.retryRemaining();\n Reflect.apply(fnTarget, batch, args);\n },\n });\n }\n return Reflect.get(target, prop);\n },\n };\n return wrap(batch, batchHandler);\n}\n\n/**\n * Queue handler instrumentation with message tracking\n */\nclass QueueInstrumentation implements HandlerInstrumentation<MessageBatch, void> {\n private count?: MessageStatusCount;\n\n getInitialSpanInfo(batch: MessageBatch): InitialSpanInfo {\n return {\n name: `queueHandler ${batch.queue || 'unknown'}`,\n options: {\n kind: SpanKind.CONSUMER,\n attributes: {\n 'faas.trigger': 'pubsub',\n 'queue.name': batch.queue || 'unknown',\n },\n },\n };\n }\n\n instrumentTrigger(batch: MessageBatch): MessageBatch {\n this.count = new MessageStatusCount(batch.messages.length);\n return proxyMessageBatch(batch, this.count);\n }\n\n executionSucces(span: Span, _trigger: MessageBatch, _result: void) {\n if (this.count) {\n this.count.ackRemaining();\n span.setAttributes(this.count.toAttributes());\n }\n }\n\n executionFailed(span: Span, _trigger: MessageBatch, _error?: any) {\n if (this.count) {\n this.count.retryRemaining();\n span.setAttributes(this.count.toAttributes());\n }\n }\n}\n\n/**\n * Converts email headers into OpenTelemetry attributes.\n * When dataSafety.emailHeaderAllowlist is configured, only allowed headers are captured.\n */\nfunction headerAttributes(message: { headers: Headers }): Record<string, string> {\n const attrs: Record<string, string> = {};\n if (message.headers instanceof Headers) {\n const config = getActiveConfig();\n const allowlist: string[] | undefined = config?.dataSafety?.emailHeaderAllowlist;\n for (const [key, value] of message.headers.entries()) {\n if (allowlist && !allowlist.includes(key.toLowerCase())) {\n continue;\n }\n attrs[`email.header.${key}`] = value;\n }\n }\n return attrs;\n}\n\n/**\n * Email handler instrumentation\n */\nconst emailInstrumentation: HandlerInstrumentation<ForwardableEmailMessage, void> = {\n getInitialSpanInfo: (message: ForwardableEmailMessage): InitialSpanInfo => {\n const attributes: Record<string, string> = {\n 'faas.trigger': 'other',\n 'messaging.destination.name': message.to || 'unknown',\n };\n\n // Add message ID if available\n if ('headers' in message && message.headers instanceof Headers) {\n const messageId = message.headers.get('Message-Id');\n if (messageId) {\n attributes['rpc.message.id'] = messageId;\n }\n // Add all headers as attributes\n Object.assign(attributes, headerAttributes(message));\n }\n\n return {\n name: `emailHandler ${message.to || 'unknown'}`,\n options: {\n kind: SpanKind.CONSUMER,\n attributes,\n },\n };\n },\n};\n\n\n/**\n * Export spans after request completes\n */\nasync function exportSpans(\n traceId: string,\n tracker: PromiseTracker | undefined,\n ctx: ExecutionContext,\n) {\n const tracer = trace.getTracer('autotel-edge');\n if (tracer instanceof WorkerTracer) {\n try {\n // scheduler is available on ExecutionContext at runtime\n const ctxWithScheduler = ctx as ExecutionContext & { scheduler?: { wait(ms: number): Promise<void> } };\n if (ctxWithScheduler.scheduler) {\n await ctxWithScheduler.scheduler.wait(1);\n }\n await tracker?.wait();\n await tracer.forceFlush(traceId);\n } catch (error) {\n // Silently handle exporter errors to prevent worker crashes\n // Exporter failures should not affect the worker's ability to process requests\n // In production, consider logging to a monitoring service\n console.error('[autotel-edge] Failed to export spans:', error);\n }\n }\n}\n\n/**\n * Create handler flow with instrumentation\n */\nfunction createHandlerFlow<T extends Trigger, E, R>(\n instrumentation: HandlerInstrumentation<T, R>,\n) {\n return (\n handlerFn: (trigger: T, env: E, ctx: ExecutionContext) => R | Promise<R>,\n [trigger, env, context]: [T, E, ExecutionContext],\n ) => {\n const { ctx: proxiedCtx, tracker } = proxyExecutionContext(context);\n\n const tracer = trace.getTracer('autotel-edge') as WorkerTracer;\n\n const { name, options, context: spanContext } =\n instrumentation.getInitialSpanInfo(trigger);\n\n // Add cold start tracking\n if (options.attributes) {\n options.attributes['faas.coldstart'] = coldStart;\n } else {\n options.attributes = { 'faas.coldstart': coldStart };\n }\n coldStart = false;\n\n const parentContext = spanContext || api_context.active();\n\n // Instrument trigger if supported (e.g., for queue handler)\n const instrumentedTrigger = instrumentation.instrumentTrigger\n ? instrumentation.instrumentTrigger(trigger)\n : trigger;\n\n return tracer.startActiveSpan(name, options, parentContext, async (span) => {\n try {\n const result = await handlerFn(instrumentedTrigger, env, proxiedCtx);\n\n if (instrumentation.getAttributesFromResult) {\n const attributes = instrumentation.getAttributesFromResult(result);\n span.setAttributes(attributes);\n }\n\n // Set default OK status; executionSucces may override (e.g. HTTP 5xx)\n span.setStatus({ code: SpanStatusCode.OK });\n\n if (instrumentation.executionSucces) {\n instrumentation.executionSucces(span, trigger, result);\n }\n return result;\n } catch (error) {\n span.recordException(error as Error);\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: error instanceof Error ? error.message : String(error),\n });\n if (instrumentation.executionFailed) {\n instrumentation.executionFailed(span, trigger, error);\n }\n throw error;\n } finally {\n span.end();\n context.waitUntil(exportSpans(span.spanContext().traceId, tracker, context));\n }\n });\n };\n}\n\n/**\n * Create handler proxy\n */\nfunction createHandlerProxy<T extends Trigger, E, R>(\n _handler: unknown,\n handlerFn: (trigger: T, env: E, ctx: ExecutionContext) => R | Promise<R>,\n initialiser: Initialiser,\n instrumentation: HandlerInstrumentation<T, R>,\n): (trigger: T, env: E, ctx: ExecutionContext) => ReturnType<typeof handlerFn> {\n return (trigger: T, env: E, ctx: ExecutionContext) => {\n const config = initialiser(env, trigger);\n \n // Check if instrumentation is disabled (useful for local dev)\n if (config.instrumentation.disabled) {\n // Return handler as-is without instrumentation\n return handlerFn(trigger, env, ctx);\n }\n \n // Auto-instrument Cloudflare bindings in the environment\n const instrumentedEnv = instrumentBindings(env as Record<string, any>) as E;\n \n const configContext = setConfig(config);\n\n // Initialize provider on first call\n initProvider(config);\n\n const flowFn = createHandlerFlow<T, E, R>(instrumentation);\n\n // Execute the handler flow within the config context\n return api_context.with(configContext, () => {\n return flowFn(handlerFn, [trigger, instrumentedEnv, ctx]) as ReturnType<typeof handlerFn>;\n });\n };\n}\n\n/**\n * Create handler proxy with dynamic instrumentation (for fetch with postProcess)\n */\nfunction createHandlerProxyWithConfig<T extends Trigger, E, R>(\n _handler: unknown,\n handlerFn: (trigger: T, env: E, ctx: ExecutionContext) => R | Promise<R>,\n initialiser: Initialiser,\n createInstrumentation: (config: ResolvedEdgeConfig) => HandlerInstrumentation<T, R>,\n): (trigger: T, env: E, ctx: ExecutionContext) => ReturnType<typeof handlerFn> {\n return (trigger: T, env: E, ctx: ExecutionContext) => {\n const config = initialiser(env, trigger);\n \n // Check if instrumentation is disabled (useful for local dev)\n if (config.instrumentation.disabled) {\n // Return handler as-is without instrumentation\n return handlerFn(trigger, env, ctx);\n }\n \n // Auto-instrument Cloudflare bindings in the environment\n const instrumentedEnv = instrumentBindings(env as Record<string, any>) as E;\n \n const configContext = setConfig(config);\n\n // Initialize provider on first call\n initProvider(config);\n\n // Create instrumentation with config\n const instrumentation = createInstrumentation(config);\n const flowFn = createHandlerFlow<T, E, R>(instrumentation);\n\n // Execute the handler flow within the config context\n return api_context.with(configContext, () => {\n return flowFn(handlerFn, [trigger, instrumentedEnv, ctx]) as ReturnType<typeof handlerFn>;\n });\n };\n}\n\nlet providerInitialized = false;\nlet coldStart = true;\n\n/**\n * Initialize the tracer provider\n */\nfunction initProvider(config: ResolvedEdgeConfig): void {\n if (providerInitialized) return;\n\n // Install global instrumentations\n if (config.instrumentation.instrumentGlobalFetch) {\n instrumentGlobalFetch();\n }\n if (config.instrumentation.instrumentGlobalCache) {\n instrumentGlobalCache();\n }\n\n // Set up propagator\n propagation.setGlobalPropagator(config.propagator);\n\n // Create resource\n const resource = resourceFromAttributes({\n 'service.name': config.service.name,\n 'service.version': config.service.version,\n 'service.namespace': config.service.namespace,\n 'cloud.provider': 'cloudflare',\n 'cloud.platform': 'cloudflare.workers',\n 'telemetry.sdk.name': 'autotel-edge',\n 'telemetry.sdk.language': 'js',\n });\n\n // Create and register provider\n const provider = new WorkerTracerProvider(config.spanProcessors, resource);\n provider.register();\n\n // Set head sampler on tracer\n const tracer = trace.getTracer('autotel-edge') as WorkerTracer;\n tracer.setHeadSampler(config.sampling.headSampler);\n\n providerInitialized = true;\n}\n\n/**\n * Instrument a Cloudflare Workers handler\n *\n * @example\n * ```typescript\n * import { instrument } from 'autotel-edge'\n *\n * const handler = {\n * async fetch(request, env, ctx) {\n * return new Response('Hello World')\n * }\n * }\n *\n * export default instrument(handler, {\n * exporter: {\n * url: env.OTLP_ENDPOINT,\n * headers: { 'x-api-key': env.API_KEY }\n * },\n * service: { name: 'my-worker' }\n * })\n * ```\n */\nexport function instrument<E, Q = any, C = any>(\n handler: ExportedHandler<E, Q, C>,\n config: ConfigurationOption,\n): ExportedHandler<E, Q, C> {\n const initialiser = createInitialiser(config);\n\n if (handler.fetch) {\n const fetcher = unwrap(handler.fetch) as FetchHandler;\n // Create fetch instrumentation with config support\n handler.fetch = createHandlerProxyWithConfig(\n handler,\n fetcher,\n initialiser,\n createFetchInstrumentation,\n );\n }\n\n if (handler.scheduled) {\n const scheduled = unwrap(handler.scheduled) as ScheduledHandler;\n handler.scheduled = createHandlerProxy(\n handler,\n scheduled,\n initialiser,\n scheduledInstrumentation,\n );\n }\n\n if (handler.queue) {\n const queue = unwrap(handler.queue) as QueueHandler;\n handler.queue = createHandlerProxy(\n handler,\n queue,\n initialiser,\n new QueueInstrumentation(),\n );\n }\n\n if (handler.email) {\n const email = unwrap(handler.email) as EmailHandler;\n handler.email = createHandlerProxy(\n handler,\n email,\n initialiser,\n emailInstrumentation,\n );\n }\n\n return handler;\n}\n","/**\n * workers-honeycomb-logger style wrapper API\n *\n * @example\n * ```typescript\n * import { wrapModule } from 'autotel-cloudflare'\n *\n * const handler = {\n * async fetch(req, env, ctx) {\n * return new Response('Hello')\n * }\n * }\n *\n * export default wrapModule(\n * { service: { name: 'my-worker' } },\n * handler\n * )\n * ```\n */\n\nimport { instrument } from './instrument';\nimport type { ConfigurationOption } from 'autotel-edge';\n\n/**\n * Wrap a Cloudflare Workers module-style handler\n * Alternative API style inspired by workers-honeycomb-logger\n *\n * @param config Configuration (can be static object or function)\n * @param handler The worker handler to wrap\n * @returns Instrumented handler\n */\nexport function wrapModule<E, Q = any, C = any>(\n config: ConfigurationOption,\n handler: ExportedHandler<E, Q, C>,\n): ExportedHandler<E, Q, C> {\n return instrument(handler, config);\n}\n","/**\n * Durable Object wrapper\n *\n * @example\n * ```typescript\n * import { wrapDurableObject } from 'autotel-cloudflare'\n *\n * class Counter implements DurableObject {\n * async fetch(request: Request) {\n * return new Response('count')\n * }\n * }\n *\n * export default wrapDurableObject({ service: { name: 'counter-do' } }, Counter)\n * ```\n */\n\nimport { instrumentDO } from '../handlers/durable-objects';\nimport type { ConfigurationOption } from 'autotel-edge';\n\n/**\n * Wrap a Durable Object class with instrumentation\n * Alternative API style inspired by workers-honeycomb-logger\n *\n * @param config Configuration (can be static object or function)\n * @param doClass The Durable Object class to wrap\n * @returns Instrumented Durable Object class\n */\nexport function wrapDurableObject<T extends DurableObject>(\n config: ConfigurationOption,\n doClass: new (state: DurableObjectState, env: any) => T,\n): new (state: DurableObjectState, env: any) => T {\n return instrumentDO(doClass, config);\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "autotel-cloudflare",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.16.0",
|
|
4
4
|
"description": "The #1 OpenTelemetry package for Cloudflare Workers - complete bindings coverage, native CF OTel integration, advanced sampling",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -69,7 +69,7 @@
|
|
|
69
69
|
"dependencies": {
|
|
70
70
|
"@opentelemetry/api": "^1.9.0",
|
|
71
71
|
"@opentelemetry/resources": "^2.5.1",
|
|
72
|
-
"autotel-edge": "3.
|
|
72
|
+
"autotel-edge": "3.14.0"
|
|
73
73
|
},
|
|
74
74
|
"peerDependencies": {
|
|
75
75
|
"@cloudflare/workers-types": "^4.20260302.0"
|
|
@@ -77,7 +77,7 @@
|
|
|
77
77
|
"devDependencies": {
|
|
78
78
|
"@cloudflare/workers-types": "^4.20260302.0",
|
|
79
79
|
"@opentelemetry/context-async-hooks": "^2.5.1",
|
|
80
|
-
"@types/node": "^25.3.
|
|
80
|
+
"@types/node": "^25.3.3",
|
|
81
81
|
"rimraf": "^6.1.3",
|
|
82
82
|
"tsup": "^8.5.1",
|
|
83
83
|
"typescript": "^5.9.3",
|
package/src/bindings/ai.test.ts
CHANGED
|
@@ -136,6 +136,20 @@ describe('AI Binding Instrumentation', () => {
|
|
|
136
136
|
expect(mockSpan.end).toHaveBeenCalled();
|
|
137
137
|
});
|
|
138
138
|
|
|
139
|
+
it('should invoke run() with original object as this, not the proxy', async () => {
|
|
140
|
+
let receivedThis: any;
|
|
141
|
+
const mockAIObj = {
|
|
142
|
+
run: vi.fn(async function(this: any) {
|
|
143
|
+
// eslint-disable-next-line unicorn/no-this-assignment, @typescript-eslint/no-this-alias
|
|
144
|
+
receivedThis = this;
|
|
145
|
+
return { response: 'Hello' };
|
|
146
|
+
}),
|
|
147
|
+
};
|
|
148
|
+
const instrumented = instrumentAI(mockAIObj as any, 'test');
|
|
149
|
+
await instrumented.run('@cf/meta/llama-2-7b-chat-int8', { prompt: 'Hello' });
|
|
150
|
+
expect(receivedThis).toBe(mockAIObj);
|
|
151
|
+
});
|
|
152
|
+
|
|
139
153
|
it('should pass through non-instrumented methods unchanged', () => {
|
|
140
154
|
const instrumented = instrumentAI(mockAI);
|
|
141
155
|
|
package/src/bindings/ai.ts
CHANGED
|
@@ -22,7 +22,7 @@ export function instrumentAI<T extends Ai>(ai: T, bindingName?: string): T {
|
|
|
22
22
|
|
|
23
23
|
if (prop === 'run' && typeof value === 'function') {
|
|
24
24
|
return new Proxy(value, {
|
|
25
|
-
apply: (fnTarget,
|
|
25
|
+
apply: (fnTarget, _thisArg, args) => {
|
|
26
26
|
const [model] = args as [string, unknown, unknown];
|
|
27
27
|
const tracer = trace.getTracer('autotel-edge') as WorkerTracer;
|
|
28
28
|
|
|
@@ -38,7 +38,7 @@ export function instrumentAI<T extends Ai>(ai: T, bindingName?: string): T {
|
|
|
38
38
|
},
|
|
39
39
|
async (span) => {
|
|
40
40
|
try {
|
|
41
|
-
const result = await Reflect.apply(fnTarget,
|
|
41
|
+
const result = await Reflect.apply(fnTarget, target, args);
|
|
42
42
|
if (result?.usage?.prompt_tokens !== undefined) {
|
|
43
43
|
setAttr(span, 'gen_ai.usage.input_tokens', Number(result.usage.prompt_tokens));
|
|
44
44
|
}
|