@tracepanel/js 0.5.0 → 0.6.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 (81) hide show
  1. package/README.md +221 -12
  2. package/dist/agent.d.ts +5 -1
  3. package/dist/agent.js +12 -3
  4. package/dist/agent.js.map +1 -1
  5. package/dist/aws.d.ts +27 -0
  6. package/dist/aws.js +368 -0
  7. package/dist/aws.js.map +1 -0
  8. package/dist/bun.js +6 -82
  9. package/dist/bun.js.map +1 -1
  10. package/dist/calls.d.ts +5 -0
  11. package/dist/calls.js +7 -0
  12. package/dist/calls.js.map +1 -1
  13. package/dist/config.d.ts +7 -0
  14. package/dist/config.js +2 -0
  15. package/dist/config.js.map +1 -1
  16. package/dist/explain.d.ts +5 -0
  17. package/dist/explain.js +56 -7
  18. package/dist/explain.js.map +1 -1
  19. package/dist/fastify.d.ts +2 -0
  20. package/dist/fastify.js +100 -0
  21. package/dist/fastify.js.map +1 -0
  22. package/dist/frameworks.js +3 -0
  23. package/dist/frameworks.js.map +1 -1
  24. package/dist/hono.d.ts +2 -0
  25. package/dist/hono.js +63 -0
  26. package/dist/hono.js.map +1 -0
  27. package/dist/koa.d.ts +2 -0
  28. package/dist/koa.js +119 -0
  29. package/dist/koa.js.map +1 -0
  30. package/dist/llm.d.ts +20 -0
  31. package/dist/llm.js +632 -0
  32. package/dist/llm.js.map +1 -0
  33. package/dist/memory.d.ts +69 -0
  34. package/dist/memory.js +203 -0
  35. package/dist/memory.js.map +1 -0
  36. package/dist/model.d.ts +22 -1
  37. package/dist/model.js.map +1 -1
  38. package/dist/next.js +4 -4
  39. package/dist/next.js.map +1 -1
  40. package/dist/processor.d.ts +40 -4
  41. package/dist/processor.js +156 -29
  42. package/dist/processor.js.map +1 -1
  43. package/dist/profile.d.ts +34 -8
  44. package/dist/profile.js +98 -13
  45. package/dist/profile.js.map +1 -1
  46. package/dist/queries.d.ts +20 -0
  47. package/dist/queries.js +75 -0
  48. package/dist/queries.js.map +1 -0
  49. package/dist/respond.d.ts +12 -0
  50. package/dist/respond.js +85 -0
  51. package/dist/respond.js.map +1 -0
  52. package/dist/setup.js +22 -5
  53. package/dist/setup.js.map +1 -1
  54. package/dist/sql.d.ts +1 -0
  55. package/dist/sql.js +11 -2
  56. package/dist/sql.js.map +1 -1
  57. package/dist/sqlite.d.ts +13 -0
  58. package/dist/sqlite.js +291 -0
  59. package/dist/sqlite.js.map +1 -0
  60. package/dist/stack.d.ts +3 -1
  61. package/dist/stack.js +30 -6
  62. package/dist/stack.js.map +1 -1
  63. package/dist/testing.d.ts +128 -0
  64. package/dist/testing.js +362 -0
  65. package/dist/testing.js.map +1 -0
  66. package/dist/transactions.d.ts +11 -1
  67. package/dist/transactions.js +70 -34
  68. package/dist/transactions.js.map +1 -1
  69. package/dist/view.d.ts +17 -0
  70. package/dist/view.js +71 -0
  71. package/dist/view.js.map +1 -0
  72. package/dist/vitest-setup.d.ts +1 -0
  73. package/dist/vitest-setup.js +63 -0
  74. package/dist/vitest-setup.js.map +1 -0
  75. package/dist/vitest.d.ts +57 -0
  76. package/dist/vitest.js +130 -0
  77. package/dist/vitest.js.map +1 -0
  78. package/dist/widget.d.ts +16 -0
  79. package/dist/widget.js +33 -1
  80. package/dist/widget.js.map +1 -1
  81. package/package.json +69 -4
package/dist/profile.js CHANGED
@@ -1,6 +1,7 @@
1
1
  // Where a trace's time goes in code: V8's sampling profiler, through Node's inspector (the trace's `profile`, a flame
2
2
  // graph in the console). Nothing runs until a trace is profiled: the setting profiles every one, a request asks with
