autotel-cloudflare 4.0.3 → 4.0.5
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.js +3 -2
- package/dist/actors.js.map +1 -1
- package/dist/{bindings-C10RI6Il.js → bindings-BG6hzGSN.js} +3 -2
- package/dist/{bindings-C10RI6Il.js.map → bindings-BG6hzGSN.js.map} +1 -1
- package/dist/bindings.js +1 -1
- package/dist/{handlers-CMg9l_T-.js → handlers-BAe65zoJ.js} +6 -4
- package/dist/{handlers-CMg9l_T-.js.map → handlers-BAe65zoJ.js.map} +1 -1
- package/dist/handlers.js +1 -1
- package/dist/index.js +2 -2
- package/package.json +8 -8
package/dist/actors.js
CHANGED
|
@@ -821,10 +821,11 @@ function instrumentActor(actorClass, config) {
|
|
|
821
821
|
...defaultOptions,
|
|
822
822
|
...actorOptions
|
|
823
823
|
};
|
|
824
|
-
const
|
|
824
|
+
const trigger = {
|
|
825
825
|
id: state.id.toString(),
|
|
826
826
|
name: state.id.name
|
|
827
|
-
}
|
|
827
|
+
};
|
|
828
|
+
const context$1 = setConfig(initialiser(env, trigger));
|
|
828
829
|
return instrumentActorInstance(context.with(context$1, () => {
|
|
829
830
|
return new target(state, env);
|
|
830
831
|
}), state, env, actorClass, options);
|
package/dist/actors.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
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: 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: 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(this: unknown, key: string): 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: 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: 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(this: unknown, key: string): 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: 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: 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: 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: 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(this: unknown): 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: 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: 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(this: unknown, message: unknown): 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: 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(this: unknown, ws: WebSocket, message: unknown): 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: 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('websocket.connections.count', result.length);\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 // 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 && { 'actor.identifier': actorInstance.identifier }),\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(actorInstance.name || '', actorClassName, 'init');\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(request: Request): Promise<Response> {\n const tracer = getTracer();\n\n // Extract parent context from request headers\n const parentContext = propagation.extract(api_context.active(), request.headers);\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(alarmInfo?: unknown): 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(actorInstance.name || '', actorClassName, 'alarm');\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(ws: WebSocket, request: Request): 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(actorInstance.name || '', actorClassName, 'websocket.connect');\n\n tracer.startActiveSpan(\n spanName,\n {\n kind: SpanKind.SERVER,\n attributes: {\n ...createActorAttributes(actorInstance, actorClass, 'websocket.connect'),\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(ws: WebSocket, message: 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 || '', 'websocket.message')\n : defaultSpanNameFormatter(actorInstance.name || '', actorClassName, 'websocket.message');\n\n tracer.startActiveSpan(\n spanName,\n {\n kind: SpanKind.SERVER,\n attributes: {\n ...createActorAttributes(actorInstance, actorClass, 'websocket.message'),\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(actorInstance.name || '', 'websocket.disconnect')\n : defaultSpanNameFormatter(actorInstance.name || '', actorClassName, 'websocket.disconnect');\n\n tracer.startActiveSpan(\n spanName,\n {\n kind: SpanKind.SERVER,\n attributes: createActorAttributes(actorInstance, actorClass, 'websocket.disconnect'),\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(value.bind(target), target, actorClass, options);\n }\n\n if (prop === 'onRequest' && typeof value === 'function') {\n return instrumentOnRequest(value.bind(target), target, actorClass, options);\n }\n\n if (prop === 'onAlarm' && typeof value === 'function') {\n return instrumentOnAlarm(value.bind(target), target, actorClass, options);\n }\n\n if (prop === 'onPersist' && typeof value === 'function') {\n return instrumentOnPersist(value.bind(target), target, actorClass, options);\n }\n\n if (prop === 'onWebSocketConnect' && typeof value === 'function') {\n return instrumentWebSocketConnect(value.bind(target), target, actorClass, options);\n }\n\n if (prop === 'onWebSocketMessage' && typeof value === 'function') {\n return instrumentWebSocketMessage(value.bind(target), target, actorClass, options);\n }\n\n if (prop === 'onWebSocketDisconnect' && typeof value === 'function') {\n return instrumentWebSocketDisconnect(value.bind(target), target, actorClass, options);\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 && typeof resolvedConfig === 'object' && '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(actorInstance, state, env, actorClass, options);\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): { locationHint?: DurableObjectLocationHint };\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(request: Request, env: E, _ctx: ExecutionContext): 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>).__DURABLE_OBJECT_BINDINGS as\n | Record<string, { class_name?: string }>\n | undefined;\n return key === actorClassName || binding?.[key]?.class_name === actorClassName;\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 { status: 500, headers: { 'Content-Type': 'application/json' } },\n );\n }\n\n const namespace = envObj[bindingName];\n const idString = actorName || 'default';\n\n // Get location hint if available\n const locationHint = 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(idString);\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: 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(request: Request, env: E, ctx: ExecutionContext): 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(tracedRequest, env, ctx);\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
|
+
{"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: 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: 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(this: unknown, key: string): 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: 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: 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(this: unknown, key: string): 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: 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: 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: 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: 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(this: unknown): 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: 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: 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(this: unknown, message: unknown): 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: 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(this: unknown, ws: WebSocket, message: unknown): 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: 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('websocket.connections.count', result.length);\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 // 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 && { 'actor.identifier': actorInstance.identifier }),\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(actorInstance.name || '', actorClassName, 'init');\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(request: Request): Promise<Response> {\n const tracer = getTracer();\n\n // Extract parent context from request headers\n const parentContext = propagation.extract(api_context.active(), request.headers);\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(alarmInfo?: unknown): 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(actorInstance.name || '', actorClassName, 'alarm');\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(ws: WebSocket, request: Request): 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(actorInstance.name || '', actorClassName, 'websocket.connect');\n\n tracer.startActiveSpan(\n spanName,\n {\n kind: SpanKind.SERVER,\n attributes: {\n ...createActorAttributes(actorInstance, actorClass, 'websocket.connect'),\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(ws: WebSocket, message: 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 || '', 'websocket.message')\n : defaultSpanNameFormatter(actorInstance.name || '', actorClassName, 'websocket.message');\n\n tracer.startActiveSpan(\n spanName,\n {\n kind: SpanKind.SERVER,\n attributes: {\n ...createActorAttributes(actorInstance, actorClass, 'websocket.message'),\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(actorInstance.name || '', 'websocket.disconnect')\n : defaultSpanNameFormatter(actorInstance.name || '', actorClassName, 'websocket.disconnect');\n\n tracer.startActiveSpan(\n spanName,\n {\n kind: SpanKind.SERVER,\n attributes: createActorAttributes(actorInstance, actorClass, 'websocket.disconnect'),\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(value.bind(target), target, actorClass, options);\n }\n\n if (prop === 'onRequest' && typeof value === 'function') {\n return instrumentOnRequest(value.bind(target), target, actorClass, options);\n }\n\n if (prop === 'onAlarm' && typeof value === 'function') {\n return instrumentOnAlarm(value.bind(target), target, actorClass, options);\n }\n\n if (prop === 'onPersist' && typeof value === 'function') {\n return instrumentOnPersist(value.bind(target), target, actorClass, options);\n }\n\n if (prop === 'onWebSocketConnect' && typeof value === 'function') {\n return instrumentWebSocketConnect(value.bind(target), target, actorClass, options);\n }\n\n if (prop === 'onWebSocketMessage' && typeof value === 'function') {\n return instrumentWebSocketMessage(value.bind(target), target, actorClass, options);\n }\n\n if (prop === 'onWebSocketDisconnect' && typeof value === 'function') {\n return instrumentWebSocketDisconnect(value.bind(target), target, actorClass, options);\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 && typeof resolvedConfig === 'object' && '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(actorInstance, state, env, actorClass, options);\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): { locationHint?: DurableObjectLocationHint };\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(request: Request, env: E, _ctx: ExecutionContext): 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>).__DURABLE_OBJECT_BINDINGS as\n | Record<string, { class_name?: string }>\n | undefined;\n return key === actorClassName || binding?.[key]?.class_name === actorClassName;\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 { status: 500, headers: { 'Content-Type': 'application/json' } },\n );\n }\n\n const namespace = envObj[bindingName];\n const idString = actorName || 'default';\n\n // Get location hint if available\n const locationHint = 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(idString);\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: 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(request: Request, env: E, ctx: ExecutionContext): 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(tracedRequest, env, ctx);\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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"}
|
|
@@ -670,7 +670,8 @@ function instrumentD1(d1, databaseName) {
|
|
|
670
670
|
return wrap(Reflect.apply(fnTarget, target, args), { get(target, prop) {
|
|
671
671
|
const value = Reflect.get(target, prop);
|
|
672
672
|
if (prop === "first" || prop === "run" || prop === "all" || prop === "raw") return new Proxy(value, { apply: (fnTarget, _thisArg, args) => {
|
|
673
|
-
const
|
|
673
|
+
const captureMode = getActiveConfig()?.dataSafety?.captureDbStatement ?? "full";
|
|
674
|
+
const statement = sanitizeStatement(query, captureMode);
|
|
674
675
|
const attributes = {
|
|
675
676
|
"db.system": "cloudflare-d1",
|
|
676
677
|
"db.operation": prop,
|
|
@@ -972,4 +973,4 @@ function instrumentBrowserRendering(browser, bindingName) {
|
|
|
972
973
|
|
|
973
974
|
//#endregion
|
|
974
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 };
|
|
975
|
-
//# sourceMappingURL=bindings-
|
|
976
|
+
//# sourceMappingURL=bindings-BG6hzGSN.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bindings-C10RI6Il.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 {\n trace,\n SpanKind,\n SpanStatusCode,\n} from '@opentelemetry/api';\nimport type { WorkerTracer } from 'autotel-edge';\nimport { wrap, setAttr } from './common';\n\n/**\n * Instrument Workers AI binding\n */\nexport function instrumentAI<T extends Ai>(ai: T, bindingName?: string): T {\n const name = bindingName || 'ai';\n\n const handler: ProxyHandler<T> = {\n get(target, prop) {\n const value = Reflect.get(target, prop);\n\n if (prop === 'run' && typeof value === 'function') {\n return new Proxy(value, {\n apply: (fnTarget, _thisArg, args) => {\n const [model] = args as [string, unknown, unknown];\n const tracer = trace.getTracer('autotel-edge') as WorkerTracer;\n\n return tracer.startActiveSpan(\n `AI ${name}: run ${model}`,\n {\n kind: SpanKind.CLIENT,\n attributes: {\n // 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(span, 'gen_ai.usage.input_tokens', Number(result.usage.prompt_tokens));\n }\n if (result?.usage?.completion_tokens !== undefined) {\n setAttr(span, 'gen_ai.usage.output_tokens', Number(result.usage.completion_tokens));\n }\n span.setStatus({ code: SpanStatusCode.OK });\n return result;\n } catch (error) {\n span.recordException(error as Error);\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: error instanceof Error ? error.message : String(error),\n });\n throw error;\n } finally {\n span.end();\n }\n },\n );\n },\n });\n }\n\n return value;\n },\n };\n\n return wrap(ai, handler);\n}\n","/**\n * Vectorize binding instrumentation\n */\n\nimport {\n trace,\n SpanKind,\n SpanStatusCode,\n} from '@opentelemetry/api';\nimport type { WorkerTracer } from 'autotel-edge';\nimport { wrap, setAttr } from './common';\n\nconst TRACED_METHODS = ['query', 'insert', 'upsert', 'deleteByIds', 'getByIds', 'describe'] as const;\n\n/**\n * Instrument Vectorize index binding\n */\nexport function instrumentVectorize<T extends VectorizeIndex>(vectorize: T, indexName?: string): T {\n const name = indexName || 'vectorize';\n\n const handler: ProxyHandler<T> = {\n get(target, prop) {\n const value = Reflect.get(target, prop);\n\n if (typeof prop === 'string' && TRACED_METHODS.includes(prop as any) && typeof value === 'function') {\n return new Proxy(value, {\n apply: (fnTarget, _thisArg, args) => {\n const operation = prop as string;\n const tracer = trace.getTracer('autotel-edge') as WorkerTracer;\n\n const attributes: Record<string, string | number> = {\n 'db.system': 'cloudflare-vectorize',\n 'db.operation': operation,\n 'db.collection.name': name,\n };\n\n // Per-operation attributes\n if (operation === 'query') {\n const queryInput = args[0] as { topK?: number } | undefined;\n if (queryInput?.topK !== undefined) {\n attributes['db.vectorize.top_k'] = queryInput.topK;\n }\n }\n\n if ((operation === 'insert' || operation === 'upsert') && Array.isArray(args[0])) {\n attributes['db.vectorize.vectors_count'] = args[0].length;\n }\n\n return tracer.startActiveSpan(\n `Vectorize ${name}: ${operation}`,\n {\n kind: SpanKind.CLIENT,\n attributes,\n },\n async (span) => {\n try {\n const result = await Reflect.apply(fnTarget, target, args);\n\n if (operation === 'query' && result?.matches) {\n setAttr(span, 'db.vectorize.matches_count', result.matches.length);\n }\n\n span.setStatus({ code: SpanStatusCode.OK });\n return result;\n } catch (error) {\n span.recordException(error as Error);\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: error instanceof Error ? error.message : String(error),\n });\n throw error;\n } finally {\n span.end();\n }\n },\n );\n },\n });\n }\n\n return value;\n },\n };\n\n return wrap(vectorize, handler);\n}\n","/**\n * Hyperdrive binding instrumentation\n */\n\nimport {\n trace,\n SpanKind,\n SpanStatusCode,\n} from '@opentelemetry/api';\nimport type { WorkerTracer } from 'autotel-edge';\nimport { wrap, setAttr } from './common';\n\n/**\n * Instrument Hyperdrive binding\n */\nexport function instrumentHyperdrive<T extends Hyperdrive>(hyperdrive: T, bindingName?: string): T {\n const name = bindingName || 'hyperdrive';\n\n const handler: ProxyHandler<T> = {\n get(target, prop) {\n const value = Reflect.get(target, prop);\n\n if (prop === 'connect' && typeof value === 'function') {\n return new Proxy(value, {\n apply: (fnTarget, _thisArg, args) => {\n const tracer = trace.getTracer('autotel-edge') as WorkerTracer;\n\n const attributes: Record<string, string | number> = {\n 'db.system': 'cloudflare-hyperdrive',\n 'db.operation': 'connect',\n };\n\n // Extract connection info safely (never record password)\n try {\n setAttr({ setAttribute: (k: string, v: any) => { if (v !== undefined && v !== null) attributes[k] = v; } }, 'server.address', target.host);\n setAttr({ setAttribute: (k: string, v: any) => { if (v !== undefined && v !== null) attributes[k] = v; } }, 'server.port', target.port);\n setAttr({ setAttribute: (k: string, v: any) => { if (v !== undefined && v !== null) attributes[k] = v; } }, 'db.user', target.user);\n } catch {\n // Properties may not be accessible in all environments\n }\n\n return tracer.startActiveSpan(\n `Hyperdrive ${name}: connect`,\n {\n kind: SpanKind.CLIENT,\n attributes,\n },\n async (span) => {\n try {\n const result = await Reflect.apply(fnTarget, target, args);\n span.setStatus({ code: SpanStatusCode.OK });\n return result;\n } catch (error) {\n span.recordException(error as Error);\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: error instanceof Error ? error.message : String(error),\n });\n throw error;\n } finally {\n span.end();\n }\n },\n );\n },\n });\n }\n\n return value;\n },\n };\n\n return wrap(hyperdrive, handler);\n}\n","/**\n * Queue producer binding instrumentation\n */\n\nimport {\n trace,\n SpanKind,\n SpanStatusCode,\n} from '@opentelemetry/api';\nimport type { WorkerTracer } from 'autotel-edge';\nimport { wrap, setAttr } from './common';\n\n/**\n * Instrument Queue producer binding\n */\nexport function instrumentQueueProducer<T extends Queue>(queue: T, queueName?: string): T {\n const name = queueName || 'queue';\n\n const handler: ProxyHandler<T> = {\n get(target, prop) {\n const value = Reflect.get(target, prop);\n\n if (prop === 'send' && typeof value === 'function') {\n return new Proxy(value, {\n apply: (fnTarget, _thisArg, args) => {\n const tracer = trace.getTracer('autotel-edge') as WorkerTracer;\n\n return tracer.startActiveSpan(\n `Queue ${name}: send`,\n {\n kind: SpanKind.PRODUCER,\n attributes: {\n 'messaging.system': 'cloudflare-queues',\n 'messaging.operation.type': 'publish',\n 'messaging.operation': 'send',\n 'messaging.destination.name': name,\n },\n },\n async (span) => {\n try {\n const result = await Reflect.apply(fnTarget, target, args);\n setAttr(span, 'messaging.message.id', (result as any)?.messageId);\n span.setStatus({ code: SpanStatusCode.OK });\n return result;\n } catch (error) {\n span.recordException(error as Error);\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: error instanceof Error ? error.message : String(error),\n });\n throw error;\n } finally {\n span.end();\n }\n },\n );\n },\n });\n }\n\n if (prop === 'sendBatch' && typeof value === 'function') {\n return new Proxy(value, {\n apply: (fnTarget, _thisArg, args) => {\n const [messages] = args as [{ body: unknown }[]];\n const tracer = trace.getTracer('autotel-edge') as WorkerTracer;\n\n return tracer.startActiveSpan(\n `Queue ${name}: sendBatch`,\n {\n kind: SpanKind.PRODUCER,\n attributes: {\n 'messaging.system': 'cloudflare-queues',\n 'messaging.operation.type': 'publish',\n 'messaging.operation': 'sendBatch',\n 'messaging.destination.name': name,\n 'messaging.batch.message_count': Array.isArray(messages) ? messages.length : 0,\n },\n },\n async (span) => {\n try {\n const result = await Reflect.apply(fnTarget, target, args);\n span.setStatus({ code: SpanStatusCode.OK });\n return result;\n } catch (error) {\n span.recordException(error as Error);\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: error instanceof Error ? error.message : String(error),\n });\n throw error;\n } finally {\n span.end();\n }\n },\n );\n },\n });\n }\n\n return value;\n },\n };\n\n return wrap(queue, handler);\n}\n","/**\n * Analytics Engine binding instrumentation\n */\n\nimport {\n trace,\n SpanKind,\n SpanStatusCode,\n} from '@opentelemetry/api';\nimport type { WorkerTracer } from 'autotel-edge';\nimport { wrap } from './common';\n\n/**\n * Instrument Analytics Engine binding\n */\nexport function instrumentAnalyticsEngine<T extends AnalyticsEngineDataset>(ae: T, datasetName?: string): T {\n const name = datasetName || 'analytics-engine';\n\n const handler: ProxyHandler<T> = {\n get(target, prop) {\n const value = Reflect.get(target, prop);\n\n if (prop === 'writeDataPoint' && typeof value === 'function') {\n return new Proxy(value, {\n apply: (fnTarget, _thisArg, args) => {\n const [dataPoint] = args as [AnalyticsEngineDataPoint | undefined];\n const tracer = trace.getTracer('autotel-edge') as WorkerTracer;\n\n const attributes: Record<string, string | number> = {\n 'analytics.system': 'cloudflare-analytics-engine',\n 'analytics.operation': 'writeDataPoint',\n };\n\n if (dataPoint) {\n if (dataPoint.indexes) {\n attributes['analytics.indexes_count'] = Array.isArray(dataPoint.indexes) ? dataPoint.indexes.length : 1;\n }\n if (dataPoint.doubles) {\n attributes['analytics.doubles_count'] = dataPoint.doubles.length;\n }\n if (dataPoint.blobs) {\n attributes['analytics.blobs_count'] = dataPoint.blobs.length;\n }\n }\n\n return tracer.startActiveSpan(\n `AnalyticsEngine ${name}: writeDataPoint`,\n {\n kind: SpanKind.CLIENT,\n attributes,\n },\n (span) => {\n try {\n // writeDataPoint is synchronous/void\n Reflect.apply(fnTarget, target, args);\n span.setStatus({ code: SpanStatusCode.OK });\n } catch (error) {\n span.recordException(error as Error);\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: error instanceof Error ? error.message : String(error),\n });\n throw error;\n } finally {\n span.end();\n }\n },\n );\n },\n });\n }\n\n return value;\n },\n };\n\n return wrap(ae, handler);\n}\n","/**\n * Images binding instrumentation\n *\n * The Images binding uses a fluent chain: input() -> transform() -> draw() -> output()\n * We only create a span at the terminal output() call to avoid intermediate noise.\n * info() is a standalone operation and gets its own span.\n */\n\nimport {\n trace,\n SpanKind,\n SpanStatusCode,\n} from '@opentelemetry/api';\nimport type { WorkerTracer } from 'autotel-edge';\nimport { wrap, setAttr } from './common';\n\nconst pipelineMetaSymbol = Symbol('images-pipeline-meta');\n\ninterface PipelineMeta {\n operationCount: number;\n}\n\ninterface ImagesLike {\n info(blob: ReadableStream | ArrayBuffer | Blob): Promise<{ width: number; height: number; format: string }>;\n input(blob: ReadableStream | ArrayBuffer | Blob): ImageTransformerLike;\n}\n\ninterface ImageTransformerLike {\n transform(options: unknown): ImageTransformerLike;\n draw(image: unknown, options?: unknown): ImageTransformerLike;\n output(options?: unknown): Promise<ImageOutputLike>;\n}\n\ninterface ImageOutputLike {\n response(): Response;\n blob(): Promise<Blob>;\n arrayBuffer(): Promise<ArrayBuffer>;\n}\n\nfunction proxyTransformer(transformer: ImageTransformerLike, meta: PipelineMeta, bindingName: string): ImageTransformerLike {\n const handler: ProxyHandler<ImageTransformerLike> = {\n get(target, prop) {\n const value = Reflect.get(target, prop);\n\n if ((prop === 'transform' || prop === 'draw') && typeof value === 'function') {\n return new Proxy(value, {\n apply: (fnTarget, _thisArg, args) => {\n meta.operationCount++;\n const result = Reflect.apply(fnTarget, target, args);\n // If the result is the transformer itself (fluent chain), return our proxy\n if (result === target || (result && typeof result === 'object' && 'output' in result)) {\n return proxyTransformer(result as ImageTransformerLike, meta, bindingName);\n }\n return result;\n },\n });\n }\n\n if (prop === 'output' && typeof value === 'function') {\n return new Proxy(value, {\n apply: (fnTarget, _thisArg, args) => {\n const tracer = trace.getTracer('autotel-edge') as WorkerTracer;\n const [formatOrOptions] = args;\n\n const attributes: Record<string, string | number> = {\n 'images.system': 'cloudflare-images',\n 'images.pipeline.operation_count': meta.operationCount,\n };\n\n // Capture output format\n if (typeof formatOrOptions === 'string') {\n attributes['images.output.format'] = formatOrOptions;\n } else if (formatOrOptions && typeof formatOrOptions === 'object') {\n const fmt = (formatOrOptions as any).format;\n if (fmt) attributes['images.output.format'] = fmt;\n }\n\n return tracer.startActiveSpan(\n `Images ${bindingName}: output`,\n {\n kind: SpanKind.CLIENT,\n attributes,\n },\n async (span) => {\n try {\n const result = await Reflect.apply(fnTarget, target, args);\n span.setStatus({ code: SpanStatusCode.OK });\n return result;\n } catch (error) {\n span.recordException(error as Error);\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: error instanceof Error ? error.message : String(error),\n });\n throw error;\n } finally {\n span.end();\n }\n },\n );\n },\n });\n }\n\n return value;\n },\n };\n\n const proxy = new Proxy(transformer, handler);\n Object.defineProperty(proxy, pipelineMetaSymbol, {\n value: meta,\n writable: false,\n enumerable: false,\n configurable: false,\n });\n return proxy;\n}\n\n/**\n * Instrument Images binding\n */\nexport function instrumentImages<T extends ImagesLike>(images: T, bindingName?: string): T {\n const name = bindingName || 'images';\n\n const handler: ProxyHandler<T> = {\n get(target, prop) {\n const value = Reflect.get(target, prop);\n\n if (prop === 'info' && typeof value === 'function') {\n return new Proxy(value, {\n apply: (fnTarget, _thisArg, args) => {\n const tracer = trace.getTracer('autotel-edge') as WorkerTracer;\n\n return tracer.startActiveSpan(\n `Images ${name}: info`,\n {\n kind: SpanKind.CLIENT,\n attributes: {\n 'images.system': 'cloudflare-images',\n 'images.operation': 'info',\n },\n },\n async (span) => {\n try {\n const result = await Reflect.apply(fnTarget, target, args);\n setAttr(span, 'images.width', result?.width);\n setAttr(span, 'images.height', result?.height);\n setAttr(span, 'images.format', result?.format);\n span.setStatus({ code: SpanStatusCode.OK });\n return result;\n } catch (error) {\n span.recordException(error as Error);\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: error instanceof Error ? error.message : String(error),\n });\n throw error;\n } finally {\n span.end();\n }\n },\n );\n },\n });\n }\n\n if (prop === 'input' && typeof value === 'function') {\n return new Proxy(value, {\n apply: (fnTarget, _thisArg, args) => {\n const transformer = Reflect.apply(fnTarget, target, args) as ImageTransformerLike;\n const meta: PipelineMeta = { operationCount: 0 };\n return proxyTransformer(transformer, meta, name);\n },\n });\n }\n\n return value;\n },\n };\n\n return wrap(images, handler);\n}\n","/**\n * Auto-instrumentation for Cloudflare Workers bindings\n * \n * Note: This file uses Cloudflare Workers types (KVNamespace, R2Bucket, D1Database, Fetcher, etc.)\n * which are globally available via @cloudflare/workers-types when listed in tsconfig.json.\n * These types are devDependencies only - they're not runtime dependencies.\n * At runtime, Cloudflare Workers runtime provides the actual implementations.\n * \n * This module provides automatic tracing for Cloudflare bindings:\n * - KV (key-value operations)\n * - R2 (object storage operations)\n * - D1 (database operations)\n * - Service Bindings\n * - Events Engine\n * - Workers AI\n * - Vectorize\n * - Hyperdrive\n */\n\nimport {\n trace,\n SpanKind,\n SpanStatusCode,\n} from '@opentelemetry/api';\nimport { WorkerTracer, getActiveConfig } from 'autotel-edge';\nimport { wrap, isWrapped } from './common';\nimport { instrumentAI } from './ai';\nimport { instrumentVectorize } from './vectorize';\nimport { instrumentHyperdrive } from './hyperdrive';\nimport { instrumentQueueProducer } from './queue-producer';\nimport { instrumentAnalyticsEngine } from './analytics-engine';\nimport { instrumentImages } from './images';\n\ntype DbStatementCapture = 'off' | 'obfuscated' | 'full';\n\n/**\n * Sanitize a SQL statement based on the capture mode.\n * - 'full': returns the statement as-is\n * - 'obfuscated': replaces string literals and numbers with '?'\n * - 'off': returns undefined (attribute not set)\n */\nfunction sanitizeStatement(query: string, mode: DbStatementCapture): string | undefined {\n if (mode === 'off') return undefined;\n if (mode === 'obfuscated') return query.replaceAll(/'[^']*'/g, \"'?'\").replaceAll(/\\b\\d+\\b/g, '?');\n return query;\n}\n\n/**\n * Instrument KV namespace\n */\nexport function instrumentKV<K extends KVNamespace>(kv: K, namespaceName?: string): K {\n const name = namespaceName || 'kv';\n \n const kvHandler: ProxyHandler<K> = {\n get(target, prop) {\n const value = Reflect.get(target, prop);\n \n if (prop === 'get' && typeof value === 'function') {\n return new Proxy(value, {\n apply: (fnTarget, _thisArg, args) => {\n const [key, options] = args as [string, KVNamespaceGetOptions<unknown> | undefined];\n const tracer = trace.getTracer('autotel-edge') as WorkerTracer;\n\n return tracer.startActiveSpan(\n `KV ${name}: get`,\n {\n kind: SpanKind.CLIENT,\n attributes: {\n 'db.system': 'cloudflare-kv',\n 'db.operation': 'get',\n 'db.namespace': name,\n 'db.key': key,\n 'db.cache_hit': options?.cacheTtl !== undefined,\n },\n },\n async (span) => {\n try {\n const result = await Reflect.apply(fnTarget, target, args);\n span.setAttribute('db.result.type', result === null ? 'null' : typeof result);\n span.setStatus({ code: SpanStatusCode.OK });\n return result;\n } catch (error) {\n span.recordException(error as Error);\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: error instanceof Error ? error.message : String(error),\n });\n throw error;\n } finally {\n span.end();\n }\n },\n );\n },\n });\n }\n \n if (prop === 'put' && typeof value === 'function') {\n return new Proxy(value, {\n apply: (fnTarget, _thisArg, args) => {\n const [key] = args as [string, unknown, KVNamespacePutOptions | undefined];\n const tracer = trace.getTracer('autotel-edge') as WorkerTracer;\n\n return tracer.startActiveSpan(\n `KV ${name}: put`,\n {\n kind: SpanKind.CLIENT,\n attributes: {\n 'db.system': 'cloudflare-kv',\n 'db.operation': 'put',\n 'db.namespace': name,\n 'db.key': key,\n },\n },\n async (span) => {\n try {\n const result = await Reflect.apply(fnTarget, target, args);\n span.setStatus({ code: SpanStatusCode.OK });\n return result;\n } catch (error) {\n span.recordException(error as Error);\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: error instanceof Error ? error.message : String(error),\n });\n throw error;\n } finally {\n span.end();\n }\n },\n );\n },\n });\n }\n \n if (prop === 'delete' && typeof value === 'function') {\n return new Proxy(value, {\n apply: (fnTarget, _thisArg, args) => {\n const [key] = args as [string];\n const tracer = trace.getTracer('autotel-edge') as WorkerTracer;\n\n return tracer.startActiveSpan(\n `KV ${name}: delete`,\n {\n kind: SpanKind.CLIENT,\n attributes: {\n 'db.system': 'cloudflare-kv',\n 'db.operation': 'delete',\n 'db.namespace': name,\n 'db.key': key,\n },\n },\n async (span) => {\n try {\n const result = await Reflect.apply(fnTarget, target, args);\n span.setStatus({ code: SpanStatusCode.OK });\n return result;\n } catch (error) {\n span.recordException(error as Error);\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: error instanceof Error ? error.message : String(error),\n });\n throw error;\n } finally {\n span.end();\n }\n },\n );\n },\n });\n }\n \n if (prop === 'list' && typeof value === 'function') {\n return new Proxy(value, {\n apply: (fnTarget, _thisArg, args) => {\n const [options] = args as [KVNamespaceListOptions | undefined];\n const tracer = trace.getTracer('autotel-edge') as WorkerTracer;\n\n return tracer.startActiveSpan(\n `KV ${name}: list`,\n {\n kind: SpanKind.CLIENT,\n attributes: {\n 'db.system': 'cloudflare-kv',\n 'db.operation': 'list',\n 'db.namespace': name,\n 'db.prefix': options?.prefix || undefined,\n 'db.limit': options?.limit || undefined,\n },\n },\n async (span) => {\n try {\n const result = await Reflect.apply(fnTarget, target, args);\n span.setAttribute('db.result.keys_count', result.keys.length);\n span.setStatus({ code: SpanStatusCode.OK });\n return result;\n } catch (error) {\n span.recordException(error as Error);\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: error instanceof Error ? error.message : String(error),\n });\n throw error;\n } finally {\n span.end();\n }\n },\n );\n },\n });\n }\n \n return value;\n },\n };\n \n return wrap(kv, kvHandler);\n}\n\n/**\n * Instrument R2 bucket\n */\nexport function instrumentR2<R extends R2Bucket>(r2: R, bucketName?: string): R {\n const name = bucketName || 'r2';\n \n const r2Handler: ProxyHandler<R> = {\n get(target, prop) {\n const value = Reflect.get(target, prop);\n \n if (prop === 'get' && typeof value === 'function') {\n return new Proxy(value, {\n apply: (fnTarget, _thisArg, args) => {\n const [key] = args as [string, R2GetOptions | undefined];\n const tracer = trace.getTracer('autotel-edge') as WorkerTracer;\n\n return tracer.startActiveSpan(\n `R2 ${name}: get`,\n {\n kind: SpanKind.CLIENT,\n attributes: {\n 'db.system': 'cloudflare-r2',\n 'db.operation': 'get',\n 'db.bucket': name,\n 'db.key': key,\n },\n },\n async (span) => {\n try {\n const result = await Reflect.apply(fnTarget, target, args);\n if (result) {\n span.setAttribute('db.result.size', result.size);\n span.setAttribute('db.result.etag', result.etag);\n span.setAttribute('db.result.content_type', result.httpMetadata?.contentType);\n } else {\n span.setAttribute('db.result.exists', false);\n }\n span.setStatus({ code: SpanStatusCode.OK });\n return result;\n } catch (error) {\n span.recordException(error as Error);\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: error instanceof Error ? error.message : String(error),\n });\n throw error;\n } finally {\n span.end();\n }\n },\n );\n },\n });\n }\n \n if (prop === 'put' && typeof value === 'function') {\n return new Proxy(value, {\n apply: (fnTarget, _thisArg, args) => {\n const [key] = args as [string, ReadableStream | ArrayBuffer | ArrayBufferView | string | null | Blob, R2PutOptions | undefined];\n const tracer = trace.getTracer('autotel-edge') as WorkerTracer;\n\n return tracer.startActiveSpan(\n `R2 ${name}: put`,\n {\n kind: SpanKind.CLIENT,\n attributes: {\n 'db.system': 'cloudflare-r2',\n 'db.operation': 'put',\n 'db.bucket': name,\n 'db.key': key,\n },\n },\n async (span) => {\n try {\n const result = await Reflect.apply(fnTarget, target, args);\n span.setAttribute('db.result.etag', result.etag);\n span.setAttribute('db.result.uploaded', result.uploaded);\n span.setStatus({ code: SpanStatusCode.OK });\n return result;\n } catch (error) {\n span.recordException(error as Error);\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: error instanceof Error ? error.message : String(error),\n });\n throw error;\n } finally {\n span.end();\n }\n },\n );\n },\n });\n }\n \n if (prop === 'delete' && typeof value === 'function') {\n return new Proxy(value, {\n apply: (fnTarget, _thisArg, args) => {\n const keys = args as string[];\n const tracer = trace.getTracer('autotel-edge') as WorkerTracer;\n\n return tracer.startActiveSpan(\n `R2 ${name}: delete`,\n {\n kind: SpanKind.CLIENT,\n attributes: {\n 'db.system': 'cloudflare-r2',\n 'db.operation': 'delete',\n 'db.bucket': name,\n 'db.keys_count': keys.length,\n },\n },\n async (span) => {\n try {\n const result = await Reflect.apply(fnTarget, target, args);\n span.setStatus({ code: SpanStatusCode.OK });\n return result;\n } catch (error) {\n span.recordException(error as Error);\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: error instanceof Error ? error.message : String(error),\n });\n throw error;\n } finally {\n span.end();\n }\n },\n );\n },\n });\n }\n \n if (prop === 'list' && typeof value === 'function') {\n return new Proxy(value, {\n apply: (fnTarget, _thisArg, args) => {\n const [options] = args as [R2ListOptions | undefined];\n const tracer = trace.getTracer('autotel-edge') as WorkerTracer;\n\n return tracer.startActiveSpan(\n `R2 ${name}: list`,\n {\n kind: SpanKind.CLIENT,\n attributes: {\n 'db.system': 'cloudflare-r2',\n 'db.operation': 'list',\n 'db.bucket': name,\n 'db.prefix': options?.prefix || undefined,\n 'db.limit': options?.limit || undefined,\n },\n },\n async (span) => {\n try {\n const result = await Reflect.apply(fnTarget, target, args);\n span.setAttribute('db.result.objects_count', result.objects.length);\n span.setAttribute('db.result.truncated', result.truncated);\n span.setStatus({ code: SpanStatusCode.OK });\n return result;\n } catch (error) {\n span.recordException(error as Error);\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: error instanceof Error ? error.message : String(error),\n });\n throw error;\n } finally {\n span.end();\n }\n },\n );\n },\n });\n }\n \n return value;\n },\n };\n \n return wrap(r2, r2Handler);\n}\n\n/**\n * Instrument D1 database\n */\nexport function instrumentD1<D extends D1Database>(d1: D, databaseName?: string): D {\n const name = databaseName || 'd1';\n \n const d1Handler: ProxyHandler<D> = {\n get(target, prop) {\n const value = Reflect.get(target, prop);\n \n if (prop === 'prepare' && typeof value === 'function') {\n return new Proxy(value, {\n apply: (fnTarget, _thisArg, args) => {\n const [query] = args as [string];\n const tracer = trace.getTracer('autotel-edge') as WorkerTracer;\n\n const prepared = Reflect.apply(fnTarget, target, args);\n \n // Instrument the prepared statement\n const preparedHandler: ProxyHandler<typeof prepared> = {\n get(target, prop) {\n const value = Reflect.get(target, prop);\n \n if (prop === 'first' || prop === 'run' || prop === 'all' || prop === 'raw') {\n return new Proxy(value, {\n apply: (fnTarget, _thisArg, args) => {\n const activeConfig = getActiveConfig();\n const captureMode: DbStatementCapture = activeConfig?.dataSafety?.captureDbStatement ?? 'full';\n const statement = sanitizeStatement(query, captureMode);\n const attributes: Record<string, any> = {\n 'db.system': 'cloudflare-d1',\n 'db.operation': prop,\n 'db.name': name,\n };\n if (statement !== undefined) {\n attributes['db.statement'] = statement;\n }\n return tracer.startActiveSpan(\n `D1 ${name}: ${prop}`,\n {\n kind: SpanKind.CLIENT,\n attributes,\n },\n async (span) => {\n try {\n const result = await Reflect.apply(fnTarget, target, args);\n if (prop === 'all' && Array.isArray(result)) {\n span.setAttribute('db.result.rows_count', result.length);\n } else if (prop === 'first' && result) {\n span.setAttribute('db.result.exists', true);\n }\n span.setStatus({ code: SpanStatusCode.OK });\n return result;\n } catch (error) {\n span.recordException(error as Error);\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: error instanceof Error ? error.message : String(error),\n });\n throw error;\n } finally {\n span.end();\n }\n },\n );\n },\n });\n }\n \n return value;\n },\n };\n \n return wrap(prepared, preparedHandler);\n },\n });\n }\n \n if (prop === 'exec' && typeof value === 'function') {\n return new Proxy(value, {\n apply: (fnTarget, _thisArg, args) => {\n const [query] = args as [string];\n const tracer = trace.getTracer('autotel-edge') as WorkerTracer;\n const activeConfig = getActiveConfig();\n const captureMode: DbStatementCapture = activeConfig?.dataSafety?.captureDbStatement ?? 'full';\n const statement = sanitizeStatement(query, captureMode);\n const attributes: Record<string, any> = {\n 'db.system': 'cloudflare-d1',\n 'db.operation': 'exec',\n 'db.name': name,\n };\n if (statement !== undefined) {\n attributes['db.statement'] = statement;\n }\n\n return tracer.startActiveSpan(\n `D1 ${name}: exec`,\n {\n kind: SpanKind.CLIENT,\n attributes,\n },\n async (span) => {\n try {\n const result = await Reflect.apply(fnTarget, target, args);\n span.setAttribute('db.result.count', result.count);\n span.setStatus({ code: SpanStatusCode.OK });\n return result;\n } catch (error) {\n span.recordException(error as Error);\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: error instanceof Error ? error.message : String(error),\n });\n throw error;\n } finally {\n span.end();\n }\n },\n );\n },\n });\n }\n \n return value;\n },\n };\n \n return wrap(d1, d1Handler);\n}\n\n/**\n * Instrument service binding (Fetcher)\n *\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>(fetcher: F, serviceName?: string): 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 [RequestInfo | URL, RequestInit | undefined];\n const request = new Request(input, init);\n const tracer = trace.getTracer('autotel-edge') as WorkerTracer;\n\n return tracer.startActiveSpan(\n `Service ${name}: ${request.method}`,\n {\n kind: SpanKind.CLIENT,\n attributes: {\n 'rpc.system': 'cloudflare-service-binding',\n 'rpc.service': name,\n 'http.request.method': request.method,\n 'url.full': request.url,\n },\n },\n async (span) => {\n try {\n // 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: 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(env: Record<string, any>): Record<string, any> {\n const cached = envCache.get(env);\n if (cached) return cached;\n\n const instrumented: Record<string, any> = {};\n\n for (const [key, value] of Object.entries(env)) {\n if (!value || typeof value !== 'object') {\n instrumented[key] = value;\n continue;\n }\n\n // Skip already-instrumented bindings\n if (isWrapped(value)) {\n instrumented[key] = value;\n continue;\n }\n\n // 1. R2 — most specific (has head)\n if (hasExactMethods(value, ['get', 'put', 'delete', 'list', 'head'])) {\n instrumented[key] = instrumentR2(value as R2Bucket, key);\n continue;\n }\n\n // 2. KV — like R2 but without head\n if (hasExactMethods(value, ['get', 'put', 'delete', 'list']) && !('head' in value)) {\n instrumented[key] = instrumentKV(value as KVNamespace, key);\n continue;\n }\n\n // 3. D1\n if (hasExactMethods(value, ['prepare', 'exec'])) {\n instrumented[key] = instrumentD1(value as D1Database, key);\n continue;\n }\n\n // 4. Vectorize\n if (hasExactMethods(value, ['query', 'insert', 'upsert', 'describe'])) {\n instrumented[key] = instrumentVectorize(value as VectorizeIndex, key);\n continue;\n }\n\n // 5. AI — has run() + discriminator properties\n if (hasMethod(value, 'run') && ('gateway' in value || 'models' in value)) {\n instrumented[key] = instrumentAI(value as Ai, key);\n continue;\n }\n\n // 6. Hyperdrive — connect + connection properties\n if (hasMethod(value, 'connect') && 'connectionString' in value && 'host' in value) {\n instrumented[key] = instrumentHyperdrive(value as Hyperdrive, key);\n continue;\n }\n\n // 7. Queue Producer — send + sendBatch (not get, to avoid KV collision)\n if (hasExactMethods(value, ['send', 'sendBatch']) && !('get' in value)) {\n instrumented[key] = instrumentQueueProducer(value as Queue, key);\n continue;\n }\n\n // 8. Analytics Engine\n if (hasMethod(value, 'writeDataPoint')) {\n instrumented[key] = instrumentAnalyticsEngine(value as AnalyticsEngineDataset, key);\n continue;\n }\n\n // 9. Images\n if (hasExactMethods(value, ['info', 'input'])) {\n instrumented[key] = instrumentImages(value as any, key);\n continue;\n }\n\n // 10. Service Binding (broadest — must be last)\n if (hasMethod(value, 'fetch')) {\n instrumented[key] = instrumentServiceBinding(value as Fetcher, key);\n continue;\n }\n\n // Unknown binding type — pass through\n instrumented[key] = value;\n }\n\n envCache.set(env, instrumented);\n return instrumented;\n}\n\n","/**\n * Rate Limiter binding instrumentation\n */\n\nimport {\n trace,\n SpanKind,\n SpanStatusCode,\n} from '@opentelemetry/api';\nimport type { WorkerTracer } from 'autotel-edge';\nimport { wrap, setAttr } from './common';\n\ninterface RateLimiterLike {\n limit(options: { key: string }): Promise<{ success: boolean }>;\n}\n\n/**\n * Instrument Rate Limiter binding (manual only — not auto-detected)\n */\nexport function instrumentRateLimiter<T extends RateLimiterLike>(limiter: T, bindingName?: string): T {\n const name = bindingName || 'rate-limiter';\n\n const handler: ProxyHandler<T> = {\n get(target, prop) {\n const value = Reflect.get(target, prop);\n\n if (prop === 'limit' && typeof value === 'function') {\n return new Proxy(value, {\n apply: (fnTarget, _thisArg, args) => {\n const [options] = args as [{ key: string }];\n const tracer = trace.getTracer('autotel-edge') as WorkerTracer;\n\n return tracer.startActiveSpan(\n `RateLimiter ${name}: limit`,\n {\n kind: SpanKind.CLIENT,\n attributes: {\n 'rate_limiter.system': 'cloudflare-rate-limiter',\n 'rate_limiter.key': options?.key,\n },\n },\n async (span) => {\n try {\n const result = await Reflect.apply(fnTarget, target, args);\n setAttr(span, 'rate_limiter.success', result?.success);\n span.setStatus({ code: SpanStatusCode.OK });\n return result;\n } catch (error) {\n span.recordException(error as Error);\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: error instanceof Error ? error.message : String(error),\n });\n throw error;\n } finally {\n span.end();\n }\n },\n );\n },\n });\n }\n\n return value;\n },\n };\n\n return wrap(limiter, handler);\n}\n","/**\n * Browser Rendering binding instrumentation\n */\n\nimport {\n trace,\n SpanKind,\n SpanStatusCode,\n} from '@opentelemetry/api';\nimport type { WorkerTracer } from 'autotel-edge';\nimport { wrap, setAttr } from './common';\n\ninterface BrowserRenderingLike {\n fetch(input: RequestInfo | URL, init?: RequestInit): Promise<Response>;\n}\n\n/**\n * Instrument Browser Rendering binding (manual only — not auto-detected)\n */\nexport function instrumentBrowserRendering<T extends BrowserRenderingLike>(browser: T, bindingName?: string): T {\n const name = bindingName || 'browser';\n\n const handler: ProxyHandler<T> = {\n get(target, prop) {\n const value = Reflect.get(target, prop);\n\n if (prop === 'fetch' && typeof value === 'function') {\n return new Proxy(value, {\n apply: (fnTarget, _thisArg, args) => {\n const [input] = args as [RequestInfo | URL, RequestInit | undefined];\n const url = typeof input === 'string' ? input : input instanceof URL ? input.toString() : input.url;\n const tracer = trace.getTracer('autotel-edge') as WorkerTracer;\n\n return tracer.startActiveSpan(\n `BrowserRendering ${name}: fetch`,\n {\n kind: SpanKind.CLIENT,\n attributes: {\n 'browser.system': 'cloudflare-browser-rendering',\n 'url.full': url,\n },\n },\n async (span) => {\n try {\n const result = await Reflect.apply(fnTarget, target, args);\n setAttr(span, 'http.response.status_code', result?.status);\n span.setStatus({ code: SpanStatusCode.OK });\n return result;\n } catch (error) {\n span.recordException(error as Error);\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: error instanceof Error ? error.message : String(error),\n });\n throw error;\n } finally {\n span.end();\n }\n },\n );\n },\n });\n }\n\n return value;\n },\n };\n\n return wrap(browser, handler);\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"bindings-BG6hzGSN.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 {\n trace,\n SpanKind,\n SpanStatusCode,\n} from '@opentelemetry/api';\nimport type { WorkerTracer } from 'autotel-edge';\nimport { wrap, setAttr } from './common';\n\n/**\n * Instrument Workers AI binding\n */\nexport function instrumentAI<T extends Ai>(ai: T, bindingName?: string): T {\n const name = bindingName || 'ai';\n\n const handler: ProxyHandler<T> = {\n get(target, prop) {\n const value = Reflect.get(target, prop);\n\n if (prop === 'run' && typeof value === 'function') {\n return new Proxy(value, {\n apply: (fnTarget, _thisArg, args) => {\n const [model] = args as [string, unknown, unknown];\n const tracer = trace.getTracer('autotel-edge') as WorkerTracer;\n\n return tracer.startActiveSpan(\n `AI ${name}: run ${model}`,\n {\n kind: SpanKind.CLIENT,\n attributes: {\n // 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(span, 'gen_ai.usage.input_tokens', Number(result.usage.prompt_tokens));\n }\n if (result?.usage?.completion_tokens !== undefined) {\n setAttr(span, 'gen_ai.usage.output_tokens', Number(result.usage.completion_tokens));\n }\n span.setStatus({ code: SpanStatusCode.OK });\n return result;\n } catch (error) {\n span.recordException(error as Error);\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: error instanceof Error ? error.message : String(error),\n });\n throw error;\n } finally {\n span.end();\n }\n },\n );\n },\n });\n }\n\n return value;\n },\n };\n\n return wrap(ai, handler);\n}\n","/**\n * Vectorize binding instrumentation\n */\n\nimport {\n trace,\n SpanKind,\n SpanStatusCode,\n} from '@opentelemetry/api';\nimport type { WorkerTracer } from 'autotel-edge';\nimport { wrap, setAttr } from './common';\n\nconst TRACED_METHODS = ['query', 'insert', 'upsert', 'deleteByIds', 'getByIds', 'describe'] as const;\n\n/**\n * Instrument Vectorize index binding\n */\nexport function instrumentVectorize<T extends VectorizeIndex>(vectorize: T, indexName?: string): T {\n const name = indexName || 'vectorize';\n\n const handler: ProxyHandler<T> = {\n get(target, prop) {\n const value = Reflect.get(target, prop);\n\n if (typeof prop === 'string' && TRACED_METHODS.includes(prop as any) && typeof value === 'function') {\n return new Proxy(value, {\n apply: (fnTarget, _thisArg, args) => {\n const operation = prop as string;\n const tracer = trace.getTracer('autotel-edge') as WorkerTracer;\n\n const attributes: Record<string, string | number> = {\n 'db.system': 'cloudflare-vectorize',\n 'db.operation': operation,\n 'db.collection.name': name,\n };\n\n // Per-operation attributes\n if (operation === 'query') {\n const queryInput = args[0] as { topK?: number } | undefined;\n if (queryInput?.topK !== undefined) {\n attributes['db.vectorize.top_k'] = queryInput.topK;\n }\n }\n\n if ((operation === 'insert' || operation === 'upsert') && Array.isArray(args[0])) {\n attributes['db.vectorize.vectors_count'] = args[0].length;\n }\n\n return tracer.startActiveSpan(\n `Vectorize ${name}: ${operation}`,\n {\n kind: SpanKind.CLIENT,\n attributes,\n },\n async (span) => {\n try {\n const result = await Reflect.apply(fnTarget, target, args);\n\n if (operation === 'query' && result?.matches) {\n setAttr(span, 'db.vectorize.matches_count', result.matches.length);\n }\n\n span.setStatus({ code: SpanStatusCode.OK });\n return result;\n } catch (error) {\n span.recordException(error as Error);\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: error instanceof Error ? error.message : String(error),\n });\n throw error;\n } finally {\n span.end();\n }\n },\n );\n },\n });\n }\n\n return value;\n },\n };\n\n return wrap(vectorize, handler);\n}\n","/**\n * Hyperdrive binding instrumentation\n */\n\nimport {\n trace,\n SpanKind,\n SpanStatusCode,\n} from '@opentelemetry/api';\nimport type { WorkerTracer } from 'autotel-edge';\nimport { wrap, setAttr } from './common';\n\n/**\n * Instrument Hyperdrive binding\n */\nexport function instrumentHyperdrive<T extends Hyperdrive>(hyperdrive: T, bindingName?: string): T {\n const name = bindingName || 'hyperdrive';\n\n const handler: ProxyHandler<T> = {\n get(target, prop) {\n const value = Reflect.get(target, prop);\n\n if (prop === 'connect' && typeof value === 'function') {\n return new Proxy(value, {\n apply: (fnTarget, _thisArg, args) => {\n const tracer = trace.getTracer('autotel-edge') as WorkerTracer;\n\n const attributes: Record<string, string | number> = {\n 'db.system': 'cloudflare-hyperdrive',\n 'db.operation': 'connect',\n };\n\n // Extract connection info safely (never record password)\n try {\n setAttr({ setAttribute: (k: string, v: any) => { if (v !== undefined && v !== null) attributes[k] = v; } }, 'server.address', target.host);\n setAttr({ setAttribute: (k: string, v: any) => { if (v !== undefined && v !== null) attributes[k] = v; } }, 'server.port', target.port);\n setAttr({ setAttribute: (k: string, v: any) => { if (v !== undefined && v !== null) attributes[k] = v; } }, 'db.user', target.user);\n } catch {\n // Properties may not be accessible in all environments\n }\n\n return tracer.startActiveSpan(\n `Hyperdrive ${name}: connect`,\n {\n kind: SpanKind.CLIENT,\n attributes,\n },\n async (span) => {\n try {\n const result = await Reflect.apply(fnTarget, target, args);\n span.setStatus({ code: SpanStatusCode.OK });\n return result;\n } catch (error) {\n span.recordException(error as Error);\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: error instanceof Error ? error.message : String(error),\n });\n throw error;\n } finally {\n span.end();\n }\n },\n );\n },\n });\n }\n\n return value;\n },\n };\n\n return wrap(hyperdrive, handler);\n}\n","/**\n * Queue producer binding instrumentation\n */\n\nimport {\n trace,\n SpanKind,\n SpanStatusCode,\n} from '@opentelemetry/api';\nimport type { WorkerTracer } from 'autotel-edge';\nimport { wrap, setAttr } from './common';\n\n/**\n * Instrument Queue producer binding\n */\nexport function instrumentQueueProducer<T extends Queue>(queue: T, queueName?: string): T {\n const name = queueName || 'queue';\n\n const handler: ProxyHandler<T> = {\n get(target, prop) {\n const value = Reflect.get(target, prop);\n\n if (prop === 'send' && typeof value === 'function') {\n return new Proxy(value, {\n apply: (fnTarget, _thisArg, args) => {\n const tracer = trace.getTracer('autotel-edge') as WorkerTracer;\n\n return tracer.startActiveSpan(\n `Queue ${name}: send`,\n {\n kind: SpanKind.PRODUCER,\n attributes: {\n 'messaging.system': 'cloudflare-queues',\n 'messaging.operation.type': 'publish',\n 'messaging.operation': 'send',\n 'messaging.destination.name': name,\n },\n },\n async (span) => {\n try {\n const result = await Reflect.apply(fnTarget, target, args);\n setAttr(span, 'messaging.message.id', (result as any)?.messageId);\n span.setStatus({ code: SpanStatusCode.OK });\n return result;\n } catch (error) {\n span.recordException(error as Error);\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: error instanceof Error ? error.message : String(error),\n });\n throw error;\n } finally {\n span.end();\n }\n },\n );\n },\n });\n }\n\n if (prop === 'sendBatch' && typeof value === 'function') {\n return new Proxy(value, {\n apply: (fnTarget, _thisArg, args) => {\n const [messages] = args as [{ body: unknown }[]];\n const tracer = trace.getTracer('autotel-edge') as WorkerTracer;\n\n return tracer.startActiveSpan(\n `Queue ${name}: sendBatch`,\n {\n kind: SpanKind.PRODUCER,\n attributes: {\n 'messaging.system': 'cloudflare-queues',\n 'messaging.operation.type': 'publish',\n 'messaging.operation': 'sendBatch',\n 'messaging.destination.name': name,\n 'messaging.batch.message_count': Array.isArray(messages) ? messages.length : 0,\n },\n },\n async (span) => {\n try {\n const result = await Reflect.apply(fnTarget, target, args);\n span.setStatus({ code: SpanStatusCode.OK });\n return result;\n } catch (error) {\n span.recordException(error as Error);\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: error instanceof Error ? error.message : String(error),\n });\n throw error;\n } finally {\n span.end();\n }\n },\n );\n },\n });\n }\n\n return value;\n },\n };\n\n return wrap(queue, handler);\n}\n","/**\n * Analytics Engine binding instrumentation\n */\n\nimport {\n trace,\n SpanKind,\n SpanStatusCode,\n} from '@opentelemetry/api';\nimport type { WorkerTracer } from 'autotel-edge';\nimport { wrap } from './common';\n\n/**\n * Instrument Analytics Engine binding\n */\nexport function instrumentAnalyticsEngine<T extends AnalyticsEngineDataset>(ae: T, datasetName?: string): T {\n const name = datasetName || 'analytics-engine';\n\n const handler: ProxyHandler<T> = {\n get(target, prop) {\n const value = Reflect.get(target, prop);\n\n if (prop === 'writeDataPoint' && typeof value === 'function') {\n return new Proxy(value, {\n apply: (fnTarget, _thisArg, args) => {\n const [dataPoint] = args as [AnalyticsEngineDataPoint | undefined];\n const tracer = trace.getTracer('autotel-edge') as WorkerTracer;\n\n const attributes: Record<string, string | number> = {\n 'analytics.system': 'cloudflare-analytics-engine',\n 'analytics.operation': 'writeDataPoint',\n };\n\n if (dataPoint) {\n if (dataPoint.indexes) {\n attributes['analytics.indexes_count'] = Array.isArray(dataPoint.indexes) ? dataPoint.indexes.length : 1;\n }\n if (dataPoint.doubles) {\n attributes['analytics.doubles_count'] = dataPoint.doubles.length;\n }\n if (dataPoint.blobs) {\n attributes['analytics.blobs_count'] = dataPoint.blobs.length;\n }\n }\n\n return tracer.startActiveSpan(\n `AnalyticsEngine ${name}: writeDataPoint`,\n {\n kind: SpanKind.CLIENT,\n attributes,\n },\n (span) => {\n try {\n // writeDataPoint is synchronous/void\n Reflect.apply(fnTarget, target, args);\n span.setStatus({ code: SpanStatusCode.OK });\n } catch (error) {\n span.recordException(error as Error);\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: error instanceof Error ? error.message : String(error),\n });\n throw error;\n } finally {\n span.end();\n }\n },\n );\n },\n });\n }\n\n return value;\n },\n };\n\n return wrap(ae, handler);\n}\n","/**\n * Images binding instrumentation\n *\n * The Images binding uses a fluent chain: input() -> transform() -> draw() -> output()\n * We only create a span at the terminal output() call to avoid intermediate noise.\n * info() is a standalone operation and gets its own span.\n */\n\nimport {\n trace,\n SpanKind,\n SpanStatusCode,\n} from '@opentelemetry/api';\nimport type { WorkerTracer } from 'autotel-edge';\nimport { wrap, setAttr } from './common';\n\nconst pipelineMetaSymbol = Symbol('images-pipeline-meta');\n\ninterface PipelineMeta {\n operationCount: number;\n}\n\ninterface ImagesLike {\n info(blob: ReadableStream | ArrayBuffer | Blob): Promise<{ width: number; height: number; format: string }>;\n input(blob: ReadableStream | ArrayBuffer | Blob): ImageTransformerLike;\n}\n\ninterface ImageTransformerLike {\n transform(options: unknown): ImageTransformerLike;\n draw(image: unknown, options?: unknown): ImageTransformerLike;\n output(options?: unknown): Promise<ImageOutputLike>;\n}\n\ninterface ImageOutputLike {\n response(): Response;\n blob(): Promise<Blob>;\n arrayBuffer(): Promise<ArrayBuffer>;\n}\n\nfunction proxyTransformer(transformer: ImageTransformerLike, meta: PipelineMeta, bindingName: string): ImageTransformerLike {\n const handler: ProxyHandler<ImageTransformerLike> = {\n get(target, prop) {\n const value = Reflect.get(target, prop);\n\n if ((prop === 'transform' || prop === 'draw') && typeof value === 'function') {\n return new Proxy(value, {\n apply: (fnTarget, _thisArg, args) => {\n meta.operationCount++;\n const result = Reflect.apply(fnTarget, target, args);\n // If the result is the transformer itself (fluent chain), return our proxy\n if (result === target || (result && typeof result === 'object' && 'output' in result)) {\n return proxyTransformer(result as ImageTransformerLike, meta, bindingName);\n }\n return result;\n },\n });\n }\n\n if (prop === 'output' && typeof value === 'function') {\n return new Proxy(value, {\n apply: (fnTarget, _thisArg, args) => {\n const tracer = trace.getTracer('autotel-edge') as WorkerTracer;\n const [formatOrOptions] = args;\n\n const attributes: Record<string, string | number> = {\n 'images.system': 'cloudflare-images',\n 'images.pipeline.operation_count': meta.operationCount,\n };\n\n // Capture output format\n if (typeof formatOrOptions === 'string') {\n attributes['images.output.format'] = formatOrOptions;\n } else if (formatOrOptions && typeof formatOrOptions === 'object') {\n const fmt = (formatOrOptions as any).format;\n if (fmt) attributes['images.output.format'] = fmt;\n }\n\n return tracer.startActiveSpan(\n `Images ${bindingName}: output`,\n {\n kind: SpanKind.CLIENT,\n attributes,\n },\n async (span) => {\n try {\n const result = await Reflect.apply(fnTarget, target, args);\n span.setStatus({ code: SpanStatusCode.OK });\n return result;\n } catch (error) {\n span.recordException(error as Error);\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: error instanceof Error ? error.message : String(error),\n });\n throw error;\n } finally {\n span.end();\n }\n },\n );\n },\n });\n }\n\n return value;\n },\n };\n\n const proxy = new Proxy(transformer, handler);\n Object.defineProperty(proxy, pipelineMetaSymbol, {\n value: meta,\n writable: false,\n enumerable: false,\n configurable: false,\n });\n return proxy;\n}\n\n/**\n * Instrument Images binding\n */\nexport function instrumentImages<T extends ImagesLike>(images: T, bindingName?: string): T {\n const name = bindingName || 'images';\n\n const handler: ProxyHandler<T> = {\n get(target, prop) {\n const value = Reflect.get(target, prop);\n\n if (prop === 'info' && typeof value === 'function') {\n return new Proxy(value, {\n apply: (fnTarget, _thisArg, args) => {\n const tracer = trace.getTracer('autotel-edge') as WorkerTracer;\n\n return tracer.startActiveSpan(\n `Images ${name}: info`,\n {\n kind: SpanKind.CLIENT,\n attributes: {\n 'images.system': 'cloudflare-images',\n 'images.operation': 'info',\n },\n },\n async (span) => {\n try {\n const result = await Reflect.apply(fnTarget, target, args);\n setAttr(span, 'images.width', result?.width);\n setAttr(span, 'images.height', result?.height);\n setAttr(span, 'images.format', result?.format);\n span.setStatus({ code: SpanStatusCode.OK });\n return result;\n } catch (error) {\n span.recordException(error as Error);\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: error instanceof Error ? error.message : String(error),\n });\n throw error;\n } finally {\n span.end();\n }\n },\n );\n },\n });\n }\n\n if (prop === 'input' && typeof value === 'function') {\n return new Proxy(value, {\n apply: (fnTarget, _thisArg, args) => {\n const transformer = Reflect.apply(fnTarget, target, args) as ImageTransformerLike;\n const meta: PipelineMeta = { operationCount: 0 };\n return proxyTransformer(transformer, meta, name);\n },\n });\n }\n\n return value;\n },\n };\n\n return wrap(images, handler);\n}\n","/**\n * Auto-instrumentation for Cloudflare Workers bindings\n * \n * Note: This file uses Cloudflare Workers types (KVNamespace, R2Bucket, D1Database, Fetcher, etc.)\n * which are globally available via @cloudflare/workers-types when listed in tsconfig.json.\n * These types are devDependencies only - they're not runtime dependencies.\n * At runtime, Cloudflare Workers runtime provides the actual implementations.\n * \n * This module provides automatic tracing for Cloudflare bindings:\n * - KV (key-value operations)\n * - R2 (object storage operations)\n * - D1 (database operations)\n * - Service Bindings\n * - Events Engine\n * - Workers AI\n * - Vectorize\n * - Hyperdrive\n */\n\nimport {\n trace,\n SpanKind,\n SpanStatusCode,\n} from '@opentelemetry/api';\nimport { WorkerTracer, getActiveConfig } from 'autotel-edge';\nimport { wrap, isWrapped } from './common';\nimport { instrumentAI } from './ai';\nimport { instrumentVectorize } from './vectorize';\nimport { instrumentHyperdrive } from './hyperdrive';\nimport { instrumentQueueProducer } from './queue-producer';\nimport { instrumentAnalyticsEngine } from './analytics-engine';\nimport { instrumentImages } from './images';\n\ntype DbStatementCapture = 'off' | 'obfuscated' | 'full';\n\n/**\n * Sanitize a SQL statement based on the capture mode.\n * - 'full': returns the statement as-is\n * - 'obfuscated': replaces string literals and numbers with '?'\n * - 'off': returns undefined (attribute not set)\n */\nfunction sanitizeStatement(query: string, mode: DbStatementCapture): string | undefined {\n if (mode === 'off') return undefined;\n if (mode === 'obfuscated') return query.replaceAll(/'[^']*'/g, \"'?'\").replaceAll(/\\b\\d+\\b/g, '?');\n return query;\n}\n\n/**\n * Instrument KV namespace\n */\nexport function instrumentKV<K extends KVNamespace>(kv: K, namespaceName?: string): K {\n const name = namespaceName || 'kv';\n \n const kvHandler: ProxyHandler<K> = {\n get(target, prop) {\n const value = Reflect.get(target, prop);\n \n if (prop === 'get' && typeof value === 'function') {\n return new Proxy(value, {\n apply: (fnTarget, _thisArg, args) => {\n const [key, options] = args as [string, KVNamespaceGetOptions<unknown> | undefined];\n const tracer = trace.getTracer('autotel-edge') as WorkerTracer;\n\n return tracer.startActiveSpan(\n `KV ${name}: get`,\n {\n kind: SpanKind.CLIENT,\n attributes: {\n 'db.system': 'cloudflare-kv',\n 'db.operation': 'get',\n 'db.namespace': name,\n 'db.key': key,\n 'db.cache_hit': options?.cacheTtl !== undefined,\n },\n },\n async (span) => {\n try {\n const result = await Reflect.apply(fnTarget, target, args);\n span.setAttribute('db.result.type', result === null ? 'null' : typeof result);\n span.setStatus({ code: SpanStatusCode.OK });\n return result;\n } catch (error) {\n span.recordException(error as Error);\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: error instanceof Error ? error.message : String(error),\n });\n throw error;\n } finally {\n span.end();\n }\n },\n );\n },\n });\n }\n \n if (prop === 'put' && typeof value === 'function') {\n return new Proxy(value, {\n apply: (fnTarget, _thisArg, args) => {\n const [key] = args as [string, unknown, KVNamespacePutOptions | undefined];\n const tracer = trace.getTracer('autotel-edge') as WorkerTracer;\n\n return tracer.startActiveSpan(\n `KV ${name}: put`,\n {\n kind: SpanKind.CLIENT,\n attributes: {\n 'db.system': 'cloudflare-kv',\n 'db.operation': 'put',\n 'db.namespace': name,\n 'db.key': key,\n },\n },\n async (span) => {\n try {\n const result = await Reflect.apply(fnTarget, target, args);\n span.setStatus({ code: SpanStatusCode.OK });\n return result;\n } catch (error) {\n span.recordException(error as Error);\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: error instanceof Error ? error.message : String(error),\n });\n throw error;\n } finally {\n span.end();\n }\n },\n );\n },\n });\n }\n \n if (prop === 'delete' && typeof value === 'function') {\n return new Proxy(value, {\n apply: (fnTarget, _thisArg, args) => {\n const [key] = args as [string];\n const tracer = trace.getTracer('autotel-edge') as WorkerTracer;\n\n return tracer.startActiveSpan(\n `KV ${name}: delete`,\n {\n kind: SpanKind.CLIENT,\n attributes: {\n 'db.system': 'cloudflare-kv',\n 'db.operation': 'delete',\n 'db.namespace': name,\n 'db.key': key,\n },\n },\n async (span) => {\n try {\n const result = await Reflect.apply(fnTarget, target, args);\n span.setStatus({ code: SpanStatusCode.OK });\n return result;\n } catch (error) {\n span.recordException(error as Error);\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: error instanceof Error ? error.message : String(error),\n });\n throw error;\n } finally {\n span.end();\n }\n },\n );\n },\n });\n }\n \n if (prop === 'list' && typeof value === 'function') {\n return new Proxy(value, {\n apply: (fnTarget, _thisArg, args) => {\n const [options] = args as [KVNamespaceListOptions | undefined];\n const tracer = trace.getTracer('autotel-edge') as WorkerTracer;\n\n return tracer.startActiveSpan(\n `KV ${name}: list`,\n {\n kind: SpanKind.CLIENT,\n attributes: {\n 'db.system': 'cloudflare-kv',\n 'db.operation': 'list',\n 'db.namespace': name,\n 'db.prefix': options?.prefix || undefined,\n 'db.limit': options?.limit || undefined,\n },\n },\n async (span) => {\n try {\n const result = await Reflect.apply(fnTarget, target, args);\n span.setAttribute('db.result.keys_count', result.keys.length);\n span.setStatus({ code: SpanStatusCode.OK });\n return result;\n } catch (error) {\n span.recordException(error as Error);\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: error instanceof Error ? error.message : String(error),\n });\n throw error;\n } finally {\n span.end();\n }\n },\n );\n },\n });\n }\n \n return value;\n },\n };\n \n return wrap(kv, kvHandler);\n}\n\n/**\n * Instrument R2 bucket\n */\nexport function instrumentR2<R extends R2Bucket>(r2: R, bucketName?: string): R {\n const name = bucketName || 'r2';\n \n const r2Handler: ProxyHandler<R> = {\n get(target, prop) {\n const value = Reflect.get(target, prop);\n \n if (prop === 'get' && typeof value === 'function') {\n return new Proxy(value, {\n apply: (fnTarget, _thisArg, args) => {\n const [key] = args as [string, R2GetOptions | undefined];\n const tracer = trace.getTracer('autotel-edge') as WorkerTracer;\n\n return tracer.startActiveSpan(\n `R2 ${name}: get`,\n {\n kind: SpanKind.CLIENT,\n attributes: {\n 'db.system': 'cloudflare-r2',\n 'db.operation': 'get',\n 'db.bucket': name,\n 'db.key': key,\n },\n },\n async (span) => {\n try {\n const result = await Reflect.apply(fnTarget, target, args);\n if (result) {\n span.setAttribute('db.result.size', result.size);\n span.setAttribute('db.result.etag', result.etag);\n span.setAttribute('db.result.content_type', result.httpMetadata?.contentType);\n } else {\n span.setAttribute('db.result.exists', false);\n }\n span.setStatus({ code: SpanStatusCode.OK });\n return result;\n } catch (error) {\n span.recordException(error as Error);\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: error instanceof Error ? error.message : String(error),\n });\n throw error;\n } finally {\n span.end();\n }\n },\n );\n },\n });\n }\n \n if (prop === 'put' && typeof value === 'function') {\n return new Proxy(value, {\n apply: (fnTarget, _thisArg, args) => {\n const [key] = args as [string, ReadableStream | ArrayBuffer | ArrayBufferView | string | null | Blob, R2PutOptions | undefined];\n const tracer = trace.getTracer('autotel-edge') as WorkerTracer;\n\n return tracer.startActiveSpan(\n `R2 ${name}: put`,\n {\n kind: SpanKind.CLIENT,\n attributes: {\n 'db.system': 'cloudflare-r2',\n 'db.operation': 'put',\n 'db.bucket': name,\n 'db.key': key,\n },\n },\n async (span) => {\n try {\n const result = await Reflect.apply(fnTarget, target, args);\n span.setAttribute('db.result.etag', result.etag);\n span.setAttribute('db.result.uploaded', result.uploaded);\n span.setStatus({ code: SpanStatusCode.OK });\n return result;\n } catch (error) {\n span.recordException(error as Error);\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: error instanceof Error ? error.message : String(error),\n });\n throw error;\n } finally {\n span.end();\n }\n },\n );\n },\n });\n }\n \n if (prop === 'delete' && typeof value === 'function') {\n return new Proxy(value, {\n apply: (fnTarget, _thisArg, args) => {\n const keys = args as string[];\n const tracer = trace.getTracer('autotel-edge') as WorkerTracer;\n\n return tracer.startActiveSpan(\n `R2 ${name}: delete`,\n {\n kind: SpanKind.CLIENT,\n attributes: {\n 'db.system': 'cloudflare-r2',\n 'db.operation': 'delete',\n 'db.bucket': name,\n 'db.keys_count': keys.length,\n },\n },\n async (span) => {\n try {\n const result = await Reflect.apply(fnTarget, target, args);\n span.setStatus({ code: SpanStatusCode.OK });\n return result;\n } catch (error) {\n span.recordException(error as Error);\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: error instanceof Error ? error.message : String(error),\n });\n throw error;\n } finally {\n span.end();\n }\n },\n );\n },\n });\n }\n \n if (prop === 'list' && typeof value === 'function') {\n return new Proxy(value, {\n apply: (fnTarget, _thisArg, args) => {\n const [options] = args as [R2ListOptions | undefined];\n const tracer = trace.getTracer('autotel-edge') as WorkerTracer;\n\n return tracer.startActiveSpan(\n `R2 ${name}: list`,\n {\n kind: SpanKind.CLIENT,\n attributes: {\n 'db.system': 'cloudflare-r2',\n 'db.operation': 'list',\n 'db.bucket': name,\n 'db.prefix': options?.prefix || undefined,\n 'db.limit': options?.limit || undefined,\n },\n },\n async (span) => {\n try {\n const result = await Reflect.apply(fnTarget, target, args);\n span.setAttribute('db.result.objects_count', result.objects.length);\n span.setAttribute('db.result.truncated', result.truncated);\n span.setStatus({ code: SpanStatusCode.OK });\n return result;\n } catch (error) {\n span.recordException(error as Error);\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: error instanceof Error ? error.message : String(error),\n });\n throw error;\n } finally {\n span.end();\n }\n },\n );\n },\n });\n }\n \n return value;\n },\n };\n \n return wrap(r2, r2Handler);\n}\n\n/**\n * Instrument D1 database\n */\nexport function instrumentD1<D extends D1Database>(d1: D, databaseName?: string): D {\n const name = databaseName || 'd1';\n \n const d1Handler: ProxyHandler<D> = {\n get(target, prop) {\n const value = Reflect.get(target, prop);\n \n if (prop === 'prepare' && typeof value === 'function') {\n return new Proxy(value, {\n apply: (fnTarget, _thisArg, args) => {\n const [query] = args as [string];\n const tracer = trace.getTracer('autotel-edge') as WorkerTracer;\n\n const prepared = Reflect.apply(fnTarget, target, args);\n \n // Instrument the prepared statement\n const preparedHandler: ProxyHandler<typeof prepared> = {\n get(target, prop) {\n const value = Reflect.get(target, prop);\n \n if (prop === 'first' || prop === 'run' || prop === 'all' || prop === 'raw') {\n return new Proxy(value, {\n apply: (fnTarget, _thisArg, args) => {\n const activeConfig = getActiveConfig();\n const captureMode: DbStatementCapture = activeConfig?.dataSafety?.captureDbStatement ?? 'full';\n const statement = sanitizeStatement(query, captureMode);\n const attributes: Record<string, any> = {\n 'db.system': 'cloudflare-d1',\n 'db.operation': prop,\n 'db.name': name,\n };\n if (statement !== undefined) {\n attributes['db.statement'] = statement;\n }\n return tracer.startActiveSpan(\n `D1 ${name}: ${prop}`,\n {\n kind: SpanKind.CLIENT,\n attributes,\n },\n async (span) => {\n try {\n const result = await Reflect.apply(fnTarget, target, args);\n if (prop === 'all' && Array.isArray(result)) {\n span.setAttribute('db.result.rows_count', result.length);\n } else if (prop === 'first' && result) {\n span.setAttribute('db.result.exists', true);\n }\n span.setStatus({ code: SpanStatusCode.OK });\n return result;\n } catch (error) {\n span.recordException(error as Error);\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: error instanceof Error ? error.message : String(error),\n });\n throw error;\n } finally {\n span.end();\n }\n },\n );\n },\n });\n }\n \n return value;\n },\n };\n \n return wrap(prepared, preparedHandler);\n },\n });\n }\n \n if (prop === 'exec' && typeof value === 'function') {\n return new Proxy(value, {\n apply: (fnTarget, _thisArg, args) => {\n const [query] = args as [string];\n const tracer = trace.getTracer('autotel-edge') as WorkerTracer;\n const activeConfig = getActiveConfig();\n const captureMode: DbStatementCapture = activeConfig?.dataSafety?.captureDbStatement ?? 'full';\n const statement = sanitizeStatement(query, captureMode);\n const attributes: Record<string, any> = {\n 'db.system': 'cloudflare-d1',\n 'db.operation': 'exec',\n 'db.name': name,\n };\n if (statement !== undefined) {\n attributes['db.statement'] = statement;\n }\n\n return tracer.startActiveSpan(\n `D1 ${name}: exec`,\n {\n kind: SpanKind.CLIENT,\n attributes,\n },\n async (span) => {\n try {\n const result = await Reflect.apply(fnTarget, target, args);\n span.setAttribute('db.result.count', result.count);\n span.setStatus({ code: SpanStatusCode.OK });\n return result;\n } catch (error) {\n span.recordException(error as Error);\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: error instanceof Error ? error.message : String(error),\n });\n throw error;\n } finally {\n span.end();\n }\n },\n );\n },\n });\n }\n \n return value;\n },\n };\n \n return wrap(d1, d1Handler);\n}\n\n/**\n * Instrument service binding (Fetcher)\n *\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>(fetcher: F, serviceName?: string): 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 [RequestInfo | URL, RequestInit | undefined];\n const request = new Request(input, init);\n const tracer = trace.getTracer('autotel-edge') as WorkerTracer;\n\n return tracer.startActiveSpan(\n `Service ${name}: ${request.method}`,\n {\n kind: SpanKind.CLIENT,\n attributes: {\n 'rpc.system': 'cloudflare-service-binding',\n 'rpc.service': name,\n 'http.request.method': request.method,\n 'url.full': request.url,\n },\n },\n async (span) => {\n try {\n // 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: 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(env: Record<string, any>): Record<string, any> {\n const cached = envCache.get(env);\n if (cached) return cached;\n\n const instrumented: Record<string, any> = {};\n\n for (const [key, value] of Object.entries(env)) {\n if (!value || typeof value !== 'object') {\n instrumented[key] = value;\n continue;\n }\n\n // Skip already-instrumented bindings\n if (isWrapped(value)) {\n instrumented[key] = value;\n continue;\n }\n\n // 1. R2 — most specific (has head)\n if (hasExactMethods(value, ['get', 'put', 'delete', 'list', 'head'])) {\n instrumented[key] = instrumentR2(value as R2Bucket, key);\n continue;\n }\n\n // 2. KV — like R2 but without head\n if (hasExactMethods(value, ['get', 'put', 'delete', 'list']) && !('head' in value)) {\n instrumented[key] = instrumentKV(value as KVNamespace, key);\n continue;\n }\n\n // 3. D1\n if (hasExactMethods(value, ['prepare', 'exec'])) {\n instrumented[key] = instrumentD1(value as D1Database, key);\n continue;\n }\n\n // 4. Vectorize\n if (hasExactMethods(value, ['query', 'insert', 'upsert', 'describe'])) {\n instrumented[key] = instrumentVectorize(value as VectorizeIndex, key);\n continue;\n }\n\n // 5. AI — has run() + discriminator properties\n if (hasMethod(value, 'run') && ('gateway' in value || 'models' in value)) {\n instrumented[key] = instrumentAI(value as Ai, key);\n continue;\n }\n\n // 6. Hyperdrive — connect + connection properties\n if (hasMethod(value, 'connect') && 'connectionString' in value && 'host' in value) {\n instrumented[key] = instrumentHyperdrive(value as Hyperdrive, key);\n continue;\n }\n\n // 7. Queue Producer — send + sendBatch (not get, to avoid KV collision)\n if (hasExactMethods(value, ['send', 'sendBatch']) && !('get' in value)) {\n instrumented[key] = instrumentQueueProducer(value as Queue, key);\n continue;\n }\n\n // 8. Analytics Engine\n if (hasMethod(value, 'writeDataPoint')) {\n instrumented[key] = instrumentAnalyticsEngine(value as AnalyticsEngineDataset, key);\n continue;\n }\n\n // 9. Images\n if (hasExactMethods(value, ['info', 'input'])) {\n instrumented[key] = instrumentImages(value as any, key);\n continue;\n }\n\n // 10. Service Binding (broadest — must be last)\n if (hasMethod(value, 'fetch')) {\n instrumented[key] = instrumentServiceBinding(value as Fetcher, key);\n continue;\n }\n\n // Unknown binding type — pass through\n instrumented[key] = value;\n }\n\n envCache.set(env, instrumented);\n return instrumented;\n}\n\n","/**\n * Rate Limiter binding instrumentation\n */\n\nimport {\n trace,\n SpanKind,\n SpanStatusCode,\n} from '@opentelemetry/api';\nimport type { WorkerTracer } from 'autotel-edge';\nimport { wrap, setAttr } from './common';\n\ninterface RateLimiterLike {\n limit(options: { key: string }): Promise<{ success: boolean }>;\n}\n\n/**\n * Instrument Rate Limiter binding (manual only — not auto-detected)\n */\nexport function instrumentRateLimiter<T extends RateLimiterLike>(limiter: T, bindingName?: string): T {\n const name = bindingName || 'rate-limiter';\n\n const handler: ProxyHandler<T> = {\n get(target, prop) {\n const value = Reflect.get(target, prop);\n\n if (prop === 'limit' && typeof value === 'function') {\n return new Proxy(value, {\n apply: (fnTarget, _thisArg, args) => {\n const [options] = args as [{ key: string }];\n const tracer = trace.getTracer('autotel-edge') as WorkerTracer;\n\n return tracer.startActiveSpan(\n `RateLimiter ${name}: limit`,\n {\n kind: SpanKind.CLIENT,\n attributes: {\n 'rate_limiter.system': 'cloudflare-rate-limiter',\n 'rate_limiter.key': options?.key,\n },\n },\n async (span) => {\n try {\n const result = await Reflect.apply(fnTarget, target, args);\n setAttr(span, 'rate_limiter.success', result?.success);\n span.setStatus({ code: SpanStatusCode.OK });\n return result;\n } catch (error) {\n span.recordException(error as Error);\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: error instanceof Error ? error.message : String(error),\n });\n throw error;\n } finally {\n span.end();\n }\n },\n );\n },\n });\n }\n\n return value;\n },\n };\n\n return wrap(limiter, handler);\n}\n","/**\n * Browser Rendering binding instrumentation\n */\n\nimport {\n trace,\n SpanKind,\n SpanStatusCode,\n} from '@opentelemetry/api';\nimport type { WorkerTracer } from 'autotel-edge';\nimport { wrap, setAttr } from './common';\n\ninterface BrowserRenderingLike {\n fetch(input: RequestInfo | URL, init?: RequestInit): Promise<Response>;\n}\n\n/**\n * Instrument Browser Rendering binding (manual only — not auto-detected)\n */\nexport function instrumentBrowserRendering<T extends BrowserRenderingLike>(browser: T, bindingName?: string): T {\n const name = bindingName || 'browser';\n\n const handler: ProxyHandler<T> = {\n get(target, prop) {\n const value = Reflect.get(target, prop);\n\n if (prop === 'fetch' && typeof value === 'function') {\n return new Proxy(value, {\n apply: (fnTarget, _thisArg, args) => {\n const [input] = args as [RequestInfo | URL, RequestInit | undefined];\n const url = typeof input === 'string' ? input : input instanceof URL ? input.toString() : input.url;\n const tracer = trace.getTracer('autotel-edge') as WorkerTracer;\n\n return tracer.startActiveSpan(\n `BrowserRendering ${name}: fetch`,\n {\n kind: SpanKind.CLIENT,\n attributes: {\n 'browser.system': 'cloudflare-browser-rendering',\n 'url.full': url,\n },\n },\n async (span) => {\n try {\n const result = await Reflect.apply(fnTarget, target, args);\n setAttr(span, 'http.response.status_code', result?.status);\n span.setStatus({ code: SpanStatusCode.OK });\n return result;\n } catch (error) {\n span.recordException(error as Error);\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: error instanceof Error ? error.message : String(error),\n });\n throw error;\n } finally {\n span.end();\n }\n },\n );\n },\n });\n }\n\n return value;\n },\n };\n\n return wrap(browser, handler);\n}\n"],"mappings":"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"}
|
package/dist/bindings.js
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import { a as instrumentKV, c as instrumentImages, d as instrumentHyperdrive, f as instrumentVectorize, i as instrumentD1, l as instrumentAnalyticsEngine, n as instrumentRateLimiter, o as instrumentR2, p as instrumentAI, r as instrumentBindings, s as instrumentServiceBinding, t as instrumentBrowserRendering, u as instrumentQueueProducer } from "./bindings-
|
|
1
|
+
import { a as instrumentKV, c as instrumentImages, d as instrumentHyperdrive, f as instrumentVectorize, i as instrumentD1, l as instrumentAnalyticsEngine, n as instrumentRateLimiter, o as instrumentR2, p as instrumentAI, r as instrumentBindings, s as instrumentServiceBinding, t as instrumentBrowserRendering, u as instrumentQueueProducer } from "./bindings-BG6hzGSN.js";
|
|
2
2
|
|
|
3
3
|
export { instrumentAI, instrumentAnalyticsEngine, instrumentBindings, instrumentBrowserRendering, instrumentD1, instrumentHyperdrive, instrumentImages, instrumentKV, instrumentQueueProducer, instrumentR2, instrumentRateLimiter, instrumentServiceBinding, instrumentVectorize };
|
|
@@ -150,10 +150,11 @@ function instrumentDOInstance(doInstance, state, _env, doClass) {
|
|
|
150
150
|
function instrumentDO(doClass, config) {
|
|
151
151
|
const initialiser = createInitialiser(config);
|
|
152
152
|
return wrap(doClass, { construct(target, [state, env]) {
|
|
153
|
-
const
|
|
153
|
+
const trigger = {
|
|
154
154
|
id: state.id.toString(),
|
|
155
155
|
name: state.id.name
|
|
156
|
-
}
|
|
156
|
+
};
|
|
157
|
+
const context$2 = setConfig(initialiser(env, trigger));
|
|
157
158
|
return instrumentDOInstance(context.with(context$2, () => {
|
|
158
159
|
return new target(state, env);
|
|
159
160
|
}), state, env, doClass);
|
|
@@ -363,7 +364,8 @@ function instrumentWorkflowInstance(workflowInstance, workflowName, workflowClas
|
|
|
363
364
|
function instrumentWorkflow(workflowClass, workflowName, config) {
|
|
364
365
|
const initialiser = createInitialiser(config);
|
|
365
366
|
return wrap(workflowClass, { construct(target, args) {
|
|
366
|
-
const
|
|
367
|
+
const env = args[args.length - 1] || {};
|
|
368
|
+
const context$1 = setConfig(initialiser(env, {
|
|
367
369
|
type: "workflow",
|
|
368
370
|
name: workflowName
|
|
369
371
|
}));
|
|
@@ -375,4 +377,4 @@ function instrumentWorkflow(workflowClass, workflowName, config) {
|
|
|
375
377
|
|
|
376
378
|
//#endregion
|
|
377
379
|
export { instrumentDO as n, instrumentWorkflow as t };
|
|
378
|
-
//# sourceMappingURL=handlers-
|
|
380
|
+
//# sourceMappingURL=handlers-BAe65zoJ.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"handlers-CMg9l_T-.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 (state: DurableObjectState, env: 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<\n C extends new (...args: any[]) => any,\n>(\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
|
+
{"version":3,"file":"handlers-BAe65zoJ.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 (state: DurableObjectState, env: 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<\n C extends new (...args: any[]) => any,\n>(\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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"}
|
package/dist/handlers.js
CHANGED
package/dist/index.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { a as getWorkflowLogger, i as getRequestLogger, n as getActorLogger, r as getQueueLogger, t as createWorkersLogger } from "./execution-logger-BxmgP8jF.js";
|
|
2
2
|
import { n as isNativeTracingAvailable, t as getNativeTracerFromCtx } from "./native-tracing-D0EyAtsF.js";
|
|
3
3
|
import { a as wrap, i as unwrap, n as proxyExecutionContext } from "./common-DiWH6nmG.js";
|
|
4
|
-
import { a as instrumentKV, c as instrumentImages, d as instrumentHyperdrive, f as instrumentVectorize, i as instrumentD1, l as instrumentAnalyticsEngine, n as instrumentRateLimiter, o as instrumentR2, p as instrumentAI, r as instrumentBindings, s as instrumentServiceBinding, t as instrumentBrowserRendering, u as instrumentQueueProducer } from "./bindings-
|
|
5
|
-
import { n as instrumentDO, t as instrumentWorkflow } from "./handlers-
|
|
4
|
+
import { a as instrumentKV, c as instrumentImages, d as instrumentHyperdrive, f as instrumentVectorize, i as instrumentD1, l as instrumentAnalyticsEngine, n as instrumentRateLimiter, o as instrumentR2, p as instrumentAI, r as instrumentBindings, s as instrumentServiceBinding, t as instrumentBrowserRendering, u as instrumentQueueProducer } from "./bindings-BG6hzGSN.js";
|
|
5
|
+
import { n as instrumentDO, t as instrumentWorkflow } from "./handlers-BAe65zoJ.js";
|
|
6
6
|
import { WorkerTracer, WorkerTracerProvider, createInitialiser, ensureGlobalContextManager, getActiveConfig, getServiceForPath, setConfig, shouldInstrumentPath, withNativeTracer } from "autotel-edge";
|
|
7
7
|
import { SpanKind, SpanStatusCode, context, propagation, trace } from "@opentelemetry/api";
|
|
8
8
|
import { resourceFromAttributes } from "@opentelemetry/resources";
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "autotel-cloudflare",
|
|
3
|
-
"version": "4.0.
|
|
3
|
+
"version": "4.0.5",
|
|
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",
|
|
@@ -79,9 +79,9 @@
|
|
|
79
79
|
"@opentelemetry/resources": "^2.7.1"
|
|
80
80
|
},
|
|
81
81
|
"peerDependencies": {
|
|
82
|
-
"@cloudflare/workers-types": "^
|
|
82
|
+
"@cloudflare/workers-types": "^5.20260707.1",
|
|
83
83
|
"autotel-edge": "3.17.1",
|
|
84
|
-
"autotel-genai": "0.3.
|
|
84
|
+
"autotel-genai": "0.3.5"
|
|
85
85
|
},
|
|
86
86
|
"peerDependenciesMeta": {
|
|
87
87
|
"autotel-edge": {
|
|
@@ -92,16 +92,16 @@
|
|
|
92
92
|
}
|
|
93
93
|
},
|
|
94
94
|
"devDependencies": {
|
|
95
|
-
"@cloudflare/workers-types": "^
|
|
95
|
+
"@cloudflare/workers-types": "^5.20260707.1",
|
|
96
96
|
"@opentelemetry/context-async-hooks": "^2.7.1",
|
|
97
|
-
"@types/node": "^
|
|
97
|
+
"@types/node": "^26.1.0",
|
|
98
98
|
"rimraf": "^6.1.3",
|
|
99
|
-
"tsdown": "^0.22.
|
|
99
|
+
"tsdown": "^0.22.3",
|
|
100
100
|
"typescript": "^6.0.3",
|
|
101
|
-
"vitest": "^4.1.
|
|
101
|
+
"vitest": "^4.1.10",
|
|
102
102
|
"vitest-mock-extended": "^4.0.0",
|
|
103
103
|
"autotel-edge": "3.17.1",
|
|
104
|
-
"autotel-genai": "0.3.
|
|
104
|
+
"autotel-genai": "0.3.5"
|
|
105
105
|
},
|
|
106
106
|
"repository": {
|
|
107
107
|
"type": "git",
|