autotel-cloudflare 5.0.2 → 5.0.4

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/dist/actors.d.ts CHANGED
@@ -208,5 +208,4 @@ declare function instrumentActorAlarms(alarms: unknown, actorInstance: ActorLike
208
208
  */
209
209
  declare function instrumentActorSockets(sockets: unknown, actorInstance: ActorLike, actorClass: object): unknown;
210
210
  //#endregion
211
- export { type ActorConfig, type ActorInstrumentationOptions, type ActorLifecycle, instrumentActor, instrumentActorAlarms, instrumentActorSockets, instrumentActorStorage, tracedHandler, wrapHandler };
212
- //# sourceMappingURL=actors.d.ts.map
211
+ export { type ActorConfig, type ActorInstrumentationOptions, type ActorLifecycle, instrumentActor, instrumentActorAlarms, instrumentActorSockets, instrumentActorStorage, tracedHandler, wrapHandler };
package/dist/actors.js CHANGED
@@ -1031,5 +1031,4 @@ function wrapHandler(originalHandler, config) {
1031
1031
  }
1032
1032
 
1033
1033
  //#endregion
1034
- export { instrumentActor, instrumentActorAlarms, instrumentActorSockets, instrumentActorStorage, tracedHandler, wrapHandler };
1035
- //# sourceMappingURL=actors.js.map
1034
+ export { instrumentActor, instrumentActorAlarms, instrumentActorSockets, instrumentActorStorage, tracedHandler, wrapHandler };
package/dist/agents.d.ts CHANGED
@@ -691,5 +691,4 @@ declare class OtelObservability implements Observability {
691
691
  declare function createOtelObservability(config: OtelObservabilityConfig): OtelObservability;
692
692
  declare function createOtelObservabilityFromEnv(env: Record<string, unknown>, options?: AgentInstrumentationOptions): OtelObservability;
693
693
  //#endregion
694
- export { type AgentInstrumentationOptions, type AgentObservabilityEvent, type AgentSpanAttributes, type BaseEvent, type ChannelEventMap, type MCPObservabilityEvent, type Observability, type ObservabilityEvent, OtelObservability, type OtelObservabilityConfig, channels, createOtelObservability, createOtelObservabilityFromEnv, genericObservability, subscribe };
695
- //# sourceMappingURL=agents.d.ts.map
694
+ export { type AgentInstrumentationOptions, type AgentObservabilityEvent, type AgentSpanAttributes, type BaseEvent, type ChannelEventMap, type MCPObservabilityEvent, type Observability, type ObservabilityEvent, OtelObservability, type OtelObservabilityConfig, channels, createOtelObservability, createOtelObservabilityFromEnv, genericObservability, subscribe };
package/dist/agents.js CHANGED
@@ -382,5 +382,4 @@ function subscribe(channelKey, callback) {
382
382
  }
383
383
 
384
384
  //#endregion
385
- export { OtelObservability, channels, createOtelObservability, createOtelObservabilityFromEnv, genericObservability, subscribe };
386
- //# sourceMappingURL=agents.js.map
385
+ export { OtelObservability, channels, createOtelObservability, createOtelObservabilityFromEnv, genericObservability, subscribe };
@@ -972,5 +972,4 @@ function instrumentBrowserRendering(browser, bindingName) {
972
972
  }
973
973
 
974
974
  //#endregion
975
- export { instrumentKV as a, instrumentImages as c, instrumentHyperdrive as d, instrumentVectorize as f, instrumentD1 as i, instrumentAnalyticsEngine as l, instrumentRateLimiter as n, instrumentR2 as o, instrumentAI as p, instrumentBindings as r, instrumentServiceBinding as s, instrumentBrowserRendering as t, instrumentQueueProducer as u };
976
- //# sourceMappingURL=bindings-DznsCwCn.js.map
975
+ export { instrumentKV as a, instrumentImages as c, instrumentHyperdrive as d, instrumentVectorize as f, instrumentD1 as i, instrumentAnalyticsEngine as l, instrumentRateLimiter as n, instrumentR2 as o, instrumentAI as p, instrumentBindings as r, instrumentServiceBinding as s, instrumentBrowserRendering as t, instrumentQueueProducer as u };
@@ -145,5 +145,4 @@ interface BrowserRenderingLike {
145
145
  */
146
146
  declare function instrumentBrowserRendering<T extends BrowserRenderingLike>(browser: T, bindingName?: string): T;
147
147
  //#endregion
148
- export { instrumentQueueProducer as a, instrumentAI as c, instrumentKV as d, instrumentR2 as f, instrumentAnalyticsEngine as i, instrumentBindings as l, instrumentRateLimiter as n, instrumentHyperdrive as o, instrumentServiceBinding as p, instrumentImages as r, instrumentVectorize as s, instrumentBrowserRendering as t, instrumentD1 as u };
149
- //# sourceMappingURL=bindings-xEZcXo5r.d.ts.map
148
+ export { instrumentQueueProducer as a, instrumentAI as c, instrumentKV as d, instrumentR2 as f, instrumentAnalyticsEngine as i, instrumentBindings as l, instrumentRateLimiter as n, instrumentHyperdrive as o, instrumentServiceBinding as p, instrumentImages as r, instrumentVectorize as s, instrumentBrowserRendering as t, instrumentD1 as u };
@@ -59,5 +59,4 @@ function wrap(item, handler) {
59
59
  }
60
60
 
61
61
  //#endregion
62
- export { wrap as a, unwrap as i, proxyExecutionContext as n, setAttr as r, isWrapped as t };
63
- //# sourceMappingURL=common-DiWH6nmG.js.map
62
+ export { wrap as a, unwrap as i, proxyExecutionContext as n, setAttr as r, isWrapped as t };
@@ -61,5 +61,4 @@ function getActorLogger(ctx, options) {
61
61
  }
62
62
 
63
63
  //#endregion
64
- export { getWorkflowLogger as a, getRequestLogger as i, getActorLogger as n, getQueueLogger as r, createWorkersLogger as t };
65
- //# sourceMappingURL=execution-logger-BxmgP8jF.js.map
64
+ export { getWorkflowLogger as a, getRequestLogger as i, getActorLogger as n, getQueueLogger as r, createWorkersLogger as t };
@@ -16,5 +16,4 @@ declare function getQueueLogger(ctx?: TraceContext, options?: ExecutionLoggerOpt
16
16
  declare function getWorkflowLogger(ctx?: TraceContext, options?: ExecutionLoggerOptions): ExecutionLogger;
17
17
  declare function getActorLogger(ctx?: TraceContext, options?: ExecutionLoggerOptions): ExecutionLogger;
18
18
  //#endregion
19
- export { createWorkersLogger as a, getRequestLogger as c, WorkersLoggerOptions as i, getWorkflowLogger as l, ExecutionLogger as n, getActorLogger as o, ExecutionLoggerOptions as r, getQueueLogger as s, ExecutionLogSnapshot as t };
20
- //# sourceMappingURL=execution-logger-CCn9HGYC.d.ts.map
19
+ export { createWorkersLogger as a, getRequestLogger as c, WorkersLoggerOptions as i, getWorkflowLogger as l, ExecutionLogger as n, getActorLogger as o, ExecutionLoggerOptions as r, getQueueLogger as s, ExecutionLogSnapshot as t };
@@ -91,5 +91,4 @@ declare function instrumentDO<C extends new (...args: any[]) => any>(doClass: C,
91
91
  */
92
92
  declare function instrumentWorkflow<C extends new (...args: any[]) => any>(workflowClass: C, workflowName: string, config: ConfigurationOption): C;
93
93
  //#endregion
94
- export { instrumentDO as n, instrumentWorkflow as t };
95
- //# sourceMappingURL=handlers-BRfAgfP7.d.ts.map
94
+ export { instrumentDO as n, instrumentWorkflow as t };
@@ -376,5 +376,4 @@ function instrumentWorkflow(workflowClass, workflowName, config) {
376
376
  }
377
377
 
378
378
  //#endregion
379
- export { instrumentDO as n, instrumentWorkflow as t };
380
- //# sourceMappingURL=handlers-BePc7OJU.js.map
379
+ export { instrumentDO as n, instrumentWorkflow as t };
package/dist/index.d.ts CHANGED
@@ -102,5 +102,4 @@ declare function instrumentGlobalFetch(): void;
102
102
  */
103
103
  declare function instrumentGlobalCache(): void;
104
104
  //#endregion
105
- export { type DefineWorkerFetchOptions, type ExecutionLogSnapshot, type ExecutionLogger, type ExecutionLoggerOptions, type WorkerFetchHandler, type WorkersLoggerOptions, createWorkersLogger, defineWorkerFetch, getActorLogger, getNativeTracerFromCtx, getQueueLogger, getRequestLogger, getWorkflowLogger, instrument, instrumentAI, instrumentAnalyticsEngine, instrumentBindings, instrumentBrowserRendering, instrumentD1, instrumentDO, instrumentGlobalCache, instrumentGlobalFetch, instrumentHyperdrive, instrumentImages, instrumentKV, instrumentQueueProducer, instrumentR2, instrumentRateLimiter, instrumentServiceBinding, instrumentVectorize, instrumentWorkflow, isNativeTracingAvailable, wrapDurableObject, wrapModule };
106
- //# sourceMappingURL=index.d.ts.map
105
+ export { type DefineWorkerFetchOptions, type ExecutionLogSnapshot, type ExecutionLogger, type ExecutionLoggerOptions, type WorkerFetchHandler, type WorkersLoggerOptions, createWorkersLogger, defineWorkerFetch, getActorLogger, getNativeTracerFromCtx, getQueueLogger, getRequestLogger, getWorkflowLogger, instrument, instrumentAI, instrumentAnalyticsEngine, instrumentBindings, instrumentBrowserRendering, instrumentD1, instrumentDO, instrumentGlobalCache, instrumentGlobalFetch, instrumentHyperdrive, instrumentImages, instrumentKV, instrumentQueueProducer, instrumentR2, instrumentRateLimiter, instrumentServiceBinding, instrumentVectorize, instrumentWorkflow, isNativeTracingAvailable, wrapDurableObject, wrapModule };
package/dist/index.js CHANGED
@@ -736,5 +736,4 @@ function defineWorkerFetch(config, handler, loggerOptions = {}) {
736
736
  }
737
737
 
738
738
  //#endregion
739
- export { createWorkersLogger, defineWorkerFetch, getActorLogger, getNativeTracerFromCtx, getQueueLogger, getRequestLogger, getWorkflowLogger, instrument, instrumentAI, instrumentAnalyticsEngine, instrumentBindings, instrumentBrowserRendering, instrumentD1, instrumentDO, instrumentGlobalCache, instrumentGlobalFetch, instrumentHyperdrive, instrumentImages, instrumentKV, instrumentQueueProducer, instrumentR2, instrumentRateLimiter, instrumentServiceBinding, instrumentVectorize, instrumentWorkflow, isNativeTracingAvailable, wrapDurableObject, wrapModule };
740
- //# sourceMappingURL=index.js.map
739
+ export { createWorkersLogger, defineWorkerFetch, getActorLogger, getNativeTracerFromCtx, getQueueLogger, getRequestLogger, getWorkflowLogger, instrument, instrumentAI, instrumentAnalyticsEngine, instrumentBindings, instrumentBrowserRendering, instrumentD1, instrumentDO, instrumentGlobalCache, instrumentGlobalFetch, instrumentHyperdrive, instrumentImages, instrumentKV, instrumentQueueProducer, instrumentR2, instrumentRateLimiter, instrumentServiceBinding, instrumentVectorize, instrumentWorkflow, isNativeTracingAvailable, wrapDurableObject, wrapModule };
@@ -29,5 +29,4 @@ function getNativeTracerFromCtx(ctx, correlationId) {
29
29
  }
30
30
 
31
31
  //#endregion
32
- export { isNativeTracingAvailable as n, getNativeTracerFromCtx as t };
33
- //# sourceMappingURL=native-tracing-D0EyAtsF.js.map
32
+ export { isNativeTracingAvailable as n, getNativeTracerFromCtx as t };
@@ -16,5 +16,4 @@ declare function isNativeTracingAvailable(ctx: unknown): boolean;
16
16
  */
17
17
  declare function getNativeTracerFromCtx(ctx: unknown, correlationId?: string): NativeTracer | null;
18
18
  //#endregion
19
- export { isNativeTracingAvailable as n, getNativeTracerFromCtx as t };
20
- //# sourceMappingURL=native-tracing-DFaGAoR7.d.ts.map
19
+ export { isNativeTracingAvailable as n, getNativeTracerFromCtx as t };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "autotel-cloudflare",
3
- "version": "5.0.2",
3
+ "version": "5.0.4",
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",
@@ -75,12 +75,12 @@
75
75
  "license": "Apache-2.0",
76
76
  "dependencies": {
77
77
  "@opentelemetry/api": "^1.9.1",
78
- "@opentelemetry/resources": "^2.9.0"
78
+ "@opentelemetry/resources": "^2.10.0"
79
79
  },
80
80
  "peerDependencies": {
81
- "@cloudflare/workers-types": "^5.20260721.1",
82
- "autotel-edge": "4.0.1",
83
- "autotel-genai": "0.3.10"
81
+ "@cloudflare/workers-types": "^5.20260728.1",
82
+ "autotel-edge": "4.0.2",
83
+ "autotel-genai": "0.3.12"
84
84
  },
85
85
  "peerDependenciesMeta": {
86
86
  "autotel-edge": {
@@ -91,16 +91,16 @@
91
91
  }
92
92
  },
93
93
  "devDependencies": {
94
- "@cloudflare/workers-types": "^5.20260721.1",
95
- "@opentelemetry/context-async-hooks": "^2.9.0",
96
- "@types/node": "^26.1.1",
94
+ "@cloudflare/workers-types": "^5.20260728.1",
95
+ "@opentelemetry/context-async-hooks": "^2.10.0",
96
+ "@types/node": "^26.1.2",
97
97
  "rimraf": "^6.1.3",
98
- "tsdown": "^0.22.12",
98
+ "tsdown": "^0.22.14",
99
99
  "typescript": "^6.0.3",
100
100
  "vitest": "^4.1.10",
101
101
  "vitest-mock-extended": "^5.1.0",
102
- "autotel-edge": "4.0.1",
103
- "autotel-genai": "0.3.10"
102
+ "autotel-edge": "4.0.2",
103
+ "autotel-genai": "0.3.12"
104
104
  },
105
105
  "repository": {
106
106
  "type": "git",
@@ -1 +0,0 @@
1
- {"version":3,"file":"actors.d.ts","names":[],"sources":["../src/actors/types.ts","../src/actors/instrument-actor.ts","../src/actors/traced-handler.ts","../src/actors/storage.ts","../src/actors/alarms.ts","../src/actors/sockets.ts"],"mappings":";;;;;UASiB;;;;;EAKf;;;;;EAMA;;;;;EAMA;;;;;EAMA;;;;EAKA,qBAAqB,mBAAmB;;;;;;KAO9B,cAAc;;;;EAIxB,SAAS;;;;;KAMC;;;;;UA2BK;EACf;EACA;EACA;EACA;EACA;EACA,OAAO,SAAS,UAAU,QAAQ;EAClC,OAAO,sBAAsB;;;;;KAMnB,iBAAiB,UAAU,YAAY,kBACjD,OAAO,oBACP,iBACG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBC6fW,gBAAgB,UAAU,kBACxC,YAAY,GACZ,QAAQ,gBAAgB,cAAc,sBAAsB,eAC3D;;;;;;UCnkBO,cAAc;EACtB,MAAM,SAAS,SAAS,KAAK,GAAG,KAAK,mBAAmB,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAoClD,cAAc,GAAG,UAAU,WACzC,YAAY,iBAAiB;EAC3B,iBAAiB,SAAS,UAAU;EACpC,eAAe,SAAS;IACtB,eAAe;;GAGnB,QAAQ,gBAAgB,KAAK,GAAG,sBAAsB,eACrD,cAAc;;;;;;;;;;;;;;;;;;;iBAyKD,YAAY,GAC1B,iBAAiB,cAAc,IAC/B,QAAQ,gBAAgB,KAAK,GAAG,sBAAsB,eACrD,cAAc;;;;;;;;;;iBC9ND,uBACd,kBACA,eAAe,WACf;;;;;;;;;;;;iBCDc,sBACd,iBACA,eAAe,WACf;;;;;;;;;;;iBCJc,uBACd,kBACA,eAAe,WACf"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"actors.js","names":["getTracer","getTracer","getTracer","getTracer","api_context","context","api_context"],"sources":["../src/actors/storage.ts","../src/actors/alarms.ts","../src/actors/sockets.ts","../src/actors/instrument-actor.ts","../src/actors/traced-handler.ts"],"sourcesContent":["/**\n * Actor storage instrumentation\n *\n * Traces operations on actor.storage including SQL queries\n */\n\nimport { trace, SpanStatusCode, SpanKind } from '@opentelemetry/api';\nimport type { WorkerTracer } from 'autotel-edge';\nimport { wrap } from '../bindings/common';\nimport type { ActorLike } from './types';\n\n/**\n * Get the tracer instance\n */\nfunction getTracer(): WorkerTracer {\n return trace.getTracer('autotel-cloudflare-actors') as WorkerTracer;\n}\n\n/**\n * Instrument Actor storage for tracing\n *\n * Captures:\n * - SQL query operations\n * - Key-value operations (if available)\n */\nexport function instrumentActorStorage(\n storage: unknown,\n actorInstance: ActorLike,\n actorClass: object,\n): unknown {\n if (!storage || typeof storage !== 'object') {\n return storage;\n }\n\n const actorClassName = (actorClass as { name?: string }).name || 'Actor';\n const actorName = actorInstance.name || actorClassName;\n\n const storageHandler: ProxyHandler<object> = {\n get(target, prop) {\n const value = Reflect.get(target, prop);\n\n // Instrument SQL query method if it exists\n // The Actors Storage class has an exec method for SQL\n if (prop === 'exec' && typeof value === 'function') {\n return function instrumentedExec(\n this: unknown,\n query: string,\n ...params: unknown[]\n ): unknown {\n const tracer = getTracer();\n const spanName = `Actor ${actorName}: storage.exec`;\n\n return tracer.startActiveSpan(\n spanName,\n {\n kind: SpanKind.CLIENT,\n attributes: {\n 'actor.name': actorName,\n 'actor.class': actorClassName,\n 'db.system': 'sqlite',\n 'db.operation': 'exec',\n 'db.statement': query,\n 'db.statement.params_count': params.length,\n },\n },\n (span) => {\n try {\n const result = value.call(target, query, ...params);\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:\n error instanceof Error ? error.message : String(error),\n });\n throw error;\n } finally {\n span.end();\n }\n },\n );\n };\n }\n\n // Instrument query method (alternative name for exec)\n if (prop === 'query' && typeof value === 'function') {\n return function instrumentedQuery(\n this: unknown,\n query: string,\n ...params: unknown[]\n ): unknown {\n const tracer = getTracer();\n const spanName = `Actor ${actorName}: storage.query`;\n\n return tracer.startActiveSpan(\n spanName,\n {\n kind: SpanKind.CLIENT,\n attributes: {\n 'actor.name': actorName,\n 'actor.class': actorClassName,\n 'db.system': 'sqlite',\n 'db.operation': 'query',\n 'db.statement': query,\n 'db.statement.params_count': params.length,\n },\n },\n (span) => {\n try {\n const result = value.call(target, query, ...params);\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:\n error instanceof Error ? error.message : String(error),\n });\n throw error;\n } finally {\n span.end();\n }\n },\n );\n };\n }\n\n // Instrument get method\n if (prop === 'get' && typeof value === 'function') {\n return async function instrumentedGet(\n this: unknown,\n key: string,\n ): Promise<unknown> {\n const tracer = getTracer();\n const spanName = `Actor ${actorName}: storage.get`;\n\n return tracer.startActiveSpan(\n spanName,\n {\n kind: SpanKind.CLIENT,\n attributes: {\n 'actor.name': actorName,\n 'actor.class': actorClassName,\n 'db.system': 'durable_object_storage',\n 'db.operation': 'get',\n 'db.key': key,\n },\n },\n async (span) => {\n try {\n const result = await value.call(target, key);\n span.setAttributes({\n 'db.result.found': result !== null && result !== undefined,\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:\n error instanceof Error ? error.message : String(error),\n });\n throw error;\n } finally {\n span.end();\n }\n },\n );\n };\n }\n\n // Instrument put method\n if (prop === 'put' && typeof value === 'function') {\n return async function instrumentedPut(\n this: unknown,\n key: string,\n val: unknown,\n ): Promise<void> {\n const tracer = getTracer();\n const spanName = `Actor ${actorName}: storage.put`;\n\n return tracer.startActiveSpan(\n spanName,\n {\n kind: SpanKind.CLIENT,\n attributes: {\n 'actor.name': actorName,\n 'actor.class': actorClassName,\n 'db.system': 'durable_object_storage',\n 'db.operation': 'put',\n 'db.key': key,\n 'db.value_type': typeof val,\n },\n },\n async (span) => {\n try {\n await value.call(target, key, val);\n span.setStatus({ code: SpanStatusCode.OK });\n } catch (error) {\n span.recordException(error as Error);\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message:\n error instanceof Error ? error.message : String(error),\n });\n throw error;\n } finally {\n span.end();\n }\n },\n );\n };\n }\n\n // Instrument delete method\n if (prop === 'delete' && typeof value === 'function') {\n return async function instrumentedDelete(\n this: unknown,\n key: string,\n ): Promise<boolean> {\n const tracer = getTracer();\n const spanName = `Actor ${actorName}: storage.delete`;\n\n return tracer.startActiveSpan(\n spanName,\n {\n kind: SpanKind.CLIENT,\n attributes: {\n 'actor.name': actorName,\n 'actor.class': actorClassName,\n 'db.system': 'durable_object_storage',\n 'db.operation': 'delete',\n 'db.key': key,\n },\n },\n async (span) => {\n try {\n const result = await value.call(target, key);\n span.setAttributes({\n 'db.result.deleted': result,\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:\n error instanceof Error ? error.message : String(error),\n });\n throw error;\n } finally {\n span.end();\n }\n },\n );\n };\n }\n\n // Bind other methods to the target\n if (typeof value === 'function') {\n return value.bind(target);\n }\n\n return value;\n },\n };\n\n return wrap(storage, storageHandler);\n}\n","/**\n * Actor alarms instrumentation\n *\n * Traces operations on actor.alarms\n */\n\nimport { trace, SpanStatusCode, SpanKind } from '@opentelemetry/api';\nimport type { WorkerTracer } from 'autotel-edge';\nimport { wrap } from '../bindings/common';\nimport type { ActorLike } from './types';\n\n/**\n * Get the tracer instance\n */\nfunction getTracer(): WorkerTracer {\n return trace.getTracer('autotel-cloudflare-actors') as WorkerTracer;\n}\n\n/**\n * Instrument Actor alarms for tracing\n *\n * Captures:\n * - set: Schedule a single alarm\n * - setMultiple: Schedule multiple alarms\n * - cancel: Cancel an alarm\n * - cancelAll: Cancel all alarms\n */\nexport function instrumentActorAlarms(\n alarms: unknown,\n actorInstance: ActorLike,\n actorClass: object,\n): unknown {\n if (!alarms || typeof alarms !== 'object') {\n return alarms;\n }\n\n const actorClassName = (actorClass as { name?: string }).name || 'Actor';\n const actorName = actorInstance.name || actorClassName;\n\n const alarmsHandler: ProxyHandler<object> = {\n get(target, prop) {\n const value = Reflect.get(target, prop);\n\n // Instrument set method\n if (prop === 'set' && typeof value === 'function') {\n return async function instrumentedSet(\n this: unknown,\n ...args: unknown[]\n ): Promise<unknown> {\n const tracer = getTracer();\n const spanName = `Actor ${actorName}: alarms.set`;\n\n // Try to extract timing info from args\n const alarmAttributes: Record<string, string | number | boolean> = {\n 'actor.name': actorName,\n 'actor.class': actorClassName,\n 'alarm.operation': 'set',\n };\n\n // First arg might be timestamp, delay, or options\n if (args.length > 0) {\n const firstArg = args[0];\n if (typeof firstArg === 'number') {\n alarmAttributes['alarm.delay_ms'] = firstArg;\n } else if (firstArg instanceof Date) {\n alarmAttributes['alarm.scheduled_time'] = firstArg.toISOString();\n } else if (typeof firstArg === 'string') {\n // Might be a cron expression\n alarmAttributes['alarm.cron'] = firstArg;\n }\n }\n\n return tracer.startActiveSpan(\n spanName,\n {\n kind: SpanKind.CLIENT,\n attributes: alarmAttributes,\n },\n async (span) => {\n try {\n const result = await value.apply(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:\n error instanceof Error ? error.message : String(error),\n });\n throw error;\n } finally {\n span.end();\n }\n },\n );\n };\n }\n\n // Instrument setMultiple method\n if (prop === 'setMultiple' && typeof value === 'function') {\n return async function instrumentedSetMultiple(\n this: unknown,\n alarmDefs: unknown[],\n ): Promise<unknown> {\n const tracer = getTracer();\n const spanName = `Actor ${actorName}: alarms.setMultiple`;\n\n return tracer.startActiveSpan(\n spanName,\n {\n kind: SpanKind.CLIENT,\n attributes: {\n 'actor.name': actorName,\n 'actor.class': actorClassName,\n 'alarm.operation': 'setMultiple',\n 'alarm.count': Array.isArray(alarmDefs) ? alarmDefs.length : 0,\n },\n },\n async (span) => {\n try {\n const result = await value.call(target, alarmDefs);\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:\n error instanceof Error ? error.message : String(error),\n });\n throw error;\n } finally {\n span.end();\n }\n },\n );\n };\n }\n\n // Instrument cancel method\n if (prop === 'cancel' && typeof value === 'function') {\n return async function instrumentedCancel(\n this: unknown,\n alarmId: string,\n ): Promise<unknown> {\n const tracer = getTracer();\n const spanName = `Actor ${actorName}: alarms.cancel`;\n\n return tracer.startActiveSpan(\n spanName,\n {\n kind: SpanKind.CLIENT,\n attributes: {\n 'actor.name': actorName,\n 'actor.class': actorClassName,\n 'alarm.operation': 'cancel',\n 'alarm.id': alarmId,\n },\n },\n async (span) => {\n try {\n const result = await value.call(target, alarmId);\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:\n error instanceof Error ? error.message : String(error),\n });\n throw error;\n } finally {\n span.end();\n }\n },\n );\n };\n }\n\n // Instrument cancelAll method\n if (prop === 'cancelAll' && typeof value === 'function') {\n return async function instrumentedCancelAll(\n this: unknown,\n ): Promise<unknown> {\n const tracer = getTracer();\n const spanName = `Actor ${actorName}: alarms.cancelAll`;\n\n return tracer.startActiveSpan(\n spanName,\n {\n kind: SpanKind.CLIENT,\n attributes: {\n 'actor.name': actorName,\n 'actor.class': actorClassName,\n 'alarm.operation': 'cancelAll',\n },\n },\n async (span) => {\n try {\n const result = await value.call(target);\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:\n error instanceof Error ? error.message : String(error),\n });\n throw error;\n } finally {\n span.end();\n }\n },\n );\n };\n }\n\n // Bind other methods to the target\n if (typeof value === 'function') {\n return value.bind(target);\n }\n\n return value;\n },\n };\n\n return wrap(alarms, alarmsHandler);\n}\n","/**\n * Actor sockets instrumentation\n *\n * Traces operations on actor.sockets\n */\n\nimport { trace, SpanStatusCode, SpanKind } from '@opentelemetry/api';\nimport type { WorkerTracer } from 'autotel-edge';\nimport { wrap } from '../bindings/common';\nimport type { ActorLike } from './types';\n\n/**\n * Get the tracer instance\n */\nfunction getTracer(): WorkerTracer {\n return trace.getTracer('autotel-cloudflare-actors') as WorkerTracer;\n}\n\n/**\n * Instrument Actor sockets for tracing\n *\n * Captures:\n * - acceptWebSocket: Accept an incoming WebSocket connection\n * - broadcast: Send message to all connected sockets\n * - send: Send message to a specific socket\n */\nexport function instrumentActorSockets(\n sockets: unknown,\n actorInstance: ActorLike,\n actorClass: object,\n): unknown {\n if (!sockets || typeof sockets !== 'object') {\n return sockets;\n }\n\n const actorClassName = (actorClass as { name?: string }).name || 'Actor';\n const actorName = actorInstance.name || actorClassName;\n\n const socketsHandler: ProxyHandler<object> = {\n get(target, prop) {\n const value = Reflect.get(target, prop);\n\n // Instrument acceptWebSocket method\n if (prop === 'acceptWebSocket' && typeof value === 'function') {\n return function instrumentedAcceptWebSocket(\n this: unknown,\n request: Request,\n ): unknown {\n const tracer = getTracer();\n const spanName = `Actor ${actorName}: sockets.acceptWebSocket`;\n\n return tracer.startActiveSpan(\n spanName,\n {\n kind: SpanKind.SERVER,\n attributes: {\n 'actor.name': actorName,\n 'actor.class': actorClassName,\n 'websocket.operation': 'accept',\n 'url.full': request.url,\n },\n },\n (span) => {\n try {\n const result = value.call(target, request);\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:\n error instanceof Error ? error.message : String(error),\n });\n throw error;\n } finally {\n span.end();\n }\n },\n );\n };\n }\n\n // Instrument broadcast method\n if (prop === 'broadcast' && typeof value === 'function') {\n return function instrumentedBroadcast(\n this: unknown,\n message: unknown,\n ): void {\n const tracer = getTracer();\n const spanName = `Actor ${actorName}: sockets.broadcast`;\n\n tracer.startActiveSpan(\n spanName,\n {\n kind: SpanKind.PRODUCER,\n attributes: {\n 'actor.name': actorName,\n 'actor.class': actorClassName,\n 'websocket.operation': 'broadcast',\n 'websocket.message.type': typeof message,\n 'websocket.message.size':\n typeof message === 'string'\n ? message.length\n : message instanceof ArrayBuffer\n ? message.byteLength\n : 0,\n },\n },\n (span) => {\n try {\n value.call(target, message);\n span.setStatus({ code: SpanStatusCode.OK });\n } catch (error) {\n span.recordException(error as Error);\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message:\n error instanceof Error ? error.message : String(error),\n });\n throw error;\n } finally {\n span.end();\n }\n },\n );\n };\n }\n\n // Instrument send method\n if (prop === 'send' && typeof value === 'function') {\n return function instrumentedSend(\n this: unknown,\n ws: WebSocket,\n message: unknown,\n ): void {\n const tracer = getTracer();\n const spanName = `Actor ${actorName}: sockets.send`;\n\n tracer.startActiveSpan(\n spanName,\n {\n kind: SpanKind.PRODUCER,\n attributes: {\n 'actor.name': actorName,\n 'actor.class': actorClassName,\n 'websocket.operation': 'send',\n 'websocket.message.type': typeof message,\n 'websocket.message.size':\n typeof message === 'string'\n ? message.length\n : message instanceof ArrayBuffer\n ? message.byteLength\n : 0,\n },\n },\n (span) => {\n try {\n value.call(target, ws, message);\n span.setStatus({ code: SpanStatusCode.OK });\n } catch (error) {\n span.recordException(error as Error);\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message:\n error instanceof Error ? error.message : String(error),\n });\n throw error;\n } finally {\n span.end();\n }\n },\n );\n };\n }\n\n // Instrument getConnections method (if exists)\n if (prop === 'getConnections' && typeof value === 'function') {\n return function instrumentedGetConnections(this: unknown): unknown {\n const tracer = getTracer();\n const spanName = `Actor ${actorName}: sockets.getConnections`;\n\n return tracer.startActiveSpan(\n spanName,\n {\n kind: SpanKind.CLIENT,\n attributes: {\n 'actor.name': actorName,\n 'actor.class': actorClassName,\n 'websocket.operation': 'getConnections',\n },\n },\n (span) => {\n try {\n const result = value.call(target);\n // Try to capture connection count if result is array-like\n if (Array.isArray(result)) {\n span.setAttribute(\n 'websocket.connections.count',\n result.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:\n error instanceof Error ? error.message : String(error),\n });\n throw error;\n } finally {\n span.end();\n }\n },\n );\n };\n }\n\n // Bind other methods to the target\n if (typeof value === 'function') {\n return value.bind(target);\n }\n\n return value;\n },\n };\n\n return wrap(sockets, socketsHandler);\n}\n","/**\n * Actor class instrumentation for @cloudflare/actors\n *\n * Wraps Actor lifecycle methods with OpenTelemetry tracing:\n * - onInit: Traced as 'actor.lifecycle': 'init'\n * - onRequest: Traced with full HTTP semantics\n * - onAlarm: Traced as 'actor.lifecycle': 'alarm'\n * - onPersist: Traced as 'actor.lifecycle': 'persist'\n * - WebSocket methods: Traced with socket semantics\n */\n\nimport {\n trace,\n context as api_context,\n propagation,\n SpanStatusCode,\n SpanKind,\n} from '@opentelemetry/api';\nimport type { ConfigurationOption } from 'autotel-edge';\nimport { createInitialiser, setConfig, WorkerTracer } from 'autotel-edge';\nimport { wrap } from '../bindings/common';\nimport type {\n ActorConfig,\n ActorConstructor,\n ActorLike,\n ActorLifecycle,\n ActorInstrumentationOptions,\n} from './types';\nimport { instrumentActorStorage } from './storage';\nimport { instrumentActorAlarms } from './alarms';\nimport { instrumentActorSockets } from './sockets';\n\n/**\n * Track cold starts per Actor class\n */\nconst coldStarts = new WeakMap<object, boolean>();\n\nfunction isColdStart(actorClass: object): boolean {\n if (!coldStarts.has(actorClass)) {\n coldStarts.set(actorClass, true);\n return true;\n }\n return false;\n}\n\n/**\n * Get the tracer instance\n */\nfunction getTracer(): WorkerTracer {\n return trace.getTracer('autotel-cloudflare-actors') as WorkerTracer;\n}\n\n/**\n * Default span name formatter\n */\nfunction defaultSpanNameFormatter(\n actorName: string,\n actorClass: string,\n lifecycle: ActorLifecycle,\n): string {\n const displayName = actorName || actorClass;\n return `Actor ${displayName}: ${lifecycle}`;\n}\n\n/**\n * Create base Actor span attributes\n */\nfunction createActorAttributes(\n actorInstance: ActorLike,\n actorClass: object,\n lifecycle: ActorLifecycle,\n): Record<string, string | boolean | number> {\n return {\n 'actor.name': actorInstance.name || 'unknown',\n 'actor.class': (actorClass as { name?: string }).name || 'Actor',\n 'actor.lifecycle': lifecycle,\n 'actor.coldstart': isColdStart(actorClass),\n ...(actorInstance.identifier && {\n 'actor.identifier': actorInstance.identifier,\n }),\n };\n}\n\n/**\n * Instrument the onInit lifecycle method\n */\nfunction instrumentOnInit(\n originalMethod: () => Promise<void>,\n actorInstance: ActorLike,\n actorClass: object,\n options: ActorInstrumentationOptions,\n): () => Promise<void> {\n return async function instrumentedOnInit(): Promise<void> {\n const tracer = getTracer();\n const actorClassName = (actorClass as { name?: string }).name || 'Actor';\n const spanName = options.spanNameFormatter\n ? options.spanNameFormatter(actorInstance.name || '', 'init')\n : defaultSpanNameFormatter(\n actorInstance.name || '',\n actorClassName,\n 'init',\n );\n\n return tracer.startActiveSpan(\n spanName,\n {\n kind: SpanKind.INTERNAL,\n attributes: createActorAttributes(actorInstance, actorClass, 'init'),\n },\n async (span) => {\n try {\n await originalMethod.call(actorInstance);\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 * Instrument the onRequest lifecycle method\n */\nfunction instrumentOnRequest(\n originalMethod: (request: Request) => Promise<Response>,\n actorInstance: ActorLike,\n actorClass: object,\n options: ActorInstrumentationOptions,\n): (request: Request) => Promise<Response> {\n return async function instrumentedOnRequest(\n request: Request,\n ): Promise<Response> {\n const tracer = getTracer();\n\n // Extract parent context from request headers\n const parentContext = propagation.extract(\n api_context.active(),\n request.headers,\n );\n\n const url = new URL(request.url);\n const actorClassName = (actorClass as { name?: string }).name || 'Actor';\n const spanName = options.spanNameFormatter\n ? options.spanNameFormatter(actorInstance.name || '', 'request')\n : `Actor ${actorInstance.name || actorClassName}: ${request.method} ${url.pathname}`;\n\n return tracer.startActiveSpan(\n spanName,\n {\n kind: SpanKind.SERVER,\n attributes: {\n ...createActorAttributes(actorInstance, actorClass, 'request'),\n 'http.request.method': request.method,\n 'url.full': request.url,\n 'url.path': url.pathname,\n 'url.query': url.search,\n },\n },\n parentContext,\n async (span) => {\n try {\n const response = await originalMethod.call(actorInstance, request);\n\n span.setAttributes({\n 'http.response.status_code': response.status,\n });\n\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\n/**\n * Instrument the onAlarm lifecycle method\n */\nfunction instrumentOnAlarm(\n originalMethod: (alarmInfo?: unknown) => Promise<void>,\n actorInstance: ActorLike,\n actorClass: object,\n options: ActorInstrumentationOptions,\n): (alarmInfo?: unknown) => Promise<void> {\n return async function instrumentedOnAlarm(\n alarmInfo?: unknown,\n ): Promise<void> {\n const tracer = getTracer();\n const actorClassName = (actorClass as { name?: string }).name || 'Actor';\n const spanName = options.spanNameFormatter\n ? options.spanNameFormatter(actorInstance.name || '', 'alarm')\n : defaultSpanNameFormatter(\n actorInstance.name || '',\n actorClassName,\n 'alarm',\n );\n\n return tracer.startActiveSpan(\n spanName,\n {\n kind: SpanKind.INTERNAL,\n attributes: {\n ...createActorAttributes(actorInstance, actorClass, 'alarm'),\n 'faas.trigger': 'timer',\n },\n },\n async (span) => {\n try {\n await originalMethod.call(actorInstance, alarmInfo);\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 * Instrument the onPersist lifecycle method\n */\nfunction instrumentOnPersist(\n originalMethod: (key: string, value: unknown) => void,\n actorInstance: ActorLike,\n actorClass: object,\n options: ActorInstrumentationOptions,\n): (key: string, value: unknown) => void {\n if (!options.capturePersistEvents) {\n return originalMethod;\n }\n\n return function instrumentedOnPersist(key: string, value: unknown): void {\n const tracer = getTracer();\n const actorClassName = (actorClass as { name?: string }).name || 'Actor';\n const spanName = options.spanNameFormatter\n ? options.spanNameFormatter(actorInstance.name || '', 'persist')\n : `Actor ${actorInstance.name || actorClassName}: persist ${key}`;\n\n tracer.startActiveSpan(\n spanName,\n {\n kind: SpanKind.INTERNAL,\n attributes: {\n ...createActorAttributes(actorInstance, actorClass, 'persist'),\n 'actor.persist.key': key,\n 'actor.persist.value_type': typeof value,\n },\n },\n (span) => {\n try {\n originalMethod.call(actorInstance, key, value);\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 * Instrument WebSocket lifecycle methods\n */\nfunction instrumentWebSocketConnect(\n originalMethod: (ws: WebSocket, request: Request) => void,\n actorInstance: ActorLike,\n actorClass: object,\n options: ActorInstrumentationOptions,\n): (ws: WebSocket, request: Request) => void {\n return function instrumentedWebSocketConnect(\n ws: WebSocket,\n request: Request,\n ): void {\n const tracer = getTracer();\n const actorClassName = (actorClass as { name?: string }).name || 'Actor';\n const spanName = options.spanNameFormatter\n ? options.spanNameFormatter(actorInstance.name || '', 'websocket.connect')\n : defaultSpanNameFormatter(\n actorInstance.name || '',\n actorClassName,\n 'websocket.connect',\n );\n\n tracer.startActiveSpan(\n spanName,\n {\n kind: SpanKind.SERVER,\n attributes: {\n ...createActorAttributes(\n actorInstance,\n actorClass,\n 'websocket.connect',\n ),\n 'url.full': request.url,\n },\n },\n (span) => {\n try {\n originalMethod.call(actorInstance, ws, request);\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\nfunction instrumentWebSocketMessage(\n originalMethod: (ws: WebSocket, message: unknown) => void,\n actorInstance: ActorLike,\n actorClass: object,\n options: ActorInstrumentationOptions,\n): (ws: WebSocket, message: unknown) => void {\n return function instrumentedWebSocketMessage(\n ws: WebSocket,\n message: unknown,\n ): void {\n const tracer = getTracer();\n const actorClassName = (actorClass as { name?: string }).name || 'Actor';\n const spanName = options.spanNameFormatter\n ? options.spanNameFormatter(actorInstance.name || '', 'websocket.message')\n : defaultSpanNameFormatter(\n actorInstance.name || '',\n actorClassName,\n 'websocket.message',\n );\n\n tracer.startActiveSpan(\n spanName,\n {\n kind: SpanKind.SERVER,\n attributes: {\n ...createActorAttributes(\n actorInstance,\n actorClass,\n 'websocket.message',\n ),\n 'websocket.message.type': typeof message,\n 'websocket.message.size':\n typeof message === 'string'\n ? message.length\n : message instanceof ArrayBuffer\n ? message.byteLength\n : 0,\n },\n },\n (span) => {\n try {\n originalMethod.call(actorInstance, ws, message);\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\nfunction instrumentWebSocketDisconnect(\n originalMethod: (ws: WebSocket) => void,\n actorInstance: ActorLike,\n actorClass: object,\n options: ActorInstrumentationOptions,\n): (ws: WebSocket) => void {\n return function instrumentedWebSocketDisconnect(ws: WebSocket): void {\n const tracer = getTracer();\n const actorClassName = (actorClass as { name?: string }).name || 'Actor';\n const spanName = options.spanNameFormatter\n ? options.spanNameFormatter(\n actorInstance.name || '',\n 'websocket.disconnect',\n )\n : defaultSpanNameFormatter(\n actorInstance.name || '',\n actorClassName,\n 'websocket.disconnect',\n );\n\n tracer.startActiveSpan(\n spanName,\n {\n kind: SpanKind.SERVER,\n attributes: createActorAttributes(\n actorInstance,\n actorClass,\n 'websocket.disconnect',\n ),\n },\n (span) => {\n try {\n originalMethod.call(actorInstance, ws);\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 * Instrument an Actor instance by wrapping all lifecycle methods\n */\nfunction instrumentActorInstance(\n actorInstance: ActorLike,\n _state: DurableObjectState,\n _env: unknown,\n actorClass: object,\n options: ActorInstrumentationOptions,\n): ActorLike {\n const instanceHandler: ProxyHandler<ActorLike> = {\n get(target, prop) {\n const value = Reflect.get(target, prop);\n\n // Lifecycle methods that need instrumentation\n if (prop === 'onInit' && typeof value === 'function') {\n return instrumentOnInit(\n value.bind(target),\n target,\n actorClass,\n options,\n );\n }\n\n if (prop === 'onRequest' && typeof value === 'function') {\n return instrumentOnRequest(\n value.bind(target),\n target,\n actorClass,\n options,\n );\n }\n\n if (prop === 'onAlarm' && typeof value === 'function') {\n return instrumentOnAlarm(\n value.bind(target),\n target,\n actorClass,\n options,\n );\n }\n\n if (prop === 'onPersist' && typeof value === 'function') {\n return instrumentOnPersist(\n value.bind(target),\n target,\n actorClass,\n options,\n );\n }\n\n if (prop === 'onWebSocketConnect' && typeof value === 'function') {\n return instrumentWebSocketConnect(\n value.bind(target),\n target,\n actorClass,\n options,\n );\n }\n\n if (prop === 'onWebSocketMessage' && typeof value === 'function') {\n return instrumentWebSocketMessage(\n value.bind(target),\n target,\n actorClass,\n options,\n );\n }\n\n if (prop === 'onWebSocketDisconnect' && typeof value === 'function') {\n return instrumentWebSocketDisconnect(\n value.bind(target),\n target,\n actorClass,\n options,\n );\n }\n\n // Instrument sub-components if enabled\n if (prop === 'storage' && value && options.instrumentStorage !== false) {\n return instrumentActorStorage(value, target, actorClass);\n }\n\n if (prop === 'alarms' && value && options.instrumentAlarms !== false) {\n return instrumentActorAlarms(value, target, actorClass);\n }\n\n if (prop === 'sockets' && value && options.instrumentSockets !== false) {\n return instrumentActorSockets(value, target, actorClass);\n }\n\n // Bind other methods to the target\n if (typeof value === 'function') {\n return value.bind(target);\n }\n\n return value;\n },\n };\n\n return wrap(actorInstance, instanceHandler);\n}\n\n/**\n * Instrument an Actor class for comprehensive OpenTelemetry tracing\n *\n * This wraps the Actor class to automatically trace all lifecycle methods:\n * - onInit: Actor initialization\n * - onRequest: HTTP request handling\n * - onAlarm: Alarm triggers\n * - onPersist: Property persistence events\n * - WebSocket methods: Connection, message, disconnect\n *\n * It also optionally instruments:\n * - actor.storage: SQL queries and storage operations\n * - actor.alarms: Alarm scheduling operations\n * - actor.sockets: WebSocket operations\n *\n * @example\n * ```typescript\n * import { Actor } from '@cloudflare/actors'\n * import { instrumentActor } from 'autotel-cloudflare/actors'\n *\n * class Counter extends Actor<Env> {\n * protected onInit() {\n * console.log('Counter initialized')\n * }\n *\n * protected onRequest(request: Request) {\n * return new Response('count: 42')\n * }\n * }\n *\n * // Wrap the class\n * export const InstrumentedCounter = instrumentActor(Counter, (env: Env) => ({\n * service: { name: 'counter-actor' },\n * exporter: { url: env.OTLP_ENDPOINT },\n * actors: {\n * instrumentStorage: true,\n * capturePersistEvents: true\n * }\n * }))\n * ```\n *\n * @param actorClass - The Actor class to instrument\n * @param config - Configuration (static object or function)\n * @returns Instrumented Actor class\n */\nexport function instrumentActor<C extends ActorConstructor>(\n actorClass: C,\n config: ActorConfig | ((env: unknown, trigger?: unknown) => ActorConfig),\n): C {\n const initialiser = createInitialiser(config as ConfigurationOption);\n\n // Default options\n const defaultOptions: ActorInstrumentationOptions = {\n instrumentStorage: true,\n instrumentAlarms: true,\n instrumentSockets: true,\n capturePersistEvents: true,\n };\n\n const classHandler: ProxyHandler<C> = {\n construct(target, [state, env]: [DurableObjectState, unknown]) {\n // Get config (either static or from function)\n const resolvedConfig =\n typeof config === 'function'\n ? config(env, { id: state.id.toString(), name: state.id.name })\n : config;\n\n // Merge options with defaults\n // Handle the case where config might not have actors property\n const actorOptions =\n resolvedConfig &&\n typeof resolvedConfig === 'object' &&\n 'actors' in resolvedConfig\n ? (resolvedConfig as { actors?: ActorInstrumentationOptions }).actors\n : undefined;\n const options: ActorInstrumentationOptions = {\n ...defaultOptions,\n ...actorOptions,\n };\n\n // Initialize telemetry config\n const trigger = {\n id: state.id.toString(),\n name: state.id.name,\n };\n const telemetryConfig = initialiser(env, trigger);\n const context = setConfig(telemetryConfig);\n\n // Create the Actor instance within the config context\n const actorInstance = api_context.with(context, () => {\n return new target(state, env);\n }) as ActorLike;\n\n // Instrument the instance\n return instrumentActorInstance(\n actorInstance,\n state,\n env,\n actorClass,\n options,\n );\n },\n };\n\n return wrap(actorClass, classHandler);\n}\n","/**\n * Traced handler wrapper for @cloudflare/actors\n *\n * Wraps the Actors handler() to provide:\n * - Root span for the entire request lifecycle\n * - Actor name extraction and correlation\n * - Request routing tracing\n */\n\nimport {\n trace,\n context as api_context,\n propagation,\n SpanStatusCode,\n SpanKind,\n} from '@opentelemetry/api';\nimport type { ConfigurationOption } from 'autotel-edge';\nimport { createInitialiser, setConfig, WorkerTracer } from 'autotel-edge';\nimport type { ActorConfig, ActorConstructor, ActorLike } from './types';\n\n/**\n * Get the tracer instance\n */\nfunction getTracer(): WorkerTracer {\n return trace.getTracer('autotel-cloudflare-actors') as WorkerTracer;\n}\n\n/**\n * Worker handler type matching @cloudflare/actors output\n */\ninterface WorkerHandler<E = unknown> {\n fetch(request: Request, env: E, ctx: ExecutionContext): Promise<Response>;\n}\n\n/**\n * Create a traced handler that combines Actor instrumentation with request tracing\n *\n * This is an all-in-one wrapper that:\n * 1. Initializes telemetry for the Worker\n * 2. Creates a root span for each incoming request\n * 3. Extracts the Actor name using `nameFromRequest`\n * 4. Instruments the Actor class with lifecycle tracing\n * 5. Routes the request to the instrumented Actor\n *\n * @example\n * ```typescript\n * import { Actor } from '@cloudflare/actors'\n * import { tracedHandler } from 'autotel-cloudflare/actors'\n *\n * class MyActor extends Actor<Env> {\n * protected onRequest(request: Request) {\n * return new Response('Hello!')\n * }\n * }\n *\n * // Export the Actor class and use tracedHandler\n * export { MyActor }\n * export default tracedHandler(MyActor, (env) => ({\n * service: { name: 'my-actor-service' },\n * exporter: { url: env.OTLP_ENDPOINT }\n * }))\n * ```\n *\n * @param actorClass - The Actor class to handle requests\n * @param config - Configuration (static object or function)\n * @returns A Worker handler with full tracing\n */\nexport function tracedHandler<E, A extends ActorLike>(\n actorClass: ActorConstructor<A> & {\n nameFromRequest?(request: Request): Promise<string | undefined>;\n configuration?(request: Request): {\n locationHint?: DurableObjectLocationHint;\n };\n },\n config: ActorConfig | ((env: E, trigger?: unknown) => ActorConfig),\n): WorkerHandler<E> {\n const initialiser = createInitialiser(config as ConfigurationOption);\n\n // Note: The Actor class instrumentation happens at the DO level, not here.\n // This handler wraps the Worker entrypoint that routes to the DO.\n\n return {\n async fetch(\n request: Request,\n env: E,\n _ctx: ExecutionContext,\n ): Promise<Response> {\n // Initialize telemetry for this request\n const telemetryConfig = initialiser(env, { type: 'http' });\n const configContext = setConfig(telemetryConfig);\n\n // Extract parent context from request headers\n const parentContext = propagation.extract(configContext, request.headers);\n\n const tracer = getTracer();\n const url = new URL(request.url);\n const actorClassName = actorClass.name || 'Actor';\n\n // Get actor name from request (using the Actor's static method if available)\n let actorName: string | undefined;\n try {\n if (actorClass.nameFromRequest) {\n actorName = await actorClass.nameFromRequest(request);\n }\n } catch {\n actorName = undefined;\n }\n\n const spanName = `${actorClassName} handler: ${request.method} ${url.pathname}`;\n\n return tracer.startActiveSpan(\n spanName,\n {\n kind: SpanKind.SERVER,\n attributes: {\n 'http.request.method': request.method,\n 'url.full': request.url,\n 'url.path': url.pathname,\n 'url.query': url.search,\n 'actor.class': actorClassName,\n ...(actorName && { 'actor.name': actorName }),\n 'faas.trigger': 'http',\n },\n },\n parentContext,\n async (span) => {\n try {\n // Get Actor stub using the same pattern as @cloudflare/actors handler()\n const envObj = env as Record<string, DurableObjectNamespace>;\n\n // Find the binding name for this Actor class\n const bindingName = Object.keys(envObj).find((key) => {\n const binding = (env as Record<string, unknown>)\n .__DURABLE_OBJECT_BINDINGS as\n Record<string, { class_name?: string }> | undefined;\n return (\n key === actorClassName ||\n binding?.[key]?.class_name === actorClassName\n );\n });\n\n if (!bindingName) {\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: `No Durable Object binding found for ${actorClassName}`,\n });\n return Response.json(\n {\n error: 'Configuration Error',\n message: `No Durable Object binding found for actor class ${actorClassName}`,\n },\n {\n status: 500,\n headers: { 'Content-Type': 'application/json' },\n },\n );\n }\n\n const namespace = envObj[bindingName];\n const idString = actorName || 'default';\n\n // Get location hint if available\n const locationHint =\n actorClass.configuration?.(request)?.locationHint;\n\n // Get the Durable Object stub\n const stub = namespace.getByName(idString, { locationHint });\n\n // Set the name on the stub (as @cloudflare/actors does)\n if ('setName' in stub && typeof stub.setName === 'function') {\n (stub as unknown as { setName(id: string): void }).setName(\n idString,\n );\n }\n\n // Inject trace context into the request for propagation to the DO\n const headers = new Headers(request.headers);\n propagation.inject(api_context.active(), headers);\n\n // Create a new request with the injected headers\n const tracedRequest = new Request(request.url, {\n method: request.method,\n headers,\n body: request.body,\n redirect: request.redirect,\n });\n\n // Forward the request to the Durable Object\n const response = await stub.fetch(tracedRequest);\n\n span.setAttributes({\n 'http.response.status_code': response.status,\n 'actor.name': idString,\n });\n\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\n return Response.json(\n {\n error: 'Internal Server Error',\n message:\n error instanceof Error ? error.message : 'Unknown error',\n },\n { status: 500, headers: { 'Content-Type': 'application/json' } },\n );\n } finally {\n span.end();\n }\n },\n );\n },\n };\n}\n\n/**\n * Alternative: Create a handler wrapper that uses the existing @cloudflare/actors handler\n *\n * This is useful if you want to use the original handler() but add tracing around it.\n *\n * @example\n * ```typescript\n * import { Actor, handler } from '@cloudflare/actors'\n * import { wrapHandler } from 'autotel-cloudflare/actors'\n *\n * class MyActor extends Actor<Env> {}\n *\n * export { MyActor }\n * export default wrapHandler(handler(MyActor), (env) => ({\n * service: { name: 'my-service' }\n * }))\n * ```\n */\nexport function wrapHandler<E>(\n originalHandler: WorkerHandler<E>,\n config: ActorConfig | ((env: E, trigger?: unknown) => ActorConfig),\n): WorkerHandler<E> {\n const initialiser = createInitialiser(config as ConfigurationOption);\n\n return {\n async fetch(\n request: Request,\n env: E,\n ctx: ExecutionContext,\n ): Promise<Response> {\n // Initialize telemetry for this request\n const telemetryConfig = initialiser(env, { type: 'http' });\n const configContext = setConfig(telemetryConfig);\n\n // Extract parent context from request headers\n const parentContext = propagation.extract(configContext, request.headers);\n\n const tracer = getTracer();\n const url = new URL(request.url);\n\n return tracer.startActiveSpan(\n `Worker: ${request.method} ${url.pathname}`,\n {\n kind: SpanKind.SERVER,\n attributes: {\n 'http.request.method': request.method,\n 'url.full': request.url,\n 'url.path': url.pathname,\n 'url.query': url.search,\n 'faas.trigger': 'http',\n },\n },\n parentContext,\n async (span) => {\n try {\n // Inject trace context into request\n const headers = new Headers(request.headers);\n propagation.inject(api_context.active(), headers);\n\n const tracedRequest = new Request(request.url, {\n method: request.method,\n headers,\n body: request.body,\n redirect: request.redirect,\n });\n\n const response = await originalHandler.fetch(\n tracedRequest,\n env,\n ctx,\n );\n\n span.setAttributes({\n 'http.response.status_code': response.status,\n });\n\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}\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"agents.d.ts","names":[],"sources":["../src/agents/base.ts","../src/agents/agent.ts","../src/agents/mcp.ts","../src/agents/observability.ts","../src/agents/types.ts","../src/agents/otel-observability.ts"],"mappings":";;;;;;KAGY,UACV,kBACA,gBAAgB,0BAA0B;EAE1C,MAAM;;;;;EAKN;;;;EAIA;;;;;EAKA;EACA;EACA,SAAS;EACT;;;;;;;KCnBU,0BACR,4BACA;EAAmB;EAAgB;KACnC;EAAyB;EAAgB;KACzC,+BACA,gCACA,6BACA;EAA8B;KAC9B;EAA6B;KAC7B;EAA2B;EAAoB;KAC/C;EAA6B;EAAoB;KACjD;EAA+B;EAAkB;KACjD;EAAgC;EAAkB;KAClD;EAA+B;EAAkB;KACjD;EAEI;EAAkB;EAAY;EAAiB;KAEnD;EAEI;EAAkB;EAAY;EAAe;KAEjD;EAEI;EAAkB;EAAe;KAErC;EAA4B;EAAkB;KAC9C;EAEI;EAAkB;EAAY;EAAiB;KAEnD;EAEI;EAAkB;EAAY;EAAe;KAEjD;EAEI;EAAsB;EAAoB;KAE9C;EAEI;EAAsB;EAAoB;KAE9C;EAEI;EAAsB;EAAoB;KAE9C;EAEI;EAAiB;EAAmB;KAExC;EAGI;EACA;EACA;EACA;KAGJ;EAGI;EACA;EACA;EACA;EACA;KAGJ;EAGI;EACA;EACA;EACA;EACA;KAGJ;EAGI;EACA;EACA;EACA;EACA;KAGJ;EAGI;EACA;EACA;EACA;KAGJ;EAGI;EACA;EACA;EACA;EACA;KAGJ;EAGI;EACA;EACA;EACA;EACA;KAGJ;EAGI;EACA;EACA;EACA;EACA;KAGJ;EAGI;EACA;EAEA;EACA;KAGJ;EAGI;EACA;EACA;EACA;EACA;KAGJ;EAGI;EACA;EACA;EACA;EACA;KAGJ;EAGI;EACA;EACA;EACA;EACA;KAGJ;EAGI;EACA;EACA;EACA;EACA;KAGJ;EAGI;EACA;EACA;EACA;EACA;EACA;KAGJ;EAGI;EACA;EACA;EACA;EACA;EACA;KAGJ;EAGI;EACA;EACA;EACA;EACA;EACA;KAGJ;EAGI;EACA;EACA;EACA;KAGJ;EAGI;EAIA;KAGJ;EAGI;EACA;EACA;KAGJ;EAGI;EACA;EACA;EACA;KAGJ;EAGI;EACA;KAGJ;EAGI;EACA;EACA;EACA;KAGJ;EAEI;EAAkB;KAEtB;EAGI;EACA;EACA;EACA;EACA;KAGJ;EAEI;EAAe;EAAmB;KAEtC;EAEI;EAAe;EAAmB;KAEtC;EAEI;EAAkB;KAEtB;EAA0C;KAC1C,uBACA;EAAuB;KACvB;EAEI;EAAsB;EAAc;KAExC;EAA6B;EAAc;EAAY;KACvD;EAA2B;EAAc;EAAY;KACrD;EAEI;EAAc;EAAuB;KAEzC;EAA8B;EAAoB;KAClD;EAA8B;EAAoB;KAClD;EAAiC;EAAoB;KACrD;EAAiC;EAAoB;KACrD;EAEI;EAAoB;KAExB;EAA+B;EAAoB;KACnD;EAAgC;EAAoB;KACpD;EAEI;EAAoB;;;;;;;KC3ThB,wBACR;EAAqC;KACrC;EAEI;EAAa;EAAmB;EAAe;KAEnD;EAGI;EACA;EACA;KAGJ;EAGI;EACA;EACA;EACA;KAGJ;EAGI;EACA;EACA;EACA;EACA;;;;KChCI,qBACV,0BAA0B;UAEX;EACf,KACE,OAAO,oBACP,MAAM,qBAAqB;;KAkBnB;EACV,OAAO,QAAQ;IAAsB;;EACrC,KAAK,QAAQ;IAAsB;;EACnC,SAAS,QACP;IACE;;EAEJ,MAAM,QACJ,QAAQ;IAAsB;;IAC5B;;EAEJ,YAAY,QACV;IACE;;EAEJ,OAAO,QAAQ;IAAsB;;EACrC,WAAW,QAAQ;IAAsB;;EACzC,UAAU,QACR;IACE;;EAEJ,WAAW,QACT;IACE;;EAEJ,UAAU,QAAQ;IAAsB;;EACxC,KAAK,QAAQ;IAAsB;;EACnC,OAAO,QAAQ;IAAsB;;;UAGtB,qBACf,eAAe,qBAAqB;EAEpC;EACA,QAAQ,OAAO;;cAkCJ;uCAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cAwCA,sBAAsB;iBAMnB,UAAU,gBAAgB,iBACxC,YAAY,GACZ,WAAW,OAAO,gBAAgB;;;KC7HxB,gCACV,qBAAqB;UAEN;EACf;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,sBAAsB,OAAO,uBAAuB;EACpD,qBAAqB,OAAO;;KAGlB,0BAA0B;EACpC,SAAS;;UAGM;EACf;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;;;;;;;;cCiaW,6BAA6B;mBACvB;mBACA;UACT;EAEI,YAAA,QAAQ;UAMZ;EAMR,KAAK,OAAO,oBAAoB,MAAM;;iBA2CxB,wBACd,QAAQ,0BACP;iBAIa,+BACd,KAAK,yBACL,UAAU,8BACT"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"agents.js","names":[],"sources":["../src/agents/otel-observability.ts","../src/agents/observability.ts"],"sourcesContent":["/**\n * OpenTelemetry-based Observability implementation for Cloudflare Agents SDK\n *\n * Converts Agent events into OpenTelemetry spans for distributed tracing.\n */\n\nimport {\n SpanKind,\n SpanStatusCode,\n trace,\n type Attributes,\n type Span,\n} from '@opentelemetry/api';\nimport { agentContextFromSpan, recordHumanApproval } from 'autotel-genai/agent';\nimport { resourceFromAttributes } from '@opentelemetry/resources';\nimport {\n WorkerTracer,\n WorkerTracerProvider,\n createInitialiser,\n type ResolvedEdgeConfig,\n} from 'autotel-edge';\nimport type {\n AgentInstrumentationOptions,\n MCPObservabilityEvent,\n Observability,\n ObservabilityEvent,\n ObservabilityExecutionContext,\n OtelObservabilityConfig,\n} from './types';\n\nlet providerInitialized = false;\n\ntype EventCategory =\n | 'state'\n | 'rpc'\n | 'schedule'\n | 'queue'\n | 'submission'\n | 'message'\n | 'chat'\n | 'transcript'\n | 'fiber'\n | 'agentTool'\n | 'lifecycle'\n | 'workflow'\n | 'mcp'\n | 'email';\n\nfunction initProvider(config: ResolvedEdgeConfig): void {\n if (providerInitialized) return;\n\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-cloudflare',\n 'telemetry.sdk.language': 'js',\n 'agent.framework': 'cloudflare-agents',\n });\n\n const provider = new WorkerTracerProvider(config.spanProcessors, resource);\n provider.register();\n\n const tracer = trace.getTracer('autotel-cloudflare/agents') as WorkerTracer;\n tracer.setHeadSampler(config.sampling.headSampler);\n\n providerInitialized = true;\n}\n\nfunction classifyEvent(type: ObservabilityEvent['type']): EventCategory {\n if (type.startsWith('mcp:')) return 'mcp';\n if (type.startsWith('workflow:')) return 'workflow';\n if (type.startsWith('fiber:')) return 'fiber';\n if (type.startsWith('agent_tool:')) return 'agentTool';\n if (type.startsWith('chat:transcript:')) return 'transcript';\n if (type.startsWith('chat:')) return 'chat';\n if (type.startsWith('submission:')) return 'submission';\n if (type.startsWith('queue:')) return 'queue';\n if (type.startsWith('schedule:')) return 'schedule';\n if (\n type.startsWith('message:') ||\n type.startsWith('tool:') ||\n type === 'rpc:error'\n ) {\n return 'message';\n }\n if (type === 'rpc') return 'rpc';\n if (type.startsWith('state:')) return 'state';\n if (type.startsWith('email:')) return 'email';\n if (type === 'connect' || type === 'disconnect' || type === 'destroy') {\n return 'lifecycle';\n }\n return 'message';\n}\n\nfunction shouldTraceEvent(\n event: ObservabilityEvent,\n options: AgentInstrumentationOptions,\n): boolean {\n const opts: Required<\n Pick<\n AgentInstrumentationOptions,\n | 'traceRpc'\n | 'traceSchedule'\n | 'traceQueue'\n | 'traceSubmissions'\n | 'traceMcp'\n | 'traceStateUpdates'\n | 'traceMessages'\n | 'traceLifecycle'\n | 'traceChat'\n | 'traceTranscripts'\n | 'traceFibers'\n | 'traceToolRecovery'\n | 'traceWorkflow'\n | 'traceEmail'\n >\n > = {\n traceRpc: true,\n traceSchedule: true,\n traceQueue: true,\n traceSubmissions: true,\n traceMcp: true,\n traceStateUpdates: false,\n traceMessages: true,\n traceLifecycle: true,\n traceChat: true,\n traceTranscripts: true,\n traceFibers: true,\n traceToolRecovery: true,\n traceWorkflow: true,\n traceEmail: true,\n };\n const merged = { ...opts, ...options };\n\n switch (classifyEvent(event.type)) {\n case 'rpc': {\n return merged.traceRpc;\n }\n case 'schedule': {\n return merged.traceSchedule;\n }\n case 'queue': {\n return merged.traceQueue;\n }\n case 'submission': {\n return merged.traceSubmissions;\n }\n case 'mcp': {\n return merged.traceMcp;\n }\n case 'state': {\n return merged.traceStateUpdates;\n }\n case 'message': {\n return merged.traceMessages;\n }\n case 'lifecycle': {\n return merged.traceLifecycle;\n }\n case 'chat': {\n return merged.traceChat;\n }\n case 'transcript': {\n return merged.traceTranscripts;\n }\n case 'fiber': {\n return merged.traceFibers;\n }\n case 'agentTool': {\n return merged.traceToolRecovery;\n }\n case 'workflow': {\n return merged.traceWorkflow;\n }\n case 'email': {\n return merged.traceEmail;\n }\n }\n}\n\nfunction formatTypeSegment(value: string): string {\n return value.replaceAll(/[:_]/g, '.');\n}\n\nfunction getPayloadName(\n payload: Record<string, unknown>,\n ...keys: string[]\n): string | undefined {\n for (const key of keys) {\n const value = payload[key];\n if (typeof value === 'string' && value.length > 0) {\n return value;\n }\n }\n return undefined;\n}\n\nfunction getDefaultSpanName(event: ObservabilityEvent): string {\n const payload = event.payload;\n\n switch (event.type) {\n case 'rpc':\n case 'rpc:error': {\n return `agent.rpc ${(payload as { method: string }).method}`;\n }\n case 'schedule:create':\n case 'schedule:execute':\n case 'schedule:cancel':\n case 'schedule:retry':\n case 'schedule:error':\n case 'schedule:duplicate_warning': {\n return `agent.${formatTypeSegment(event.type)} ${getPayloadName(payload, 'callback') ?? 'unknown'}`;\n }\n case 'queue:create':\n case 'queue:retry':\n case 'queue:error': {\n return `agent.${formatTypeSegment(event.type)} ${getPayloadName(payload, 'callback') ?? 'unknown'}`;\n }\n case 'submission:create':\n case 'submission:status':\n case 'submission:error': {\n return `agent.${formatTypeSegment(event.type)} ${getPayloadName(payload, 'submissionId') ?? 'unknown'}`;\n }\n case 'connect':\n case 'disconnect': {\n return `agent.${event.type} ${getPayloadName(payload, 'connectionId') ?? 'unknown'}`;\n }\n case 'mcp:client:preconnect': {\n return `mcp.client.preconnect ${getPayloadName(payload, 'serverId') ?? 'unknown'}`;\n }\n case 'mcp:client:authorize': {\n return `mcp.client.authorize ${getPayloadName(payload, 'serverId') ?? 'unknown'}`;\n }\n case 'mcp:client:connect':\n case 'mcp:client:discover':\n case 'mcp:client:close': {\n return `mcp.client.${formatTypeSegment(event.type).split('.').slice(-1)[0]} ${\n getPayloadName(payload, 'url', 'capability', 'state') ?? 'unknown'\n }`;\n }\n case 'workflow:start':\n case 'workflow:event':\n case 'workflow:approved':\n case 'workflow:rejected':\n case 'workflow:terminated':\n case 'workflow:paused':\n case 'workflow:resumed':\n case 'workflow:restarted': {\n return `agent.${formatTypeSegment(event.type)} ${\n getPayloadName(payload, 'workflowName', 'workflowId', 'eventType') ??\n 'unknown'\n }`;\n }\n case 'email:receive':\n case 'email:reply':\n case 'email:send': {\n return `agent.${formatTypeSegment(event.type)} ${getPayloadName(payload, 'subject') ?? 'message'}`;\n }\n case 'destroy': {\n return 'agent.destroy';\n }\n default: {\n return `agent.${formatTypeSegment(event.type)}`;\n }\n }\n}\n\nfunction isPrimitiveAttributeValue(\n value: unknown,\n): value is string | number | boolean | string[] | number[] | boolean[] {\n if (\n typeof value === 'string' ||\n typeof value === 'number' ||\n typeof value === 'boolean'\n ) {\n return true;\n }\n\n if (!Array.isArray(value)) {\n return false;\n }\n\n return value.every(\n (entry) =>\n typeof entry === 'string' ||\n typeof entry === 'number' ||\n typeof entry === 'boolean',\n );\n}\n\nfunction setIfPresent(attrs: Attributes, key: string, value: unknown): void {\n if (value === undefined || value === null) return;\n if (isPrimitiveAttributeValue(value)) {\n attrs[key] = value;\n }\n}\n\nfunction getDefaultAttributes(event: ObservabilityEvent): Attributes {\n const attrs: Attributes = {\n 'agent.event.type': event.type,\n };\n\n setIfPresent(attrs, 'agent.event.id', event.id);\n setIfPresent(attrs, 'agent.display_message', event.displayMessage);\n setIfPresent(attrs, 'agent.class', event.agent);\n setIfPresent(attrs, 'agent.instance.name', event.name);\n setIfPresent(attrs, 'gen_ai.agent.name', event.agent);\n\n switch (event.type) {\n case 'rpc': {\n attrs['agent.rpc.method'] = event.payload.method;\n setIfPresent(attrs, 'agent.rpc.streaming', event.payload.streaming);\n break;\n }\n case 'rpc:error': {\n attrs['agent.rpc.method'] = event.payload.method;\n break;\n }\n case 'schedule:create':\n case 'schedule:execute':\n case 'schedule:cancel':\n case 'schedule:retry':\n case 'schedule:error':\n case 'queue:create':\n case 'queue:retry':\n case 'queue:error': {\n setIfPresent(attrs, 'agent.schedule.callback', event.payload.callback);\n setIfPresent(attrs, 'agent.schedule.id', event.payload.id);\n break;\n }\n case 'schedule:duplicate_warning': {\n setIfPresent(attrs, 'agent.schedule.callback', event.payload.callback);\n break;\n }\n case 'connect':\n case 'disconnect': {\n setIfPresent(attrs, 'agent.connection.id', event.payload.connectionId);\n break;\n }\n case 'mcp:client:preconnect': {\n setIfPresent(attrs, 'agent.mcp.server_id', event.payload.serverId);\n break;\n }\n case 'mcp:client:connect':\n case 'mcp:client:close': {\n setIfPresent(attrs, 'agent.mcp.url', event.payload.url);\n setIfPresent(attrs, 'agent.mcp.transport', event.payload.transport);\n setIfPresent(attrs, 'agent.mcp.state', event.payload.state);\n break;\n }\n case 'mcp:client:authorize': {\n setIfPresent(attrs, 'agent.mcp.server_id', event.payload.serverId);\n setIfPresent(attrs, 'agent.mcp.auth_url', event.payload.authUrl);\n setIfPresent(attrs, 'agent.mcp.client_id', event.payload.clientId);\n break;\n }\n case 'mcp:client:discover': {\n setIfPresent(attrs, 'agent.mcp.url', event.payload.url);\n setIfPresent(attrs, 'agent.mcp.state', event.payload.state);\n setIfPresent(attrs, 'agent.mcp.capability', event.payload.capability);\n break;\n }\n }\n\n for (const [key, value] of Object.entries(event.payload)) {\n setIfPresent(attrs, `agent.payload.${key}`, value);\n }\n\n return attrs;\n}\n\nfunction getSpanKind(event: ObservabilityEvent): SpanKind {\n switch (classifyEvent(event.type)) {\n case 'rpc':\n case 'lifecycle':\n case 'email': {\n return SpanKind.SERVER;\n }\n case 'mcp': {\n return SpanKind.CLIENT;\n }\n case 'schedule':\n case 'queue': {\n return SpanKind.CONSUMER;\n }\n default: {\n return SpanKind.INTERNAL;\n }\n }\n}\n\nfunction inferErrorMessage(event: ObservabilityEvent): string | undefined {\n const payload = event.payload as Record<string, unknown>;\n const direct = payload.error;\n if (typeof direct === 'string' && direct.length > 0) {\n return direct;\n }\n\n if (event.type === 'workflow:rejected') {\n const reason = payload.reason;\n if (typeof reason === 'string' && reason.length > 0) {\n return reason;\n }\n return 'workflow rejected';\n }\n\n if (event.type.endsWith(':failed') || event.type.endsWith(':error')) {\n return event.type;\n }\n\n return undefined;\n}\n\nfunction isErrorEvent(event: ObservabilityEvent): boolean {\n if (event.type === 'workflow:rejected') return true;\n if (event.type.endsWith(':error') || event.type.endsWith(':failed'))\n return true;\n\n if ('error' in event.payload) {\n return typeof (event.payload as Record<string, unknown>).error === 'string';\n }\n\n return false;\n}\n\nfunction applyEventStatus(span: Span, event: ObservabilityEvent): void {\n if (!isErrorEvent(event)) {\n span.setStatus({ code: SpanStatusCode.OK });\n return;\n }\n\n const message = inferErrorMessage(event);\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message,\n });\n span.setAttribute('error', true);\n\n if (message) {\n span.setAttribute('exception.message', message);\n }\n}\n\nasync function exportSpans(\n traceId: string,\n ctx?: ObservabilityExecutionContext,\n): Promise<void> {\n const tracer = trace.getTracer('autotel-cloudflare/agents');\n if (tracer instanceof WorkerTracer) {\n try {\n const scheduler =\n ctx && 'scheduler' in ctx\n ? (ctx.scheduler as\n { wait?: (ms: number) => Promise<void> } | undefined)\n : undefined;\n if (scheduler?.wait) {\n await scheduler.wait(1);\n }\n await tracer.forceFlush(traceId);\n } catch (error) {\n console.error(\n '[autotel-cloudflare/agents] Failed to export spans:',\n error,\n );\n }\n }\n}\n\n/**\n * OpenTelemetry-based Observability implementation\n *\n * Implements the Agents SDK Observability interface and converts\n * events into OpenTelemetry spans.\n */\nexport class OtelObservability implements Observability {\n private readonly config: ResolvedEdgeConfig;\n private readonly options: AgentInstrumentationOptions;\n private initialized = false;\n\n constructor(config: OtelObservabilityConfig) {\n const initialiser = createInitialiser(config);\n this.config = initialiser({}, undefined);\n this.options = config.agents ?? {};\n }\n\n private initialize(): void {\n if (this.initialized) return;\n initProvider(this.config);\n this.initialized = true;\n }\n\n emit(event: ObservabilityEvent, ctx?: ObservabilityExecutionContext): void {\n this.initialize();\n\n if (!shouldTraceEvent(event, this.options)) {\n return;\n }\n\n const tracer = trace.getTracer('autotel-cloudflare/agents');\n const spanName = this.options.spanNameFormatter\n ? this.options.spanNameFormatter(event)\n : getDefaultSpanName(event);\n const defaultAttrs = getDefaultAttributes(event);\n const customAttrs = this.options.attributeExtractor\n ? this.options.attributeExtractor(event)\n : {};\n const span = tracer.startSpan(spanName, {\n kind: getSpanKind(event),\n attributes: { ...defaultAttrs, ...customAttrs },\n startTime: event.timestamp,\n });\n\n if (event.type === 'tool:approval') {\n recordHumanApproval({\n ctx: agentContextFromSpan(span),\n toolCallId: event.payload.toolCallId,\n approved: event.payload.approved,\n required: true,\n });\n }\n\n applyEventStatus(span, event);\n span.end(event.timestamp + 1);\n\n const traceId = span.spanContext().traceId;\n if (ctx && 'waitUntil' in ctx && typeof ctx.waitUntil === 'function') {\n ctx.waitUntil(exportSpans(traceId, ctx));\n return;\n }\n\n void exportSpans(traceId, ctx);\n }\n}\n\nexport function createOtelObservability(\n config: OtelObservabilityConfig,\n): OtelObservability {\n return new OtelObservability(config);\n}\n\nexport function createOtelObservabilityFromEnv(\n env: Record<string, unknown>,\n options?: AgentInstrumentationOptions,\n): OtelObservability {\n const endpoint = (env.OTEL_EXPORTER_OTLP_ENDPOINT as string) || undefined;\n const serviceName = (env.OTEL_SERVICE_NAME as string) || 'cloudflare-agent';\n\n let headers: Record<string, string> | undefined;\n const headersStr = env.OTEL_EXPORTER_OTLP_HEADERS as string;\n if (headersStr) {\n headers = {};\n for (const pair of headersStr.split(',')) {\n const [key, value] = pair.split('=');\n if (key && value) {\n headers[key.trim()] = value.trim();\n }\n }\n }\n\n return createOtelObservability({\n service: { name: serviceName },\n exporter: { url: endpoint || 'http://localhost:4318/v1/traces', headers },\n agents: options,\n });\n}\n\nexport type { MCPObservabilityEvent };\n","import type { AgentObservabilityEvent } from './agent';\nimport type { MCPObservabilityEvent } from './mcp';\n\nexport type ObservabilityEvent =\n AgentObservabilityEvent | MCPObservabilityEvent;\n\nexport interface Observability {\n emit(\n event: ObservabilityEvent,\n ctx?: DurableObjectState | ExecutionContext,\n ): void;\n}\n\ntype ChannelKey =\n | 'state'\n | 'rpc'\n | 'message'\n | 'chat'\n | 'transcript'\n | 'fiber'\n | 'agentTool'\n | 'schedule'\n | 'lifecycle'\n | 'workflow'\n | 'mcp'\n | 'email';\n\nexport type ChannelEventMap = {\n state: Extract<ObservabilityEvent, { type: `state:${string}` }>;\n rpc: Extract<ObservabilityEvent, { type: 'rpc' | `rpc:${string}` }>;\n message: Extract<\n ObservabilityEvent,\n { type: `message:${string}` | `tool:${string}` | `submission:${string}` }\n >;\n chat: Exclude<\n Extract<ObservabilityEvent, { type: `chat:${string}` }>,\n { type: `chat:transcript:${string}` }\n >;\n transcript: Extract<\n ObservabilityEvent,\n { type: `transcript:${string}` | `chat:transcript:${string}` }\n >;\n fiber: Extract<ObservabilityEvent, { type: `fiber:${string}` }>;\n agentTool: Extract<ObservabilityEvent, { type: `agent_tool:${string}` }>;\n schedule: Extract<\n ObservabilityEvent,\n { type: `schedule:${string}` | `queue:${string}` }\n >;\n lifecycle: Extract<\n ObservabilityEvent,\n { type: 'connect' | 'disconnect' | 'destroy' }\n >;\n workflow: Extract<ObservabilityEvent, { type: `workflow:${string}` }>;\n mcp: Extract<ObservabilityEvent, { type: `mcp:${string}` }>;\n email: Extract<ObservabilityEvent, { type: `email:${string}` }>;\n};\n\nexport interface ObservabilityChannel<\n TEvent extends ObservabilityEvent = ObservabilityEvent,\n> {\n name: string;\n publish(event: TEvent): void;\n}\n\nconst listeners: {\n [K in ChannelKey]: Set<(event: ChannelEventMap[K]) => void>;\n} = {\n state: new Set(),\n rpc: new Set(),\n message: new Set(),\n chat: new Set(),\n transcript: new Set(),\n fiber: new Set(),\n agentTool: new Set(),\n schedule: new Set(),\n lifecycle: new Set(),\n workflow: new Set(),\n mcp: new Set(),\n email: new Set(),\n};\n\nfunction createChannel<K extends ChannelKey>(\n key: K,\n name: string,\n): ObservabilityChannel<ChannelEventMap[K]> {\n return {\n name,\n publish(event) {\n for (const callback of listeners[key]) {\n callback(event);\n }\n },\n };\n}\n\nexport const channels = {\n state: createChannel('state', 'agents:state'),\n rpc: createChannel('rpc', 'agents:rpc'),\n message: createChannel('message', 'agents:message'),\n chat: createChannel('chat', 'agents:chat'),\n transcript: createChannel('transcript', 'agents:transcript'),\n fiber: createChannel('fiber', 'agents:fiber'),\n agentTool: createChannel('agentTool', 'agents:agent_tool'),\n schedule: createChannel('schedule', 'agents:schedule'),\n lifecycle: createChannel('lifecycle', 'agents:lifecycle'),\n workflow: createChannel('workflow', 'agents:workflow'),\n mcp: createChannel('mcp', 'agents:mcp'),\n email: createChannel('email', 'agents:email'),\n} as const;\n\nfunction getChannel(type: string): ObservabilityChannel {\n if (type.startsWith('mcp:')) return channels.mcp;\n if (type.startsWith('workflow:')) return channels.workflow;\n if (type.startsWith('fiber:')) return channels.fiber;\n if (type.startsWith('transcript:') || type.startsWith('chat:transcript:')) {\n return channels.transcript;\n }\n if (type.startsWith('chat:')) return channels.chat;\n if (type.startsWith('agent_tool:')) return channels.agentTool;\n if (type.startsWith('schedule:') || type.startsWith('queue:')) {\n return channels.schedule;\n }\n if (\n type.startsWith('message:') ||\n type.startsWith('tool:') ||\n type.startsWith('submission:')\n ) {\n return channels.message;\n }\n if (type === 'rpc' || type.startsWith('rpc:')) return channels.rpc;\n if (type.startsWith('state:')) return channels.state;\n if (type.startsWith('email:')) return channels.email;\n return channels.lifecycle;\n}\n\nexport const genericObservability: Observability = {\n emit(event) {\n getChannel(event.type).publish(event);\n },\n};\n\nexport function subscribe<K extends keyof ChannelEventMap>(\n channelKey: K,\n callback: (event: ChannelEventMap[K]) => void,\n): () => void {\n const bucket = listeners[channelKey];\n bucket.add(callback);\n return () => {\n bucket.delete(callback);\n };\n}\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"bindings-DznsCwCn.js","names":[],"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"],"sourcesContent":["/**\n * Workers AI binding instrumentation\n */\n\nimport { trace, SpanKind, SpanStatusCode } 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 // Canonical GenAI provider attribute (replaces deprecated\n // `gen_ai.system`).\n 'gen_ai.provider.name': '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(\n span,\n 'gen_ai.usage.input_tokens',\n Number(result.usage.prompt_tokens),\n );\n }\n if (result?.usage?.completion_tokens !== undefined) {\n setAttr(\n span,\n 'gen_ai.usage.output_tokens',\n Number(result.usage.completion_tokens),\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:\n 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 { trace, SpanKind, SpanStatusCode } from '@opentelemetry/api';\nimport type { WorkerTracer } from 'autotel-edge';\nimport { wrap, setAttr } from './common';\n\nconst TRACED_METHODS = [\n 'query',\n 'insert',\n 'upsert',\n 'deleteByIds',\n 'getByIds',\n 'describe',\n] as const;\n\n/**\n * Instrument Vectorize index binding\n */\nexport function instrumentVectorize<T extends VectorizeIndex>(\n vectorize: T,\n indexName?: string,\n): 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 (\n typeof prop === 'string' &&\n TRACED_METHODS.includes(prop as any) &&\n typeof value === 'function'\n ) {\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 (\n (operation === 'insert' || operation === 'upsert') &&\n Array.isArray(args[0])\n ) {\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(\n span,\n 'db.vectorize.matches_count',\n result.matches.length,\n );\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:\n 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 { trace, SpanKind, SpanStatusCode } 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>(\n hyperdrive: T,\n bindingName?: string,\n): 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(\n {\n setAttribute: (k: string, v: any) => {\n if (v !== undefined && v !== null) attributes[k] = v;\n },\n },\n 'server.address',\n target.host,\n );\n setAttr(\n {\n setAttribute: (k: string, v: any) => {\n if (v !== undefined && v !== null) attributes[k] = v;\n },\n },\n 'server.port',\n target.port,\n );\n setAttr(\n {\n setAttribute: (k: string, v: any) => {\n if (v !== undefined && v !== null) attributes[k] = v;\n },\n },\n 'db.user',\n target.user,\n );\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:\n 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 { trace, SpanKind, SpanStatusCode } 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>(\n queue: T,\n queueName?: string,\n): 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(\n span,\n 'messaging.message.id',\n (result as any)?.messageId,\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:\n 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)\n ? messages.length\n : 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:\n 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 { trace, SpanKind, SpanStatusCode } 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>(\n ae: T,\n datasetName?: string,\n): 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(\n dataPoint.indexes,\n )\n ? dataPoint.indexes.length\n : 1;\n }\n if (dataPoint.doubles) {\n attributes['analytics.doubles_count'] =\n 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:\n 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 { trace, SpanKind, SpanStatusCode } 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(\n blob: ReadableStream | ArrayBuffer | Blob,\n ): 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(\n transformer: ImageTransformerLike,\n meta: PipelineMeta,\n bindingName: string,\n): ImageTransformerLike {\n const handler: ProxyHandler<ImageTransformerLike> = {\n get(target, prop) {\n const value = Reflect.get(target, prop);\n\n if (\n (prop === 'transform' || prop === 'draw') &&\n typeof value === 'function'\n ) {\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 (\n result === target ||\n (result && typeof result === 'object' && 'output' in result)\n ) {\n return proxyTransformer(\n result as ImageTransformerLike,\n meta,\n bindingName,\n );\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:\n 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>(\n images: T,\n bindingName?: string,\n): 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:\n 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(\n fnTarget,\n target,\n args,\n ) 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 { trace, SpanKind, SpanStatusCode } 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(\n query: string,\n mode: DbStatementCapture,\n): string | undefined {\n if (mode === 'off') return undefined;\n if (mode === 'obfuscated')\n 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>(\n kv: K,\n namespaceName?: string,\n): 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 [\n string,\n KVNamespaceGetOptions<unknown> | undefined,\n ];\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(\n 'db.result.type',\n result === null ? 'null' : typeof result,\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:\n 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 [\n string,\n unknown,\n KVNamespacePutOptions | undefined,\n ];\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:\n 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:\n 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:\n 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>(\n r2: R,\n bucketName?: string,\n): 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(\n 'db.result.content_type',\n result.httpMetadata?.contentType,\n );\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:\n 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 [\n string,\n (\n | ReadableStream\n | ArrayBuffer\n | ArrayBufferView\n | string\n | null\n | Blob\n ),\n R2PutOptions | undefined,\n ];\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:\n 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:\n 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(\n 'db.result.objects_count',\n result.objects.length,\n );\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:\n 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>(\n d1: D,\n databaseName?: string,\n): 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 (\n prop === 'first' ||\n prop === 'run' ||\n prop === 'all' ||\n prop === 'raw'\n ) {\n return new Proxy(value, {\n apply: (fnTarget, _thisArg, args) => {\n const activeConfig = getActiveConfig();\n const captureMode: DbStatementCapture =\n 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(\n fnTarget,\n target,\n args,\n );\n if (prop === 'all' && Array.isArray(result)) {\n span.setAttribute(\n 'db.result.rows_count',\n result.length,\n );\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:\n error instanceof Error\n ? error.message\n : 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 =\n 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:\n 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 *\n * Unlike other bindings, Fetcher objects are native Cloudflare C++ bindings\n * whose methods throw \"Illegal invocation\" when called through a Proxy with\n * a different `this` reference. We work around this by calling `target.fetch()`\n * directly on the original binding instead of using `Reflect.apply` on a\n * detached function reference.\n */\nexport function instrumentServiceBinding<F extends Fetcher>(\n fetcher: F,\n serviceName?: string,\n): F {\n const name = serviceName || 'service';\n\n const fetcherHandler: ProxyHandler<F> = {\n get(target, prop) {\n if (prop === 'fetch' && typeof target.fetch === 'function') {\n // Return a plain function wrapper instead of proxying the native method.\n // This avoids detaching the native method from its binding, which would\n // cause \"Illegal invocation\" on Cloudflare's native Fetcher objects.\n const tracedFetch = (...args: any[]) => {\n const [input, init] = args as [\n RequestInfo | URL,\n RequestInit | undefined,\n ];\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 // Call fetch directly on the original target to preserve\n // the native `this` binding that Cloudflare requires\n const response = await target.fetch(input, init as RequestInit);\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:\n error instanceof Error ? error.message : String(error),\n });\n throw error;\n } finally {\n span.end();\n }\n },\n );\n };\n return tracedFetch;\n }\n\n // For non-fetch properties, access the original target directly\n // to avoid Proxy-related issues with native bindings\n const value = Reflect.get(target, prop);\n if (typeof value === 'function') {\n // Bind native methods to the original target to prevent\n // \"Illegal invocation\" errors\n return value.bind(target);\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(\n env: Record<string, any>,\n): 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 (\n hasExactMethods(value, ['get', 'put', 'delete', 'list']) &&\n !('head' in value)\n ) {\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 (\n hasMethod(value, 'connect') &&\n 'connectionString' in value &&\n 'host' in value\n ) {\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(\n value as AnalyticsEngineDataset,\n key,\n );\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 * Rate Limiter binding instrumentation\n */\n\nimport { trace, SpanKind, SpanStatusCode } 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>(\n limiter: T,\n bindingName?: string,\n): 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:\n 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 { trace, SpanKind, SpanStatusCode } 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>(\n browser: T,\n bindingName?: string,\n): 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 [\n RequestInfo | URL,\n RequestInit | undefined,\n ];\n const url =\n typeof input === 'string'\n ? input\n : input instanceof URL\n ? input.toString()\n : 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:\n 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"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"bindings-xEZcXo5r.d.ts","names":[],"sources":["../src/bindings/bindings.ts","../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/rate-limiter.ts","../src/bindings/browser-rendering.ts"],"mappings":";;;;;;;;;;;;;;;;;;;;;;iBAkDgB,aAAa,UAAU,aACrC,IAAI,GACJ,yBACC;;;;iBA2La,aAAa,UAAU,UACrC,IAAI,GACJ,sBACC;;;;iBA0Ma,aAAa,UAAU,YACrC,IAAI,GACJ,wBACC;;;;;;;;;;iBA0Ja,yBAAyB,UAAU,SACjD,SAAS,GACT,uBACC;iBAkGa,mBACd,KAAK,sBACJ;;;;;;;;;iBCtrBa,aAAa,UAAU,IAAI,IAAI,GAAG,uBAAuB;;;;;;;;;iBCSzD,oBAAoB,UAAU,gBAC5C,WAAW,GACX,qBACC;;;;;;;;;iBCZa,qBAAqB,UAAU,YAC7C,YAAY,GACZ,uBACC;;;;;;;;;iBCHa,wBAAwB,UAAU,OAChD,OAAO,GACP,qBACC;;;;;;;;;iBCHa,0BAA0B,UAAU,wBAClD,IAAI,GACJ,uBACC;;;;;;;;;;UCIO;EACR,KACE,MAAM,iBAAiB,cAAc,OACpC;IAAU;IAAe;IAAgB;;EAC5C,MAAM,MAAM,iBAAiB,cAAc,OAAO;;UAG1C;EACR,UAAU,mBAAmB;EAC7B,KAAK,gBAAgB,oBAAoB;EACzC,OAAO,oBAAoB,QAAQ;;UAG3B;EACR,YAAY;EACZ,QAAQ,QAAQ;EAChB,eAAe,QAAQ;;;;;iBAoGT,iBAAiB,UAAU,YACzC,QAAQ,GACR,uBACC;;;;;;UCjIO;EACR,MAAM;IAAW;MAAgB;IAAU;;;;;;iBAM7B,sBAAsB,UAAU,iBAC9C,SAAS,GACT,uBACC;;;;;;UCVO;EACR,MAAM,OAAO,cAAc,KAAK,OAAO,cAAc,QAAQ;;;;;iBAM/C,2BAA2B,UAAU,sBACnD,SAAS,GACT,uBACC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"common-DiWH6nmG.js","names":[],"sources":["../src/bindings/common.ts"],"sourcesContent":["/**\n * Common instrumentation utilities\n */\n\n/**\n * Promise tracker for waitUntil\n */\nexport class PromiseTracker {\n private promises: Promise<unknown>[] = [];\n\n track(promise: Promise<unknown>): void {\n this.promises.push(promise);\n }\n\n async wait(): Promise<void> {\n await Promise.allSettled(this.promises);\n }\n}\n\n/**\n * Proxy ExecutionContext to track waitUntil promises\n */\nexport function proxyExecutionContext(ctx: ExecutionContext): {\n ctx: ExecutionContext;\n tracker: PromiseTracker;\n} {\n const tracker = new PromiseTracker();\n\n const proxied = new Proxy(ctx, {\n get(target, prop) {\n if (prop === 'waitUntil') {\n return (promise: Promise<unknown>) => {\n tracker.track(promise);\n return target.waitUntil(promise);\n };\n }\n return Reflect.get(target, prop);\n },\n });\n\n return { ctx: proxied, tracker };\n}\n\n/**\n * Helper to wrap/unwrap proxied objects\n */\nconst unwrapSymbol = Symbol('unwrap');\n\ntype Wrapped<T> = { [unwrapSymbol]: T } & T;\n\nexport function isWrapped<T>(item: T): item is Wrapped<T> {\n return item && !!(item as Wrapped<T>)[unwrapSymbol];\n}\n\nexport function unwrap<T extends object>(item: T): T {\n if (item && isWrapped(item)) {\n return item[unwrapSymbol];\n } else {\n return item;\n }\n}\n\n/**\n * Set attribute only if value is defined and non-null\n */\nexport function setAttr(\n span: { setAttribute: (key: string, value: any) => void },\n key: string,\n value: unknown,\n): void {\n if (value !== undefined && value !== null) {\n span.setAttribute(key, value);\n }\n}\n\nexport function wrap<T extends object>(\n item: T,\n handler: ProxyHandler<T>,\n): Wrapped<T> {\n const proxy = new Proxy(item, handler) as Wrapped<T>;\n Object.defineProperty(proxy, unwrapSymbol, {\n value: item,\n writable: false,\n enumerable: false,\n configurable: false,\n });\n return proxy;\n}\n"],"mappings":";;;;;;;AAOA,IAAa,iBAAb,MAA4B;CAC1B,AAAQ,WAA+B,CAAC;CAExC,MAAM,SAAiC;EACrC,KAAK,SAAS,KAAK,OAAO;CAC5B;CAEA,MAAM,OAAsB;EAC1B,MAAM,QAAQ,WAAW,KAAK,QAAQ;CACxC;AACF;;;;AAKA,SAAgB,sBAAsB,KAGpC;CACA,MAAM,UAAU,IAAI,eAAe;CAcnC,OAAO;EAAE,KAAK,IAZM,MAAM,KAAK,EAC7B,IAAI,QAAQ,MAAM;GAChB,IAAI,SAAS,aACX,QAAQ,YAA8B;IACpC,QAAQ,MAAM,OAAO;IACrB,OAAO,OAAO,UAAU,OAAO;GACjC;GAEF,OAAO,QAAQ,IAAI,QAAQ,IAAI;EACjC,EACF,CAEoB;EAAG;CAAQ;AACjC;;;;AAKA,MAAM,eAAe,OAAO,QAAQ;AAIpC,SAAgB,UAAa,MAA6B;CACxD,OAAO,QAAQ,CAAC,CAAE,KAAoB;AACxC;AAEA,SAAgB,OAAyB,MAAY;CACnD,IAAI,QAAQ,UAAU,IAAI,GACxB,OAAO,KAAK;MAEZ,OAAO;AAEX;;;;AAKA,SAAgB,QACd,MACA,KACA,OACM;CACN,IAAI,UAAU,UAAa,UAAU,MACnC,KAAK,aAAa,KAAK,KAAK;AAEhC;AAEA,SAAgB,KACd,MACA,SACY;CACZ,MAAM,QAAQ,IAAI,MAAM,MAAM,OAAO;CACrC,OAAO,eAAe,OAAO,cAAc;EACzC,OAAO;EACP,UAAU;EACV,YAAY;EACZ,cAAc;CAChB,CAAC;CACD,OAAO;AACT"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"execution-logger-BxmgP8jF.js","names":[],"sources":["../src/execution-logger.ts"],"sourcesContent":["import {\n type ExecutionLogger,\n type ExecutionLoggerOptions,\n type ExecutionLogSnapshot,\n getExecutionLogger,\n type TraceContext,\n} from 'autotel-edge/logger';\n\nexport type { ExecutionLogger, ExecutionLoggerOptions, ExecutionLogSnapshot };\n\nexport interface WorkersLoggerOptions {\n /** Override derived request id (default: cf-ray header value when present). */\n requestId?: string;\n /** Optional request header allowlist to include in logger context. */\n headers?: string[];\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction collectHeaders(\n headers: Headers,\n include: string[] | undefined,\n): Record<string, string> | undefined {\n if (!include || include.length === 0) return undefined;\n\n const allowlist = new Set(include.map((h) => h.toLowerCase()));\n const out: Record<string, string> = {};\n headers.forEach((value, key) => {\n if (allowlist.has(key.toLowerCase())) {\n out[key] = value;\n }\n });\n\n return Object.keys(out).length > 0 ? out : undefined;\n}\n\nfunction pickCfContext(request: Request): Record<string, unknown> {\n const cf = Reflect.get(request, 'cf');\n if (!isRecord(cf)) return {};\n\n const out: Record<string, unknown> = {};\n if (typeof cf.colo === 'string') out.colo = cf.colo;\n if (typeof cf.country === 'string') out.country = cf.country;\n if (typeof cf.asn === 'number') out.asn = cf.asn;\n if (typeof cf.city === 'string') out.city = cf.city;\n if (typeof cf.region === 'string') out.region = cf.region;\n return out;\n}\n\n/**\n * Create an execution logger pre-populated with common request context.\n * Best used from fetch handlers that already run inside autotel span context.\n */\nexport function createWorkersLogger(\n request: Request,\n options: WorkersLoggerOptions = {},\n ctx?: TraceContext,\n): ExecutionLogger {\n const log = getExecutionLogger(ctx);\n const url = new URL(request.url);\n const cfRay = request.headers.get('cf-ray') ?? undefined;\n const traceparent = request.headers.get('traceparent') ?? undefined;\n\n log.set({\n request: {\n method: request.method,\n path: url.pathname,\n url: request.url,\n requestId: options.requestId ?? cfRay,\n headers: collectHeaders(request.headers, options.headers),\n },\n cfRay,\n traceparent,\n ...pickCfContext(request),\n });\n\n return log;\n}\n\nexport function getRequestLogger(\n ctx?: TraceContext,\n options?: ExecutionLoggerOptions,\n): ExecutionLogger {\n return getExecutionLogger(ctx, options);\n}\n\nexport function getQueueLogger(\n ctx?: TraceContext,\n options?: ExecutionLoggerOptions,\n): ExecutionLogger {\n return getExecutionLogger(ctx, options);\n}\n\nexport function getWorkflowLogger(\n ctx?: TraceContext,\n options?: ExecutionLoggerOptions,\n): ExecutionLogger {\n return getExecutionLogger(ctx, options);\n}\n\nexport function getActorLogger(\n ctx?: TraceContext,\n options?: ExecutionLoggerOptions,\n): ExecutionLogger {\n return getExecutionLogger(ctx, options);\n}\n"],"mappings":";;;AAiBA,SAAS,SAAS,OAAkD;CAClE,OAAO,OAAO,UAAU,YAAY,UAAU,QAAQ,CAAC,MAAM,QAAQ,KAAK;AAC5E;AAEA,SAAS,eACP,SACA,SACoC;CACpC,IAAI,CAAC,WAAW,QAAQ,WAAW,GAAG,OAAO;CAE7C,MAAM,YAAY,IAAI,IAAI,QAAQ,KAAK,MAAM,EAAE,YAAY,CAAC,CAAC;CAC7D,MAAM,MAA8B,CAAC;CACrC,QAAQ,SAAS,OAAO,QAAQ;EAC9B,IAAI,UAAU,IAAI,IAAI,YAAY,CAAC,GACjC,IAAI,OAAO;CAEf,CAAC;CAED,OAAO,OAAO,KAAK,GAAG,CAAC,CAAC,SAAS,IAAI,MAAM;AAC7C;AAEA,SAAS,cAAc,SAA2C;CAChE,MAAM,KAAK,QAAQ,IAAI,SAAS,IAAI;CACpC,IAAI,CAAC,SAAS,EAAE,GAAG,OAAO,CAAC;CAE3B,MAAM,MAA+B,CAAC;CACtC,IAAI,OAAO,GAAG,SAAS,UAAU,IAAI,OAAO,GAAG;CAC/C,IAAI,OAAO,GAAG,YAAY,UAAU,IAAI,UAAU,GAAG;CACrD,IAAI,OAAO,GAAG,QAAQ,UAAU,IAAI,MAAM,GAAG;CAC7C,IAAI,OAAO,GAAG,SAAS,UAAU,IAAI,OAAO,GAAG;CAC/C,IAAI,OAAO,GAAG,WAAW,UAAU,IAAI,SAAS,GAAG;CACnD,OAAO;AACT;;;;;AAMA,SAAgB,oBACd,SACA,UAAgC,CAAC,GACjC,KACiB;CACjB,MAAM,MAAM,mBAAmB,GAAG;CAClC,MAAM,MAAM,IAAI,IAAI,QAAQ,GAAG;CAC/B,MAAM,QAAQ,QAAQ,QAAQ,IAAI,QAAQ,KAAK;CAC/C,MAAM,cAAc,QAAQ,QAAQ,IAAI,aAAa,KAAK;CAE1D,IAAI,IAAI;EACN,SAAS;GACP,QAAQ,QAAQ;GAChB,MAAM,IAAI;GACV,KAAK,QAAQ;GACb,WAAW,QAAQ,aAAa;GAChC,SAAS,eAAe,QAAQ,SAAS,QAAQ,OAAO;EAC1D;EACA;EACA;EACA,GAAG,cAAc,OAAO;CAC1B,CAAC;CAED,OAAO;AACT;AAEA,SAAgB,iBACd,KACA,SACiB;CACjB,OAAO,mBAAmB,KAAK,OAAO;AACxC;AAEA,SAAgB,eACd,KACA,SACiB;CACjB,OAAO,mBAAmB,KAAK,OAAO;AACxC;AAEA,SAAgB,kBACd,KACA,SACiB;CACjB,OAAO,mBAAmB,KAAK,OAAO;AACxC;AAEA,SAAgB,eACd,KACA,SACiB;CACjB,OAAO,mBAAmB,KAAK,OAAO;AACxC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"execution-logger-CCn9HGYC.d.ts","names":[],"sources":["../src/execution-logger.ts"],"mappings":";;UAUiB;;EAEf;;EAEA;;;;;;iBAyCc,oBACd,SAAS,SACT,UAAS,sBACT,MAAM,eACL;iBAsBa,iBACd,MAAM,cACN,UAAU,yBACT;iBAIa,eACd,MAAM,cACN,UAAU,yBACT;iBAIa,kBACd,MAAM,cACN,UAAU,yBACT;iBAIa,eACd,MAAM,cACN,UAAU,yBACT"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"handlers-BRfAgfP7.d.ts","names":[],"sources":["../src/handlers/durable-objects.ts","../src/handlers/workflows.ts"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBA8NgB,aAAa,kBAAkB,qBAC7C,SAAS,GACT,QAAQ,sBACP;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBCsFa,mBAAmB,kBAAkB,qBACnD,eAAe,GACf,sBACA,QAAQ,sBACP"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"handlers-BePc7OJU.js","names":["coldStarts","isColdStart","api_context","context","context","api_context"],"sources":["../src/handlers/durable-objects.ts","../src/handlers/workflows.ts"],"sourcesContent":["/**\n * Durable Objects instrumentation for Cloudflare Workers\n *\n * Note: This file uses Cloudflare Workers types (DurableObjectId, DurableObjectState, 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\nimport {\n trace,\n context as api_context,\n propagation,\n SpanStatusCode,\n SpanKind,\n} from '@opentelemetry/api';\nimport type { ConfigurationOption } from 'autotel-edge';\nimport { createInitialiser, setConfig, WorkerTracer } from 'autotel-edge';\nimport { wrap } from '../bindings/common';\n\n// Durable Object types\ntype DOFetchFn = (request: Request) => Response | Promise<Response>;\ntype DOAlarmFn = () => void | Promise<void>;\n\n/**\n * Track cold starts per DO class\n */\nconst coldStarts = new WeakMap<any, boolean>();\n\nfunction isColdStart(doClass: any): boolean {\n if (!coldStarts.has(doClass)) {\n coldStarts.set(doClass, true);\n return true;\n }\n return false;\n}\n\n/**\n * Instrument a Durable Object fetch method\n */\nfunction instrumentDOFetch(\n fetchFn: DOFetchFn,\n id: DurableObjectId,\n doClass: any,\n): DOFetchFn {\n return async function instrumentedFetch(\n this: any,\n request: Request,\n ): Promise<Response> {\n const tracer = trace.getTracer('autotel-edge') as WorkerTracer;\n\n // Extract parent context from request headers\n const parentContext = propagation.extract(\n api_context.active(),\n request.headers,\n );\n\n const url = new URL(request.url);\n const spanName = `DO ${id.name || id.toString()}: ${request.method} ${url.pathname}`;\n\n return tracer.startActiveSpan(\n spanName,\n {\n kind: SpanKind.SERVER,\n attributes: {\n 'http.request.method': request.method,\n 'url.full': request.url,\n 'do.id': id.toString(),\n 'do.id.name': id.name || '',\n 'faas.trigger': 'http',\n 'faas.coldstart': isColdStart(doClass),\n },\n },\n parentContext,\n async (span) => {\n try {\n const response = await fetchFn.call(this, request);\n\n span.setAttributes({\n 'http.response.status_code': response.status,\n });\n\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\n/**\n * Instrument a Durable Object alarm method\n */\nfunction instrumentDOAlarm(\n alarmFn: DOAlarmFn,\n id: DurableObjectId,\n doClass: any,\n): DOAlarmFn {\n return async function instrumentedAlarm(this: any): Promise<void> {\n const tracer = trace.getTracer('autotel-edge') as WorkerTracer;\n\n const spanName = `DO ${id.name || id.toString()}: alarm`;\n\n return tracer.startActiveSpan(\n spanName,\n {\n kind: SpanKind.INTERNAL,\n attributes: {\n 'do.id': id.toString(),\n 'do.id.name': id.name || '',\n 'faas.trigger': 'timer',\n 'faas.coldstart': isColdStart(doClass),\n },\n },\n async (span) => {\n try {\n await alarmFn.call(this);\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 * Instrument a Durable Object instance\n */\nfunction instrumentDOInstance(\n doInstance: any,\n state: DurableObjectState,\n _env: any,\n doClass: any,\n): any {\n const instanceHandler: ProxyHandler<any> = {\n get(target, prop) {\n const value = Reflect.get(target, prop);\n\n if (prop === 'fetch' && typeof value === 'function') {\n return instrumentDOFetch(value.bind(target), state.id, doClass);\n }\n\n if (prop === 'alarm' && typeof value === 'function') {\n return instrumentDOAlarm(value.bind(target), state.id, doClass);\n }\n\n // Bind other methods to the target\n if (typeof value === 'function') {\n return value.bind(target);\n }\n\n return value;\n },\n };\n\n return wrap(doInstance, instanceHandler);\n}\n\n/**\n * Instrument a Durable Object class\n *\n * This wraps the DO class to automatically trace all fetch and alarm calls,\n * as well as initialize the telemetry configuration.\n *\n * **Usage:**\n * ```typescript\n * import { DurableObject } from 'cloudflare:workers'\n * import { instrumentDO } from 'autotel-edge'\n *\n * export class Counter extends DurableObject<Env> {\n * async fetch(request: Request) {\n * // Your DO logic here\n * return new Response('OK')\n * }\n * }\n *\n * // Wrap the class before exporting\n * export const CounterDO = instrumentDO(Counter, (env: Env) => ({\n * exporter: {\n * url: env.OTLP_ENDPOINT,\n * headers: { 'x-api-key': env.API_KEY }\n * },\n * service: {\n * name: 'my-durable-object',\n * version: '1.0.0'\n * }\n * }))\n * ```\n *\n * **What you get:**\n * - 🎯 Automatic spans for fetch() calls with HTTP attributes\n * - ⏰ Automatic spans for alarm() calls\n * - 🥶 Cold start tracking\n * - 🔗 Context propagation from incoming requests\n * - ⚡ Automatic span lifecycle management\n *\n * @param doClass - The Durable Object class to instrument\n * @param config - Configuration or configuration function\n * @returns Instrumented Durable Object class\n */\nexport function instrumentDO<C extends new (...args: any[]) => any>(\n doClass: C,\n config: ConfigurationOption,\n): C {\n const initialiser = createInitialiser(config);\n\n const classHandler: ProxyHandler<C> = {\n construct(target, [state, env]: [DurableObjectState, any]) {\n // Initialize config for this DO instance\n const trigger = {\n id: state.id.toString(),\n name: state.id.name,\n };\n const doConfig = initialiser(env, trigger);\n const context = setConfig(doConfig);\n\n // Create the DO instance within the config context\n const doInstance = api_context.with(context, () => {\n return new target(state, env);\n });\n\n // Instrument the instance\n return instrumentDOInstance(doInstance, state, env, doClass);\n },\n };\n\n return wrap(doClass, classHandler);\n}\n","/**\n * Cloudflare Workflows instrumentation for autotel-edge\n *\n * Instruments WorkflowEntrypoint classes to automatically trace workflow execution,\n * step operations, retries, and sleeps.\n *\n * Based on Cloudflare Workflows API:\n * https://developers.cloudflare.com/workflows/\n */\n\nimport {\n trace,\n context as api_context,\n SpanStatusCode,\n SpanKind,\n} from '@opentelemetry/api';\nimport type { WorkflowEvent, WorkflowStep } from 'cloudflare:workers';\nimport type { ConfigurationOption, WorkflowTrigger } from 'autotel-edge';\nimport { createInitialiser, setConfig, WorkerTracer } from 'autotel-edge';\nimport { wrap } from '../bindings/common';\n\ntype WorkflowRunFn = (\n event: Readonly<WorkflowEvent<unknown>>,\n step: WorkflowStep,\n) => Promise<unknown> | void;\n\n/**\n * Track cold starts per Workflow class\n */\nconst coldStarts = new WeakMap<object, boolean>();\n\nfunction isColdStart(workflowClass: object): boolean {\n if (!coldStarts.has(workflowClass)) {\n coldStarts.set(workflowClass, true);\n return true;\n }\n return false;\n}\n\n/**\n * Proxy the step object to instrument step.do(), step.sleep(), and step.sleepUntil() calls\n */\nfunction instrumentWorkflowStep(\n step: WorkflowStep,\n workflowName: string,\n): WorkflowStep {\n const stepHandler: ProxyHandler<WorkflowStep> = {\n get(target, prop) {\n const value = Reflect.get(target, prop);\n\n // Instrument step.do() to create spans for each workflow step\n if (prop === 'do' && typeof value === 'function') {\n return new Proxy(value, {\n apply: (fnTarget, thisArg, args) => {\n const [stepName] = args as [string, ...unknown[]];\n\n const tracer = trace.getTracer('autotel-edge') as WorkerTracer;\n\n return tracer.startActiveSpan(\n `Workflow ${workflowName}: ${stepName}`,\n {\n kind: SpanKind.INTERNAL,\n attributes: {\n 'workflow.step.name': stepName,\n 'workflow.name': workflowName,\n },\n },\n async (span) => {\n try {\n const result = await Reflect.apply(fnTarget, thisArg, 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:\n error instanceof Error ? error.message : String(error),\n });\n throw error;\n } finally {\n span.end();\n }\n },\n );\n },\n });\n }\n\n // Instrument step.sleep() to track workflow delays\n if (prop === 'sleep' && typeof value === 'function') {\n return new Proxy(value, {\n apply: (fnTarget, thisArg, args) => {\n const [sleepName, duration] = args as [string, string | number];\n\n const tracer = trace.getTracer('autotel-edge') as WorkerTracer;\n\n return tracer.startActiveSpan(\n `Workflow ${workflowName}: sleep ${sleepName}`,\n {\n kind: SpanKind.INTERNAL,\n attributes: {\n 'workflow.sleep.name': sleepName,\n 'workflow.sleep.duration': String(duration),\n 'workflow.name': workflowName,\n },\n },\n async (span) => {\n try {\n const result = await Reflect.apply(fnTarget, thisArg, 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:\n 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 === 'sleepUntil' && typeof value === 'function') {\n return new Proxy(value, {\n apply: (fnTarget, thisArg, args) => {\n const [sleepName, timestamp] = args as [string, Date | number];\n\n const tracer = trace.getTracer('autotel-edge') as WorkerTracer;\n const wakeAt =\n timestamp instanceof Date\n ? timestamp.toISOString()\n : new Date(timestamp).toISOString();\n\n return tracer.startActiveSpan(\n `Workflow ${workflowName}: sleepUntil ${sleepName}`,\n {\n kind: SpanKind.INTERNAL,\n attributes: {\n 'workflow.sleep.name': sleepName,\n 'workflow.sleep.until': wakeAt,\n 'workflow.name': workflowName,\n },\n },\n async (span) => {\n try {\n const result = await Reflect.apply(fnTarget, thisArg, 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:\n error instanceof Error ? error.message : String(error),\n });\n throw error;\n } finally {\n span.end();\n }\n },\n );\n },\n });\n }\n\n // Pass through other step methods\n if (typeof value === 'function') {\n return value.bind(target);\n }\n\n return value;\n },\n };\n\n return wrap(step, stepHandler);\n}\n\n/**\n * Instrument a Workflow run method\n */\nfunction instrumentWorkflowRun(\n runFn: WorkflowRunFn,\n workflowName: string,\n workflowClass: object,\n): WorkflowRunFn {\n return async function instrumentedRun(\n this: unknown,\n event: Readonly<WorkflowEvent<unknown>>,\n step: WorkflowStep,\n ): Promise<unknown> {\n const tracer = trace.getTracer('autotel-edge') as WorkerTracer;\n\n // Instrument the step object to track individual operations\n const instrumentedStep = instrumentWorkflowStep(step, workflowName);\n\n const spanName = `Workflow ${workflowName}: run`;\n\n return tracer.startActiveSpan(\n spanName,\n {\n kind: SpanKind.INTERNAL,\n attributes: {\n 'workflow.name': workflowName,\n 'workflow.instance_id': event.instanceId,\n 'faas.trigger': 'workflow',\n 'faas.coldstart': isColdStart(workflowClass),\n },\n },\n async (span) => {\n try {\n const result = await runFn.call(this, event, instrumentedStep);\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 * Instrument a Workflow instance\n */\nfunction instrumentWorkflowInstance(\n workflowInstance: Record<string, unknown>,\n workflowName: string,\n workflowClass: object,\n): Record<string, unknown> {\n const instanceHandler: ProxyHandler<Record<string, unknown>> = {\n get(target, prop) {\n const value = Reflect.get(target, prop);\n\n if (prop === 'run' && typeof value === 'function') {\n return instrumentWorkflowRun(\n value.bind(target) as WorkflowRunFn,\n workflowName,\n workflowClass,\n );\n }\n\n // Bind other methods to the target\n if (typeof value === 'function') {\n return value.bind(target);\n }\n\n return value;\n },\n };\n\n return wrap(workflowInstance, instanceHandler);\n}\n\n/**\n * Instrument a Cloudflare Workflow class\n *\n * This wraps the WorkflowEntrypoint class to automatically trace workflow execution,\n * step operations, retries, and sleeps.\n *\n * **Usage:**\n * ```typescript\n * import { WorkflowEntrypoint } from 'cloudflare:workers'\n * import { instrumentWorkflow } from 'autotel-cloudflare/handlers'\n *\n * class MyWorkflow extends WorkflowEntrypoint {\n * async run(event, step) {\n * await step.do('submit payment', async () => {\n * return await submitToPaymentProcessor(event.payload.payment)\n * })\n *\n * await step.sleep('wait for feedback', '2 days')\n *\n * await step.do('send feedback email', sendFeedbackEmail)\n * }\n * }\n *\n * export const CheckoutWorkflow = instrumentWorkflow(\n * MyWorkflow,\n * 'checkout-workflow',\n * (env: Env) => ({\n * exporter: {\n * url: env.OTLP_ENDPOINT,\n * headers: { 'x-api-key': env.API_KEY }\n * },\n * service: {\n * name: 'checkout-workflow',\n * version: '1.0.0'\n * }\n * })\n * )\n * ```\n *\n * @param workflowClass - The WorkflowEntrypoint class to instrument\n * @param workflowName - The name of the workflow (used in span names)\n * @param config - Configuration or configuration function\n * @returns Instrumented Workflow class\n */\nexport function instrumentWorkflow<C extends new (...args: any[]) => any>(\n workflowClass: C,\n workflowName: string,\n config: ConfigurationOption,\n): C {\n const initialiser = createInitialiser(config);\n\n const classHandler: ProxyHandler<C> = {\n construct(target, args: any[]) {\n // Extract env from constructor args (typically last arg)\n const env = args[args.length - 1] || {};\n\n const trigger: WorkflowTrigger = { type: 'workflow', name: workflowName };\n const workflowConfig = initialiser(env, trigger);\n const context = setConfig(workflowConfig);\n\n // Create the workflow instance within the config context\n const workflowInstance = api_context.with(context, () => {\n return new target(...args);\n });\n\n // Instrument the instance\n return instrumentWorkflowInstance(\n workflowInstance,\n workflowName,\n workflowClass,\n );\n },\n };\n\n return wrap(workflowClass, classHandler);\n}\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","names":[],"sources":["../src/wrappers/instrument.ts","../src/wrappers/wrap-module.ts","../src/wrappers/wrap-do.ts","../src/wrappers/define-worker-fetch.ts","../src/global/fetch.ts","../src/global/cache.ts"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBA4zBgB,WAAW,GAAG,SAAS,SACrC,SAAS,gBAAgB,GAAG,GAAG,IAC/B,QAAQ,sBACP,gBAAgB,GAAG,GAAG;;;;;;;;;;;iBChyBT,WAAW,GAAG,SAAS,SACrC,QAAQ,qBACR,SAAS,gBAAgB,GAAG,GAAG,KAC9B,gBAAgB,GAAG,GAAG;;;;;;;;;;;iBCNT,kBAAkB,UAAU,eAC1C,QAAQ,qBACR,cAAc,OAAO,oBAAoB,aAAa,SAChD,OAAO,oBAAoB,aAAa;;;KCEpC,2BAA2B;KAE3B,mBAAmB,MAC7B,SAAS,SACT,KAAK,GACL,KAAK,kBACL,KAAK,oBACF,WAAW,QAAQ;;;;;;iBAOR,kBAAkB,aAChC,QAAQ,qBACR,SAAS,mBAAmB,IAC5B,gBAAe;EAEf,QAAQ,SAAS,SAAS,KAAK,GAAG,KAAK,qBAAqB,QAAQ;;;;;;;;;;;;;;;;;;;;;iBCMtD;;;;;;;;;;;;;;;;;;;iBCoFA"}
package/dist/index.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","names":["api_context","api_context","context"],"sources":["../src/global/fetch.ts","../src/global/cache.ts","../src/wrappers/instrument.ts","../src/wrappers/wrap-module.ts","../src/wrappers/wrap-do.ts","../src/wrappers/define-worker-fetch.ts"],"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':\n 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 RouteServiceConfig,\n} from 'autotel-edge';\nimport {\n createInitialiser,\n setConfig,\n getActiveConfig,\n getServiceForPath,\n shouldInstrumentPath,\n withNativeTracer,\n ensureGlobalContextManager,\n type Initialiser,\n type NativeTracer,\n WorkerTracerProvider,\n WorkerTracer,\n} from 'autotel-edge';\nimport { getNativeTracerFromCtx } from '../native/native-tracing';\nimport {\n proxyExecutionContext,\n unwrap,\n wrap,\n type PromiseTracker,\n} from '../bindings/common';\nimport { instrumentGlobalFetch } from '../global/fetch';\nimport { instrumentGlobalCache } from '../global/cache';\nimport { instrumentBindings } from '../bindings/bindings';\nimport type { Attributes, Span, TextMapGetter } from '@opentelemetry/api';\n\n// Web API Headers objects require .get() — property access via defaultTextMapGetter won't work\nconst headersGetter: TextMapGetter<Headers> = {\n get: (carrier, key) => carrier.get(key) ?? undefined,\n keys: (carrier) => [...carrier.keys()],\n};\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 * Create fetch handler instrumentation with config support for postProcess\n */\n/**\n * Extract Cloudflare-specific attributes from a request\n */\nfunction extractCfAttributes(\n request: Request,\n): 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 const routeService = getServiceForPath(\n url.pathname,\n config.handlers.fetch.routes as\n Record<string, RouteServiceConfig> | undefined,\n );\n\n const cfAttrs =\n (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 ...(routeService\n ? {\n 'service.name': routeService,\n 'autotel.route.service': routeService,\n }\n : {}),\n ...cfAttrs,\n },\n },\n context: propagation.extract(\n api_context.active(),\n request.headers,\n headersGetter,\n ),\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<\n ScheduledController,\n void\n> = {\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>(\n msg: Message<Q>,\n count: MessageStatusCount,\n): 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 } | 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(\n 'queue.message.content_type',\n retryOptions.contentType,\n );\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(\n batch: MessageBatch,\n count: MessageStatusCount,\n): 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\n { 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<\n MessageBatch,\n void\n> {\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: {\n headers: Headers;\n}): Record<string, string> {\n const attrs: Record<string, string> = {};\n if (message.headers instanceof Headers) {\n const config = getActiveConfig();\n const allowlist: string[] | undefined =\n 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<\n ForwardableEmailMessage,\n void\n> = {\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 * 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 & {\n scheduler?: { wait(ms: number): Promise<void> };\n };\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 {\n name,\n options,\n 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(\n name,\n options,\n parentContext,\n 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(\n exportSpans(span.spanContext().traceId, tracker, context),\n );\n }\n },\n );\n };\n}\n\nlet warnedMissingNative = false;\n\n/**\n * Resolve whether this invocation should use Cloudflare's native tracer.\n *\n * - `nativeTracing: 'off'` → never use native (always autotel's OTLP pipeline).\n * - `nativeTracing: 'on'` → require native; warn once and fall back if absent.\n * - `nativeTracing: 'auto'` (default) → use native when `ctx.tracing` exists.\n */\nfunction resolveNativeTracer(\n config: ResolvedEdgeConfig,\n ctx: ExecutionContext,\n trigger: Trigger,\n): NativeTracer | null {\n const mode = config.nativeTracing ?? 'auto';\n if (mode === 'off') {\n return null;\n }\n // Correlation id: prefer Cloudflare's ray id (also stamped on the native root\n // span + carried by the workers logger), so logs/spans/dashboard share a key.\n // Fall back to a per-invocation uuid for non-fetch triggers.\n const rayId =\n trigger instanceof Request ? trigger.headers.get('cf-ray') : null;\n const correlationId = rayId ?? crypto.randomUUID();\n const nativeTracer = getNativeTracerFromCtx(ctx, correlationId);\n if (!nativeTracer && mode === 'on' && !warnedMissingNative) {\n warnedMissingNative = true;\n console.warn(\n \"[autotel-cloudflare] nativeTracing is 'on' but Cloudflare native tracing was not detected. \" +\n 'Enable observability.traces in your Wrangler config (and use a recent compatibility_date). ' +\n 'Falling back to the autotel OTLP exporter.',\n );\n }\n return nativeTracer;\n}\n\n/**\n * Run a handler in native-tracing mode.\n *\n * Cloudflare already creates the root handler span and instruments platform\n * operations (fetch / KV / R2 / D1 / DO), so autotel defers entirely: no\n * binding proxies (avoids duplicate spans), no provider/exporter, no manual\n * flush. We install the native tracer into the active context so that the\n * user's `span()` / `trace()` / `enterSpan()` calls nest inside Cloudflare's\n * native waterfall and are exported by the platform.\n */\nfunction runWithNativeTracing<T extends Trigger, E, R>(\n handlerFn: (trigger: T, env: E, ctx: ExecutionContext) => R | Promise<R>,\n trigger: T,\n env: E,\n ctx: ExecutionContext,\n config: ResolvedEdgeConfig,\n nativeTracer: NativeTracer,\n): R | Promise<R> {\n // Register the context manager (we skip initProvider in native mode) so the\n // native tracer propagates through OTel context into span()/trace() — without\n // it, getActiveNativeTracer() returns null and custom spans never route to\n // enterSpan. Bindings are NOT proxied: Cloudflare instruments them natively.\n ensureGlobalContextManager();\n const nativeContext = withNativeTracer(nativeTracer, setConfig(config));\n return api_context.with(nativeContext, () => handlerFn(trigger, env, ctx));\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 // Prefer Cloudflare native tracing when available — defer to the platform.\n const nativeTracer = resolveNativeTracer(config, ctx, trigger);\n if (nativeTracer) {\n return runWithNativeTracing(\n handlerFn,\n trigger,\n env,\n ctx,\n config,\n nativeTracer,\n );\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<\n typeof handlerFn\n >;\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: (\n config: ResolvedEdgeConfig,\n ) => 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 if (trigger instanceof Request) {\n const pathname = new URL(trigger.url).pathname;\n const fetchCfg = config.handlers.fetch;\n if (\n !shouldInstrumentPath(pathname, {\n include: fetchCfg.include,\n exclude: fetchCfg.exclude,\n })\n ) {\n return handlerFn(trigger, env, ctx) as ReturnType<typeof handlerFn>;\n }\n }\n\n // Prefer Cloudflare native tracing when available — defer to the platform.\n const nativeTracer = resolveNativeTracer(config, ctx, trigger);\n if (nativeTracer) {\n return runWithNativeTracing(\n handlerFn,\n trigger,\n env,\n ctx,\n config,\n nativeTracer,\n ) as ReturnType<typeof handlerFn>;\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<\n typeof handlerFn\n >;\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","/**\n * Ergonomic wrapper for Cloudflare Workers `fetch` handlers.\n *\n * `defineWorkerFetch` instruments the handler the same way `instrument()` does\n * (so span exports already flush via `ctx.waitUntil`), and additionally injects\n * a request-scoped `ExecutionLogger` as the fourth argument — pre-populated\n * with method, path, cf-ray and `request.cf` context.\n *\n * Use this instead of `wrapModule` / `instrument` when your handler wants the\n * logger handed in directly rather than reaching for `getRequestLogger()`.\n *\n * @example\n * ```ts\n * import { defineWorkerFetch } from 'autotel-cloudflare'\n *\n * export default defineWorkerFetch(\n * { service: { name: 'my-worker' } },\n * async (request, env, ctx, log) => {\n * log.set({ route: '/health' })\n * log.emitNow({ status: 200 })\n * return new Response('ok')\n * },\n * )\n * ```\n */\nimport type { ConfigurationOption } from 'autotel-edge';\nimport { instrument } from './instrument';\nimport {\n createWorkersLogger,\n type WorkersLoggerOptions,\n} from '../execution-logger';\nimport type { ExecutionLogger } from '../execution-logger';\n\nexport type DefineWorkerFetchOptions = WorkersLoggerOptions;\n\nexport type WorkerFetchHandler<E> = (\n request: Request,\n env: E,\n ctx: ExecutionContext,\n log: ExecutionLogger,\n) => Response | Promise<Response>;\n\n/**\n * Wrap a Workers fetch handler so:\n * - the handler is instrumented (spans, propagation, waitUntil export flush)\n * - the handler receives a request-scoped logger as its fourth argument\n */\nexport function defineWorkerFetch<E = unknown>(\n config: ConfigurationOption,\n handler: WorkerFetchHandler<E>,\n loggerOptions: DefineWorkerFetchOptions = {},\n): {\n fetch: (request: Request, env: E, ctx: ExecutionContext) => Promise<Response>;\n} {\n const wrapped = instrument(\n {\n fetch(request: Request, env: E, ctx: ExecutionContext) {\n const log = createWorkersLogger(request, loggerOptions);\n return handler(request, env, ctx, log);\n },\n },\n config,\n );\n\n return {\n fetch(request, env, ctx) {\n return Promise.resolve(\n (\n wrapped.fetch as unknown as (\n req: Request,\n env: E,\n ctx: ExecutionContext,\n ) => Response | Promise<Response>\n )(request, env, ctx),\n );\n },\n };\n}\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"native-tracing-D0EyAtsF.js","names":[],"sources":["../src/native/native-tracing.ts"],"sourcesContent":["/**\n * Cloudflare native tracing adapter\n *\n * Bridges Cloudflare Workers' built-in custom-span API\n * (`ctx.tracing.enterSpan()` / `import { tracing } from \"cloudflare:workers\"`)\n * to autotel-edge's runtime-agnostic {@link NativeTracer} seam.\n *\n * When a Worker has tracing enabled (`observability.traces.enabled = true` in\n * Wrangler) the runtime exposes `ctx.tracing`. The handler wrappers detect it,\n * wrap it as a {@link NativeTracer}, and install it into the active context with\n * `withNativeTracer()`. From then on every autotel `span()` / `trace()` /\n * `enterSpan()` call — including deep inside utility functions and libraries —\n * automatically routes to Cloudflare's native tracer and nests inside the\n * platform's trace waterfall (fetch / KV / R2 / D1 / handler spans), exported\n * by Cloudflare to whichever destination is configured in Wrangler.\n *\n * No `cloudflare:workers` import is required here: the native tracer travels\n * through autotel's AsyncLocalStorage context, so code without access to `ctx`\n * still picks it up via `getActiveNativeTracer()`.\n */\n\nimport type { NativeTracer, NativeSpanHandle } from 'autotel-edge';\n\n/**\n * Cloudflare's native custom-span surface. Declared locally because it is not\n * yet present in `@cloudflare/workers-types`. Structurally compatible with\n * autotel-edge's {@link NativeSpanHandle}.\n */\ninterface CloudflareSpan {\n readonly isTraced: boolean;\n setAttribute(key: string, value: string | number | boolean | undefined): void;\n}\n\n/**\n * Cloudflare's `tracing` object, available as `ctx.tracing` on the\n * ExecutionContext and as the `tracing` export of `cloudflare:workers`.\n */\ninterface CloudflareTracing {\n enterSpan<T, A extends unknown[]>(\n name: string,\n callback: (span: CloudflareSpan, ...args: A) => T,\n ...args: A\n ): T;\n}\n\ntype MaybeTracingCarrier = { tracing?: CloudflareTracing } | null | undefined;\n\nfunction readTracing(carrier: unknown): CloudflareTracing | undefined {\n const tracing = (carrier as MaybeTracingCarrier)?.tracing;\n return typeof tracing?.enterSpan === 'function' ? tracing : undefined;\n}\n\n/**\n * Returns `true` when Cloudflare native custom-span tracing is available on the\n * given ExecutionContext (i.e. tracing is enabled for this Worker).\n */\nexport function isNativeTracingAvailable(ctx: unknown): boolean {\n return readTracing(ctx) !== undefined;\n}\n\n/**\n * Wrap Cloudflare's `ctx.tracing` as an autotel {@link NativeTracer}, or return\n * `null` when native tracing is unavailable on this context.\n *\n * @param correlationId Optional per-request id (e.g. the `cf-ray` header)\n * surfaced as `ctx.correlationId` and a `correlation.id` span attribute, so\n * logs, custom spans, and the Cloudflare dashboard share one queryable key\n * today — before Cloudflare exposes in-code trace/span ids.\n */\nexport function getNativeTracerFromCtx(\n ctx: unknown,\n correlationId?: string,\n): NativeTracer | null {\n const tracing = readTracing(ctx);\n if (!tracing) {\n return null;\n }\n return {\n correlationId,\n enterSpan: <T>(name: string, callback: (span: NativeSpanHandle) => T): T =>\n tracing.enterSpan(name, callback as (span: CloudflareSpan) => T),\n };\n}\n"],"mappings":";AA+CA,SAAS,YAAY,SAAiD;CACpE,MAAM,UAAW,SAAiC;CAClD,OAAO,OAAO,SAAS,cAAc,aAAa,UAAU;AAC9D;;;;;AAMA,SAAgB,yBAAyB,KAAuB;CAC9D,OAAO,YAAY,GAAG,MAAM;AAC9B;;;;;;;;;;AAWA,SAAgB,uBACd,KACA,eACqB;CACrB,MAAM,UAAU,YAAY,GAAG;CAC/B,IAAI,CAAC,SACH,OAAO;CAET,OAAO;EACL;EACA,YAAe,MAAc,aAC3B,QAAQ,UAAU,MAAM,QAAuC;CACnE;AACF"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"native-tracing-DFaGAoR7.d.ts","names":[],"sources":["../src/native/native-tracing.ts"],"mappings":";;;;;;iBAwDgB,yBAAyB;;;;;;;;;;iBAazB,uBACd,cACA,yBACC"}