3
- // the X-Tracepanel-Profile: 1 header or the panel's tracepanel_profile=1 cookie.
3
+ // the X-Tracepanel-Profile: 1 header or the panel's tracepanel_profile=1 cookie. "memory" there rather than "1", or
4
+ // TRACEPANEL_PROFILE_MEMORY=1, profiles its memory too (memory.ts). Every profile has the collector's runs (`gc`).
4
5
  //
5
6
  // The profiler samples the whole thread, and one event loop runs every request of the process at once: a sample
6
7
  // can't tell which request a frame belongs to. So a profiled trace keeps the samples taken while it was the only trace
@@ -15,13 +16,14 @@
15
16
  import { relative } from "node:path";
16
17
  import { createContextKey } from "@opentelemetry/api";
17
18
  import { call, connect, inspector } from "./inspector.js";
19
+ import { Collections, HeapSampler, memoryAvailable } from "./memory.js";
18
20
  import { headerValue, parseCookies } from "./request.js";
19
21
  import { inApp, libraryPath, ownFile, place } from "./stack.js";
20
22
  export const HEADER = "x-tracepanel-profile";
21
23
  export const COOKIE = "tracepanel_profile";
22
- /** On a request's root span: the request asked to be profiled. */
24
+ /** On a request's root span: what the request asked for ("1", or "memory"). */
23
25
  export const ATTRIBUTE = "tracepanel.profile";
24
- /** In the context a framework starts the request's root span in (Next.js's): the request asked to be profiled. */
26
+ /** In the context a framework starts the request's root span in (Next.js's): what the request asked for. */
25
27
  export const ASKED = createContextKey("tracepanel.profile");
26
28
  // How deep a stack is kept: a recursion beyond it is cut, outermost frames kept.
27
29
  const MAX_DEPTH = 128;
@@ -35,22 +37,46 @@ const RENEW_MS = 60_000;
35
37
  const IDLE = "(idle)";
36
38
  const ROOT = "(root)";
37
39
  const OTHER = { function: "(other)", module: null, file: "", line: 0, in_app: false };
38
- /** Whether a request asks to be profiled: the X-Tracepanel-Profile header, or the cookie the panel's toggle sets. */
40
+ /** A frame as the profile names it, once: by its function, file and line. */
41
+ function frameKey(frame) {
42
+ return `${frame.file}:${frame.line}:${frame.function}`;
43
+ }
44
+ /** What a value asks for: "1" or "memory" as they are, true (a span marked by code) "1"; else nothing. */
45
+ export function asking(value) {
46
+ if (value === true || value === "1")
47
+ return "1";
48
+ return value === "memory" ? "memory" : undefined;
49
+ }
50
+ /**
51
+ * What a request asks for: the X-Tracepanel-Profile header's, else the cookie's the panel's toggle sets; undefined
52
+ * when neither asks.
53
+ */
39
54
  export function requested(headers) {
40
- if (headerValue(headers[HEADER])?.trim() === "1")
41
- return true;
55
+ const asked = asking(headerValue(headers[HEADER])?.trim());
56
+ if (asked)
57
+ return asked;
42
58
  const cookies = headerValue(headers.cookie);
43
- return (cookies?.includes(COOKIE) === true &&
44
- parseCookies(cookies).some(([name, value]) => name === COOKIE && value === "1"));
59
+ if (cookies?.includes(COOKIE) !== true)
60
+ return undefined;
61
+ return asking(parseCookies(cookies).find(([name]) => name === COOKIE)?.[1]);
45
62
  }
46
- /** Whether to profile a trace: the setting profiles every one, a request may ask; nothing when profiling is off. */
63
+ /**
64
+ * How to profile a trace: "memory" with its memory, "1" its time only; undefined for none. The setting profiles
65
+ * every one, a request may ask; nothing when profiling is off.
66
+ */
47
67
  export function wanted(config, asked) {
48
- return config.profileEnabled && (config.profile || asked) && available();
68
+ if (!(config.profileEnabled && (config.profile || asked) && available()))
69
+ return undefined;
70
+ return (config.profileMemory || asked === "memory") && memoryAvailable() ? "memory" : "1";
49
71
  }
50
72
  /** Whether this runtime can profile: Node, with its inspector. */
51
73
  export function available() {
52
74
  return inspector() !== null;
53
75
  }
76
+ /** Whether this runtime can profile memory too: Node's inspector, and V8's GC profiler. */
77
+ export function memoryProfiling() {
78
+ return available() && memoryAvailable();
79
+ }
54
80
  let next = 0;
