@tracepanel/js 0.0.0-stage → 0.2.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.
Files changed (84) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +271 -2
  3. package/dist/agent.d.ts +42 -0
  4. package/dist/agent.js +249 -0
  5. package/dist/agent.js.map +1 -0
  6. package/dist/api.d.ts +11 -0
  7. package/dist/api.js +34 -0
  8. package/dist/api.js.map +1 -0
  9. package/dist/browser.d.ts +25 -0
  10. package/dist/browser.js +438 -0
  11. package/dist/browser.js.map +1 -0
  12. package/dist/bullmq.d.ts +7 -0
  13. package/dist/bullmq.js +86 -0
  14. package/dist/bullmq.js.map +1 -0
  15. package/dist/bun.d.ts +15 -0
  16. package/dist/bun.js +114 -0
  17. package/dist/bun.js.map +1 -0
  18. package/dist/calls.d.ts +20 -0
  19. package/dist/calls.js +145 -0
  20. package/dist/calls.js.map +1 -0
  21. package/dist/cli.d.ts +2 -0
  22. package/dist/cli.js +39 -0
  23. package/dist/cli.js.map +1 -0
  24. package/dist/config.d.ts +29 -0
  25. package/dist/config.js +48 -0
  26. package/dist/config.js.map +1 -0
  27. package/dist/console.d.ts +6 -0
  28. package/dist/console.js +44 -0
  29. package/dist/console.js.map +1 -0
  30. package/dist/express.d.ts +2 -0
  31. package/dist/express.js +77 -0
  32. package/dist/express.js.map +1 -0
  33. package/dist/frameworks.d.ts +2 -0
  34. package/dist/frameworks.js +39 -0
  35. package/dist/frameworks.js.map +1 -0
  36. package/dist/headers.d.ts +2 -0
  37. package/dist/headers.js +42 -0
  38. package/dist/headers.js.map +1 -0
  39. package/dist/index.d.ts +5 -0
  40. package/dist/index.js +3 -0
  41. package/dist/index.js.map +1 -0
  42. package/dist/logs.d.ts +8 -0
  43. package/dist/logs.js +54 -0
  44. package/dist/logs.js.map +1 -0
  45. package/dist/model.d.ts +57 -0
  46. package/dist/model.js +18 -0
  47. package/dist/model.js.map +1 -0
  48. package/dist/next-widget.d.ts +3 -0
  49. package/dist/next-widget.js +17 -0
  50. package/dist/next-widget.js.map +1 -0
  51. package/dist/next.d.ts +2 -0
  52. package/dist/next.js +16 -0
  53. package/dist/next.js.map +1 -0
  54. package/dist/nuxt-plugin.d.ts +24 -0
  55. package/dist/nuxt-plugin.js +39 -0
  56. package/dist/nuxt-plugin.js.map +1 -0
  57. package/dist/nuxt.d.ts +10 -0
  58. package/dist/nuxt.js +16 -0
  59. package/dist/nuxt.js.map +1 -0
  60. package/dist/processor.d.ts +105 -0
  61. package/dist/processor.js +482 -0
  62. package/dist/processor.js.map +1 -0
  63. package/dist/register.d.ts +1 -0
  64. package/dist/register.js +5 -0
  65. package/dist/register.js.map +1 -0
  66. package/dist/runtime.d.ts +17 -0
  67. package/dist/runtime.js +27 -0
  68. package/dist/runtime.js.map +1 -0
  69. package/dist/setup.d.ts +10 -0
  70. package/dist/setup.js +99 -0
  71. package/dist/setup.js.map +1 -0
  72. package/dist/sql.d.ts +3 -0
  73. package/dist/sql.js +18 -0
  74. package/dist/sql.js.map +1 -0
  75. package/dist/stack.d.ts +13 -0
  76. package/dist/stack.js +66 -0
  77. package/dist/stack.js.map +1 -0
  78. package/dist/vite.d.ts +36 -0
  79. package/dist/vite.js +139 -0
  80. package/dist/vite.js.map +1 -0
  81. package/dist/widget.d.ts +26 -0
  82. package/dist/widget.js +70 -0
  83. package/dist/widget.js.map +1 -0
  84. package/package.json +125 -4
