@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
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
package/dist/explain.d.ts CHANGED
@@ -12,6 +12,11 @@ export interface ExplainAnswer {
12
12
  columns: string[];
13
13
  rows: unknown[][];
14
14
  }
15
+ /**
16
+ * A SQLite connection that queried (better-sqlite3's, node:sqlite's, libsql's), by its file's name (`file`, none in
17
+ * memory). Held weakly: a connection the app lets go of is gone for EXPLAIN too.
18
+ */
19
+ export declare function rememberSqlite(db: object, file: string | null): void;
15
20
  export declare function explain(request: ExplainRequest): Promise<ExplainAnswer>;
16
21
  /** Records pg's and mysql2's connections as they query: where they are, and their settings. */
17
22
  export declare class DatabasesInstrumentation extends InstrumentationBase {
package/dist/explain.js CHANGED
@@ -3,22 +3,69 @@
3
3
  //
4
4
  // The app's databases are the ones its queries ran on: each pg or mysql2 connection that queries is remembered by
5
5
  // its settings (the password among them), and EXPLAIN opens one of its own with them, so it never runs inside the
6
- // app's transaction. Whatever EXPLAIN ANALYZE does is rolled back.
6
+ // app's transaction. Whatever EXPLAIN ANALYZE does is rolled back. A SQLite database (sqlite.ts) is explained on the
7
+ // app's own connection, the last one that queried that file: EXPLAIN QUERY PLAN only plans, and the connection is
8
+ // the app's thread's, between its statements.
7
9
  import { InstrumentationBase, InstrumentationNodeModuleDefinition, InstrumentationNodeModuleFile, } from "@opentelemetry/instrumentation";
8
10
  import { commonJs } from "./transactions.js";
9
11
  const DATABASES = new Map();
10
- function remember(database) {
12
+ /** The first connection to a database is remembered; a SQLite one's last, as the app may have closed the others. */
13
+ function remember(database, latest = false) {
11
14
  const key = `${database.vendor} ${database.server}:${database.port}/${database.database}`;
12
- if (!DATABASES.has(key))
15
+ if (latest || !DATABASES.has(key))
13
16
  DATABASES.set(key, database);
14
17
  }
15
- /** The database a span's query ran on: by vendor, server, port and name; the only one of that vendor otherwise. */
18
+ // biome-ignore lint/suspicious/noExplicitAny: the drivers' own types are the app's, not this package's.
19
+ const SQLITE = new WeakMap();
20
+ /**
21
+ * A SQLite connection that queried (better-sqlite3's, node:sqlite's, libsql's), by its file's name (`file`, none in
22
+ * memory). Held weakly: a connection the app lets go of is gone for EXPLAIN too.
23
+ */
24
+ export function rememberSqlite(db, file) {
25
+ const known = SQLITE.get(db);
26
+ if (known) {
27
+ if (DATABASES.get(`sqlite :0/${file ?? ""}`) !== known)
28
+ remember(known, true);
29
+ return;
30
+ }
31
+ const connection = new WeakRef(db);
32
+ const database = {
33
+ vendor: "sqlite",
34
+ server: "",
35
+ port: 0,
36
+ database: file ?? "",
37
+ inPlace: true,
38
+ async open() {
39
+ // biome-ignore lint/suspicious/noExplicitAny: the driver's own type.
40
+ const db = connection.deref();
41
+ if (!db || db.open === false || db.isOpen === false)
42
+ throw new Error("The app's SQLite connection is closed.");
43
+ return {
44
+ async run(sql, values) {
45
+ const rows = db.prepare(sql).all(...values);
46
+ return {
47
+ columns: Object.keys(rows[0] ?? {}),
48
+ rows: rows.map((row) => Object.values(row)),
49
+ };
50
+ },
51
+ async close() { },
52
+ };
53
+ },
54
+ };
55
+ SQLITE.set(db, database);
56
+ remember(database, true);
57
+ }
58
+ /**
59
+ * The database a span's query ran on: by vendor, server, port and name; the only one of that vendor otherwise. A
60
+ * SQLite database by its file's name, or the one in memory when the span names none.
61
+ */
16
62
  function databaseFor(request) {
17
63
  const vendor = request.vendor === "mariadb" ? "mysql" : request.vendor;
18
64
  const candidates = [...DATABASES.values()].filter((database) => database.vendor === vendor);
19
- const exact = candidates.find((database) => (request.server == null || database.server === request.server) &&
20
- (request.port == null || database.port === Number(request.port)) &&
21
- (request.database == null || database.database === request.database));
65
+ const named = vendor === "sqlite" ? (request.database ?? "") : request.database;
66
+ const exact = candidates.find((database) => (request.server == null || vendor === "sqlite" || database.server === request.server) &&
67
+ (request.port == null || vendor === "sqlite" || database.port === Number(request.port)) &&
68
+ (named == null || database.database === named));
22
69
  return exact ?? (candidates.length === 1 ? candidates[0] : undefined);
23
70
  }
24
71
  export async function explain(request) {
@@ -26,6 +73,8 @@ export async function explain(request) {
26
73
  if (!database)
27
74
  throw new Error(`The app has queried no ${request.vendor} database it can run EXPLAIN on.`);
28
75
  const session = await database.open();
76
+ if (database.inPlace)
77
+ return session.run(request.sql, request.params);
29
78
  try {
30
79
  await session.run("BEGIN", []);
31
80
  return await session.run(request.sql, request.params);
@@ -1 +1 @@
1
- {"version":3,"file":"explain.js","sourceRoot":"","sources":["../src/explain.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"explain.js","sourceRoot":"","sources":["../src/explain.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import type { FastifyPluginAsync } from "fastify";
2
+ export declare function tracepanel(): FastifyPluginAsync;
@@ -0,0 +1,100 @@
1
+ // `await app.register(tracepanel())`, before the routes: a Fastify plugin. Each route's handler is a span of its own,
2
+ // named by its route (`/books/:id`) and the app's line that added it; the request's trace is named by the route too.
3
+ // Every response gets what the badge reads (Tracepanel-Id, Server-Timing), and an HTML page the widget's script: one
4
+ // sent whole has it put into its body, a stream as it passes. What the request carried goes into its trace as the
5
+ // response goes out: its headers, query, cookies, the body Fastify parsed, the session (`request.session`), and the
6
+ // response's headers. An error the handler throws is the request's unless Fastify answers it below 500.
7
+ //
8
+ // Fastify's own OpenTelemetry instrumentation is deprecated, and @fastify/otel is a plugin to register too, with a span
9
+ // for every hook: this plugin needs nothing but Fastify's hooks.
10
+ import { hasBody, parsedBody, requestAttrs, responseHeaders, searchOf } from "./request.js";
11
+ import { runtime } from "./runtime.js";
12
+ import { expressSession } from "./session.js";
13
+ import { madeAt } from "./stack.js";
14
+ import { inView, statusOf, wasRecorded } from "./view.js";
15
+ import { inject, responseMarks, streamablePage, streamWith } from "./widget.js";
16
+ const TRACED = Symbol.for("tracepanel.fastify.handler");
17
+ const FRAMEWORK = "Fastify";
18
+ function isStream(payload) {
19
+ return payload !== null && typeof payload === "object" && typeof payload.pipe === "function";
20
+ }
21
+ /** What the request carried, the body Fastify parsed, the session as the handler left it, the response's headers. */
22
+ function carried(request, reply) {
23
+ const { headers } = request;
24
+ const body = hasBody(headers) ? parsedBody({ contentType: headers["content-type"] ?? "", body: request.body }) : {};
25
+ return {
26
+ ...requestAttrs(headers, searchOf(request.url)),
27
+ ...body,
28
+ ...expressSession(request.session),
29
+ ...responseHeaders(Object.entries(reply.getHeaders())),
30
+ };
31
+ }
32
+ export function tracepanel() {
33
+ const plugin = async (app) => {
34
+ const tp = runtime();
35
+ if (!tp)
36
+ return;
37
+ const started = new WeakMap();
38
+ app.addHook("onRoute", (route) => {
39
+ const handler = route.handler;
40
+ if (handler[TRACED])
41
+ return;
42
+ // The app's line that added the route: where its handler is, most often.
43
+ const origin = madeAt(tp.config.root).origin;
44
+ const name = route.url;
45
+ const traced = function (request, reply) {
46
+ return inView(name, origin, () => handler.call(this, request, reply));
47
+ };
48
+ traced[TRACED] = true;
49
+ route.handler = traced;
50
+ });
51
+ app.addHook("onRequest", async (request) => {
52
+ started.set(request, performance.now());
53
+ tp.processor.setFramework(FRAMEWORK);
54
+ const route = request.routeOptions.url;
55
+ if (route)
56
+ tp.processor.setRoute(route);
57
+ });
58
+ // One a hook threw, or one the handler's span didn't see (a validation error is below 500, and not one).
59
+ app.addHook("onError", async (_request, _reply, error) => {
60
+ if (statusOf(error) >= 500 && !wasRecorded(error))
61
+ tp.processor.addError(error);
62
+ });
63
+ app.addHook("onSend", async (request, reply, payload) => {
64
+ if (tp.config.captureRequest)
65
+ tp.processor.setTraceAttrs(carried(request, reply));
66
+ const header = (name) => reply.getHeader(name);
67
+ const html = String(header("content-type") ?? "").includes("text/html") && header("content-encoding") == null;
68
+ const whole = typeof payload === "string" || Buffer.isBuffer(payload);
69
+ const page = html && (whole || (isStream(payload) && streamablePage(header)));
70
+ const marks = responseMarks(tp, {
71
+ method: request.method,
72
+ status: reply.statusCode,
73
+ startedMs: started.get(request) ?? performance.now(),
74
+ page,
75
+ framework: tp.processor.framework() ?? FRAMEWORK,
76
+ }, request.headers, header);
77
+ if (!marks)
78
+ return payload;
79
+ reply.headers(marks.headers);
80
+ // Fastify keeps each Set-Cookie it is given.
81
+ if (marks.cookie)
82
+ reply.header("set-cookie", marks.cookie);
83
+ if (!page || !marks.script)
84
+ return payload;
85
+ if (isStream(payload))
86
+ return streamWith(payload, marks.script);
87
+ const body = inject(Buffer.isBuffer(payload) ? payload.toString("utf8") : payload, marks.script);
88
+ if (header("content-length") !== undefined)
89
+ reply.header("content-length", Buffer.byteLength(body));
90
+ return body;
91
+ });
92
+ };
93
+ // Not encapsulated, as fastify-plugin would leave it: its hooks are the app's, for the routes added after it.
94
+ Object.assign(plugin, {
95
+ [Symbol.for("skip-override")]: true,
96
+ [Symbol.for("fastify.display-name")]: "tracepanel",
97
+ });
98
+ return plugin;
99
+ }
100
+ //# sourceMappingURL=fastify.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fastify.js","sourceRoot":"","sources":["../src/fastify.ts"],"names":[],"mappings":"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"}
@@ -4,6 +4,9 @@ import { readFileSync } from "node:fs";
4
4
  import { dirname, join } from "node:path";
5
5
  const PACKAGES = {
6
6
  Express: "express",
7
+ Fastify: "fastify",
8
+ Hono: "hono",
9
+ Koa: "koa",
7
10
  NestJS: "@nestjs/core",
8
11
  "Next.js": "next",
9
12
  Nuxt: "nuxt",
@@ -1 +1 @@
1
- {"version":3,"file":"frameworks.js","sourceRoot":"","sources":["../src/frameworks.ts"],"names":[],"mappings":"AAAA,qHAAqH;AACrH,yCAAyC;AAEzC,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAE1C,MAAM,QAAQ,GAA2B;IACvC,OAAO,EAAE,SAAS;IAClB,MAAM,EAAE,cAAc;IACtB,SAAS,EAAE,MAAM;IACjB,IAAI,EAAE,MAAM;CACb,CAAC;AAEF,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAyB,CAAC;AAElD,SAAS,SAAS,CAAC,IAAY;IAC7B,IAAI,MAAM,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAC3B,SAAS,CAAC;QACR,IAAI,CAAC;YACH,MAAM,OAAO,GAAY,IAAI,CAAC,KAAK,CACjC,YAAY,CAAC,IAAI,CAAC,MAAM,EAAE,cAAc,EAAE,IAAI,EAAE,cAAc,CAAC,EAAE,MAAM,CAAC,CACzE,CAAC,OAAO,CAAC;YACV,OAAO,OAAO,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC;QACtD,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;YAC/B,IAAI,MAAM,KAAK,MAAM;gBAAE,OAAO,IAAI,CAAC;YACnC,MAAM,GAAG,MAAM,CAAC;QAClB,CAAC;IACH,CAAC;AACH,CAAC;AAED,gHAAgH;AAChH,MAAM,UAAU,WAAW,CAAC,SAAiB,EAAE,KAAc;IAC3D,MAAM,IAAI,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC;IACjC,IAAI,CAAC,IAAI;QAAE,OAAO,SAAS,CAAC;IAC5B,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC;QAAE,QAAQ,CAAC,GAAG,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;IAC7D,MAAM,OAAO,GAAG,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACnC,IAAI,CAAC,OAAO;QAAE,OAAO,SAAS,CAAC;IAC/B,OAAO,GAAG,SAAS,IAAI,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;AAC1F,CAAC"}
1
+ {"version":3,"file":"frameworks.js","sourceRoot":"","sources":["../src/frameworks.ts"],"names":[],"mappings":"AAAA,qHAAqH;AACrH,yCAAyC;AAEzC,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAE1C,MAAM,QAAQ,GAA2B;IACvC,OAAO,EAAE,SAAS;IAClB,OAAO,EAAE,SAAS;IAClB,IAAI,EAAE,MAAM;IACZ,GAAG,EAAE,KAAK;IACV,MAAM,EAAE,cAAc;IACtB,SAAS,EAAE,MAAM;IACjB,IAAI,EAAE,MAAM;CACb,CAAC;AAEF,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAyB,CAAC;AAElD,SAAS,SAAS,CAAC,IAAY;IAC7B,IAAI,MAAM,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAC3B,SAAS,CAAC;QACR,IAAI,CAAC;YACH,MAAM,OAAO,GAAY,IAAI,CAAC,KAAK,CACjC,YAAY,CAAC,IAAI,CAAC,MAAM,EAAE,cAAc,EAAE,IAAI,EAAE,cAAc,CAAC,EAAE,MAAM,CAAC,CACzE,CAAC,OAAO,CAAC;YACV,OAAO,OAAO,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC;QACtD,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;YAC/B,IAAI,MAAM,KAAK,MAAM;gBAAE,OAAO,IAAI,CAAC;YACnC,MAAM,GAAG,MAAM,CAAC;QAClB,CAAC;IACH,CAAC;AACH,CAAC;AAED,gHAAgH;AAChH,MAAM,UAAU,WAAW,CAAC,SAAiB,EAAE,KAAc;IAC3D,MAAM,IAAI,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC;IACjC,IAAI,CAAC,IAAI;QAAE,OAAO,SAAS,CAAC;IAC5B,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC;QAAE,QAAQ,CAAC,GAAG,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;IAC7D,MAAM,OAAO,GAAG,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACnC,IAAI,CAAC,OAAO;QAAE,OAAO,SAAS,CAAC;IAC/B,OAAO,GAAG,SAAS,IAAI,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;AAC1F,CAAC"}
package/dist/hono.d.ts ADDED
@@ -0,0 +1,2 @@
1
+ import type { MiddlewareHandler } from "hono";
2
+ export declare function tracepanel(): MiddlewareHandler;
package/dist/hono.js ADDED
@@ -0,0 +1,63 @@
1
+ // `app.use(tracepanel())`, first: Hono middleware, for Hono on Node (@hono/node-server) and on Bun. The route's handler
2
+ // is a span of its own, named by its route (`/books/:id`), and so is the request's trace. On Node every response gets
3
+ // what the badge reads (Tracepanel-Id, Server-Timing) and an HTML page the widget's script, put into its body as it
4
+ // streams; what the request carried goes into its trace: its headers, query, cookies, its body as far as the handler
5
+ // read it, and the response's headers. On Bun, `withTracepanel(app.fetch)` does that, and this middleware names the
6
+ // route and its handler under it. An error is the request's unless the app answers it below 500 (an HTTPException, or
7
+ // what app.onError answers).
8
+ //
9
+ // Hono matches a request before its middleware run: the handler is the last of the routes it matched that is not
10
+ // middleware, and its span holds what runs after this middleware (the others the route has, then the handler).
11
+ import { matchedRoutes } from "hono/route";
12
+ import { tapRequest } from "./body.js";
13
+ import { MARKED, marked } from "./respond.js";
14
+ import { runtime } from "./runtime.js";
15
+ import { inView, recordError, wasRecorded } from "./view.js";
16
+ const FRAMEWORK = "Hono";
17
+ /** The route that answers the request: the last one matched that isn't middleware (`app.use()`'s, `next` taken). */
18
+ function handlerRoute(c) {
19
+ const routes = matchedRoutes(c);
20
+ for (let at = routes.length - 1; at > c.req.routeIndex; at--) {
21
+ const route = routes[at];
22
+ if (route && (route.method !== "ALL" || route.handler.length < 2))
23
+ return route.path;
24
+ }
25
+ return undefined;
26
+ }
27
+ export function tracepanel() {
28
+ const tp = runtime();
29
+ return async function tracepanelMiddleware(c, next) {
30
+ if (!tp) {
31
+ await next();
32
+ return;
33
+ }
34
+ tp.processor.setFramework(FRAMEWORK);
35
+ const startedMs = performance.now();
36
+ const request = c.req.raw;
37
+ const marking = !request[MARKED];
38
+ const body = marking && tp.config.captureRequest ? tapRequest(request) : undefined;
39
+ const route = handlerRoute(c);
40
+ if (route) {
41
+ tp.processor.setRoute(route);
42
+ // Hono catches what the handler throws, for app.onError: the error is the context's then.
43
+ await inView(route, null, async (span) => {
44
+ await next();
45
+ if (c.error)
46
+ recordError(span, c.error, c.res.status);
47
+ });
48
+ }
49
+ else {
50
+ await next();
51
+ }
52
+ // Thrown in middleware, before the handler or without one.
53
+ if (c.error && c.res.status >= 500 && !wasRecorded(c.error))
54
+ tp.processor.addError(c.error);
55
+ if (!marking)
56
+ return;
57
+ const answer = await marked(tp, request, c.res, startedMs, FRAMEWORK, body);
58
+ // Set over the response, the new one would get the old one's headers back (its Content-Length among them).
59
+ c.res = undefined;
60
+ c.res = answer.response;
61
+ };
62
+ }
63
+ //# sourceMappingURL=hono.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hono.js","sourceRoot":"","sources":["../src/hono.ts"],"names":[],"mappings":"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"}
package/dist/koa.d.ts ADDED
@@ -0,0 +1,2 @@
1
+ import type { Middleware } from "koa";
2
+ export declare function tracepanel(): Middleware;
package/dist/koa.js ADDED
@@ -0,0 +1,119 @@
1
+ // `app.use(tracepanel())`, first: Koa middleware. The handler of each @koa/router route is a span of its own, named
2
+ // by its route (`/books/:id`), and so is the request's trace. Every response gets what the badge reads
3
+ // (Tracepanel-Id, Server-Timing), an error's answer too, and an HTML page the widget's script: a string or a Buffer
4
+ // has it put into its body, a stream as it passes. What the request carried goes into its trace as the response goes
5
+ // out: its headers, query, cookies, the body a body parser read (`ctx.request.body`, its files), the session
6
+ // (`ctx.session`), and the response's headers. An error is the request's unless Koa answers it below 500 (`ctx.throw(404)`).
7
+ //
8
+ // The handlers are found from the app's middleware, as the request comes: the routers it mounted (`router.routes()`,
9
+ // and the routers nested in them), each route's last function its handler. OpenTelemetry's Koa instrumentation does
10
+ // the same from Koa's `use()`, once, with a span for each middleware besides; here the routes added later count too.
11
+ import { hasBody, parsedBody, requestAttrs, responseHeaders, searchOf } from "./request.js";
12
+ import { runtime } from "./runtime.js";
13
+ import { expressSession } from "./session.js";
14
+ import { inView, statusOf, wasRecorded } from "./view.js";
15
+ import { inject, responseMarks, streamablePage, streamWith } from "./widget.js";
16
+ const FRAMEWORK = "Koa";
17
+ const TRACED = Symbol.for("tracepanel.koa.handler");
18
+ // How many layers each router had when its handlers were traced: a route added since is traced as it comes.
19
+ const seen = new WeakMap();
20
+ /** Each route's handler in a span, in every router among these middleware, and in the routers nested in them. */
21
+ function traceRoutes(middleware) {
22
+ for (const fn of middleware) {
23
+ const router = fn.router;
24
+ if (!router || !Array.isArray(router.stack) || seen.get(router) === router.stack.length)
25
+ continue;
26
+ seen.set(router, router.stack.length);
27
+ for (const layer of router.stack) {
28
+ if (!Array.isArray(layer.stack))
29
+ continue;
30
+ traceRoutes(layer.stack);
31
+ const last = layer.stack.length - 1;
32
+ const handler = layer.stack[last];
33
+ // A route's own layer has its methods; router.use()'s middleware has none.
34
+ if (!handler || handler.router || handler[TRACED] || layer.methods.length === 0)
35
+ continue;
36
+ const route = String(layer.path);
37
+ const traced = (ctx, next) => inView(route, null, () => handler(ctx, next));
38
+ traced[TRACED] = true;
39
+ layer.stack[last] = traced;
40
+ }
41
+ }
42
+ }
43
+ function isStream(body) {
44
+ return body !== null && typeof body === "object" && typeof body.pipe === "function";
45
+ }
46
+ /** What the request carried, the body a parser read, the session as the handler left it, the response's headers. */
47
+ function carried(ctx) {
48
+ const { request, session } = ctx;
49
+ const body = hasBody(ctx.headers)
50
+ ? parsedBody({ contentType: ctx.get("content-type"), body: request.body, files: request.files })
51
+ : {};
52
+ return {
53
+ ...requestAttrs(ctx.headers, searchOf(ctx.originalUrl ?? ctx.url)),
54
+ ...body,
55
+ ...expressSession(session),
56
+ ...responseHeaders(Object.entries(ctx.response.headers)),
57
+ };
58
+ }
59
+ /** The route @koa/router matched, the request's name. */
60
+ function named(tp, ctx) {
61
+ const route = ctx._matchedRoute;
62
+ if (route !== undefined)
63
+ tp.processor.setRoute(String(route));
64
+ }
65
+ export function tracepanel() {
66
+ const tp = runtime();
67
+ return async function tracepanelMiddleware(ctx, next) {
68
+ if (!tp) {
69
+ await next();
70
+ return;
71
+ }
72
+ tp.processor.setFramework(FRAMEWORK);
73
+ const startedMs = performance.now();
74
+ traceRoutes(ctx.app.middleware);
75
+ const badge = (status, page) => responseMarks(tp, { method: ctx.method, status, startedMs, page, framework: tp.processor.framework() ?? FRAMEWORK }, ctx.headers, (name) => ctx.response.get(name) || undefined);
76
+ try {
77
+ await next();
78
+ }
79
+ catch (error) {
80
+ named(tp, ctx);
81
+ if (statusOf(error) >= 500 && !wasRecorded(error))
82
+ tp.processor.addError(error);
83
+ if (tp.config.captureRequest)
84
+ tp.processor.setTraceAttrs(carried(ctx));
85
+ // Koa answers it once it is out of here, its headers cleared but for the error's own: the badge's go with them.
86
+ const marks = badge(statusOf(error), false);
87
+ if (marks && error !== null && typeof error === "object") {
88
+ const own = error.headers;
89
+ const headers = { ...own, ...marks.headers };
90
+ if (marks.cookie)
91
+ headers["Set-Cookie"] = marks.cookie;
92
+ Object.assign(error, { headers });
93
+ }
94
+ throw error;
95
+ }
96
+ named(tp, ctx);
97
+ if (tp.config.captureRequest)
98
+ tp.processor.setTraceAttrs(carried(ctx));
99
+ const { body } = ctx;
100
+ const header = (name) => ctx.response.get(name) || undefined;
101
+ const html = Boolean(ctx.response.is("html")) && !header("content-encoding");
102
+ const whole = typeof body === "string" || Buffer.isBuffer(body);
103
+ const page = html && (whole || (isStream(body) && streamablePage(header)));
104
+ const marks = badge(ctx.status, page);
105
+ if (!marks)
106
+ return;
107
+ ctx.set(marks.headers);
108
+ if (marks.cookie)
109
+ ctx.append("Set-Cookie", marks.cookie);
110
+ if (!page || !marks.script)
111
+ return;
112
+ // Koa sets the new body's Content-Length, and leaves a stream's out.
113
+ if (isStream(body))
114
+ ctx.body = streamWith(body, marks.script);
115
+ else
116
+ ctx.body = inject(Buffer.isBuffer(body) ? body.toString("utf8") : body, marks.script);
117
+ };
118
+ }
119
+ //# sourceMappingURL=koa.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"koa.js","sourceRoot":"","sources":["../src/koa.ts"],"names":[],"mappings":"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"}
package/dist/llm.d.ts ADDED
@@ -0,0 +1,20 @@
1
+ import { InstrumentationBase, InstrumentationNodeModuleDefinition } from "@opentelemetry/instrumentation";
2
+ /** The span kind of an LLM call, in `tracepanel.span_kind`. */
3
+ export declare const KIND = "llm";
4
+ /** The instrumentation scope of Anthropic's SDK's own spans: the processor leaves them out. */
5
+ export declare const ANTHROPIC_SCOPE = "com.anthropic.sdk";
6
+ /** OpenAI's and Anthropic's clients, their API calls as LLM call spans. */
7
+ export declare class LlmInstrumentation extends InstrumentationBase {
8
+ constructor();
9
+ protected init(): InstrumentationNodeModuleDefinition[];
10
+ private patch;
11
+ }
12
+ type Fetch = (input: string | URL | Request, init?: RequestInit) => Promise<Response>;
13
+ /**
14
+ * fetch(), its calls to a model's API (a POST of JSON with a model to a known endpoint) as LLM call spans: what the
15
+ * AI SDK's providers and other clients of these APIs send. One an SDK's client makes is that call's already.
16
+ */
17
+ export declare function llmFetch<F extends Fetch>(fetch: F): F;
18
+ /** globalThis.fetch, its LLM calls traced, once per process. */
19
+ export declare function traceLlmFetch(): void;
20
+ export {};