55
81
  /** The app's profiler: the profile that runs while traces are profiled, and when each trace of the process ran. */
56
82
  export class Profiler {
@@ -67,6 +93,8 @@ export class Profiler {
67
93
  ended = [];
68
94
  /** The console profiles stopped, by title, as the inspector hands them over. */
69
95
  finished = new Map();
96
+ heaps;
97
+ collections = new Collections();
70
98
  constructor(root, intervalMs) {
71
99
  this.root = root;
72
100
  this.intervalMs = intervalMs;
@@ -84,14 +112,21 @@ export class Profiler {
84
112
  if (this.recordings.size > 0)
85
113
  this.ended.push([started, performance.now()]);
86
114
  }
87
- /** Begins profiling a trace that started (enter() first); undefined when the inspector can't. */
88
- start(trace) {
115
+ /**
116
+ * Begins profiling a trace that started (enter() first), its memory too when `memory`; undefined when the
117
+ * inspector can't.
118
+ */
119
+ start(trace, memory = false) {
89
120
  const console = inspector()?.console;
90
121
  if (!console || !this.ensure())
91
122
  return undefined;
92
123
  clearTimeout(this.idle);
124
+ this.collections.watch();
93
125
  next += 1;
94
- const recording = { title: `tracepanel:${next}`, startedMs: performance.now(), trace };
126
+ if (memory && this.session && !this.heaps)
127
+ this.heaps = new HeapSampler(this.session);
128
+ const heap = memory ? this.heaps?.begin() : undefined;
129
+ const recording = { title: `tracepanel:${next}`, startedMs: performance.now(), trace, heap };
95
130
  console.profile(recording.title);
96
131
  this.recordings.add(recording);
97
132
  return recording;
@@ -101,10 +136,24 @@ export class Profiler {
101
136
  if (!this.recordings.has(recording))
102
137
  return { profile: undefined, dropped: 0 };
103
138
  inspector()?.console.profileEnd(recording.title);
139
+ const endedMs = performance.now();
140
+ // Before it is let go: whether another trace ran while it did.
141
+ const shared = recording.heap ? this.overlapped(recording) : false;
142
+ const measured = recording.heap
143
+ ? this.heaps?.end(recording.heap, (frame) => this.frame(frame) === null)
144
+ : undefined;
104
145
  this.recordings.delete(recording);
105
146
  const profile = this.finished.get(recording.title);
106
147
  this.finished.delete(recording.title);
107
148
  const result = profile ? this.document(recording, profile) : { profile: undefined, dropped: 0 };
149
+ if (measured) {
150
+ result.profile ??= { interval_us: Math.round(this.intervalMs * 1000), samples: 0, frames: [], stacks: [] };
151
+ result.profile.memory = this.memory(result.profile, measured.sites, shared, measured);
152
+ }
153
+ if (result.profile) {
154
+ const { startedMs } = recording;
155
+ result.gc = () => this.collections.during(startedMs, endedMs);
156
+ }
108
157
  if (this.recordings.size === 0)
109
158
  this.rest();
110
159
  else {
@@ -147,6 +196,41 @@ export class Profiler {
147
196
  }
148
197
  return true;
149
198
  }
199
+ /** Whether another trace than the recording's ran while it did (the heap is the process's). */
200
+ overlapped(recording) {
201
+ for (const trace of this.open.keys())
202
+ if (trace !== recording.trace)
203
+ return true;
204
+ return this.ended.some(([, end]) => end >= recording.startedMs);
205
+ }
206
+ /** The profile's `memory`: its sites' frames added to the profile's own, each once. */
207
+ memory(profile, sites, shared, measured) {
208
+ const index = new Map(profile.frames.map((frame, at) => [frameKey(frame), at]));
209
+ const named = sites.flatMap((site) => {
210
+ const frames = site.frames.flatMap((callFrame) => {
211
+ const frame = this.frame(callFrame);
212
+ if (!frame)
213
+ return [];
214
+ const key = frameKey(frame);
215
+ let at = index.get(key);
216
+ if (at === undefined) {
217
+ at = profile.frames.length;
218
+ index.set(key, at);
219
+ profile.frames.push(frame);
220
+ }
221
+ return [at];
222
+ });
223
+ return frames.length > 0 ? [{ frames, bytes: site.bytes, count: site.count }] : [];
224
+ });
225
+ return {
226
+ peak: measured.peak,
227
+ net: measured.net,
228
+ ...(measured.allocated !== undefined ? { allocated: measured.allocated } : {}),
229
+ sites: named,
230
+ sites_at: "end",
231
+ shared,
232
+ };
233
+ }
150
234
  /** No trace is profiled: the profile under them stops after a while, or now when it ran long. */
151
235
  rest() {
152
236
  this.ended = [];
@@ -162,6 +246,7 @@ export class Profiler {
162
246
  if (!this.session || !this.running || this.recordings.size > 0)
163
247
  return;
164
248
  this.running = false;
249
+ this.collections.rest();
165
250
  try {
166
251
  call(this.session, "Profiler.stop");
167
252
  }
@@ -1 +1 @@
1
- {"version":3,"file":"profile.js","sourceRoot":"","sources":["../src/profile.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"profile.js","sourceRoot":"","sources":["../src/profile.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ import { type Context } from "@opentelemetry/api";
2
+ /** The app's line of the latest ORM call in this context, and the ORM: what a query span without one takes. */
3
+ export declare const QUERY_ORIGIN: symbol;
4
+ export interface QueryOrigin {
5
+ origin: string;
6
+ orm: string;
7
+ }
8
+ /**
9
+ * The app's context from here on, as `await client.query("BEGIN")` returns: what the global context manager's
10
+ * attach() does (AsyncLocalStorage's enterWith). A context manager without it leaves the app's context as it is.
11
+ */
12
+ export declare function enter(target: Context): void;
13
+ /** Wraps the methods of an ORM class's prototype the app calls to start a query: each one takes the app's line. */
14
+ export declare function markQueries(proto: object | undefined, orm: string, root: string): void;
15
+ /**
16
+ * Drizzle's entry points on Bun. Its ES modules load without the hooks Node has (import-in-the-middle): a Bun
17
+ * plugin adds a line to each file as it loads, which hands its class over to be wrapped. A file that has changed and
18
+ * no longer has the class is left as it is.
19
+ */
20
+ export declare function traceBunQueries(root: string): void;
@@ -0,0 +1,75 @@
1
+ // Where an ORM's query was made, when the driver's stack can't say. Bun's (JavaScriptCore's) stacks have no async
2
+ // frames: `await db.select().from(product)` runs Drizzle's then() from a microtask, and the driver's span starts under
3
+ // Drizzle's frames alone, none of the app's. The app's line is taken here instead, as the app calls the ORM (the
4
+ // query's first builder call, db.transaction(), db.query's findMany()), and handed to the driver's span in the app's
5
+ // context from then on, with the ORM's name: the span takes it when its own stack has none of the app's code.
6
+ import { readFileSync } from "node:fs";
7
+ import { context, createContextKey, trace } from "@opentelemetry/api";
8
+ import { madeAt } from "./stack.js";
9
+ /** The app's line of the latest ORM call in this context, and the ORM: what a query span without one takes. */
10
+ export const QUERY_ORIGIN = createContextKey("tracepanel.query_origin");
11
+ /**
12
+ * The app's context from here on, as `await client.query("BEGIN")` returns: what the global context manager's
13
+ * attach() does (AsyncLocalStorage's enterWith). A context manager without it leaves the app's context as it is.
14
+ */
15
+ export function enter(target) {
16
+ const manager = context._getContextManager?.();
17
+ manager?.attach?.(target);
18
+ }
19
+ const WRAPPED = Symbol.for("tracepanel.queries");
20
+ /** Wraps the methods of an ORM class's prototype the app calls to start a query: each one takes the app's line. */
21
+ export function markQueries(proto, orm, root) {
22
+ if (!proto || proto[WRAPPED])
23
+ return;
24
+ Object.defineProperty(proto, WRAPPED, { value: true });
25
+ for (const name of Object.getOwnPropertyNames(proto)) {
26
+ const descriptor = Object.getOwnPropertyDescriptor(proto, name);
27
+ const original = descriptor?.value;
28
+ if (name === "constructor" || typeof original !== "function")
29
+ continue;
30
+ const wrapped = function (...args) {
31
+ if (trace.getActiveSpan()) {
32
+ try {
33
+ const { origin } = madeAt(root);
34
+ if (origin)
35
+ enter(context.active().setValue(QUERY_ORIGIN, { origin, orm }));
36
+ }
37
+ catch {
38
+ // Never in the way of the app's query.
39
+ }
40
+ }
41
+ return original.apply(this, args);
42
+ };
43
+ Object.defineProperty(proto, name, { ...descriptor, value: wrapped });
44
+ }
45
+ }
46
+ // Drizzle's classes the app calls to start a query, by the file each is in: a dialect's database (PgDatabase,
47
+ // MySqlDatabase, BaseSQLiteDatabase: db and tx) and its relational query builder (db.query.product.findMany()).
48
+ const DRIZZLE = /[\\/]drizzle-orm[\\/][\w-]+-core[\\/](db|query-builders[\\/]query)\.c?js$/;
49
+ const DATABASE = /^class (\w+Database) /m;
50
+ const HOOK = Symbol.for("tracepanel.queries.drizzle");
51
+ /**
52
+ * Drizzle's entry points on Bun. Its ES modules load without the hooks Node has (import-in-the-middle): a Bun
53
+ * plugin adds a line to each file as it loads, which hands its class over to be wrapped. A file that has changed and
54
+ * no longer has the class is left as it is.
55
+ */
56
+ export function traceBunQueries(root) {
57
+ const bun = globalThis.Bun;
58
+ if (!bun?.plugin)
59
+ return;
60
+ globalThis[HOOK] = (proto) => markQueries(proto, "drizzle", root);
61
+ bun.plugin({
62
+ name: "tracepanel-queries",
63
+ setup(build) {
64
+ build.onLoad({ filter: DRIZZLE }, (args) => {
65
+ const source = readFileSync(args.path, "utf8");
66
+ const name = DRIZZLE.exec(args.path)?.[1] === "db" ? DATABASE.exec(source)?.[1] : "RelationalQueryBuilder";
67
+ const hook = name
68
+ ? `\n;typeof ${name} === "function" && globalThis[Symbol.for("tracepanel.queries.drizzle")]?.(${name}.prototype);\n`
69
+ : "";
70
+ return { contents: source + hook, loader: "js" };
71
+ });
72
+ },
73
+ });
74
+ }
75
+ //# sourceMappingURL=queries.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"queries.js","sourceRoot":"","sources":["../src/queries.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import type { BodyTap } from "./body.js";
2
+ import type { Runtime } from "./runtime.js";
3
+ /** On a request whose response withTracepanel() marks: a framework's middleware under it leaves the response be. */
4
+ export declare const MARKED: unique symbol;
5
+ /**
6
+ * The trace's headers on the response, and the widget in an HTML page: put into its body as it streams when its size
7
+ * isn't declared, with `ended` settled once that body has gone out.
8
+ */
9
+ export declare function marked(tracepanel: Runtime, request: Request, response: Response, startedMs: number, framework: string, body?: BodyTap): Promise<{
10
+ response: Response;
11
+ ended?: Promise<void>;
12
+ }>;
@@ -0,0 +1,85 @@
1
+ // A fetch handler's response (Bun.serve's, Hono's) as it goes out: the trace's headers on it, the widget's script in an
2
+ // HTML page, and what the request carried into its trace.
3
+ import { redirectCookie, requestAttrs, responseHeaders } from "./request.js";
4
+ import { exposedHeaders, inject, Stream, streamablePage } from "./widget.js";
5
+ /** On a request whose response withTracepanel() marks: a framework's middleware under it leaves the response be. */
6
+ export const MARKED = Symbol.for("tracepanel.marked");
7
+ /**
8
+ * The trace's headers on the response, and the widget in an HTML page: put into its body as it streams when its size
9
+ * isn't declared, with `ended` settled once that body has gone out.
10
+ */
11
+ export async function marked(tracepanel, request, response, startedMs, framework, body) {
12
+ if (tracepanel.config.captureRequest) {
13
+ tracepanel.processor.setTraceAttrs({
14
+ ...requestAttrs(Object.fromEntries(request.headers), new URL(request.url).search),
15
+ ...body?.attrs(),
16
+ ...responseHeaders(response.headers.entries()),
17
+ });
18
+ }
19
+ const html = (response.headers.get("content-type") ?? "").includes("text/html");
20
+ const page = html && !response.headers.has("content-encoding");
21
+ const marks = tracepanel.badge({
22
+ method: request.method,
23
+ status: response.status,
24
+ startedMs,
25
+ page,
26
+ framework: tracepanel.processor.framework() ?? framework,
27
+ });
28
+ if (!marks)
29
+ return { response };
30
+ const headers = new Headers(response.headers);
31
+ for (const [name, value] of Object.entries(marks.headers))
32
+ headers.set(name, value);
33
+ const redirect = redirectCookie(marks.headers["Tracepanel-Id"] ?? "", response.status, Object.fromEntries(request.headers));
34
+ if (redirect)
35
+ headers.append("Set-Cookie", redirect);
36
+ const expose = exposedHeaders(headers.get("access-control-allow-origin") ?? undefined, headers.get("access-control-expose-headers"));
37
+ if (expose)
38
+ headers.set("Access-Control-Expose-Headers", expose);
39
+ const init = { status: response.status, statusText: response.statusText, headers };
40
+ if (!marks.script || !response.body)
41
+ return { response: new Response(response.body, init) };
42
+ if (streamablePage((name) => headers.get(name))) {
43
+ let ended = () => { };
44
+ const done = new Promise((resolve) => (ended = resolve));
45
+ return { response: new Response(through(response.body, new Stream(marks.script), ended), init), ended: done };
46
+ }
47
+ headers.delete("content-length");
48
+ return { response: new Response(inject(await response.text(), marks.script), init) };
49
+ }
50
+ /** A body through the widget's script, piece by piece as the client reads it; `ended` once it is over. */
51
+ function through(body, script, ended) {
52
+ const reader = body.getReader();
53
+ return new ReadableStream({
54
+ async pull(controller) {
55
+ try {
56
+ // Until something goes out: a pull that enqueues nothing is not called again.
57
+ for (;;) {
58
+ const { done, value } = await reader.read();
59
+ if (done) {
60
+ const rest = script.end();
61
+ if (rest.length > 0)
62
+ controller.enqueue(rest);
63
+ controller.close();
64
+ ended();
65
+ return;
66
+ }
67
+ const piece = script.feed(value);
68
+ if (piece.length > 0) {
69
+ controller.enqueue(piece);
70
+ return;
71
+ }
72
+ }
73
+ }
74
+ catch (error) {
75
+ controller.error(error);
76
+ ended();
77
+ }
78
+ },
79
+ async cancel(reason) {
80
+ ended();
81
+ await reader.cancel(reason);
82
+ },
83
+ });
84
+ }
85
+ //# sourceMappingURL=respond.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"respond.js","sourceRoot":"","sources":["../src/respond.ts"],"names":[],"mappings":"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"}
package/dist/setup.js CHANGED
@@ -16,15 +16,20 @@ import { UndiciInstrumentation } from "@opentelemetry/instrumentation-undici";
16
16
  import { NodeTracerProvider } from "@opentelemetry/sdk-trace-node";
17
17
  import { PrismaInstrumentation } from "@prisma/instrumentation";
18
18
  import { register as registerSyncHooks, supportsSyncHooks } from "import-in-the-middle/register-hooks.mjs";
19
+ import { awsInstrumentation } from "./aws.js";
19
20
  import { BullMQInstrumentation } from "./bullmq.js";
21
+ import { mongoStatement } from "./calls.js";
20
22
  import { captureConsole } from "./console.js";
21
23
  import { DatabasesInstrumentation } from "./explain.js";
22
24
  import { traceFetch } from "./fetch.js";
25
+ import { LlmInstrumentation, traceLlmFetch } from "./llm.js";
23
26
  import { PinoLogs, WinstonLogs } from "./loggers.js";
24
27
  import { NestLogs } from "./logs.js";
25
28
  import { traceBunCalls } from "./outgoing.js";
26
29
  import { ATTRIBUTE as PROFILE, requested } from "./profile.js";
30
+ import { traceBunQueries } from "./queries.js";
27
31
  import { runtime } from "./runtime.js";
32
+ import { SqliteInstrumentation } from "./sqlite.js";
28
33
  import { TransactionsInstrumentation } from "./transactions.js";
29
34
  const STARTED = Symbol.for("tracepanel.started");
30
35
  /**
@@ -89,14 +94,20 @@ export function start(options = {}) {
89
94
  new IORedisInstrumentation(),
90
95
  new RedisInstrumentation(),
91
96
  // The command with its values: Tracepanel keeps their shape and a hash, which tells duplicates from an N+1.
92
- new MongoDBInstrumentation({ enhancedDatabaseReporting: true }),
97
+ new MongoDBInstrumentation({ enhancedDatabaseReporting: true, dbStatementSerializer: mongoStatement }),
93
98
  new PrismaInstrumentation(),
94
99
  // BEGIN … COMMIT on a connection as a transaction span: after pg's and mysql2's, so its statements are inside.
95
100
  new TransactionsInstrumentation(),
101
+ // SQLite: better-sqlite3, node:sqlite and libsql, their transactions too.
102
+ new SqliteInstrumentation(),
96
103
  // Its jobs' task events too, for the console's Live list.
97
104
  new BullMQInstrumentation(tracepanel.processor),
98
105
  // The databases the app queries, for the console's EXPLAIN.
99
106
  new DatabasesInstrumentation(),
107
+ // The AWS SDK's clients: each command a call to AWS (S3 a storage call, DynamoDB a datastore's).
108
+ awsInstrumentation(),
109
+ // OpenAI's and Anthropic's clients: each call to a model an LLM call.
110
+ new LlmInstrumentation(),
100
111
  // fetch(): Node's own, through undici (Bun's: traceBunCalls() below).
101
112
  ...(bun ? [] : [new UndiciInstrumentation()]),
102
113
  // Outgoing calls through node:http (axios, got) always; the server's requests unless the framework traces them.
@@ -106,10 +117,11 @@ export function start(options = {}) {
106
117
  // A CORS preflight (the browser asking before a call with a traceparent) is the browser's, not the app's work.
107
118
  ignoreIncomingRequestHook: (request) => options.httpServer === false ||
108
119
  (request.method === "OPTIONS" && request.headers["access-control-request-method"] !== undefined),
109
- // A request that asks to be profiled says so on its span, as it starts.
110
- startIncomingSpanHook: (request) => tracepanel.config.profileEnabled && "headers" in request && requested(request.headers)
111
- ? { [PROFILE]: true }
112
- : {},
120
+ // What a request asks to be profiled for says so on its span, as it starts.
121
+ startIncomingSpanHook: (request) => {
122
+ const asked = tracepanel.config.profileEnabled && "headers" in request ? requested(request.headers) : undefined;
123
+ return asked ? { [PROFILE]: asked } : {};
124
+ },
113
125
  }),
114
126
  ];
115
127
  registerInstrumentations({ instrumentations });
@@ -119,6 +131,11 @@ export function start(options = {}) {
119
131
  traceBunCalls();
120
132
  else
121
133
  traceFetch(tracepanel.config.root);
134
+ // Calls to a model's API through fetch() (the AI SDK's providers): around the call's own span.
135
+ traceLlmFetch();
136
+ // Bun's stacks have no async frames: an ORM's query takes the app's line as the app calls the ORM.
137
+ if (bun)
138
+ traceBunQueries(tracepanel.config.root);
122
139
  captureConsole(tracepanel.processor);
123
140
  return tracepanel;
124
141
  }
package/dist/setup.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"setup.js","sourceRoot":"","sources":["../src/setup.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"setup.js","sourceRoot":"","sources":["../src/setup.ts"],"names":[],"mappings":"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"}
package/dist/sql.d.ts CHANGED
@@ -1,3 +1,4 @@
1
1
  export declare function statement(sql: string): string;
2
2
  export declare function fingerprint(sql: string): string;
3
+ /** `SELECT category`: the verb and the table, its schema and quotes left out. */
3
4
  export declare function spanName(sql: string): string;
package/dist/sql.js CHANGED
@@ -2,7 +2,11 @@
2
2
  // queries) by: the same rules in every Tracepanel SDK.
3
3
  const WHITESPACE = /\s+/g;
4
4
  const IN_LIST = /\bIN \((?:%s|\?|\$\d+)(?:, ?(?:%s|\?|\$\d+))*\)/gi;
5
- const TABLE = /\b(?:FROM|INTO|UPDATE|JOIN)\s+[`"[]?([\w.]+)/i;
5
+ // One part of a table's name, bare or quoted: "standard SQL", `MySQL`, [SQL Server].
6
+ const PART = String.raw `(?:"[^"]+"|\`[^\`]+\`|\[[^\]]+\]|[\w$]+)`;
7
+ // The table a statement reads or writes, with its schema (Prisma's "public"."category", MySQL's `shop`.`book`).
8
+ const TABLE = new RegExp(String.raw `\b(?:FROM|INTO|UPDATE|JOIN)\s+(${PART}(?:\s*\.\s*${PART})*)`, "i");
9
+ const PARTS = new RegExp(PART, "g");
6
10
  const COUNT = /^\s*SELECT\s+COUNT\(/i;
7
11
  export function statement(sql) {
8
12
  return sql.replace(WHITESPACE, " ").trim();
@@ -10,9 +14,14 @@ export function statement(sql) {
10
14
  export function fingerprint(sql) {
11
15
  return statement(sql).replace(IN_LIST, "IN (...)");
12
16
  }
17
+ /** `SELECT category`: the verb and the table, its schema and quotes left out. */
13
18
  export function spanName(sql) {
14
19
  const verb = COUNT.test(sql) ? "SELECT COUNT" : (sql.trim().split(/\s+/)[0] ?? "SQL").toUpperCase() || "SQL";
15
- const table = TABLE.exec(sql)?.[1];
20
+ const name = TABLE.exec(sql)?.[1];
21
+ const table = name
22
+ ?.match(PARTS)
23
+ ?.at(-1)
24
+ ?.replace(/^["`[]|["`\]]$/g, "");
16
25
  return table ? `${verb} ${table}` : verb;
17
26
  }
18
27
  //# sourceMappingURL=sql.js.map
package/dist/sql.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"sql.js","sourceRoot":"","sources":["../src/sql.ts"],"names":[],"mappings":"AAAA,iHAAiH;AACjH,uDAAuD;AAEvD,MAAM,UAAU,GAAG,MAAM,CAAC;AAC1B,MAAM,OAAO,GAAG,mDAAmD,CAAC;AACpE,MAAM,KAAK,GAAG,+CAA+C,CAAC;AAC9D,MAAM,KAAK,GAAG,uBAAuB,CAAC;AAEtC,MAAM,UAAU,SAAS,CAAC,GAAW;IACnC,OAAO,GAAG,CAAC,OAAO,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;AAC7C,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,GAAW;IACrC,OAAO,SAAS,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;AACrD,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,GAAW;IAClC,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,WAAW,EAAE,IAAI,KAAK,CAAC;IAC7G,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACnC,OAAO,KAAK,CAAC,CAAC,CAAC,GAAG,IAAI,IAAI,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;AAC3C,CAAC"}
1
+ {"version":3,"file":"sql.js","sourceRoot":"","sources":["../src/sql.ts"],"names":[],"mappings":"AAAA,iHAAiH;AACjH,uDAAuD;AAEvD,MAAM,UAAU,GAAG,MAAM,CAAC;AAC1B,MAAM,OAAO,GAAG,mDAAmD,CAAC;AACpE,qFAAqF;AACrF,MAAM,IAAI,GAAG,MAAM,CAAC,GAAG,CAAA,0CAA0C,CAAC;AAClE,gHAAgH;AAChH,MAAM,KAAK,GAAG,IAAI,MAAM,CAAC,MAAM,CAAC,GAAG,CAAA,kCAAkC,IAAI,cAAc,IAAI,KAAK,EAAE,GAAG,CAAC,CAAC;AACvG,MAAM,KAAK,GAAG,IAAI,MAAM,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;AACpC,MAAM,KAAK,GAAG,uBAAuB,CAAC;AAEtC,MAAM,UAAU,SAAS,CAAC,GAAW;IACnC,OAAO,GAAG,CAAC,OAAO,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;AAC7C,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,GAAW;IACrC,OAAO,SAAS,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;AACrD,CAAC;AAED,iFAAiF;AACjF,MAAM,UAAU,QAAQ,CAAC,GAAW;IAClC,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,WAAW,EAAE,IAAI,KAAK,CAAC;IAC7G,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAClC,MAAM,KAAK,GAAG,IAAI;QAChB,EAAE,KAAK,CAAC,KAAK,CAAC;QACd,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;QACR,EAAE,OAAO,CAAC,iBAAiB,EAAE,EAAE,CAAC,CAAC;IACnC,OAAO,KAAK,CAAC,CAAC,CAAC,GAAG,IAAI,IAAI,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;AAC3C,CAAC"}
@@ -0,0 +1,13 @@
1
+ import { InstrumentationBase, InstrumentationNodeModuleDefinition } from "@opentelemetry/instrumentation";
2
+ type Any = any;
3
+ /** Patches better-sqlite3's Database class: its statements, exec and db.transaction(). */
4
+ export declare function traceBetterSqlite3(Database: Any): void;
5
+ /** Patches libsql's Database class (better-sqlite3's API; its transactions run BEGIN and COMMIT through exec). */
6
+ export declare function traceLibsql(Database: Any): void;
7
+ /** Patches node:sqlite's classes: Database and Statement (DatabaseSync and StatementSync before Node 25.7). */
8
+ export declare function traceNodeSqlite(exports: Any): Any;
9
+ export declare class SqliteInstrumentation extends InstrumentationBase {
10
+ constructor();
11
+ protected init(): InstrumentationNodeModuleDefinition[];
12
+ }
13
+ export {};