@@ -0,0 +1,25 @@
1
+ export interface BrowserOptions {
2
+ /** Where the console is, on the page's origin: "/__tracepanel__/". */
3
+ api?: string;
4
+ /** The app's name in the console. "browser" by default. */
5
+ service?: string;
6
+ /** Other origins whose calls carry a traceparent (their CORS must allow the header). */
7
+ propagateTo?: string[];
8
+ /**
9
+ * Scripts whose console isn't the page's, by path prefix: a dev server's own client ("/@vite/"). @tracepanel/js/vite
10
+ * sets Vite's; a library's warnings still count (React's, from /node_modules/).
11
+ */
12
+ ignoreSources?: string[];
13
+ }
14
+ /** A view or an action as the widget lists it: announced when it starts (open) and again when it ends. */
15
+ export interface PageAnnouncement {
16
+ id: string;
17
+ name: string;
18
+ /** Microseconds since the epoch. */
19
+ start: number;
20
+ /** Microseconds; 0 while open. */
21
+ duration: number;
22
+ status: "ok" | "error";
23
+ open: boolean;
24
+ }
25
+ export declare function record(options?: BrowserOptions): void;
@@ -0,0 +1,438 @@
1
+ // Tracepanel in the browser: traces of kind page, each a view or an action on it. A view is the page's load or an SPA's
2
+ // route change, named by its path ("/books"); an action is what the user did that called the API or threw, named
3
+ // after it on its page ("/books › click "Save""), and "background" when nobody did anything (a timer, polling). Each
4
+ // has its fetch() and XMLHttpRequest calls, the errors the page throws and its console, and lasts until its last call
5
+ // answered (a view: until the page's load too). Calls to the page's own origin carry a W3C traceparent, so the agent links each to the backend's trace
6
+ // of it. The traces go to the console's address (`api`), which the dev server serves on the page's origin.
7
+ //
8
+ // import { record } from "@tracepanel/js/browser";
9
+ // record({ api: "/__tracepanel__/", service: "shop-web" });
10
+ //
11
+ // @tracepanel/js/vite's plugin loads it by itself. Nothing here runs outside a browser, and nothing imports Node.
12
+ //
13
+ // The page's widget shows them too: each view and action is announced on window ("tracepanel:page") when it starts
14
+ // and when it ends, and each response carries the id of the one that made it (Symbol.for("tracepanel.page") on the
15
+ // Response or the XMLHttpRequest), so the panel lists a page's requests under what the user did.
16
+ function announce(trace, open) {
17
+ const detail = {
18
+ id: trace.id,
19
+ name: trace.name,
20
+ start: trace.start,
21
+ duration: trace.duration,
22
+ status: trace.status,
23
+ open,
24
+ };
25
+ const scope = globalThis;
26
+ const seen = scope[ANNOUNCED] ?? new Map();
27
+ scope[ANNOUNCED] = seen;
28
+ seen.delete(detail.id);
29
+ seen.set(detail.id, detail);
30
+ if (seen.size > ANNOUNCED_MAX)
31
+ seen.delete(seen.keys().next().value);
32
+ window.dispatchEvent(new CustomEvent("tracepanel:page", { detail }));
33
+ }
34
+ // A view is done once nothing happened for this long, or after the longest.
35
+ const QUIET_MS = 1000;
36
+ const LONGEST_MS = 15_000;
37
+ const MAX_SPANS = 500;
38
+ // On a Response or an XMLHttpRequest: the view or action that made the call.
39
+ const PAGE = Symbol.for("tracepanel.page");
40
+ // On globalThis: the latest views and actions announced, for a widget that starts listening after them.
41
+ const ANNOUNCED = Symbol.for("tracepanel.pages");
42
+ const ANNOUNCED_MAX = 50;
43
+ // Calls this soon after a click or a submit are its action's; later ones are background.
44
+ const INTERACTION_MS = 1000;
45
+ const LABEL_LENGTH = 40;
46
+ // What a click names its action after: the control it hit, not the text node or the icon inside it.
47
+ const CONTROL = "[data-tracepanel-name],button,a,[role=button],[role=link],[role=menuitem],[role=tab],input[type=submit]," +
48
+ "input[type=button],input[type=checkbox],input[type=radio],select,summary,label";
49
+ const CROCKFORD = "0123456789ABCDEFGHJKMNPQRSTVWXYZ";
50
+ const SECRET = /(token|key|secret|password|passwd|pwd|auth|signature|sig|session|credential)/i;
51
+ function hex(bytes) {
52
+ return Array.from(crypto.getRandomValues(new Uint8Array(bytes)), (b) => b.toString(16).padStart(2, "0")).join("");
53
+ }
54
+ /** A ULID, as the other SDKs make the ids: 48 bits of milliseconds, 80 random bits. */
55
+ function newId() {
56
+ let value = (BigInt(Date.now()) << 80n) | BigInt(`0x${hex(10)}`);
57
+ let out = "";
58
+ for (let i = 0; i < 26; i++) {
59
+ out = CROCKFORD[Number(value & 31n)] + out;
60
+ value >>= 5n;
61
+ }
62
+ return out;
63
+ }
64
+ /** Now, in microseconds since the epoch, as the agent stores times. */
65
+ function nowUs() {
66
+ return Math.round((performance.timeOrigin + performance.now()) * 1000);
67
+ }
68
+ /** A performance.now() reading, in microseconds since the epoch. */
69
+ function toUs(ms) {
70
+ return Math.round((performance.timeOrigin + ms) * 1000);
71
+ }
72
+ /** When the page's load event ended, in microseconds since the epoch: now while it hasn't. */
73
+ function loadEndUs() {
74
+ const entry = performance.getEntriesByType("navigation")[0];
75
+ return entry?.loadEventEnd ? toUs(entry.loadEventEnd) : nowUs();
76
+ }
77
+ function safeUrl(raw) {
78
+ try {
79
+ const url = new URL(raw, location.href);
80
+ url.username = "";
81
+ url.password = "";
82
+ for (const name of [...url.searchParams.keys()]) {
83
+ if (SECRET.test(name))
84
+ url.searchParams.set(name, "***");
85
+ }
86
+ return url;
87
+ }
88
+ catch {
89
+ return undefined;
90
+ }
91
+ }
92
+ function clip(text) {
93
+ const flat = text.replace(/\s+/g, " ").trim();
94
+ return flat.length > LABEL_LENGTH ? `${flat.slice(0, LABEL_LENGTH - 1)}…` : flat;
95
+ }
96
+ /**
97
+ * A control's name, as the user sees it: data-tracepanel-name, its aria-label, its text, else its id or tag. Never a
98
+ * text field's value: only the caption of a button input.
99
+ */
100
+ function controlName(element) {
101
+ const input = element instanceof HTMLInputElement && ["submit", "button"].includes(element.type) ? element.value : "";
102
+ const text = element instanceof HTMLElement && !(element instanceof HTMLSelectElement) ? element.innerText : "";
103
+ const name = element.getAttribute("data-tracepanel-name") ||
104
+ element.getAttribute("aria-label") ||
105
+ clip(text ?? "") ||
106
+ input ||
107
+ element.getAttribute("title") ||
108
+ (element.id ? `#${element.id}` : "");
109
+ return name ? `"${clip(name)}"` : element.tagName.toLowerCase();
110
+ }
111
+ /** A form's name: data-tracepanel-name, its aria-label, name or id, else where it posts. */
112
+ function formName(form) {
113
+ const name = form.getAttribute("data-tracepanel-name") ||
114
+ form.getAttribute("aria-label") ||
115
+ form.getAttribute("name") ||
116
+ (form.id ? `#${form.id}` : "");
117
+ if (name)
118
+ return `"${clip(name)}"`;
119
+ const action = safeUrl(form.getAttribute("action") ?? "");
120
+ return action ? action.pathname : "form";
121
+ }
122
+ /** Where a console call came from: the first frame of the stack that isn't this script's own. */
123
+ function caller(stack, own) {
124
+ return frames(stack)
125
+ .reverse()
126
+ .find((frame) => frame.filename !== own);
127
+ }
128
+ /** Where a console call was made, as the other SDKs say it: the file and line, and the function when it has a name. */
129
+ function whereLogged(frame) {
130
+ const named = frame.function !== "<anonymous>" ? { "code.function": frame.function } : {};
131
+ return { "code.filepath": frame.filename, "code.lineno": frame.lineno, ...named };
132
+ }
133
+ function frames(stack) {
134
+ const found = [];
135
+ for (const line of (stack ?? "").split("\n")) {
136
+ const match = /^\s*at (?:(.+?) \()?(.+?):(\d+):\d+\)?$/.exec(line) ?? /^(.*?)@(.+?):(\d+):\d+$/.exec(line);
137
+ if (!match)
138
+ continue;
139
+ // A script's URL; code with no file of its own (eval, a console) is named as the browser names it: <anonymous>.
140
+ const raw = match[2] ?? "";
141
+ const url = /^[a-z][a-z0-9+.-]*:\/\//i.test(raw) ? safeUrl(raw) : undefined;
142
+ found.push({
143
+ filename: url ? url.pathname : raw,
144
+ module: "",
145
+ function: match[1] || "<anonymous>",
146
+ lineno: Number(match[3]),
147
+ in_app: url?.origin === location.origin && !url.pathname.includes("/node_modules/"),
148
+ context_start: null,
149
+ context: [],
150
+ locals: {},
151
+ });
152
+ }
153
+ return found.reverse();
154
+ }
155
+ export function record(options = {}) {
156
+ const scope = globalThis;
157
+ if (typeof window === "undefined" || scope.__tracepanelRecording)
158
+ return;
159
+ scope.__tracepanelRecording = true;
160
+ const api = new URL(options.api ?? "/__tracepanel__/", location.href).toString();
161
+ const propagate = new Set([location.origin, ...(options.propagateTo ?? [])]);
162
+ const send = window.fetch.bind(window);
163
+ const ignored = options.ignoreSources ?? [];
164
+ // This script's own path, to tell a console call's caller from the wrapper it went through.
165
+ const own = frames(new Error().stack).at(-1)?.filename;
166
+ let view;
167
+ let interaction;
168
+ /** A view (no action: the page's load, a route change) or an action on the page, from `startUs`. */
169
+ function start(trigger, action, startUs = nowUs()) {
170
+ const path = location.pathname;
171
+ const name = action ? `${path} › ${action}` : path;
172
+ const root = {
173
+ id: newId(),
174
+ parent_id: null,
175
+ kind: "page",
176
+ name,
177
+ start: startUs,
178
+ duration: 0,
179
+ status: "ok",
180
+ attrs: {},
181
+ };
182
+ const w3cTraceId = hex(16);
183
+ const started = {
184
+ trace: {
185
+ id: newId(),
186
+ kind: "page",
187
+ name,
188
+ start: startUs,
189
+ duration: 0,
190
+ status: "ok",
191
+ attrs: {
192
+ "service.name": options.service ?? "browser",
193
+ "service.role": "browser",
194
+ "telemetry.sdk.language": "webjs",
195
+ "page.path": path,
196
+ "page.url": `${location.origin}${path}`,
197
+ "page.title": document.title,
198
+ "page.trigger": trigger,
199
+ ...(action ? { "page.action": action } : {}),
200
+ "user_agent.original": navigator.userAgent,
201
+ "w3c.trace_id": w3cTraceId,
202
+ },
203
+ spans: [root],
204
+ logs: [],
205
+ errors: [],
206
+ links: [],
207
+ issues: [],
208
+ },
209
+ root,
210
+ w3cTraceId,
211
+ pending: 0,
212
+ lastActivityMs: performance.now(),
213
+ endUs: startUs,
214
+ timer: undefined,
215
+ };
216
+ view = started;
217
+ settleLater(started);
218
+ announce(started.trace, true);
219
+ return started;
220
+ }
221
+ /** The view goes out once quiet: no call open and nothing new for a second, or after the longest wait. */
222
+ function settleLater(current) {
223
+ if (current.timer)
224
+ clearTimeout(current.timer);
225
+ current.timer = setTimeout(() => {
226
+ const loading = current.trace.attrs["page.trigger"] === "load" && document.readyState !== "complete";
227
+ const quiet = !loading && performance.now() - current.lastActivityMs >= QUIET_MS;
228
+ const old = nowUs() - current.trace.start >= LONGEST_MS * 1000;
229
+ if ((current.pending === 0 && quiet) || old)
230
+ finish(current);
231
+ else
232
+ settleLater(current);
233
+ }, QUIET_MS);
234
+ }
235
+ function finish(current) {
236
+ if (view === current)
237
+ view = undefined;
238
+ if (current.timer)
239
+ clearTimeout(current.timer);
240
+ // Until its last call answered, not the quiet second after: a view, until the page's load too.
241
+ const lastSpan = Math.max(...current.trace.spans.map((span) => span.start + span.duration));
242
+ let end = Math.max(current.endUs, lastSpan, current.trace.start);
243
+ if (current.trace.attrs["page.trigger"] === "load")
244
+ end = Math.max(end, loadEndUs());
245
+ current.trace.duration = end - current.trace.start;
246
+ current.root.duration = current.trace.duration;
247
+ // Failed for the user: the page threw, or a call failed (an answer of 5xx, or none).
248
+ if (current.trace.errors.length > 0 || current.trace.spans.some((span) => span.status === "error")) {
249
+ current.trace.status = "error";
250
+ }
251
+ announce(current.trace, false);
252
+ void send(`${api}api/ingest`, {
253
+ method: "POST",
254
+ headers: { "Content-Type": "application/json" },
255
+ body: JSON.stringify([current.trace]),
256
+ keepalive: true,
257
+ }).catch(() => undefined);
258
+ }
259
+ /**
260
+ * The trace a call or an error belongs to. Right after a click or a submit: its action, and the trace before it
261
+ * goes out unless its calls still run (then they share it). Else the open trace, or background activity.
262
+ */
263
+ function active() {
264
+ const done = interaction;
265
+ if (done && performance.now() - done.atMs < INTERACTION_MS) {
266
+ interaction = undefined;
267
+ if (view && view.pending === 0)
268
+ finish(view);
269
+ if (!view)
270
+ return start(done.trigger, `${done.trigger} ${done.label}`, toUs(done.atMs));
271
+ }
272
+ return view ?? start("background", "background");
273
+ }
274
+ function touch(current) {
275
+ current.lastActivityMs = performance.now();
276
+ current.endUs = Math.max(current.endUs, nowUs());
277
+ settleLater(current);
278
+ }
279
+ // What the user does: the calls right after belong to its action. Capture: before the app's own handlers.
280
+ document.addEventListener("click", (event) => {
281
+ const target = event.target instanceof Element ? event.target : null;
282
+ if (!target)
283
+ return;
284
+ const control = target.closest(CONTROL) ?? target;
285
+ interaction = { trigger: "click", label: controlName(control), atMs: event.timeStamp || performance.now() };
286
+ }, true);
287
+ document.addEventListener("submit", (event) => {
288
+ if (!(event.target instanceof HTMLFormElement))
289
+ return;
290
+ interaction = { trigger: "submit", label: formName(event.target), atMs: event.timeStamp || performance.now() };
291
+ }, true);
292
+ /** A call out of the page, as the other SDKs record theirs: http.client, its W3C span id for the backend's link. */
293
+ function call(method, raw) {
294
+ const url = safeUrl(raw);
295
+ if (!url || url.toString().startsWith(api))
296
+ return { finish: () => undefined };
297
+ const current = active();
298
+ current.pending += 1;
299
+ const spanId = hex(8);
300
+ const span = {
301
+ id: newId(),
302
+ parent_id: current.root.id,
303
+ kind: "http.client",
304
+ name: `${method.toUpperCase()} ${url.host}${url.pathname}`,
305
+ start: nowUs(),
306
+ duration: 0,
307
+ status: "ok",
308
+ attrs: {
309
+ "http.request.method": method.toUpperCase(),
310
+ "url.full": url.toString(),
311
+ "url.scheme": url.protocol.replace(":", ""),
312
+ "server.address": url.hostname,
313
+ "server.port": Number(url.port) || (url.protocol === "https:" ? 443 : 80),
314
+ "w3c.span_id": spanId,
315
+ },
316
+ };
317
+ if (current.trace.spans.length < MAX_SPANS)
318
+ current.trace.spans.push(span);
319
+ return {
320
+ traceparent: propagate.has(url.origin) ? `00-${current.w3cTraceId}-${spanId}-01` : undefined,
321
+ page: current.trace.id,
322
+ finish(status, failed) {
323
+ span.duration = nowUs() - span.start;
324
+ current.endUs = Math.max(current.endUs, span.start + span.duration);
325
+ span.attrs["http.response.status_code"] = status;
326
+ if (failed || status >= 500)
327
+ span.status = "error";
328
+ current.pending -= 1;
329
+ touch(current);
330
+ },
331
+ };
332
+ }
333
+ window.fetch = async (input, init) => {
334
+ const request = new Request(input, init);
335
+ const out = call(request.method, request.url);
336
+ const headers = new Headers(request.headers);
337
+ if (out.traceparent && !headers.has("traceparent"))
338
+ headers.set("traceparent", out.traceparent);
339
+ try {
340
+ const response = await send(new Request(request, { headers }));
341
+ out.finish(response.status, false);
342
+ if (out.page)
343
+ Object.defineProperty(response, PAGE, { value: out.page });
344
+ return response;
345
+ }
346
+ catch (error) {
347
+ out.finish(0, true);
348
+ throw error;
349
+ }
350
+ };
351
+ const open = XMLHttpRequest.prototype.open;
352
+ const sendXhr = XMLHttpRequest.prototype.send;
353
+ const calls = new WeakMap();
354
+ XMLHttpRequest.prototype.open = function (method, url, ...rest) {
355
+ calls.set(this, { method, url: String(url) });
356
+ return open.call(this, method, url, ...rest);
357
+ };
358
+ XMLHttpRequest.prototype.send = function (body) {
359
+ const target = calls.get(this);
360
+ if (target) {
361
+ const out = call(target.method, target.url);
362
+ if (out.traceparent)
363
+ this.setRequestHeader("traceparent", out.traceparent);
364
+ if (out.page)
365
+ Object.defineProperty(this, PAGE, { value: out.page, configurable: true });
366
+ this.addEventListener("loadend", () => out.finish(this.status, this.status === 0));
367
+ }
368
+ return sendXhr.call(this, body);
369
+ };
370
+ function error(thrown) {
371
+ const current = active();
372
+ const err = thrown instanceof Error ? thrown : new Error(String(thrown));
373
+ current.trace.errors.push({
374
+ span_id: null,
375
+ time: nowUs(),
376
+ type: err.name || "Error",
377
+ message: err.message,
378
+ handled: false,
379
+ frames: frames(err.stack),
380
+ chain: [],
381
+ });
382
+ touch(current);
383
+ }
384
+ window.addEventListener("error", (event) => error(event.error ?? event.message));
385
+ window.addEventListener("unhandledrejection", (event) => error(event.reason));
386
+ const levels = { debug: "debug", log: "info", info: "info", warn: "warning", error: "error" };
387
+ for (const [method, level] of Object.entries(levels)) {
388
+ const original = console[method];
389
+ if (!original)
390
+ continue;
391
+ console[method] = (...args) => {
392
+ const current = view;
393
+ const from = current ? caller(new Error().stack, own) : undefined;
394
+ const source = from?.filename ?? "";
395
+ if (current && !ignored.some((prefix) => source.startsWith(prefix))) {
396
+ current.trace.logs.push({
397
+ span_id: null,
398
+ time: nowUs(),
399
+ level,
400
+ logger: "console",
401
+ message: args.map((arg) => (typeof arg === "string" ? arg : JSON.stringify(arg))).join(" "),
402
+ exception: args.find((arg) => arg instanceof Error)?.stack ?? null,
403
+ attrs: from ? whereLogged(from) : {},
404
+ });
405
+ }
406
+ original.apply(console, args);
407
+ };
408
+ }
409
+ // An SPA's route change starts a view of the new page.
410
+ for (const name of ["pushState", "replaceState"]) {
411
+ const original = history[name];
412
+ history[name] = function (...args) {
413
+ const before = location.pathname;
414
+ const result = original.apply(this, args);
415
+ if (location.pathname !== before) {
416
+ if (view)
417
+ finish(view);
418
+ interaction = undefined;
419
+ start("navigation");
420
+ }
421
+ return result;
422
+ };
423
+ }
424
+ window.addEventListener("popstate", () => {
425
+ if (view)
426
+ finish(view);
427
+ interaction = undefined;
428
+ start("navigation");
429
+ });
430
+ // The tab going away: what is open goes out now.
431
+ window.addEventListener("pagehide", () => {
432
+ if (view)
433
+ finish(view);
434
+ });
435
+ // The first view started when the browser began loading the page.
436
+ start("load", undefined, Math.round(performance.timeOrigin * 1000));
437
+ }
438
+ //# sourceMappingURL=browser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browser.js","sourceRoot":"","sources":["../src/browser.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import { InstrumentationBase, InstrumentationNodeModuleDefinition } from "@opentelemetry/instrumentation";
2
+ export declare class BullMQInstrumentation extends InstrumentationBase {
3
+ constructor();
4
+ protected init(): InstrumentationNodeModuleDefinition;
5
+ private processJob;
6
+ private add;
7
+ }
package/dist/bullmq.js ADDED
@@ -0,0 +1,86 @@
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
+ // that added it, as the Python SDK records Celery's and RQ's.
3
+ import { SpanKind, SpanStatusCode, trace } from "@opentelemetry/api";
4
+ import { InstrumentationBase, InstrumentationNodeModuleDefinition, isWrapped } from "@opentelemetry/instrumentation";
5
+ const SYSTEM = "bullmq";
6
+ function taskAttrs(job) {
7
+ const enqueued = job.timestamp + (job.delay ?? 0);
8
+ return {
9
+ "task.system": SYSTEM,
10
+ "task.name": job.name,
11
+ "task.id": job.id ?? "",
12
+ "task.queue": job.queueName,
13
+ "task.retries": job.attemptsMade,
14
+ "task.eager": false,
15
+ // How long it waited for a worker, in microseconds: the agent's queue-wait issue.
16
+ "task.queue_wait": Math.max(Date.now() - enqueued, 0) * 1000,
17
+ };
18
+ }
19
+ export class BullMQInstrumentation extends InstrumentationBase {
20
+ constructor() {
21
+ super("tracepanel-bullmq", "1.0.0", {});
22
+ }
23
+ init() {
24
+ return new InstrumentationNodeModuleDefinition("bullmq", [">=5"], (exports) => {
25
+ const worker = exports.Worker?.prototype;
26
+ if (typeof worker?.callProcessJob === "function" && !isWrapped(worker.callProcessJob)) {
27
+ this._wrap(worker, "callProcessJob", (original) => this.processJob(original));
28
+ }
29
+ const queue = exports.Queue?.prototype;
30
+ if (typeof queue?.add === "function" && !isWrapped(queue.add)) {
31
+ this._wrap(queue, "add", (original) => this.add(original));
32
+ }
33
+ return exports;
34
+ });
35
+ }
36
+ processJob(original) {
37
+ const tracer = this.tracer;
38
+ return function (job, ...rest) {
39
+ const attributes = { ...taskAttrs(job), "tracepanel.kind": "task", "tracepanel.name": job.name };
40
+ return tracer.startActiveSpan(job.name, { kind: SpanKind.CONSUMER, attributes }, async (span) => {
41
+ try {
42
+ const result = await original.call(this, job, ...rest);
43
+ span.setAttribute("task.state", "SUCCESS");
44
+ return result;
45
+ }
46
+ catch (error) {
47
+ // BullMQ tries again while attempts are left: this run is a retry, the last one a failure.
48
+ const retried = job.attemptsMade + 1 < (job.opts?.attempts ?? 1);
49
+ span.setAttribute("task.state", retried ? "RETRY" : "FAILURE");
50
+ span.recordException(error);
51
+ span.setStatus({ code: SpanStatusCode.ERROR });
52
+ throw error;
53
+ }
54
+ finally {
55
+ span.end();
56
+ }
57
+ });
58
+ };
59
+ }
60
+ add(original) {
61
+ const tracer = this.tracer;
62
+ return function (name, ...rest) {
63
+ // 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);
66
+ const attributes = {
67
+ "tracepanel.span_kind": "task.enqueue",
68
+ "task.system": SYSTEM,
69
+ "task.name": name,
70
+ "task.queue": this.name,
71
+ };
72
+ return tracer.startActiveSpan(`enqueue ${name}`, { kind: SpanKind.PRODUCER, attributes }, async (span) => {
73
+ try {
74
+ const job = await original.call(this, name, ...rest);
75
+ if (job?.id)
76
+ span.setAttribute("task.id", job.id);
77
+ return job;
78
+ }
79
+ finally {
80
+ span.end();
81
+ }
82
+ });
83
+ };
84
+ }
85
+ }
86
+ //# sourceMappingURL=bullmq.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bullmq.js","sourceRoot":"","sources":["../src/bullmq.ts"],"names":[],"mappings":"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"}
package/dist/bun.d.ts ADDED
@@ -0,0 +1,15 @@
1
+ type Handler = (request: Request, server?: unknown) => Response | Promise<Response>;
2
+ type ErrorHandler = (error: Error) => Response | Promise<Response>;
3
+ type Routes = Record<string, Handler | Record<string, Handler> | Response>;
4
+ /**
5
+ * The handler, in a server span for each request: its route, status, errors; the badge's headers and script. An
6
+ * error it throws is answered here, by `onError` (Bun.serve's `error` option) or a 500, so the answer has its trace.
7
+ */
8
+ export declare function withTracepanel<H extends Handler>(handler: H, route?: string, onError?: ErrorHandler): H;
9
+ /** Bun.serve, with every route and the fetch fallback traced. */
10
+ export declare function serve<T extends {
11
+ routes?: Routes;
12
+ fetch?: Handler;
13
+ error?: ErrorHandler;
14
+ }>(options: T): unknown;
15
+ export {};