@tracepanel/js 0.3.4 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +50 -4
- package/dist/agent.d.ts +23 -1
- package/dist/agent.js +72 -22
- package/dist/agent.js.map +1 -1
- package/dist/body.d.ts +32 -0
- package/dist/body.js +314 -0
- package/dist/body.js.map +1 -0
- package/dist/bullmq.d.ts +76 -1
- package/dist/bullmq.js +215 -6
- package/dist/bullmq.js.map +1 -1
- package/dist/bun.js +81 -11
- package/dist/bun.js.map +1 -1
- package/dist/config.d.ts +20 -0
- package/dist/config.js +13 -0
- package/dist/config.js.map +1 -1
- package/dist/console.d.ts +5 -0
- package/dist/console.js +16 -0
- package/dist/console.js.map +1 -1
- package/dist/express.js +94 -23
- package/dist/express.js.map +1 -1
- package/dist/headers.js +54 -8
- package/dist/headers.js.map +1 -1
- package/dist/inspector.d.ts +9 -0
- package/dist/inspector.js +47 -0
- package/dist/inspector.js.map +1 -0
- package/dist/locals.d.ts +51 -0
- package/dist/locals.js +269 -0
- package/dist/locals.js.map +1 -0
- package/dist/loggers.d.ts +50 -0
- package/dist/loggers.js +201 -0
- package/dist/loggers.js.map +1 -0
- package/dist/model.d.ts +23 -2
- package/dist/model.js.map +1 -1
- package/dist/next.js +6 -0
- package/dist/next.js.map +1 -1
- package/dist/nuxt-plugin.d.ts +1 -0
- package/dist/nuxt-plugin.js +6 -0
- package/dist/nuxt-plugin.js.map +1 -1
- package/dist/processor.d.ts +23 -2
- package/dist/processor.js +61 -14
- package/dist/processor.js.map +1 -1
- package/dist/profile.d.ts +63 -0
- package/dist/profile.js +300 -0
- package/dist/profile.js.map +1 -0
- package/dist/request.d.ts +61 -0
- package/dist/request.js +244 -0
- package/dist/request.js.map +1 -0
- package/dist/session.d.ts +10 -0
- package/dist/session.js +45 -0
- package/dist/session.js.map +1 -0
- package/dist/setup.js +10 -1
- package/dist/setup.js.map +1 -1
- package/dist/stack.d.ts +27 -3
- package/dist/stack.js +106 -9
- package/dist/stack.js.map +1 -1
- package/dist/widget.d.ts +24 -0
- package/dist/widget.js +62 -1
- package/dist/widget.js.map +1 -1
- package/package.json +16 -4
package/dist/bullmq.js
CHANGED
|
@@ -1,8 +1,24 @@
|
|
|
1
1
|
// BullMQ: each job a worker runs is a task trace, and each job the app adds is a task.enqueue step of the request
|
|
2
2
|
// that added it, as the Python SDK records Celery's and RQ's.
|
|
3
|
+
//
|
|
4
|
+
// A job's trace reaches the agent when it ends. Until then task events say where it is, for the console's Live list:
|
|
5
|
+
// `enqueued` as the app adds it (with the request and step that added it), `started` as a worker takes it, then
|
|
6
|
+
// `retried` (with the error) when BullMQ will run it again, or `finished`. A worker says it is there as it starts
|
|
7
|
+
// running, and every 30 seconds each process sends a `heartbeat` per worker with the jobs it runs, so a job whose
|
|
8
|
+
// process was killed leaves the list. A job's id there is its queue's name and its id: BullMQ counts ids per queue.
|
|
9
|
+
import { hostname } from "node:os";
|
|
3
10
|
import { SpanKind, SpanStatusCode, trace } from "@opentelemetry/api";
|
|
4
11
|
import { InstrumentationBase, InstrumentationNodeModuleDefinition, isWrapped } from "@opentelemetry/instrumentation";
|
|
12
|
+
import { sends } from "./agent.js";
|
|
13
|
+
import { masked } from "./request.js";
|
|
5
14
|
const SYSTEM = "bullmq";
|
|
15
|
+
/** How often a worker says it is alive, with the jobs it runs: the agent drops a running one after 2 minutes. */
|
|
16
|
+
export const HEARTBEAT_MS = 30_000;
|
|
17
|
+
/** Arguments in a task event are for a glance at a list. */
|
|
18
|
+
const MAX_EVENT_REPR = 200;
|
|
19
|
+
/** What a job throws to be moved on, not because it failed (job.moveToDelayed(), a rate limit, its children). */
|
|
20
|
+
const MOVED = new Set(["DelayedError", "WaitingError", "WaitingChildrenError", "RateLimitError"]);
|
|
21
|
+
const RATE_LIMITED = "bullmq:rateLimitExceeded";
|
|
6
22
|
function taskAttrs(job) {
|
|
7
23
|
const enqueued = job.timestamp + (job.delay ?? 0);
|
|
8
24
|
return {
|
|
@@ -16,9 +32,108 @@ function taskAttrs(job) {
|
|
|
16
32
|
"task.queue_wait": Math.max(Date.now() - enqueued, 0) * 1000,
|
|
17
33
|
};
|
|
18
34
|
}
|
|
35
|
+
/** What becomes of a job whose run threw: run again, failed, or moved on by the job itself. */
|
|
36
|
+
export function outcome(job, error) {
|
|
37
|
+
const { name, message } = error instanceof Error ? error : { name: "", message: "" };
|
|
38
|
+
if (MOVED.has(name) || message === RATE_LIMITED)
|
|
39
|
+
return "moved";
|
|
40
|
+
// As BullMQ decides: attempts left, and not an UnrecoverableError.
|
|
41
|
+
const left = job.attemptsMade + 1 < (job.opts?.attempts ?? 1);
|
|
42
|
+
return left && name !== "UnrecoverableError" ? "retry" : "failure";
|
|
43
|
+
}
|
|
44
|
+
/** The job's id in task events: unique across queues. */
|
|
45
|
+
export function liveId(queue, id) {
|
|
46
|
+
return `${queue}:${id}`;
|
|
47
|
+
}
|
|
48
|
+
/** A job's data at a glance: as JSON, values under sensitive keys masked, cut short. */
|
|
49
|
+
export function eventArgs(data) {
|
|
50
|
+
if (data === undefined)
|
|
51
|
+
return undefined;
|
|
52
|
+
let text;
|
|
53
|
+
try {
|
|
54
|
+
text = JSON.stringify(masked(data)) ?? String(data);
|
|
55
|
+
}
|
|
56
|
+
catch {
|
|
57
|
+
text = String(data);
|
|
58
|
+
}
|
|
59
|
+
return text.length <= MAX_EVENT_REPR ? text : `${text.slice(0, MAX_EVENT_REPR)}…`;
|
|
60
|
+
}
|
|
61
|
+
function reason(error) {
|
|
62
|
+
const text = error instanceof Error ? `${error.name}: ${error.message}` : String(error);
|
|
63
|
+
return text.length <= MAX_EVENT_REPR ? text : `${text.slice(0, MAX_EVENT_REPR)}…`;
|
|
64
|
+
}
|
|
65
|
+
/** The worker's name: the one the app gave it, or this process's. */
|
|
66
|
+
export function workerName(worker) {
|
|
67
|
+
return worker.opts?.name || `${hostname()}:${process.pid}`;
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* The process's workers and the jobs each runs now, with one timer for their heartbeats. Two Worker instances under
|
|
71
|
+
* one name (the default, this process's) are one worker to the console.
|
|
72
|
+
*/
|
|
73
|
+
export class Heartbeat {
|
|
74
|
+
send;
|
|
75
|
+
workers = new Map();
|
|
76
|
+
timer;
|
|
77
|
+
constructor(send) {
|
|
78
|
+
this.send = send;
|
|
79
|
+
}
|
|
80
|
+
/** A worker starts: the console lists it before it runs anything. */
|
|
81
|
+
open(worker) {
|
|
82
|
+
this.of(worker).open += 1;
|
|
83
|
+
this.beat(worker);
|
|
84
|
+
}
|
|
85
|
+
/** A worker closed: no more heartbeats for it once no instance under its name is open, nor a job running. */
|
|
86
|
+
close(worker) {
|
|
87
|
+
const state = this.workers.get(worker);
|
|
88
|
+
if (!state)
|
|
89
|
+
return;
|
|
90
|
+
state.open = Math.max(state.open - 1, 0);
|
|
91
|
+
this.forget(worker);
|
|
92
|
+
}
|
|
93
|
+
started(worker, id) {
|
|
94
|
+
this.of(worker).running.add(id);
|
|
95
|
+
}
|
|
96
|
+
ended(worker, id) {
|
|
97
|
+
this.workers.get(worker)?.running.delete(id);
|
|
98
|
+
this.forget(worker);
|
|
99
|
+
}
|
|
100
|
+
beat(worker) {
|
|
101
|
+
const ids = [...(this.workers.get(worker)?.running ?? [])].sort();
|
|
102
|
+
this.send({ event: "heartbeat", system: SYSTEM, id: "", time: Date.now() * 1000, worker, ids });
|
|
103
|
+
}
|
|
104
|
+
of(worker) {
|
|
105
|
+
let state = this.workers.get(worker);
|
|
106
|
+
if (!state) {
|
|
107
|
+
state = { open: 0, running: new Set() };
|
|
108
|
+
this.workers.set(worker, state);
|
|
109
|
+
}
|
|
110
|
+
if (!this.timer) {
|
|
111
|
+
this.timer = setInterval(() => {
|
|
112
|
+
for (const name of this.workers.keys())
|
|
113
|
+
this.beat(name);
|
|
114
|
+
}, HEARTBEAT_MS);
|
|
115
|
+
this.timer.unref();
|
|
116
|
+
}
|
|
117
|
+
return state;
|
|
118
|
+
}
|
|
119
|
+
forget(worker) {
|
|
120
|
+
const state = this.workers.get(worker);
|
|
121
|
+
if (state && state.open === 0 && state.running.size === 0)
|
|
122
|
+
this.workers.delete(worker);
|
|
123
|
+
if (this.workers.size === 0 && this.timer) {
|
|
124
|
+
clearInterval(this.timer);
|
|
125
|
+
this.timer = undefined;
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
}
|
|
19
129
|
export class BullMQInstrumentation extends InstrumentationBase {
|
|
20
|
-
|
|
130
|
+
events;
|
|
131
|
+
heartbeat;
|
|
132
|
+
/** `events`: where task events go; without it, none are sent. */
|
|
133
|
+
constructor(events) {
|
|
21
134
|
super("tracepanel-bullmq", "1.0.0", {});
|
|
135
|
+
this.events = events;
|
|
136
|
+
this.heartbeat = new Heartbeat((event) => this.send(event));
|
|
22
137
|
}
|
|
23
138
|
init() {
|
|
24
139
|
return new InstrumentationNodeModuleDefinition("bullmq", [">=5"], (exports) => {
|
|
@@ -26,54 +141,136 @@ export class BullMQInstrumentation extends InstrumentationBase {
|
|
|
26
141
|
if (typeof worker?.callProcessJob === "function" && !isWrapped(worker.callProcessJob)) {
|
|
27
142
|
this._wrap(worker, "callProcessJob", (original) => this.processJob(original));
|
|
28
143
|
}
|
|
144
|
+
if (typeof worker?.run === "function" && !isWrapped(worker.run)) {
|
|
145
|
+
this._wrap(worker, "run", (original) => this.run(original));
|
|
146
|
+
}
|
|
29
147
|
const queue = exports.Queue?.prototype;
|
|
30
148
|
if (typeof queue?.add === "function" && !isWrapped(queue.add)) {
|
|
31
149
|
this._wrap(queue, "add", (original) => this.add(original));
|
|
32
150
|
}
|
|
151
|
+
if (typeof queue?.addBulk === "function" && !isWrapped(queue.addBulk)) {
|
|
152
|
+
this._wrap(queue, "addBulk", (original) => this.addBulk(original));
|
|
153
|
+
}
|
|
154
|
+
// Its task events: the console's Live list of tasks.
|
|
155
|
+
if (this.events)
|
|
156
|
+
sends("live_tasks");
|
|
33
157
|
return exports;
|
|
34
158
|
});
|
|
35
159
|
}
|
|
160
|
+
send(event) {
|
|
161
|
+
this.events?.taskEvent(event);
|
|
162
|
+
}
|
|
163
|
+
/** A task event: what this step knows, undefined fields left out. */
|
|
164
|
+
event(event, id, fields) {
|
|
165
|
+
const known = Object.fromEntries(Object.entries(fields).filter(([, value]) => value !== undefined));
|
|
166
|
+
this.send({ event, system: SYSTEM, id, time: Date.now() * 1000, ...known });
|
|
167
|
+
}
|
|
168
|
+
/** The job waits in its queue (or until its delay is over), sent by the process that added it. */
|
|
169
|
+
enqueued(queue, job, parent) {
|
|
170
|
+
if (!job?.id)
|
|
171
|
+
return;
|
|
172
|
+
this.event("enqueued", liveId(queue, job.id), {
|
|
173
|
+
name: job.name,
|
|
174
|
+
queue,
|
|
175
|
+
retries: job.attemptsMade ?? 0,
|
|
176
|
+
args: eventArgs(job.data),
|
|
177
|
+
trace_id: parent?.traceId,
|
|
178
|
+
span_id: parent?.spanId,
|
|
179
|
+
});
|
|
180
|
+
}
|
|
181
|
+
/** The trace and step the app is in now, for a job added there. */
|
|
182
|
+
parent() {
|
|
183
|
+
const current = this.events?.current();
|
|
184
|
+
return current?.spanId ? { traceId: current.building.trace.id, spanId: current.spanId } : undefined;
|
|
185
|
+
}
|
|
36
186
|
processJob(original) {
|
|
187
|
+
const instrumentation = this;
|
|
37
188
|
const tracer = this.tracer;
|
|
38
189
|
return function (job, ...rest) {
|
|
190
|
+
const worker = workerName(this);
|
|
191
|
+
const id = liveId(job.queueName, job.id ?? "");
|
|
192
|
+
instrumentation.heartbeat.started(worker, id);
|
|
193
|
+
instrumentation.event("started", id, {
|
|
194
|
+
name: job.name,
|
|
195
|
+
queue: job.queueName,
|
|
196
|
+
worker,
|
|
197
|
+
retries: job.attemptsMade,
|
|
198
|
+
args: eventArgs(job.data),
|
|
199
|
+
});
|
|
39
200
|
const attributes = { ...taskAttrs(job), "tracepanel.kind": "task", "tracepanel.name": job.name };
|
|
40
201
|
return tracer.startActiveSpan(job.name, { kind: SpanKind.CONSUMER, attributes }, async (span) => {
|
|
202
|
+
let failed;
|
|
203
|
+
let threw = false;
|
|
41
204
|
try {
|
|
42
205
|
const result = await original.call(this, job, ...rest);
|
|
43
206
|
span.setAttribute("task.state", "SUCCESS");
|
|
44
207
|
return result;
|
|
45
208
|
}
|
|
46
209
|
catch (error) {
|
|
210
|
+
threw = true;
|
|
211
|
+
failed = error;
|
|
47
212
|
// BullMQ tries again while attempts are left: this run is a retry, the last one a failure.
|
|
48
|
-
|
|
49
|
-
span.setAttribute("task.state", retried ? "RETRY" : "FAILURE");
|
|
213
|
+
span.setAttribute("task.state", outcome(job, error) === "failure" ? "FAILURE" : "RETRY");
|
|
50
214
|
span.recordException(error);
|
|
51
215
|
span.setStatus({ code: SpanStatusCode.ERROR });
|
|
52
216
|
throw error;
|
|
53
217
|
}
|
|
54
218
|
finally {
|
|
55
219
|
span.end();
|
|
220
|
+
instrumentation.heartbeat.ended(worker, id);
|
|
221
|
+
instrumentation.ended(job, id, worker, threw, failed);
|
|
56
222
|
}
|
|
57
223
|
});
|
|
58
224
|
};
|
|
59
225
|
}
|
|
226
|
+
/** `retried` when BullMQ runs the job again (its next attempt's count), else `finished`. */
|
|
227
|
+
ended(job, id, worker, threw, error) {
|
|
228
|
+
const after = threw ? outcome(job, error) : undefined;
|
|
229
|
+
if (after === "retry") {
|
|
230
|
+
this.event("retried", id, { worker, retries: job.attemptsMade + 1, error: reason(error) });
|
|
231
|
+
}
|
|
232
|
+
else if (after === "moved") {
|
|
233
|
+
// Back in its queue (delayed, rate limited, waiting for its children): no attempt counted.
|
|
234
|
+
this.event("retried", id, { worker, retries: job.attemptsMade });
|
|
235
|
+
}
|
|
236
|
+
else {
|
|
237
|
+
this.event("finished", id, { worker, state: after === "failure" ? "FAILURE" : "SUCCESS" });
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
/** A worker runs from here until it closes: the console lists it meanwhile. */
|
|
241
|
+
run(original) {
|
|
242
|
+
const heartbeat = this.heartbeat;
|
|
243
|
+
return function (...rest) {
|
|
244
|
+
const worker = workerName(this);
|
|
245
|
+
heartbeat.open(worker);
|
|
246
|
+
return original.apply(this, rest).finally(() => heartbeat.close(worker));
|
|
247
|
+
};
|
|
248
|
+
}
|
|
60
249
|
add(original) {
|
|
250
|
+
const instrumentation = this;
|
|
61
251
|
const tracer = this.tracer;
|
|
62
252
|
return function (name, ...rest) {
|
|
253
|
+
const queue = this.name;
|
|
63
254
|
// Outside a request or a task (a script adding jobs) there is no trace to add the step to.
|
|
64
|
-
if (!trace.getActiveSpan())
|
|
65
|
-
return original.call(this, name, ...rest)
|
|
255
|
+
if (!trace.getActiveSpan()) {
|
|
256
|
+
return original.call(this, name, ...rest).then((job) => {
|
|
257
|
+
instrumentation.enqueued(queue, job);
|
|
258
|
+
return job;
|
|
259
|
+
});
|
|
260
|
+
}
|
|
66
261
|
const attributes = {
|
|
67
262
|
"tracepanel.span_kind": "task.enqueue",
|
|
68
263
|
"task.system": SYSTEM,
|
|
69
264
|
"task.name": name,
|
|
70
|
-
"task.queue":
|
|
265
|
+
"task.queue": queue,
|
|
71
266
|
};
|
|
72
267
|
return tracer.startActiveSpan(`enqueue ${name}`, { kind: SpanKind.PRODUCER, attributes }, async (span) => {
|
|
268
|
+
const parent = instrumentation.parent();
|
|
73
269
|
try {
|
|
74
270
|
const job = await original.call(this, name, ...rest);
|
|
75
271
|
if (job?.id)
|
|
76
272
|
span.setAttribute("task.id", job.id);
|
|
273
|
+
instrumentation.enqueued(queue, job, parent);
|
|
77
274
|
return job;
|
|
78
275
|
}
|
|
79
276
|
finally {
|
|
@@ -82,5 +279,17 @@ export class BullMQInstrumentation extends InstrumentationBase {
|
|
|
82
279
|
});
|
|
83
280
|
};
|
|
84
281
|
}
|
|
282
|
+
addBulk(original) {
|
|
283
|
+
const instrumentation = this;
|
|
284
|
+
return function (jobs) {
|
|
285
|
+
const queue = this.name;
|
|
286
|
+
const parent = instrumentation.parent();
|
|
287
|
+
return original.call(this, jobs).then((added) => {
|
|
288
|
+
for (const job of added ?? [])
|
|
289
|
+
instrumentation.enqueued(queue, job, parent);
|
|
290
|
+
return added;
|
|
291
|
+
});
|
|
292
|
+
};
|
|
293
|
+
}
|
|
85
294
|
}
|
|
86
295
|
//# sourceMappingURL=bullmq.js.map
|
package/dist/bullmq.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bullmq.js","sourceRoot":"","sources":["../src/bullmq.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"bullmq.js","sourceRoot":"","sources":["../src/bullmq.ts"],"names":[],"mappings":"AAAA,kHAAkH;AAClH,8DAA8D;AAC9D,EAAE;AACF,qHAAqH;AACrH,gHAAgH;AAChH,kHAAkH;AAClH,kHAAkH;AAClH,oHAAoH;AAEpH,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACnC,OAAO,EAAmB,QAAQ,EAAE,cAAc,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AACtF,OAAO,EAAE,mBAAmB,EAAE,mCAAmC,EAAE,SAAS,EAAE,MAAM,gCAAgC,CAAC;AACrH,OAAO,EAAE,KAAK,EAAkB,MAAM,YAAY,CAAC;AACnD,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAiCtC,MAAM,MAAM,GAAG,QAAQ,CAAC;AACxB,iHAAiH;AACjH,MAAM,CAAC,MAAM,YAAY,GAAG,MAAM,CAAC;AACnC,4DAA4D;AAC5D,MAAM,cAAc,GAAG,GAAG,CAAC;AAC3B,iHAAiH;AACjH,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,CAAC,cAAc,EAAE,cAAc,EAAE,sBAAsB,EAAE,gBAAgB,CAAC,CAAC,CAAC;AAClG,MAAM,YAAY,GAAG,0BAA0B,CAAC;AAEhD,SAAS,SAAS,CAAC,GAAQ;IACzB,MAAM,QAAQ,GAAG,GAAG,CAAC,SAAS,GAAG,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC;IAClD,OAAO;QACL,aAAa,EAAE,MAAM;QACrB,WAAW,EAAE,GAAG,CAAC,IAAI;QACrB,SAAS,EAAE,GAAG,CAAC,EAAE,IAAI,EAAE;QACvB,YAAY,EAAE,GAAG,CAAC,SAAS;QAC3B,cAAc,EAAE,GAAG,CAAC,YAAY;QAChC,YAAY,EAAE,KAAK;QACnB,kFAAkF;QAClF,iBAAiB,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ,EAAE,CAAC,CAAC,GAAG,IAAI;KAC7D,CAAC;AACJ,CAAC;AAED,+FAA+F;AAC/F,MAAM,UAAU,OAAO,CAAC,GAAQ,EAAE,KAAc;IAC9C,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;IACrF,IAAI,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,OAAO,KAAK,YAAY;QAAE,OAAO,OAAO,CAAC;IAChE,mEAAmE;IACnE,MAAM,IAAI,GAAG,GAAG,CAAC,YAAY,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,QAAQ,IAAI,CAAC,CAAC,CAAC;IAC9D,OAAO,IAAI,IAAI,IAAI,KAAK,oBAAoB,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;AACrE,CAAC;AAED,yDAAyD;AACzD,MAAM,UAAU,MAAM,CAAC,KAAa,EAAE,EAAU;IAC9C,OAAO,GAAG,KAAK,IAAI,EAAE,EAAE,CAAC;AAC1B,CAAC;AAED,wFAAwF;AACxF,MAAM,UAAU,SAAS,CAAC,IAAa;IACrC,IAAI,IAAI,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IACzC,IAAI,IAAY,CAAC;IACjB,IAAI,CAAC;QACH,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC;IACtD,CAAC;IAAC,MAAM,CAAC;QACP,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;IACtB,CAAC;IACD,OAAO,IAAI,CAAC,MAAM,IAAI,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,cAAc,CAAC,GAAG,CAAC;AACpF,CAAC;AAED,SAAS,MAAM,CAAC,KAAc;IAC5B,MAAM,IAAI,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACxF,OAAO,IAAI,CAAC,MAAM,IAAI,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,cAAc,CAAC,GAAG,CAAC;AACpF,CAAC;AAED,qEAAqE;AACrE,MAAM,UAAU,UAAU,CAAC,MAAc;IACvC,OAAO,MAAM,CAAC,IAAI,EAAE,IAAI,IAAI,GAAG,QAAQ,EAAE,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;AAC7D,CAAC;AAED;;;GAGG;AACH,MAAM,OAAO,SAAS;IAIS,IAAI;IAHhB,OAAO,GAAG,IAAI,GAAG,EAAkD,CAAC;IAC7E,KAAK,CAA6B;IAE1C,YAA6B,IAAgC;oBAAhC,IAAI;IAA+B,CAAC;IAEjE,qEAAqE;IACrE,IAAI,CAAC,MAAc;QACjB,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC;QAC1B,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACpB,CAAC;IAED,6GAA6G;IAC7G,KAAK,CAAC,MAAc;QAClB,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACvC,IAAI,CAAC,KAAK;YAAE,OAAO;QACnB,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;QACzC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IACtB,CAAC;IAED,OAAO,CAAC,MAAc,EAAE,EAAU;QAChC,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAClC,CAAC;IAED,KAAK,CAAC,MAAc,EAAE,EAAU;QAC9B,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAC7C,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IACtB,CAAC;IAED,IAAI,CAAC,MAAc;QACjB,MAAM,GAAG,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,OAAO,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAClE,IAAI,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;IAClG,CAAC;IAEO,EAAE,CAAC,MAAc;QACvB,IAAI,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACrC,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,KAAK,GAAG,EAAE,IAAI,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,GAAG,EAAE,EAAE,CAAC;YACxC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;QAClC,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;YAChB,IAAI,CAAC,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE;gBAC5B,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE;oBAAE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC1D,CAAC,EAAE,YAAY,CAAC,CAAC;YACjB,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;QACrB,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAEO,MAAM,CAAC,MAAc;QAC3B,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACvC,IAAI,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,KAAK,CAAC;YAAE,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACvF,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,KAAK,CAAC,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YAC1C,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAC1B,IAAI,CAAC,KAAK,GAAG,SAAS,CAAC;QACzB,CAAC;IACH,CAAC;CACF;AAED,MAAM,OAAO,qBAAsB,SAAQ,mBAAmB;IAI/B,MAAM;IAHlB,SAAS,CAAY;IAEtC,iEAAiE;IACjE,YAA6B,MAAe;QAC1C,KAAK,CAAC,mBAAmB,EAAE,OAAO,EAAE,EAAE,CAAC,CAAC;sBADb,MAAM;QAEjC,IAAI,CAAC,SAAS,GAAG,IAAI,SAAS,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;IAC9D,CAAC;IAES,IAAI;QACZ,OAAO,IAAI,mCAAmC,CAAC,QAAQ,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,OAAe,EAAE,EAAE;YACpF,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,SAAS,CAAC;YACzC,IAAI,OAAO,MAAM,EAAE,cAAc,KAAK,UAAU,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,cAAc,CAAC,EAAE,CAAC;gBACtF,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,gBAAgB,EAAE,CAAC,QAAiB,EAAE,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC;YACzF,CAAC;YACD,IAAI,OAAO,MAAM,EAAE,GAAG,KAAK,UAAU,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;gBAChE,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC,QAAmB,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC;YACzE,CAAC;YACD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,EAAE,SAAS,CAAC;YACvC,IAAI,OAAO,KAAK,EAAE,GAAG,KAAK,UAAU,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;gBAC9D,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,EAAE,CAAC,QAAa,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC;YAClE,CAAC;YACD,IAAI,OAAO,KAAK,EAAE,OAAO,KAAK,UAAU,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;gBACtE,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,SAAS,EAAE,CAAC,QAAiB,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC;YAC9E,CAAC;YACD,qDAAqD;YACrD,IAAI,IAAI,CAAC,MAAM;gBAAE,KAAK,CAAC,YAAY,CAAC,CAAC;YACrC,OAAO,OAAO,CAAC;QACjB,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,IAAI,CAAC,KAAgB;QAC3B,IAAI,CAAC,MAAM,EAAE,SAAS,CAAC,KAAK,CAAC,CAAC;IAChC,CAAC;IAED,qEAAqE;IAC7D,KAAK,CAAC,KAAa,EAAE,EAAU,EAAE,MAA+B;QACtE,MAAM,KAAK,GAAG,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC;QACpG,IAAI,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,EAAE,GAAG,KAAK,EAAE,CAAC,CAAC;IAC9E,CAAC;IAED,kGAAkG;IAC1F,QAAQ,CAAC,KAAa,EAAE,GAAoB,EAAE,MAA4C;QAChG,IAAI,CAAC,GAAG,EAAE,EAAE;YAAE,OAAO;QACrB,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,MAAM,CAAC,KAAK,EAAE,GAAG,CAAC,EAAE,CAAC,EAAE;YAC5C,IAAI,EAAE,GAAG,CAAC,IAAI;YACd,KAAK;YACL,OAAO,EAAE,GAAG,CAAC,YAAY,IAAI,CAAC;YAC9B,IAAI,EAAE,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC;YACzB,QAAQ,EAAE,MAAM,EAAE,OAAO;YACzB,OAAO,EAAE,MAAM,EAAE,MAAM;SACxB,CAAC,CAAC;IACL,CAAC;IAED,mEAAmE;IAC3D,MAAM;QACZ,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC;QACvC,OAAO,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;IACtG,CAAC;IAEO,UAAU,CAAC,QAAiB;QAClC,MAAM,eAAe,GAAG,IAAI,CAAC;QAC7B,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;QAC3B,OAAO,UAAwB,GAAQ,EAAE,GAAG,IAAe;YACzD,MAAM,MAAM,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC;YAChC,MAAM,EAAE,GAAG,MAAM,CAAC,GAAG,CAAC,SAAS,EAAE,GAAG,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC;YAC/C,eAAe,CAAC,SAAS,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;YAC9C,eAAe,CAAC,KAAK,CAAC,SAAS,EAAE,EAAE,EAAE;gBACnC,IAAI,EAAE,GAAG,CAAC,IAAI;gBACd,KAAK,EAAE,GAAG,CAAC,SAAS;gBACpB,MAAM;gBACN,OAAO,EAAE,GAAG,CAAC,YAAY;gBACzB,IAAI,EAAE,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC;aAC1B,CAAC,CAAC;YACH,MAAM,UAAU,GAAG,EAAE,GAAG,SAAS,CAAC,GAAG,CAAC,EAAE,iBAAiB,EAAE,MAAM,EAAE,iBAAiB,EAAE,GAAG,CAAC,IAAI,EAAE,CAAC;YACjG,OAAO,MAAM,CAAC,eAAe,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,CAAC,QAAQ,EAAE,UAAU,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;gBAC9F,IAAI,MAAe,CAAC;gBACpB,IAAI,KAAK,GAAG,KAAK,CAAC;gBAClB,IAAI,CAAC;oBACH,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;oBACvD,IAAI,CAAC,YAAY,CAAC,YAAY,EAAE,SAAS,CAAC,CAAC;oBAC3C,OAAO,MAAM,CAAC;gBAChB,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,KAAK,GAAG,IAAI,CAAC;oBACb,MAAM,GAAG,KAAK,CAAC;oBACf,2FAA2F;oBAC3F,IAAI,CAAC,YAAY,CAAC,YAAY,EAAE,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;oBACzF,IAAI,CAAC,eAAe,CAAC,KAAc,CAAC,CAAC;oBACrC,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,cAAc,CAAC,KAAK,EAAE,CAAC,CAAC;oBAC/C,MAAM,KAAK,CAAC;gBACd,CAAC;wBAAS,CAAC;oBACT,IAAI,CAAC,GAAG,EAAE,CAAC;oBACX,eAAe,CAAC,SAAS,CAAC,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;oBAC5C,eAAe,CAAC,KAAK,CAAC,GAAG,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;gBACxD,CAAC;YACH,CAAC,CAAC,CAAC;QACL,CAAC,CAAC;IACJ,CAAC;IAED,4FAA4F;IACpF,KAAK,CAAC,GAAQ,EAAE,EAAU,EAAE,MAAc,EAAE,KAAc,EAAE,KAAc;QAChF,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QACtD,IAAI,KAAK,KAAK,OAAO,EAAE,CAAC;YACtB,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,CAAC,YAAY,GAAG,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAC7F,CAAC;aAAM,IAAI,KAAK,KAAK,OAAO,EAAE,CAAC;YAC7B,2FAA2F;YAC3F,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,CAAC,YAAY,EAAE,CAAC,CAAC;QACnE,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC;QAC7F,CAAC;IACH,CAAC;IAED,+EAA+E;IACvE,GAAG,CAAC,QAAmB;QAC7B,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC;QACjC,OAAO,UAAwB,GAAG,IAAe;YAC/C,MAAM,MAAM,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC;YAChC,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACvB,OAAO,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;QAC3E,CAAC,CAAC;IACJ,CAAC;IAEO,GAAG,CAAC,QAAa;QACvB,MAAM,eAAe,GAAG,IAAI,CAAC;QAC7B,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;QAC3B,OAAO,UAAkC,IAAY,EAAE,GAAG,IAAe;YACvE,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC;YACxB,2FAA2F;YAC3F,IAAI,CAAC,KAAK,CAAC,aAAa,EAAE,EAAE,CAAC;gBAC3B,OAAO,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE;oBACrD,eAAe,CAAC,QAAQ,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;oBACrC,OAAO,GAAG,CAAC;gBACb,CAAC,CAAC,CAAC;YACL,CAAC;YACD,MAAM,UAAU,GAAG;gBACjB,sBAAsB,EAAE,cAAc;gBACtC,aAAa,EAAE,MAAM;gBACrB,WAAW,EAAE,IAAI;gBACjB,YAAY,EAAE,KAAK;aACpB,CAAC;YACF,OAAO,MAAM,CAAC,eAAe,CAAC,WAAW,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,CAAC,QAAQ,EAAE,UAAU,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;gBACvG,MAAM,MAAM,GAAG,eAAe,CAAC,MAAM,EAAE,CAAC;gBACxC,IAAI,CAAC;oBACH,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC,CAAC;oBACrD,IAAI,GAAG,EAAE,EAAE;wBAAE,IAAI,CAAC,YAAY,CAAC,SAAS,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;oBAClD,eAAe,CAAC,QAAQ,CAAC,KAAK,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC;oBAC7C,OAAO,GAAG,CAAC;gBACb,CAAC;wBAAS,CAAC;oBACT,IAAI,CAAC,GAAG,EAAE,CAAC;gBACb,CAAC;YACH,CAAC,CAAC,CAAC;QACL,CAAC,CAAC;IACJ,CAAC;IAEO,OAAO,CAAC,QAAiB;QAC/B,MAAM,eAAe,GAAG,IAAI,CAAC;QAC7B,OAAO,UAAkC,IAAe;YACtD,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC;YACxB,MAAM,MAAM,GAAG,eAAe,CAAC,MAAM,EAAE,CAAC;YACxC,OAAO,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE;gBAC9C,KAAK,MAAM,GAAG,IAAI,KAAK,IAAI,EAAE;oBAAE,eAAe,CAAC,QAAQ,CAAC,KAAK,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC;gBAC5E,OAAO,KAAK,CAAC;YACf,CAAC,CAAC,CAAC;QACL,CAAC,CAAC;IACJ,CAAC;CACF"}
|
package/dist/bun.js
CHANGED
|
@@ -5,9 +5,16 @@
|
|
|
5
5
|
// serve({ routes: { "/api/books/:id": (req) => ... }, fetch: (req) => ... });
|
|
6
6
|
//
|
|
7
7
|
// Start the app with `bun --preload @tracepanel/js/register server.ts` so the database driver is hooked as it loads.
|
|
8
|
+
//
|
|
9
|
+
// What a request carried goes into its trace: its headers, query and cookies, its body as far as the handler read it,
|
|
10
|
+
// and the response's headers. The handler reads the body's stream itself: its pieces pass a tap on their way to it
|
|
11
|
+
// (body.ts), and Tracepanel never reads it for the app.
|
|
8
12
|
import { propagation, ROOT_CONTEXT, SpanKind, SpanStatusCode, trace } from "@opentelemetry/api";
|
|
13
|
+
import { tapRequest } from "./body.js";
|
|
14
|
+
import { ATTRIBUTE as PROFILE, requested } from "./profile.js";
|
|
15
|
+
import { redirectCookie, requestAttrs, responseHeaders } from "./request.js";
|
|
9
16
|
import { start } from "./setup.js";
|
|
10
|
-
import { exposedHeaders, inject } from "./widget.js";
|
|
17
|
+
import { exposedHeaders, inject, Stream, streamablePage } from "./widget.js";
|
|
11
18
|
const tracer = trace.getTracer("tracepanel-bun");
|
|
12
19
|
/** What Bun answers an error with when the app has no `error` handler of its own. */
|
|
13
20
|
function internalError(error) {
|
|
@@ -30,6 +37,7 @@ export function withTracepanel(handler, route, onError) {
|
|
|
30
37
|
"url.path": url.pathname,
|
|
31
38
|
"http.target": url.pathname + url.search,
|
|
32
39
|
...(route ? { "http.route": route } : {}),
|
|
40
|
+
...(requested(Object.fromEntries(request.headers)) ? { [PROFILE]: true } : {}),
|
|
33
41
|
};
|
|
34
42
|
const startedMs = performance.now();
|
|
35
43
|
// The caller's traceparent, as Node's http instrumentation reads it: the agent links the caller's trace to this.
|
|
@@ -38,8 +46,11 @@ export function withTracepanel(handler, route, onError) {
|
|
|
38
46
|
keys: (headers) => [...headers.keys()],
|
|
39
47
|
});
|
|
40
48
|
const options = { kind: SpanKind.SERVER, attributes };
|
|
49
|
+
const body = tracepanel.config.captureRequest ? tapRequest(request) : undefined;
|
|
41
50
|
return tracer.startActiveSpan(`${request.method}`, options, caller, async (span) => {
|
|
42
51
|
tracepanel.processor.setFramework("Bun.serve");
|
|
52
|
+
// A page streamed through the widget's script: its request ends with the body.
|
|
53
|
+
let streamed;
|
|
43
54
|
try {
|
|
44
55
|
let response;
|
|
45
56
|
try {
|
|
@@ -53,18 +64,34 @@ export function withTracepanel(handler, route, onError) {
|
|
|
53
64
|
span.setAttribute("http.response.status_code", response.status);
|
|
54
65
|
if (response.status >= 500)
|
|
55
66
|
span.setStatus({ code: SpanStatusCode.ERROR });
|
|
56
|
-
|
|
67
|
+
const answer = await marked(tracepanel, request, response, startedMs, body);
|
|
68
|
+
streamed = answer.ended;
|
|
69
|
+
return answer.response;
|
|
57
70
|
}
|
|
58
71
|
finally {
|
|
59
|
-
|
|
72
|
+
if (streamed)
|
|
73
|
+
void streamed.then(() => span.end());
|
|
74
|
+
else
|
|
75
|
+
span.end();
|
|
60
76
|
}
|
|
61
77
|
});
|
|
62
78
|
};
|
|
63
79
|
return traced;
|
|
64
80
|
}
|
|
65
|
-
/**
|
|
66
|
-
|
|
67
|
-
|
|
81
|
+
/**
|
|
82
|
+
* The trace's headers on the response, and the widget in an HTML page: put into its body as it streams when its size
|
|
83
|
+
* isn't declared, with `ended` settled once that body has gone out.
|
|
84
|
+
*/
|
|
85
|
+
async function marked(tracepanel, request, response, startedMs, body) {
|
|
86
|
+
if (tracepanel.config.captureRequest) {
|
|
87
|
+
tracepanel.processor.setTraceAttrs({
|
|
88
|
+
...requestAttrs(Object.fromEntries(request.headers), new URL(request.url).search),
|
|
89
|
+
...body?.attrs(),
|
|
90
|
+
...responseHeaders(response.headers.entries()),
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
const html = (response.headers.get("content-type") ?? "").includes("text/html");
|
|
94
|
+
const page = html && !response.headers.has("content-encoding");
|
|
68
95
|
const marks = tracepanel.badge({
|
|
69
96
|
method: request.method,
|
|
70
97
|
status: response.status,
|
|
@@ -73,18 +100,61 @@ async function marked(tracepanel, request, response, startedMs) {
|
|
|
73
100
|
framework: tracepanel.processor.framework() ?? "Bun.serve",
|
|
74
101
|
});
|
|
75
102
|
if (!marks)
|
|
76
|
-
return response;
|
|
103
|
+
return { response };
|
|
77
104
|
const headers = new Headers(response.headers);
|
|
78
105
|
for (const [name, value] of Object.entries(marks.headers))
|
|
79
106
|
headers.set(name, value);
|
|
107
|
+
const redirect = redirectCookie(marks.headers["Tracepanel-Id"] ?? "", response.status, Object.fromEntries(request.headers));
|
|
108
|
+
if (redirect)
|
|
109
|
+
headers.append("Set-Cookie", redirect);
|
|
80
110
|
const expose = exposedHeaders(headers.get("access-control-allow-origin") ?? undefined, headers.get("access-control-expose-headers"));
|
|
81
111
|
if (expose)
|
|
82
112
|
headers.set("Access-Control-Expose-Headers", expose);
|
|
83
|
-
|
|
84
|
-
|
|
113
|
+
const init = { status: response.status, statusText: response.statusText, headers };
|
|
114
|
+
if (!marks.script || !response.body)
|
|
115
|
+
return { response: new Response(response.body, init) };
|
|
116
|
+
if (streamablePage((name) => headers.get(name))) {
|
|
117
|
+
let ended = () => { };
|
|
118
|
+
const done = new Promise((resolve) => (ended = resolve));
|
|
119
|
+
return { response: new Response(through(response.body, new Stream(marks.script), ended), init), ended: done };
|
|
120
|
+
}
|
|
85
121
|
headers.delete("content-length");
|
|
86
|
-
|
|
87
|
-
|
|
122
|
+
return { response: new Response(inject(await response.text(), marks.script), init) };
|
|
123
|
+
}
|
|
124
|
+
/** A body through the widget's script, piece by piece as the client reads it; `ended` once it is over. */
|
|
125
|
+
function through(body, script, ended) {
|
|
126
|
+
const reader = body.getReader();
|
|
127
|
+
return new ReadableStream({
|
|
128
|
+
async pull(controller) {
|
|
129
|
+
try {
|
|
130
|
+
// Until something goes out: a pull that enqueues nothing is not called again.
|
|
131
|
+
for (;;) {
|
|
132
|
+
const { done, value } = await reader.read();
|
|
133
|
+
if (done) {
|
|
134
|
+
const rest = script.end();
|
|
135
|
+
if (rest.length > 0)
|
|
136
|
+
controller.enqueue(rest);
|
|
137
|
+
controller.close();
|
|
138
|
+
ended();
|
|
139
|
+
return;
|
|
140
|
+
}
|
|
141
|
+
const piece = script.feed(value);
|
|
142
|
+
if (piece.length > 0) {
|
|
143
|
+
controller.enqueue(piece);
|
|
144
|
+
return;
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
catch (error) {
|
|
149
|
+
controller.error(error);
|
|
150
|
+
ended();
|
|
151
|
+
}
|
|
152
|
+
},
|
|
153
|
+
async cancel(reason) {
|
|
154
|
+
ended();
|
|
155
|
+
await reader.cancel(reason);
|
|
156
|
+
},
|
|
157
|
+
});
|
|
88
158
|
}
|
|
89
159
|
/** Bun.serve's routes, each handler traced under its pattern: `/api/books/:id`. */
|
|
90
160
|
function tracedRoutes(routes, onError) {
|
package/dist/bun.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bun.js","sourceRoot":"","sources":["../src/bun.ts"],"names":[],"mappings":"AAAA,oHAAoH;AACpH,uGAAuG;AACvG,EAAE;AACF,gDAAgD;AAChD,gFAAgF;AAChF,EAAE;AACF,qHAAqH;
|
|
1
|
+
{"version":3,"file":"bun.js","sourceRoot":"","sources":["../src/bun.ts"],"names":[],"mappings":"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"}
|
package/dist/config.d.ts
CHANGED
|
@@ -10,6 +10,26 @@ export interface Config {
|
|
|
10
10
|
maxTraces: number;
|
|
11
11
|
/** The agent's limits for the issues it finds, as the Python SDK names them: TRACEPANEL_SLOW_SQL_MS and so on. */
|
|
12
12
|
thresholds: Thresholds;
|
|
13
|
+
/**
|
|
14
|
+
* Keep a request's headers, query, cookies and the body the app read (masked; they never leave this machine):
|
|
15
|
+
* TRACEPANEL_CAPTURE_REQUEST=0 turns it off.
|
|
16
|
+
*/
|
|
17
|
+
captureRequest: boolean;
|
|
18
|
+
/**
|
|
19
|
+
* Keep the local variables of the app's own frames of an error (masked; they never leave this machine), read
|
|
20
|
+
* through Node's inspector: TRACEPANEL_CAPTURE_LOCALS=0 turns it off.
|
|
21
|
+
*/
|
|
22
|
+
captureLocals: boolean;
|
|
23
|
+
/**
|
|
24
|
+
* Sample where each trace's time goes in code (a flame graph in the console): every trace when on
|
|
25
|
+
* (TRACEPANEL_PROFILE=1); a request with an X-Tracepanel-Profile: 1 header or a tracepanel_profile=1 cookie either
|
|
26
|
+
* way.
|
|
27
|
+
*/
|
|
28
|
+
profile: boolean;
|
|
29
|
+
/** Whether profiling is possible at all: TRACEPANEL_PROFILE_ENABLED=0, and nothing profiles. */
|
|
30
|
+
profileEnabled: boolean;
|
|
31
|
+
/** How often a profiled trace is sampled: TRACEPANEL_PROFILE_INTERVAL_MS, each millisecond by default. */
|
|
32
|
+
profileIntervalMs: number;
|
|
13
33
|
}
|
|
14
34
|
/** What the agent reports, and from when. Its defaults are these too. */
|
|
15
35
|
export interface Thresholds {
|
package/dist/config.js
CHANGED
|
@@ -18,6 +18,14 @@ function thresholds(env) {
|
|
|
18
18
|
return found;
|
|
19
19
|
}
|
|
20
20
|
const OFF = new Set(["0", "false", "no", "off"]);
|
|
21
|
+
/** A TRACEPANEL_* switch: on unless it says off. */
|
|
22
|
+
function on(value) {
|
|
23
|
+
return value === undefined || value === "" || !OFF.has(value.toLowerCase());
|
|
24
|
+
}
|
|
25
|
+
/** A TRACEPANEL_* switch that is off unless it says on. */
|
|
26
|
+
function onlyIf(value) {
|
|
27
|
+
return value !== undefined && value !== "" && !OFF.has(value.toLowerCase());
|
|
28
|
+
}
|
|
21
29
|
/** On in development: unless NODE_ENV is production, or TRACEPANEL_ENABLED turns it off (or on). */
|
|
22
30
|
function enabled(env) {
|
|
23
31
|
const explicit = env.TRACEPANEL_ENABLED?.toLowerCase();
|
|
@@ -43,6 +51,11 @@ export function loadConfig(env = process.env) {
|
|
|
43
51
|
service: env.TRACEPANEL_SERVICE || packageName(root) || basename(root),
|
|
44
52
|
maxTraces: Number(env.TRACEPANEL_MAX_TRACES) || 2000,
|
|
45
53
|
thresholds: thresholds(env),
|
|
54
|
+
captureRequest: on(env.TRACEPANEL_CAPTURE_REQUEST),
|
|
55
|
+
captureLocals: on(env.TRACEPANEL_CAPTURE_LOCALS),
|
|
56
|
+
profile: onlyIf(env.TRACEPANEL_PROFILE),
|
|
57
|
+
profileEnabled: on(env.TRACEPANEL_PROFILE_ENABLED),
|
|
58
|
+
profileIntervalMs: Math.max(Math.floor(Number(env.TRACEPANEL_PROFILE_INTERVAL_MS)) || 1, 1),
|
|
46
59
|
};
|
|
47
60
|
}
|
|
48
61
|
//# sourceMappingURL=config.js.map
|
package/dist/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|
package/dist/console.d.ts
CHANGED
|
@@ -1,4 +1,9 @@
|
|
|
1
1
|
import type { TracepanelProcessor } from "./processor.js";
|
|
2
|
+
/**
|
|
3
|
+
* Runs a logger's own write (pino's, winston's): it recorded the log already, so what it prints through console is
|
|
4
|
+
* not recorded again.
|
|
5
|
+
*/
|
|
6
|
+
export declare function quietly<T>(write: () => T): T;
|
|
2
7
|
/**
|
|
3
8
|
* Each of console's methods becomes a property whose value records the call, then runs the method as it is now:
|
|
4
9
|
* something that replaces it later (Nuxt's dev server puts its own logger there) replaces what runs, not the record.
|
package/dist/console.js
CHANGED
|
@@ -8,6 +8,20 @@ const LEVELS = {
|
|
|
8
8
|
error: "error",
|
|
9
9
|
};
|
|
10
10
|
const CAPTURED = Symbol.for("tracepanel.console");
|
|
11
|
+
let quiet = 0;
|
|
12
|
+
/**
|
|
13
|
+
* Runs a logger's own write (pino's, winston's): it recorded the log already, so what it prints through console is
|
|
14
|
+
* not recorded again.
|
|
15
|
+
*/
|
|
16
|
+
export function quietly(write) {
|
|
17
|
+
quiet++;
|
|
18
|
+
try {
|
|
19
|
+
return write();
|
|
20
|
+
}
|
|
21
|
+
finally {
|
|
22
|
+
quiet--;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
11
25
|
/**
|
|
12
26
|
* Each of console's methods becomes a property whose value records the call, then runs the method as it is now:
|
|
13
27
|
* something that replaces it later (Nuxt's dev server puts its own logger there) replaces what runs, not the record.
|
|
@@ -20,6 +34,8 @@ export function captureConsole(processor) {
|
|
|
20
34
|
for (const [method, level] of Object.entries(LEVELS)) {
|
|
21
35
|
let current = target[method];
|
|
22
36
|
const recorded = (...args) => {
|
|
37
|
+
if (quiet > 0)
|
|
38
|
+
return current.apply(console, args);
|
|
23
39
|
const error = args.find((arg) => arg instanceof Error);
|
|
24
40
|
processor.addLog({
|
|
25
41
|
time: Date.now() * 1000,
|
package/dist/console.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"console.js","sourceRoot":"","sources":["../src/console.ts"],"names":[],"mappings":"AAAA,4FAA4F;AAE5F,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AAInC,MAAM,MAAM,GAAiC;IAC3C,KAAK,EAAE,OAAO;IACd,GAAG,EAAE,MAAM;IACX,IAAI,EAAE,MAAM;IACZ,IAAI,EAAE,SAAS;IACf,KAAK,EAAE,OAAO;CACf,CAAC;AAEF,MAAM,QAAQ,GAAG,MAAM,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC;AAElD;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAC,SAA8B;IAC3D,MAAM,MAAM,GAAG,OAAwE,CAAC;IACxF,IAAI,MAAM,CAAC,QAAQ,CAAC;QAAE,OAAO;IAC7B,MAAM,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC;IACxB,KAAK,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QACrD,IAAI,OAAO,GAAG,MAAM,CAAC,MAAM,CAAiC,CAAC;QAC7D,MAAM,QAAQ,GAAG,CAAC,GAAG,IAAe,EAAE,EAAE;YACtC,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,EAAgB,EAAE,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC;YACrE,SAAS,CAAC,MAAM,CAAC;gBACf,IAAI,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI;gBACvB,KAAK;gBACL,MAAM,EAAE,SAAS;gBACjB,OAAO,EAAE,MAAM,CAAC,GAAG,IAAI,CAAC;gBACxB,SAAS,EAAE,KAAK,EAAE,KAAK,IAAI,IAAI;gBAC/B,KAAK,EAAE,EAAE;aACV,CAAC,CAAC;YACH,OAAO,CAAC,KAAK,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QAC/B,CAAC,CAAC;QACF,MAAM,CAAC,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE;YACrC,YAAY,EAAE,IAAI;YAClB,UAAU,EAAE,IAAI;YAChB,GAAG,EAAE,GAAG,EAAE,CAAC,QAAQ;YACnB,GAAG,EAAE,CAAC,WAAyC,EAAE,EAAE;gBACjD,OAAO,GAAG,WAAW,CAAC;YACxB,CAAC;SACF,CAAC,CAAC;IACL,CAAC;AACH,CAAC"}
|
|
1
|
+
{"version":3,"file":"console.js","sourceRoot":"","sources":["../src/console.ts"],"names":[],"mappings":"AAAA,4FAA4F;AAE5F,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AAInC,MAAM,MAAM,GAAiC;IAC3C,KAAK,EAAE,OAAO;IACd,GAAG,EAAE,MAAM;IACX,IAAI,EAAE,MAAM;IACZ,IAAI,EAAE,SAAS;IACf,KAAK,EAAE,OAAO;CACf,CAAC;AAEF,MAAM,QAAQ,GAAG,MAAM,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC;AAElD,IAAI,KAAK,GAAG,CAAC,CAAC;AAEd;;;GAGG;AACH,MAAM,UAAU,OAAO,CAAI,KAAc;IACvC,KAAK,EAAE,CAAC;IACR,IAAI,CAAC;QACH,OAAO,KAAK,EAAE,CAAC;IACjB,CAAC;YAAS,CAAC;QACT,KAAK,EAAE,CAAC;IACV,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAC,SAA8B;IAC3D,MAAM,MAAM,GAAG,OAAwE,CAAC;IACxF,IAAI,MAAM,CAAC,QAAQ,CAAC;QAAE,OAAO;IAC7B,MAAM,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC;IACxB,KAAK,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QACrD,IAAI,OAAO,GAAG,MAAM,CAAC,MAAM,CAAiC,CAAC;QAC7D,MAAM,QAAQ,GAAG,CAAC,GAAG,IAAe,EAAE,EAAE;YACtC,IAAI,KAAK,GAAG,CAAC;gBAAE,OAAO,OAAO,CAAC,KAAK,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;YACnD,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,EAAgB,EAAE,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC;YACrE,SAAS,CAAC,MAAM,CAAC;gBACf,IAAI,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI;gBACvB,KAAK;gBACL,MAAM,EAAE,SAAS;gBACjB,OAAO,EAAE,MAAM,CAAC,GAAG,IAAI,CAAC;gBACxB,SAAS,EAAE,KAAK,EAAE,KAAK,IAAI,IAAI;gBAC/B,KAAK,EAAE,EAAE;aACV,CAAC,CAAC;YACH,OAAO,CAAC,KAAK,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QAC/B,CAAC,CAAC;QACF,MAAM,CAAC,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE;YACrC,YAAY,EAAE,IAAI;YAClB,UAAU,EAAE,IAAI;YAChB,GAAG,EAAE,GAAG,EAAE,CAAC,QAAQ;YACnB,GAAG,EAAE,CAAC,WAAyC,EAAE,EAAE;gBACjD,OAAO,GAAG,WAAW,CAAC;YACxB,CAAC;SACF,CAAC,CAAC;IACL,CAAC;AACH,CAAC"}
|