autotel-cloudflare 2.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +432 -0
- package/dist/actors.d.ts +248 -0
- package/dist/actors.js +1030 -0
- package/dist/actors.js.map +1 -0
- package/dist/agents.d.ts +219 -0
- package/dist/agents.js +276 -0
- package/dist/agents.js.map +1 -0
- package/dist/bindings.d.ts +40 -0
- package/dist/bindings.js +4 -0
- package/dist/bindings.js.map +1 -0
- package/dist/chunk-JDPN3HND.js +520 -0
- package/dist/chunk-JDPN3HND.js.map +1 -0
- package/dist/chunk-QXFYTHQF.js +298 -0
- package/dist/chunk-QXFYTHQF.js.map +1 -0
- package/dist/chunk-SKKRPS5K.js +50 -0
- package/dist/chunk-SKKRPS5K.js.map +1 -0
- package/dist/events.d.ts +1 -0
- package/dist/events.js +3 -0
- package/dist/events.js.map +1 -0
- package/dist/handlers.d.ts +121 -0
- package/dist/handlers.js +4 -0
- package/dist/handlers.js.map +1 -0
- package/dist/index.d.ts +144 -0
- package/dist/index.js +576 -0
- package/dist/index.js.map +1 -0
- package/dist/logger.d.ts +1 -0
- package/dist/logger.js +3 -0
- package/dist/logger.js.map +1 -0
- package/dist/sampling.d.ts +4 -0
- package/dist/sampling.js +3 -0
- package/dist/sampling.js.map +1 -0
- package/dist/testing.d.ts +1 -0
- package/dist/testing.js +3 -0
- package/dist/testing.js.map +1 -0
- package/package.json +107 -0
- package/src/actors/alarms.ts +225 -0
- package/src/actors/index.ts +36 -0
- package/src/actors/instrument-actor.test.ts +179 -0
- package/src/actors/instrument-actor.ts +574 -0
- package/src/actors/sockets.ts +217 -0
- package/src/actors/storage.ts +263 -0
- package/src/actors/traced-handler.ts +300 -0
- package/src/actors/types.ts +98 -0
- package/src/actors.ts +50 -0
- package/src/agents/index.ts +42 -0
- package/src/agents/otel-observability.test.ts +329 -0
- package/src/agents/otel-observability.ts +465 -0
- package/src/agents/types.ts +167 -0
- package/src/agents.ts +76 -0
- package/src/bindings/bindings.ts +621 -0
- package/src/bindings/common.ts +75 -0
- package/src/bindings/index.ts +12 -0
- package/src/bindings.ts +6 -0
- package/src/events.ts +6 -0
- package/src/global/cache.test.ts +292 -0
- package/src/global/cache.ts +164 -0
- package/src/global/fetch.test.ts +344 -0
- package/src/global/fetch.ts +134 -0
- package/src/global/index.ts +7 -0
- package/src/handlers/durable-objects.test.ts +524 -0
- package/src/handlers/durable-objects.ts +250 -0
- package/src/handlers/index.ts +6 -0
- package/src/handlers/workflows.ts +318 -0
- package/src/handlers.ts +6 -0
- package/src/index.ts +57 -0
- package/src/logger.ts +6 -0
- package/src/sampling.ts +6 -0
- package/src/testing.ts +6 -0
- package/src/wrappers/index.ts +8 -0
- package/src/wrappers/instrument.integration.test.ts +468 -0
- package/src/wrappers/instrument.ts +643 -0
- package/src/wrappers/wrap-do.ts +34 -0
- package/src/wrappers/wrap-module.ts +37 -0
|
@@ -0,0 +1,520 @@
|
|
|
1
|
+
import { wrap } from './chunk-SKKRPS5K.js';
|
|
2
|
+
import { trace, SpanKind, SpanStatusCode } from '@opentelemetry/api';
|
|
3
|
+
|
|
4
|
+
function instrumentKV(kv, namespaceName) {
|
|
5
|
+
const name = namespaceName || "kv";
|
|
6
|
+
const kvHandler = {
|
|
7
|
+
get(target, prop) {
|
|
8
|
+
const value = Reflect.get(target, prop);
|
|
9
|
+
if (prop === "get" && typeof value === "function") {
|
|
10
|
+
return new Proxy(value, {
|
|
11
|
+
apply: (fnTarget, thisArg, args) => {
|
|
12
|
+
const [key, options] = args;
|
|
13
|
+
const tracer = trace.getTracer("autotel-edge");
|
|
14
|
+
return tracer.startActiveSpan(
|
|
15
|
+
`KV ${name}: get`,
|
|
16
|
+
{
|
|
17
|
+
kind: SpanKind.CLIENT,
|
|
18
|
+
attributes: {
|
|
19
|
+
"db.system": "cloudflare-kv",
|
|
20
|
+
"db.operation": "get",
|
|
21
|
+
"db.namespace": name,
|
|
22
|
+
"db.key": key,
|
|
23
|
+
"db.cache_hit": options?.cacheTtl !== void 0
|
|
24
|
+
}
|
|
25
|
+
},
|
|
26
|
+
async (span) => {
|
|
27
|
+
try {
|
|
28
|
+
const result = await Reflect.apply(fnTarget, thisArg, args);
|
|
29
|
+
span.setAttribute("db.result.type", result === null ? "null" : typeof result);
|
|
30
|
+
span.setStatus({ code: SpanStatusCode.OK });
|
|
31
|
+
return result;
|
|
32
|
+
} catch (error) {
|
|
33
|
+
span.recordException(error);
|
|
34
|
+
span.setStatus({
|
|
35
|
+
code: SpanStatusCode.ERROR,
|
|
36
|
+
message: error instanceof Error ? error.message : String(error)
|
|
37
|
+
});
|
|
38
|
+
throw error;
|
|
39
|
+
} finally {
|
|
40
|
+
span.end();
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
);
|
|
44
|
+
}
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
if (prop === "put" && typeof value === "function") {
|
|
48
|
+
return new Proxy(value, {
|
|
49
|
+
apply: (fnTarget, thisArg, args) => {
|
|
50
|
+
const [key] = args;
|
|
51
|
+
const tracer = trace.getTracer("autotel-edge");
|
|
52
|
+
return tracer.startActiveSpan(
|
|
53
|
+
`KV ${name}: put`,
|
|
54
|
+
{
|
|
55
|
+
kind: SpanKind.CLIENT,
|
|
56
|
+
attributes: {
|
|
57
|
+
"db.system": "cloudflare-kv",
|
|
58
|
+
"db.operation": "put",
|
|
59
|
+
"db.namespace": name,
|
|
60
|
+
"db.key": key
|
|
61
|
+
}
|
|
62
|
+
},
|
|
63
|
+
async (span) => {
|
|
64
|
+
try {
|
|
65
|
+
const result = await Reflect.apply(fnTarget, thisArg, args);
|
|
66
|
+
span.setStatus({ code: SpanStatusCode.OK });
|
|
67
|
+
return result;
|
|
68
|
+
} catch (error) {
|
|
69
|
+
span.recordException(error);
|
|
70
|
+
span.setStatus({
|
|
71
|
+
code: SpanStatusCode.ERROR,
|
|
72
|
+
message: error instanceof Error ? error.message : String(error)
|
|
73
|
+
});
|
|
74
|
+
throw error;
|
|
75
|
+
} finally {
|
|
76
|
+
span.end();
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
);
|
|
80
|
+
}
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
if (prop === "delete" && typeof value === "function") {
|
|
84
|
+
return new Proxy(value, {
|
|
85
|
+
apply: (fnTarget, thisArg, args) => {
|
|
86
|
+
const [key] = args;
|
|
87
|
+
const tracer = trace.getTracer("autotel-edge");
|
|
88
|
+
return tracer.startActiveSpan(
|
|
89
|
+
`KV ${name}: delete`,
|
|
90
|
+
{
|
|
91
|
+
kind: SpanKind.CLIENT,
|
|
92
|
+
attributes: {
|
|
93
|
+
"db.system": "cloudflare-kv",
|
|
94
|
+
"db.operation": "delete",
|
|
95
|
+
"db.namespace": name,
|
|
96
|
+
"db.key": key
|
|
97
|
+
}
|
|
98
|
+
},
|
|
99
|
+
async (span) => {
|
|
100
|
+
try {
|
|
101
|
+
const result = await Reflect.apply(fnTarget, thisArg, args);
|
|
102
|
+
span.setStatus({ code: SpanStatusCode.OK });
|
|
103
|
+
return result;
|
|
104
|
+
} catch (error) {
|
|
105
|
+
span.recordException(error);
|
|
106
|
+
span.setStatus({
|
|
107
|
+
code: SpanStatusCode.ERROR,
|
|
108
|
+
message: error instanceof Error ? error.message : String(error)
|
|
109
|
+
});
|
|
110
|
+
throw error;
|
|
111
|
+
} finally {
|
|
112
|
+
span.end();
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
);
|
|
116
|
+
}
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
if (prop === "list" && typeof value === "function") {
|
|
120
|
+
return new Proxy(value, {
|
|
121
|
+
apply: (fnTarget, thisArg, args) => {
|
|
122
|
+
const [options] = args;
|
|
123
|
+
const tracer = trace.getTracer("autotel-edge");
|
|
124
|
+
return tracer.startActiveSpan(
|
|
125
|
+
`KV ${name}: list`,
|
|
126
|
+
{
|
|
127
|
+
kind: SpanKind.CLIENT,
|
|
128
|
+
attributes: {
|
|
129
|
+
"db.system": "cloudflare-kv",
|
|
130
|
+
"db.operation": "list",
|
|
131
|
+
"db.namespace": name,
|
|
132
|
+
"db.prefix": options?.prefix || void 0,
|
|
133
|
+
"db.limit": options?.limit || void 0
|
|
134
|
+
}
|
|
135
|
+
},
|
|
136
|
+
async (span) => {
|
|
137
|
+
try {
|
|
138
|
+
const result = await Reflect.apply(fnTarget, thisArg, args);
|
|
139
|
+
span.setAttribute("db.result.keys_count", result.keys.length);
|
|
140
|
+
span.setStatus({ code: SpanStatusCode.OK });
|
|
141
|
+
return result;
|
|
142
|
+
} catch (error) {
|
|
143
|
+
span.recordException(error);
|
|
144
|
+
span.setStatus({
|
|
145
|
+
code: SpanStatusCode.ERROR,
|
|
146
|
+
message: error instanceof Error ? error.message : String(error)
|
|
147
|
+
});
|
|
148
|
+
throw error;
|
|
149
|
+
} finally {
|
|
150
|
+
span.end();
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
);
|
|
154
|
+
}
|
|
155
|
+
});
|
|
156
|
+
}
|
|
157
|
+
return value;
|
|
158
|
+
}
|
|
159
|
+
};
|
|
160
|
+
return wrap(kv, kvHandler);
|
|
161
|
+
}
|
|
162
|
+
function instrumentR2(r2, bucketName) {
|
|
163
|
+
const name = bucketName || "r2";
|
|
164
|
+
const r2Handler = {
|
|
165
|
+
get(target, prop) {
|
|
166
|
+
const value = Reflect.get(target, prop);
|
|
167
|
+
if (prop === "get" && typeof value === "function") {
|
|
168
|
+
return new Proxy(value, {
|
|
169
|
+
apply: (fnTarget, thisArg, args) => {
|
|
170
|
+
const [key] = args;
|
|
171
|
+
const tracer = trace.getTracer("autotel-edge");
|
|
172
|
+
return tracer.startActiveSpan(
|
|
173
|
+
`R2 ${name}: get`,
|
|
174
|
+
{
|
|
175
|
+
kind: SpanKind.CLIENT,
|
|
176
|
+
attributes: {
|
|
177
|
+
"db.system": "cloudflare-r2",
|
|
178
|
+
"db.operation": "get",
|
|
179
|
+
"db.bucket": name,
|
|
180
|
+
"db.key": key
|
|
181
|
+
}
|
|
182
|
+
},
|
|
183
|
+
async (span) => {
|
|
184
|
+
try {
|
|
185
|
+
const result = await Reflect.apply(fnTarget, thisArg, args);
|
|
186
|
+
if (result) {
|
|
187
|
+
span.setAttribute("db.result.size", result.size);
|
|
188
|
+
span.setAttribute("db.result.etag", result.etag);
|
|
189
|
+
span.setAttribute("db.result.content_type", result.httpMetadata?.contentType);
|
|
190
|
+
} else {
|
|
191
|
+
span.setAttribute("db.result.exists", false);
|
|
192
|
+
}
|
|
193
|
+
span.setStatus({ code: SpanStatusCode.OK });
|
|
194
|
+
return result;
|
|
195
|
+
} catch (error) {
|
|
196
|
+
span.recordException(error);
|
|
197
|
+
span.setStatus({
|
|
198
|
+
code: SpanStatusCode.ERROR,
|
|
199
|
+
message: error instanceof Error ? error.message : String(error)
|
|
200
|
+
});
|
|
201
|
+
throw error;
|
|
202
|
+
} finally {
|
|
203
|
+
span.end();
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
);
|
|
207
|
+
}
|
|
208
|
+
});
|
|
209
|
+
}
|
|
210
|
+
if (prop === "put" && typeof value === "function") {
|
|
211
|
+
return new Proxy(value, {
|
|
212
|
+
apply: (fnTarget, thisArg, args) => {
|
|
213
|
+
const [key] = args;
|
|
214
|
+
const tracer = trace.getTracer("autotel-edge");
|
|
215
|
+
return tracer.startActiveSpan(
|
|
216
|
+
`R2 ${name}: put`,
|
|
217
|
+
{
|
|
218
|
+
kind: SpanKind.CLIENT,
|
|
219
|
+
attributes: {
|
|
220
|
+
"db.system": "cloudflare-r2",
|
|
221
|
+
"db.operation": "put",
|
|
222
|
+
"db.bucket": name,
|
|
223
|
+
"db.key": key
|
|
224
|
+
}
|
|
225
|
+
},
|
|
226
|
+
async (span) => {
|
|
227
|
+
try {
|
|
228
|
+
const result = await Reflect.apply(fnTarget, thisArg, args);
|
|
229
|
+
span.setAttribute("db.result.etag", result.etag);
|
|
230
|
+
span.setAttribute("db.result.uploaded", result.uploaded);
|
|
231
|
+
span.setStatus({ code: SpanStatusCode.OK });
|
|
232
|
+
return result;
|
|
233
|
+
} catch (error) {
|
|
234
|
+
span.recordException(error);
|
|
235
|
+
span.setStatus({
|
|
236
|
+
code: SpanStatusCode.ERROR,
|
|
237
|
+
message: error instanceof Error ? error.message : String(error)
|
|
238
|
+
});
|
|
239
|
+
throw error;
|
|
240
|
+
} finally {
|
|
241
|
+
span.end();
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
);
|
|
245
|
+
}
|
|
246
|
+
});
|
|
247
|
+
}
|
|
248
|
+
if (prop === "delete" && typeof value === "function") {
|
|
249
|
+
return new Proxy(value, {
|
|
250
|
+
apply: (fnTarget, thisArg, args) => {
|
|
251
|
+
const keys = args;
|
|
252
|
+
const tracer = trace.getTracer("autotel-edge");
|
|
253
|
+
return tracer.startActiveSpan(
|
|
254
|
+
`R2 ${name}: delete`,
|
|
255
|
+
{
|
|
256
|
+
kind: SpanKind.CLIENT,
|
|
257
|
+
attributes: {
|
|
258
|
+
"db.system": "cloudflare-r2",
|
|
259
|
+
"db.operation": "delete",
|
|
260
|
+
"db.bucket": name,
|
|
261
|
+
"db.keys_count": keys.length
|
|
262
|
+
}
|
|
263
|
+
},
|
|
264
|
+
async (span) => {
|
|
265
|
+
try {
|
|
266
|
+
const result = await Reflect.apply(fnTarget, thisArg, args);
|
|
267
|
+
span.setStatus({ code: SpanStatusCode.OK });
|
|
268
|
+
return result;
|
|
269
|
+
} catch (error) {
|
|
270
|
+
span.recordException(error);
|
|
271
|
+
span.setStatus({
|
|
272
|
+
code: SpanStatusCode.ERROR,
|
|
273
|
+
message: error instanceof Error ? error.message : String(error)
|
|
274
|
+
});
|
|
275
|
+
throw error;
|
|
276
|
+
} finally {
|
|
277
|
+
span.end();
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
);
|
|
281
|
+
}
|
|
282
|
+
});
|
|
283
|
+
}
|
|
284
|
+
if (prop === "list" && typeof value === "function") {
|
|
285
|
+
return new Proxy(value, {
|
|
286
|
+
apply: (fnTarget, thisArg, args) => {
|
|
287
|
+
const [options] = args;
|
|
288
|
+
const tracer = trace.getTracer("autotel-edge");
|
|
289
|
+
return tracer.startActiveSpan(
|
|
290
|
+
`R2 ${name}: list`,
|
|
291
|
+
{
|
|
292
|
+
kind: SpanKind.CLIENT,
|
|
293
|
+
attributes: {
|
|
294
|
+
"db.system": "cloudflare-r2",
|
|
295
|
+
"db.operation": "list",
|
|
296
|
+
"db.bucket": name,
|
|
297
|
+
"db.prefix": options?.prefix || void 0,
|
|
298
|
+
"db.limit": options?.limit || void 0
|
|
299
|
+
}
|
|
300
|
+
},
|
|
301
|
+
async (span) => {
|
|
302
|
+
try {
|
|
303
|
+
const result = await Reflect.apply(fnTarget, thisArg, args);
|
|
304
|
+
span.setAttribute("db.result.objects_count", result.objects.length);
|
|
305
|
+
span.setAttribute("db.result.truncated", result.truncated);
|
|
306
|
+
span.setStatus({ code: SpanStatusCode.OK });
|
|
307
|
+
return result;
|
|
308
|
+
} catch (error) {
|
|
309
|
+
span.recordException(error);
|
|
310
|
+
span.setStatus({
|
|
311
|
+
code: SpanStatusCode.ERROR,
|
|
312
|
+
message: error instanceof Error ? error.message : String(error)
|
|
313
|
+
});
|
|
314
|
+
throw error;
|
|
315
|
+
} finally {
|
|
316
|
+
span.end();
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
);
|
|
320
|
+
}
|
|
321
|
+
});
|
|
322
|
+
}
|
|
323
|
+
return value;
|
|
324
|
+
}
|
|
325
|
+
};
|
|
326
|
+
return wrap(r2, r2Handler);
|
|
327
|
+
}
|
|
328
|
+
function instrumentD1(d1, databaseName) {
|
|
329
|
+
const name = databaseName || "d1";
|
|
330
|
+
const d1Handler = {
|
|
331
|
+
get(target, prop) {
|
|
332
|
+
const value = Reflect.get(target, prop);
|
|
333
|
+
if (prop === "prepare" && typeof value === "function") {
|
|
334
|
+
return new Proxy(value, {
|
|
335
|
+
apply: (fnTarget, thisArg, args) => {
|
|
336
|
+
const [query] = args;
|
|
337
|
+
const tracer = trace.getTracer("autotel-edge");
|
|
338
|
+
const prepared = Reflect.apply(fnTarget, thisArg, args);
|
|
339
|
+
const preparedHandler = {
|
|
340
|
+
get(target2, prop2) {
|
|
341
|
+
const value2 = Reflect.get(target2, prop2);
|
|
342
|
+
if (prop2 === "first" || prop2 === "run" || prop2 === "all" || prop2 === "raw") {
|
|
343
|
+
return new Proxy(value2, {
|
|
344
|
+
apply: (fnTarget2, thisArg2, args2) => {
|
|
345
|
+
return tracer.startActiveSpan(
|
|
346
|
+
`D1 ${name}: ${prop2}`,
|
|
347
|
+
{
|
|
348
|
+
kind: SpanKind.CLIENT,
|
|
349
|
+
attributes: {
|
|
350
|
+
"db.system": "cloudflare-d1",
|
|
351
|
+
"db.operation": prop2,
|
|
352
|
+
"db.name": name,
|
|
353
|
+
"db.statement": query
|
|
354
|
+
}
|
|
355
|
+
},
|
|
356
|
+
async (span) => {
|
|
357
|
+
try {
|
|
358
|
+
const result = await Reflect.apply(fnTarget2, thisArg2, args2);
|
|
359
|
+
if (prop2 === "all" && Array.isArray(result)) {
|
|
360
|
+
span.setAttribute("db.result.rows_count", result.length);
|
|
361
|
+
} else if (prop2 === "first" && result) {
|
|
362
|
+
span.setAttribute("db.result.exists", true);
|
|
363
|
+
}
|
|
364
|
+
span.setStatus({ code: SpanStatusCode.OK });
|
|
365
|
+
return result;
|
|
366
|
+
} catch (error) {
|
|
367
|
+
span.recordException(error);
|
|
368
|
+
span.setStatus({
|
|
369
|
+
code: SpanStatusCode.ERROR,
|
|
370
|
+
message: error instanceof Error ? error.message : String(error)
|
|
371
|
+
});
|
|
372
|
+
throw error;
|
|
373
|
+
} finally {
|
|
374
|
+
span.end();
|
|
375
|
+
}
|
|
376
|
+
}
|
|
377
|
+
);
|
|
378
|
+
}
|
|
379
|
+
});
|
|
380
|
+
}
|
|
381
|
+
return value2;
|
|
382
|
+
}
|
|
383
|
+
};
|
|
384
|
+
return wrap(prepared, preparedHandler);
|
|
385
|
+
}
|
|
386
|
+
});
|
|
387
|
+
}
|
|
388
|
+
if (prop === "exec" && typeof value === "function") {
|
|
389
|
+
return new Proxy(value, {
|
|
390
|
+
apply: (fnTarget, thisArg, args) => {
|
|
391
|
+
const [query] = args;
|
|
392
|
+
const tracer = trace.getTracer("autotel-edge");
|
|
393
|
+
return tracer.startActiveSpan(
|
|
394
|
+
`D1 ${name}: exec`,
|
|
395
|
+
{
|
|
396
|
+
kind: SpanKind.CLIENT,
|
|
397
|
+
attributes: {
|
|
398
|
+
"db.system": "cloudflare-d1",
|
|
399
|
+
"db.operation": "exec",
|
|
400
|
+
"db.name": name,
|
|
401
|
+
"db.statement": query
|
|
402
|
+
}
|
|
403
|
+
},
|
|
404
|
+
async (span) => {
|
|
405
|
+
try {
|
|
406
|
+
const result = await Reflect.apply(fnTarget, thisArg, args);
|
|
407
|
+
span.setAttribute("db.result.count", result.count);
|
|
408
|
+
span.setStatus({ code: SpanStatusCode.OK });
|
|
409
|
+
return result;
|
|
410
|
+
} catch (error) {
|
|
411
|
+
span.recordException(error);
|
|
412
|
+
span.setStatus({
|
|
413
|
+
code: SpanStatusCode.ERROR,
|
|
414
|
+
message: error instanceof Error ? error.message : String(error)
|
|
415
|
+
});
|
|
416
|
+
throw error;
|
|
417
|
+
} finally {
|
|
418
|
+
span.end();
|
|
419
|
+
}
|
|
420
|
+
}
|
|
421
|
+
);
|
|
422
|
+
}
|
|
423
|
+
});
|
|
424
|
+
}
|
|
425
|
+
return value;
|
|
426
|
+
}
|
|
427
|
+
};
|
|
428
|
+
return wrap(d1, d1Handler);
|
|
429
|
+
}
|
|
430
|
+
function instrumentServiceBinding(fetcher, serviceName) {
|
|
431
|
+
const name = serviceName || "service";
|
|
432
|
+
const fetcherHandler = {
|
|
433
|
+
get(target, prop) {
|
|
434
|
+
const value = Reflect.get(target, prop);
|
|
435
|
+
if (prop === "fetch" && typeof value === "function") {
|
|
436
|
+
return new Proxy(value, {
|
|
437
|
+
apply: (fnTarget, thisArg, args) => {
|
|
438
|
+
const [input, init] = args;
|
|
439
|
+
const request = new Request(input, init);
|
|
440
|
+
const tracer = trace.getTracer("autotel-edge");
|
|
441
|
+
return tracer.startActiveSpan(
|
|
442
|
+
`Service ${name}: ${request.method}`,
|
|
443
|
+
{
|
|
444
|
+
kind: SpanKind.CLIENT,
|
|
445
|
+
attributes: {
|
|
446
|
+
"rpc.system": "cloudflare-service-binding",
|
|
447
|
+
"rpc.service": name,
|
|
448
|
+
"http.request.method": request.method,
|
|
449
|
+
"url.full": request.url
|
|
450
|
+
}
|
|
451
|
+
},
|
|
452
|
+
async (span) => {
|
|
453
|
+
try {
|
|
454
|
+
const response = await Reflect.apply(fnTarget, thisArg, args);
|
|
455
|
+
span.setAttribute("http.response.status_code", response.status);
|
|
456
|
+
span.setStatus({ code: SpanStatusCode.OK });
|
|
457
|
+
return response;
|
|
458
|
+
} catch (error) {
|
|
459
|
+
span.recordException(error);
|
|
460
|
+
span.setStatus({
|
|
461
|
+
code: SpanStatusCode.ERROR,
|
|
462
|
+
message: error instanceof Error ? error.message : String(error)
|
|
463
|
+
});
|
|
464
|
+
throw error;
|
|
465
|
+
} finally {
|
|
466
|
+
span.end();
|
|
467
|
+
}
|
|
468
|
+
}
|
|
469
|
+
);
|
|
470
|
+
}
|
|
471
|
+
});
|
|
472
|
+
}
|
|
473
|
+
return value;
|
|
474
|
+
}
|
|
475
|
+
};
|
|
476
|
+
return wrap(fetcher, fetcherHandler);
|
|
477
|
+
}
|
|
478
|
+
function instrumentBindings(env) {
|
|
479
|
+
const instrumented = {};
|
|
480
|
+
for (const [key, value] of Object.entries(env)) {
|
|
481
|
+
if (!value || typeof value !== "object") {
|
|
482
|
+
instrumented[key] = value;
|
|
483
|
+
continue;
|
|
484
|
+
}
|
|
485
|
+
if ("get" in value && "put" in value && "delete" in value && "list" in value) {
|
|
486
|
+
try {
|
|
487
|
+
instrumented[key] = instrumentKV(value, key);
|
|
488
|
+
continue;
|
|
489
|
+
} catch {
|
|
490
|
+
}
|
|
491
|
+
}
|
|
492
|
+
if ("get" in value && "put" in value && "delete" in value && "list" in value && "head" in value) {
|
|
493
|
+
try {
|
|
494
|
+
instrumented[key] = instrumentR2(value, key);
|
|
495
|
+
continue;
|
|
496
|
+
} catch {
|
|
497
|
+
}
|
|
498
|
+
}
|
|
499
|
+
if ("prepare" in value && "exec" in value && typeof value.prepare === "function") {
|
|
500
|
+
try {
|
|
501
|
+
instrumented[key] = instrumentD1(value, key);
|
|
502
|
+
continue;
|
|
503
|
+
} catch {
|
|
504
|
+
}
|
|
505
|
+
}
|
|
506
|
+
if ("fetch" in value && typeof value.fetch === "function") {
|
|
507
|
+
try {
|
|
508
|
+
instrumented[key] = instrumentServiceBinding(value, key);
|
|
509
|
+
continue;
|
|
510
|
+
} catch {
|
|
511
|
+
}
|
|
512
|
+
}
|
|
513
|
+
instrumented[key] = value;
|
|
514
|
+
}
|
|
515
|
+
return instrumented;
|
|
516
|
+
}
|
|
517
|
+
|
|
518
|
+
export { instrumentBindings, instrumentD1, instrumentKV, instrumentR2, instrumentServiceBinding };
|
|
519
|
+
//# sourceMappingURL=chunk-JDPN3HND.js.map
|
|
520
|
+
//# sourceMappingURL=chunk-JDPN3HND.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/bindings/bindings.ts"],"names":["target","prop","value","fnTarget","thisArg","args"],"mappings":"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","file":"chunk-JDPN3HND.js","sourcesContent":["/**\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 } from 'autotel-edge';\nimport { wrap } from './common';\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, thisArg, 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, 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: 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, 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: 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, thisArg, 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, thisArg, 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, thisArg, 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, 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: 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, thisArg, 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, thisArg, 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 return tracer.startActiveSpan(\n `D1 ${name}: ${prop}`,\n {\n kind: SpanKind.CLIENT,\n attributes: {\n 'db.system': 'cloudflare-d1',\n 'db.operation': prop,\n 'db.name': name,\n 'db.statement': query,\n },\n },\n async (span) => {\n try {\n const result = await Reflect.apply(fnTarget, thisArg, 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 \n return tracer.startActiveSpan(\n `D1 ${name}: exec`,\n {\n kind: SpanKind.CLIENT,\n attributes: {\n 'db.system': 'cloudflare-d1',\n 'db.operation': 'exec',\n 'db.name': name,\n 'db.statement': query,\n },\n },\n async (span) => {\n try {\n const result = await Reflect.apply(fnTarget, thisArg, args);\n span.setAttribute('db.result.count', result.count);\n span.setStatus({ code: SpanStatusCode.OK });\n return result;\n } catch (error) {\n span.recordException(error as Error);\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: error instanceof Error ? error.message : String(error),\n });\n throw error;\n } finally {\n span.end();\n }\n },\n );\n },\n });\n }\n \n return value;\n },\n };\n \n return wrap(d1, d1Handler);\n}\n\n/**\n * Instrument service binding (Fetcher)\n */\nexport function instrumentServiceBinding<F extends Fetcher>(fetcher: F, serviceName?: string): F {\n const name = serviceName || 'service';\n \n const fetcherHandler: ProxyHandler<F> = {\n get(target, prop) {\n const value = Reflect.get(target, prop);\n \n if (prop === 'fetch' && typeof value === 'function') {\n return new Proxy(value, {\n apply: (fnTarget, thisArg, args) => {\n const [input, init] = args as [RequestInfo | URL, RequestInit | undefined];\n const request = new Request(input, init);\n const tracer = trace.getTracer('autotel-edge') as WorkerTracer;\n \n return tracer.startActiveSpan(\n `Service ${name}: ${request.method}`,\n {\n kind: SpanKind.CLIENT,\n attributes: {\n 'rpc.system': 'cloudflare-service-binding',\n 'rpc.service': name,\n 'http.request.method': request.method,\n 'url.full': request.url,\n },\n },\n async (span) => {\n try {\n const response = await Reflect.apply(fnTarget, thisArg, args);\n span.setAttribute('http.response.status_code', response.status);\n span.setStatus({ code: SpanStatusCode.OK });\n return response;\n } catch (error) {\n span.recordException(error as Error);\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: error instanceof Error ? error.message : String(error),\n });\n throw error;\n } finally {\n span.end();\n }\n },\n );\n },\n });\n }\n \n return value;\n },\n };\n \n return wrap(fetcher, fetcherHandler);\n}\n\n/**\n * Auto-instrument all Cloudflare bindings in the environment\n */\nexport function instrumentBindings(env: Record<string, any>): Record<string, any> {\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 // Check for KV namespace\n if ('get' in value && 'put' in value && 'delete' in value && 'list' in value) {\n // Likely KV namespace\n try {\n instrumented[key] = instrumentKV(value as KVNamespace, key);\n continue;\n } catch {\n // Not KV, continue checking\n }\n }\n \n // Check for R2 bucket\n if ('get' in value && 'put' in value && 'delete' in value && 'list' in value && 'head' in value) {\n // Likely R2 bucket\n try {\n instrumented[key] = instrumentR2(value as R2Bucket, key);\n continue;\n } catch {\n // Not R2, continue checking\n }\n }\n \n // Check for D1 database\n if ('prepare' in value && 'exec' in value && typeof value.prepare === 'function') {\n // Likely D1 database\n try {\n instrumented[key] = instrumentD1(value as D1Database, key);\n continue;\n } catch {\n // Not D1, continue checking\n }\n }\n \n // Check for Service Binding (Fetcher)\n if ('fetch' in value && typeof value.fetch === 'function') {\n // Likely service binding\n try {\n instrumented[key] = instrumentServiceBinding(value as Fetcher, key);\n continue;\n } catch {\n // Not a service binding, continue checking\n }\n }\n \n // For other bindings (Events Engine, Workers AI, Vectorize, Hyperdrive),\n // they don't have standard interfaces we can detect, so we pass them through\n // Users can manually instrument them if needed\n instrumented[key] = value;\n }\n \n return instrumented;\n}\n\n"]}
|