@wizeworks/lens-node 0.0.0-stage → 0.3.0-alpha.2

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 (303) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +65 -2
  3. package/dist/adapters/drizzle.d.ts +7 -0
  4. package/dist/adapters/drizzle.d.ts.map +1 -0
  5. package/dist/adapters/drizzle.js +41 -0
  6. package/dist/adapters/drizzle.js.map +1 -0
  7. package/dist/adapters/mysql2.d.ts +6 -0
  8. package/dist/adapters/mysql2.d.ts.map +1 -0
  9. package/dist/adapters/mysql2.js +60 -0
  10. package/dist/adapters/mysql2.js.map +1 -0
  11. package/dist/adapters/pg.d.ts +6 -0
  12. package/dist/adapters/pg.d.ts.map +1 -0
  13. package/dist/adapters/pg.js +50 -0
  14. package/dist/adapters/pg.js.map +1 -0
  15. package/dist/adapters/prisma.d.ts +22 -0
  16. package/dist/adapters/prisma.d.ts.map +1 -0
  17. package/dist/adapters/prisma.js +48 -0
  18. package/dist/adapters/prisma.js.map +1 -0
  19. package/dist/adapters/registry.d.ts +37 -0
  20. package/dist/adapters/registry.d.ts.map +1 -0
  21. package/dist/adapters/registry.js +41 -0
  22. package/dist/adapters/registry.js.map +1 -0
  23. package/dist/adapters/sqlite.d.ts +10 -0
  24. package/dist/adapters/sqlite.d.ts.map +1 -0
  25. package/dist/adapters/sqlite.js +59 -0
  26. package/dist/adapters/sqlite.js.map +1 -0
  27. package/dist/adapters/typeorm.d.ts +4 -0
  28. package/dist/adapters/typeorm.d.ts.map +1 -0
  29. package/dist/adapters/typeorm.js +43 -0
  30. package/dist/adapters/typeorm.js.map +1 -0
  31. package/dist/api.d.ts +26 -0
  32. package/dist/api.d.ts.map +1 -0
  33. package/dist/api.js +112 -0
  34. package/dist/api.js.map +1 -0
  35. package/dist/body-capture.d.ts +13 -0
  36. package/dist/body-capture.d.ts.map +1 -0
  37. package/dist/body-capture.js +54 -0
  38. package/dist/body-capture.js.map +1 -0
  39. package/dist/capture.d.ts +8 -0
  40. package/dist/capture.d.ts.map +1 -0
  41. package/dist/capture.js +33 -0
  42. package/dist/capture.js.map +1 -0
  43. package/dist/client-spans.d.ts +11 -0
  44. package/dist/client-spans.d.ts.map +1 -0
  45. package/dist/client-spans.js +83 -0
  46. package/dist/client-spans.js.map +1 -0
  47. package/dist/db.d.ts +25 -0
  48. package/dist/db.d.ts.map +1 -0
  49. package/dist/db.js +107 -0
  50. package/dist/db.js.map +1 -0
  51. package/dist/disabled.d.ts +4 -0
  52. package/dist/disabled.d.ts.map +1 -0
  53. package/dist/disabled.js +25 -0
  54. package/dist/disabled.js.map +1 -0
  55. package/dist/expose-headers.d.ts +6 -0
  56. package/dist/expose-headers.d.ts.map +1 -0
  57. package/dist/expose-headers.js +43 -0
  58. package/dist/expose-headers.js.map +1 -0
  59. package/dist/federation.d.ts +7 -0
  60. package/dist/federation.d.ts.map +1 -0
  61. package/dist/federation.js +33 -0
  62. package/dist/federation.js.map +1 -0
  63. package/dist/frameworks/fastify.d.ts +6 -0
  64. package/dist/frameworks/fastify.d.ts.map +1 -0
  65. package/dist/frameworks/fastify.js +60 -0
  66. package/dist/frameworks/fastify.js.map +1 -0
  67. package/dist/frameworks/hono.d.ts +6 -0
  68. package/dist/frameworks/hono.d.ts.map +1 -0
  69. package/dist/frameworks/hono.js +34 -0
  70. package/dist/frameworks/hono.js.map +1 -0
  71. package/dist/frameworks/koa.d.ts +13 -0
  72. package/dist/frameworks/koa.d.ts.map +1 -0
  73. package/dist/frameworks/koa.js +42 -0
  74. package/dist/frameworks/koa.js.map +1 -0
  75. package/dist/frameworks/next.d.ts +25 -0
  76. package/dist/frameworks/next.d.ts.map +1 -0
  77. package/dist/frameworks/next.js +49 -0
  78. package/dist/frameworks/next.js.map +1 -0
  79. package/dist/frameworks/node-server.d.ts +6 -0
  80. package/dist/frameworks/node-server.d.ts.map +1 -0
  81. package/dist/frameworks/node-server.js +35 -0
  82. package/dist/frameworks/node-server.js.map +1 -0
  83. package/dist/grpc/client.d.ts +6 -0
  84. package/dist/grpc/client.d.ts.map +1 -0
  85. package/dist/grpc/client.js +52 -0
  86. package/dist/grpc/client.js.map +1 -0
  87. package/dist/grpc/index.d.ts +4 -0
  88. package/dist/grpc/index.d.ts.map +1 -0
  89. package/dist/grpc/index.js +16 -0
  90. package/dist/grpc/index.js.map +1 -0
  91. package/dist/grpc/server.d.ts +10 -0
  92. package/dist/grpc/server.d.ts.map +1 -0
  93. package/dist/grpc/server.js +98 -0
  94. package/dist/grpc/server.js.map +1 -0
  95. package/dist/grpc/shared.d.ts +40 -0
  96. package/dist/grpc/shared.d.ts.map +1 -0
  97. package/dist/grpc/shared.js +45 -0
  98. package/dist/grpc/shared.js.map +1 -0
  99. package/dist/http-util.d.ts +10 -0
  100. package/dist/http-util.d.ts.map +1 -0
  101. package/dist/http-util.js +47 -0
  102. package/dist/http-util.js.map +1 -0
  103. package/dist/hub-connect.d.ts +10 -0
  104. package/dist/hub-connect.d.ts.map +1 -0
  105. package/dist/hub-connect.js +22 -0
  106. package/dist/hub-connect.js.map +1 -0
  107. package/dist/hub-export.d.ts +34 -0
  108. package/dist/hub-export.d.ts.map +1 -0
  109. package/dist/hub-export.js +135 -0
  110. package/dist/hub-export.js.map +1 -0
  111. package/dist/index.d.ts +35 -0
  112. package/dist/index.d.ts.map +1 -0
  113. package/dist/index.js +27 -0
  114. package/dist/index.js.map +1 -0
  115. package/dist/info.d.ts +18 -0
  116. package/dist/info.d.ts.map +1 -0
  117. package/dist/info.js +31 -0
  118. package/dist/info.js.map +1 -0
  119. package/dist/kit.d.ts +14 -0
  120. package/dist/kit.d.ts.map +1 -0
  121. package/dist/kit.js +12 -0
  122. package/dist/kit.js.map +1 -0
  123. package/dist/logger.d.ts +29 -0
  124. package/dist/logger.d.ts.map +1 -0
  125. package/dist/logger.js +82 -0
  126. package/dist/logger.js.map +1 -0
  127. package/dist/logs/bunyan.d.ts +4 -0
  128. package/dist/logs/bunyan.d.ts.map +1 -0
  129. package/dist/logs/bunyan.js +42 -0
  130. package/dist/logs/bunyan.js.map +1 -0
  131. package/dist/logs/captured.d.ts +4 -0
  132. package/dist/logs/captured.d.ts.map +1 -0
  133. package/dist/logs/captured.js +9 -0
  134. package/dist/logs/captured.js.map +1 -0
  135. package/dist/logs/consola.d.ts +4 -0
  136. package/dist/logs/consola.d.ts.map +1 -0
  137. package/dist/logs/consola.js +25 -0
  138. package/dist/logs/consola.js.map +1 -0
  139. package/dist/logs/console.d.ts +4 -0
  140. package/dist/logs/console.d.ts.map +1 -0
  141. package/dist/logs/console.js +49 -0
  142. package/dist/logs/console.js.map +1 -0
  143. package/dist/logs/levels.d.ts +14 -0
  144. package/dist/logs/levels.d.ts.map +1 -0
  145. package/dist/logs/levels.js +58 -0
  146. package/dist/logs/levels.js.map +1 -0
  147. package/dist/logs/log4js.d.ts +16 -0
  148. package/dist/logs/log4js.d.ts.map +1 -0
  149. package/dist/logs/log4js.js +21 -0
  150. package/dist/logs/log4js.js.map +1 -0
  151. package/dist/logs/nest.d.ts +6 -0
  152. package/dist/logs/nest.d.ts.map +1 -0
  153. package/dist/logs/nest.js +34 -0
  154. package/dist/logs/nest.js.map +1 -0
  155. package/dist/logs/otel.d.ts +24 -0
  156. package/dist/logs/otel.d.ts.map +1 -0
  157. package/dist/logs/otel.js +31 -0
  158. package/dist/logs/otel.js.map +1 -0
  159. package/dist/logs/pino.d.ts +4 -0
  160. package/dist/logs/pino.d.ts.map +1 -0
  161. package/dist/logs/pino.js +86 -0
  162. package/dist/logs/pino.js.map +1 -0
  163. package/dist/logs/winston.d.ts +4 -0
  164. package/dist/logs/winston.d.ts.map +1 -0
  165. package/dist/logs/winston.js +65 -0
  166. package/dist/logs/winston.js.map +1 -0
  167. package/dist/mcp-find.d.ts +5 -0
  168. package/dist/mcp-find.d.ts.map +1 -0
  169. package/dist/mcp-find.js +42 -0
  170. package/dist/mcp-find.js.map +1 -0
  171. package/dist/mcp-metrics.d.ts +5 -0
  172. package/dist/mcp-metrics.d.ts.map +1 -0
  173. package/dist/mcp-metrics.js +77 -0
  174. package/dist/mcp-metrics.js.map +1 -0
  175. package/dist/mcp-shared.d.ts +30 -0
  176. package/dist/mcp-shared.d.ts.map +1 -0
  177. package/dist/mcp-shared.js +5 -0
  178. package/dist/mcp-shared.js.map +1 -0
  179. package/dist/mcp-traces.d.ts +5 -0
  180. package/dist/mcp-traces.d.ts.map +1 -0
  181. package/dist/mcp-traces.js +51 -0
  182. package/dist/mcp-traces.js.map +1 -0
  183. package/dist/mcp.d.ts +6 -0
  184. package/dist/mcp.d.ts.map +1 -0
  185. package/dist/mcp.js +26 -0
  186. package/dist/mcp.js.map +1 -0
  187. package/dist/messaging/amqplib.d.ts +4 -0
  188. package/dist/messaging/amqplib.d.ts.map +1 -0
  189. package/dist/messaging/amqplib.js +89 -0
  190. package/dist/messaging/amqplib.js.map +1 -0
  191. package/dist/messaging/kafkajs.d.ts +4 -0
  192. package/dist/messaging/kafkajs.d.ts.map +1 -0
  193. package/dist/messaging/kafkajs.js +78 -0
  194. package/dist/messaging/kafkajs.js.map +1 -0
  195. package/dist/messaging/servicebus.d.ts +4 -0
  196. package/dist/messaging/servicebus.d.ts.map +1 -0
  197. package/dist/messaging/servicebus.js +85 -0
  198. package/dist/messaging/servicebus.js.map +1 -0
  199. package/dist/messaging/shared.d.ts +30 -0
  200. package/dist/messaging/shared.d.ts.map +1 -0
  201. package/dist/messaging/shared.js +74 -0
  202. package/dist/messaging/shared.js.map +1 -0
  203. package/dist/metrics/exponential.d.ts +17 -0
  204. package/dist/metrics/exponential.d.ts.map +1 -0
  205. package/dist/metrics/exponential.js +12 -0
  206. package/dist/metrics/exponential.js.map +1 -0
  207. package/dist/metrics/gc.d.ts +15 -0
  208. package/dist/metrics/gc.d.ts.map +1 -0
  209. package/dist/metrics/gc.js +44 -0
  210. package/dist/metrics/gc.js.map +1 -0
  211. package/dist/metrics/otel.d.ts +39 -0
  212. package/dist/metrics/otel.d.ts.map +1 -0
  213. package/dist/metrics/otel.js +62 -0
  214. package/dist/metrics/otel.js.map +1 -0
  215. package/dist/metrics/runtime.d.ts +17 -0
  216. package/dist/metrics/runtime.d.ts.map +1 -0
  217. package/dist/metrics/runtime.js +100 -0
  218. package/dist/metrics/runtime.js.map +1 -0
  219. package/dist/metrics/setup.d.ts +13 -0
  220. package/dist/metrics/setup.d.ts.map +1 -0
  221. package/dist/metrics/setup.js +20 -0
  222. package/dist/metrics/setup.js.map +1 -0
  223. package/dist/metrics/store.d.ts +34 -0
  224. package/dist/metrics/store.d.ts.map +1 -0
  225. package/dist/metrics/store.js +94 -0
  226. package/dist/metrics/store.js.map +1 -0
  227. package/dist/mode.d.ts +6 -0
  228. package/dist/mode.d.ts.map +1 -0
  229. package/dist/mode.js +7 -0
  230. package/dist/mode.js.map +1 -0
  231. package/dist/next.d.ts +5 -0
  232. package/dist/next.d.ts.map +1 -0
  233. package/dist/next.js +2 -0
  234. package/dist/next.js.map +1 -0
  235. package/dist/persist-schema.d.ts +14 -0
  236. package/dist/persist-schema.d.ts.map +1 -0
  237. package/dist/persist-schema.js +41 -0
  238. package/dist/persist-schema.js.map +1 -0
  239. package/dist/persist-util.d.ts +4 -0
  240. package/dist/persist-util.d.ts.map +1 -0
  241. package/dist/persist-util.js +30 -0
  242. package/dist/persist-util.js.map +1 -0
  243. package/dist/persist.d.ts +27 -0
  244. package/dist/persist.d.ts.map +1 -0
  245. package/dist/persist.js +159 -0
  246. package/dist/persist.js.map +1 -0
  247. package/dist/precise.d.ts +8 -0
  248. package/dist/precise.d.ts.map +1 -0
  249. package/dist/precise.js +28 -0
  250. package/dist/precise.js.map +1 -0
  251. package/dist/processor.d.ts +20 -0
  252. package/dist/processor.d.ts.map +1 -0
  253. package/dist/processor.js +102 -0
  254. package/dist/processor.js.map +1 -0
  255. package/dist/request-api.d.ts +12 -0
  256. package/dist/request-api.d.ts.map +1 -0
  257. package/dist/request-api.js +31 -0
  258. package/dist/request-api.js.map +1 -0
  259. package/dist/request-attributes.d.ts +9 -0
  260. package/dist/request-attributes.d.ts.map +1 -0
  261. package/dist/request-attributes.js +48 -0
  262. package/dist/request-attributes.js.map +1 -0
  263. package/dist/request-capture.d.ts +32 -0
  264. package/dist/request-capture.d.ts.map +1 -0
  265. package/dist/request-capture.js +94 -0
  266. package/dist/request-capture.js.map +1 -0
  267. package/dist/route-timing.d.ts +6 -0
  268. package/dist/route-timing.d.ts.map +1 -0
  269. package/dist/route-timing.js +25 -0
  270. package/dist/route-timing.js.map +1 -0
  271. package/dist/sampling.d.ts +37 -0
  272. package/dist/sampling.d.ts.map +1 -0
  273. package/dist/sampling.js +120 -0
  274. package/dist/sampling.js.map +1 -0
  275. package/dist/spans.d.ts +9 -0
  276. package/dist/spans.d.ts.map +1 -0
  277. package/dist/spans.js +17 -0
  278. package/dist/spans.js.map +1 -0
  279. package/dist/store-types.d.ts +22 -0
  280. package/dist/store-types.d.ts.map +1 -0
  281. package/dist/store-types.js +2 -0
  282. package/dist/store-types.js.map +1 -0
  283. package/dist/store.d.ts +59 -0
  284. package/dist/store.d.ts.map +1 -0
  285. package/dist/store.js +194 -0
  286. package/dist/store.js.map +1 -0
  287. package/dist/tracing.d.ts +20 -0
  288. package/dist/tracing.d.ts.map +1 -0
  289. package/dist/tracing.js +45 -0
  290. package/dist/tracing.js.map +1 -0
  291. package/dist/types.d.ts +127 -0
  292. package/dist/types.d.ts.map +1 -0
  293. package/dist/types.js +2 -0
  294. package/dist/types.js.map +1 -0
  295. package/dist/ui.d.ts +6 -0
  296. package/dist/ui.d.ts.map +1 -0
  297. package/dist/ui.js +62 -0
  298. package/dist/ui.js.map +1 -0
  299. package/dist/wizelens.d.ts +5 -0
  300. package/dist/wizelens.d.ts.map +1 -0
  301. package/dist/wizelens.js +127 -0
  302. package/dist/wizelens.js.map +1 -0
  303. package/package.json +109 -3
@@ -0,0 +1,43 @@
1
+ import { HEADER_ENDPOINT, HEADER_TRACE } from "@wizeworks/lens-core";
2
+ const EXPOSE = "access-control-expose-headers";
3
+ const OURS = [HEADER_TRACE, HEADER_ENDPOINT];
4
+ /** The header value with our two names added, without repeats. */
5
+ export function withOurNames(value) {
6
+ const list = Array.isArray(value) ? value.join(",") : value == null ? "" : String(value);
7
+ const parts = new Set(list.split(",").map((s) => s.trim()).filter(Boolean));
8
+ for (const name of OURS)
9
+ parts.add(name);
10
+ return [...parts].join(", ");
11
+ }
12
+ const isExpose = (key) => typeof key === "string" && key.toLowerCase() === EXPOSE;
13
+ /** Add our names to the header inside a writeHead headers argument: an object, a flat array, or pairs. */
14
+ function mergeInto(headers) {
15
+ if (!Array.isArray(headers)) {
16
+ const record = headers;
17
+ for (const key of Object.keys(record))
18
+ if (isExpose(key))
19
+ record[key] = withOurNames(record[key]);
20
+ return;
21
+ }
22
+ for (let i = 0; i < headers.length; i++) {
23
+ const item = headers[i];
24
+ if (Array.isArray(item) && isExpose(item[0]))
25
+ item[1] = withOurNames(item[1]);
26
+ else if (isExpose(item) && i + 1 < headers.length)
27
+ headers[i + 1] = withOurNames(headers[i + 1]);
28
+ }
29
+ }
30
+ /** Keep our names in Access-Control-Expose-Headers, even when a CORS layer sets that header after us. */
31
+ export function keepExposeHeaders(res) {
32
+ res.setHeader("Access-Control-Expose-Headers", withOurNames(res.getHeader(EXPOSE)));
33
+ const writeHead = res.writeHead;
34
+ res.writeHead = function (...args) {
35
+ const headers = args.slice(1).find((a) => !!a && typeof a === "object");
36
+ if (headers)
37
+ mergeInto(headers);
38
+ if (!this.headersSent)
39
+ this.setHeader("Access-Control-Expose-Headers", withOurNames(this.getHeader(EXPOSE)));
40
+ return writeHead.apply(this, args);
41
+ };
42
+ }
43
+ //# sourceMappingURL=expose-headers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"expose-headers.js","sourceRoot":"","sources":["../src/expose-headers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import { type Trace } from "@wizeworks/lens-core";
2
+ import type { TraceStore } from "./store.js";
3
+ /** Fetch one trace part from another WizeLens endpoint. Undefined when it fails. */
4
+ export declare function fetchRemote(remote: string, traceId: string, hop: number): Promise<Trace | undefined>;
5
+ /** Build `getTrace`: the local trace merged with the parts its downstream services hold. */
6
+ export declare function createGetTrace(store: TraceStore, selfEndpoints: ReadonlySet<string>): (traceId: string, federate?: boolean, hop?: number) => Promise<Trace | undefined>;
7
+ //# sourceMappingURL=federation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"federation.d.ts","sourceRoot":"","sources":["../src/federation.ts"],"names":[],"mappings":"AAEA,OAAO,EAAgD,KAAK,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAChG,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAI7C,oFAAoF;AACpF,wBAAsB,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,GAAG,SAAS,CAAC,CAa1G;AAED,4FAA4F;AAC5F,wBAAgB,cAAc,CAAC,KAAK,EAAE,UAAU,EAAE,aAAa,EAAE,WAAW,CAAC,MAAM,CAAC,aAC1C,MAAM,uCAA6B,OAAO,CAAC,KAAK,GAAG,SAAS,CAAC,CAStG"}
@@ -0,0 +1,33 @@
1
+ import { context, ROOT_CONTEXT } from "@opentelemetry/api";
2
+ import { suppressTracing } from "@opentelemetry/core";
3
+ import { HEADER_HOP, MAX_FEDERATION_HOPS, mergeTraces } from "@wizeworks/lens-core";
4
+ const TIMEOUT_MS = 2000;
5
+ /** Fetch one trace part from another WizeLens endpoint. Undefined when it fails. */
6
+ export async function fetchRemote(remote, traceId, hop) {
7
+ try {
8
+ // No spans at all: a framework fetch wrapper (Next.js) makes its own span above undici.
9
+ const res = await context.with(suppressTracing(ROOT_CONTEXT), () => fetch(`${remote}/api/traces/${traceId}?federate=true`, {
10
+ headers: { [HEADER_HOP]: String(hop + 1), Accept: "application/json" },
11
+ signal: AbortSignal.timeout(TIMEOUT_MS),
12
+ }));
13
+ return res.ok ? (await res.json()) : undefined;
14
+ }
15
+ catch {
16
+ return undefined;
17
+ }
18
+ }
19
+ /** Build `getTrace`: the local trace merged with the parts its downstream services hold. */
20
+ export function createGetTrace(store, selfEndpoints) {
21
+ return async function getTrace(traceId, federate = true, hop = 0) {
22
+ const local = store.get(traceId);
23
+ if (!federate || hop + 1 > MAX_FEDERATION_HOPS)
24
+ return local;
25
+ const remotes = (local?.remotes ?? []).filter((r) => !selfEndpoints.has(r));
26
+ const parts = await Promise.all(remotes.map((remote) => fetchRemote(remote, traceId, hop)));
27
+ const all = [local, ...parts].filter((t) => !!t && Array.isArray(t.spans));
28
+ if (all.length === 0)
29
+ return undefined;
30
+ return mergeTraces(traceId, all);
31
+ };
32
+ }
33
+ //# sourceMappingURL=federation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"federation.js","sourceRoot":"","sources":["../src/federation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAC3D,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAAE,UAAU,EAAE,mBAAmB,EAAE,WAAW,EAAc,MAAM,sBAAsB,CAAC;AAGhG,MAAM,UAAU,GAAG,IAAI,CAAC;AAExB,oFAAoF;AACpF,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,MAAc,EAAE,OAAe,EAAE,GAAW;IAC5E,IAAI,CAAC;QACH,wFAAwF;QACxF,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,eAAe,CAAC,YAAY,CAAC,EAAE,GAAG,EAAE,CACjE,KAAK,CAAC,GAAG,MAAM,eAAe,OAAO,gBAAgB,EAAE;YACrD,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC,GAAG,GAAG,CAAC,CAAC,EAAE,MAAM,EAAE,kBAAkB,EAAE;YACtE,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,UAAU,CAAC;SACxC,CAAC,CACH,CAAC;QACF,OAAO,GAAG,CAAC,EAAE,CAAC,CAAC,CAAE,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAW,CAAC,CAAC,CAAC,SAAS,CAAC;IAC5D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED,4FAA4F;AAC5F,MAAM,UAAU,cAAc,CAAC,KAAiB,EAAE,aAAkC;IAClF,OAAO,KAAK,UAAU,QAAQ,CAAC,OAAe,EAAE,QAAQ,GAAG,IAAI,EAAE,GAAG,GAAG,CAAC;QACtE,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACjC,IAAI,CAAC,QAAQ,IAAI,GAAG,GAAG,CAAC,GAAG,mBAAmB;YAAE,OAAO,KAAK,CAAC;QAC7D,MAAM,OAAO,GAAG,CAAC,KAAK,EAAE,OAAO,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAC5E,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,WAAW,CAAC,MAAM,EAAE,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC;QAC5F,MAAM,GAAG,GAAG,CAAC,KAAK,EAAE,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAc,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;QACvF,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,SAAS,CAAC;QACvC,OAAO,WAAW,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;IACnC,CAAC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,6 @@
1
+ import type { WizeLens } from "../types.js";
2
+ type Done = (err?: Error) => void;
3
+ /** A Fastify plugin: `await app.register(wizelensFastify(wizelens))`. Register it before your routes. */
4
+ export declare function wizelensFastify(wizelens: WizeLens): (app: unknown, _opts: unknown, done: Done) => void;
5
+ export {};
6
+ //# sourceMappingURL=fastify.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fastify.d.ts","sourceRoot":"","sources":["../../src/frameworks/fastify.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAY5C,KAAK,IAAI,GAAG,CAAC,GAAG,CAAC,EAAE,KAAK,KAAK,IAAI,CAAC;AAmDlC,yGAAyG;AACzG,wBAAgB,eAAe,CAAC,QAAQ,EAAE,QAAQ,SAC3B,OAAO,SAAS,OAAO,QAAQ,IAAI,KAAG,IAAI,CAahE"}
@@ -0,0 +1,60 @@
1
+ import { context } from "@opentelemetry/api";
2
+ import { captureOf } from "../adapters/registry.js";
3
+ import { captureRequest, isOwnPath, isPreflight, pathOf, serveOwnPath } from "../request-capture.js";
4
+ import { instrumentPino } from "../logs/pino.js";
5
+ import { markRouted } from "../route-timing.js";
6
+ import { recordOn } from "../spans.js";
7
+ const requests = new WeakMap();
8
+ function addHooks(app, d) {
9
+ app.addHook("onRequest", (request, reply, done) => {
10
+ const rawUrl = request.raw.url ?? "/";
11
+ if (isOwnPath(d, pathOf(rawUrl)) || isPreflight(request.raw))
12
+ return done();
13
+ const captured = captureRequest(d, request.raw, reply.raw, rawUrl, () => request.routeOptions?.url);
14
+ requests.set(request.raw, captured);
15
+ context.with(captured.ctx, () => done());
16
+ });
17
+ app.addHook("preHandler", (request, _reply, done) => {
18
+ const captured = requests.get(request.raw);
19
+ if (captured)
20
+ markRouted(captured.span, captured.startedAt);
21
+ done();
22
+ });
23
+ app.addHook("onError", (request, _reply, error, done) => {
24
+ const captured = requests.get(request.raw);
25
+ if (captured)
26
+ recordOn(captured.span, error);
27
+ done();
28
+ });
29
+ }
30
+ /** The dashboard and API routes, in their own scope so the raw body stays unread for the WizeLens handler. */
31
+ function addOwnRoutes(app, d) {
32
+ app.register((child, _opts, done) => {
33
+ child.removeAllContentTypeParsers();
34
+ child.addContentTypeParser("*", (_request, _payload, next) => next(null, undefined));
35
+ const serve = (request, reply) => {
36
+ reply.hijack();
37
+ void serveOwnPath(d, request.raw, reply.raw);
38
+ };
39
+ child.all(d.basePath, serve);
40
+ child.all(`${d.basePath}/*`, serve);
41
+ done();
42
+ });
43
+ }
44
+ /** A Fastify plugin: `await app.register(wizelensFastify(wizelens))`. Register it before your routes. */
45
+ export function wizelensFastify(wizelens) {
46
+ const plugin = (app, _opts, done) => {
47
+ const d = captureOf(wizelens);
48
+ if (d) {
49
+ addHooks(app, d);
50
+ addOwnRoutes(app, d);
51
+ // Fastify logs with pino: `request.log` and `app.log` lines go into the trace.
52
+ instrumentPino(wizelens, app.log);
53
+ }
54
+ done();
55
+ };
56
+ // Not encapsulated: the hooks see every route of the app.
57
+ Object.assign(plugin, { [Symbol.for("skip-override")]: true, [Symbol.for("fastify.display-name")]: "wizelens" });
58
+ return plugin;
59
+ }
60
+ //# sourceMappingURL=fastify.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fastify.js","sourceRoot":"","sources":["../../src/frameworks/fastify.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import type { WizeLens } from "../types.js";
2
+ type HonoNext = () => Promise<void>;
3
+ /** Hono middleware for @hono/node-server: `app.use(wizelensHono(wizelens))`. Use it first. */
4
+ export declare function wizelensHono(wizelens: WizeLens): (context_: unknown, next: HonoNext) => Promise<Response | void>;
5
+ export {};
6
+ //# sourceMappingURL=hono.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hono.d.ts","sourceRoot":"","sources":["../../src/frameworks/hono.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAS5C,KAAK,QAAQ,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;AAWpC,8FAA8F;AAC9F,wBAAgB,YAAY,CAAC,QAAQ,EAAE,QAAQ,cACU,OAAO,QAAQ,QAAQ,KAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CAgB1G"}
@@ -0,0 +1,34 @@
1
+ import { context } from "@opentelemetry/api";
2
+ import { captureOf } from "../adapters/registry.js";
3
+ import { captureRequest, isOwnPath, isPreflight, pathOf, serveOwnPath } from "../request-capture.js";
4
+ import { recordOn } from "../spans.js";
5
+ /** Tells @hono/node-server that the response was already written to the Node response. */
6
+ const alreadySent = () => new Response(null, { headers: { "x-hono-already-sent": "true" } });
7
+ /** The route of the handler that answered: the last matched route that is not middleware. */
8
+ function honoRoute(c) {
9
+ const routes = c.req.matchedRoutes ?? [];
10
+ return routes.filter((r) => r.method !== "ALL").pop()?.path;
11
+ }
12
+ /** Hono middleware for @hono/node-server: `app.use(wizelensHono(wizelens))`. Use it first. */
13
+ export function wizelensHono(wizelens) {
14
+ return async function wizelensHonoMiddleware(context_, next) {
15
+ const c = context_;
16
+ const d = captureOf(wizelens);
17
+ const incoming = c.env?.incoming;
18
+ const outgoing = c.env?.outgoing;
19
+ if (!d || !incoming || !outgoing)
20
+ return next();
21
+ const rawUrl = incoming.url ?? "/";
22
+ if (isOwnPath(d, pathOf(rawUrl))) {
23
+ await serveOwnPath(d, incoming, outgoing);
24
+ return alreadySent();
25
+ }
26
+ if (isPreflight(incoming))
27
+ return next();
28
+ const { span, ctx } = captureRequest(d, incoming, outgoing, rawUrl, () => honoRoute(c));
29
+ await context.with(ctx, next);
30
+ if (c.error)
31
+ recordOn(span, c.error);
32
+ };
33
+ }
34
+ //# sourceMappingURL=hono.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hono.js","sourceRoot":"","sources":["../../src/frameworks/hono.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAC7C,OAAO,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACrG,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAYvC,0FAA0F;AAC1F,MAAM,WAAW,GAAG,GAAG,EAAE,CAAC,IAAI,QAAQ,CAAC,IAAI,EAAE,EAAE,OAAO,EAAE,EAAE,qBAAqB,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC;AAE7F,6FAA6F;AAC7F,SAAS,SAAS,CAAC,CAAkB;IACnC,MAAM,MAAM,GAAG,CAAC,CAAC,GAAG,CAAC,aAAa,IAAI,EAAE,CAAC;IACzC,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE,IAAI,CAAC;AAC9D,CAAC;AAED,8FAA8F;AAC9F,MAAM,UAAU,YAAY,CAAC,QAAkB;IAC7C,OAAO,KAAK,UAAU,sBAAsB,CAAC,QAAiB,EAAE,IAAc;QAC5E,MAAM,CAAC,GAAG,QAA2B,CAAC;QACtC,MAAM,CAAC,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;QAC9B,MAAM,QAAQ,GAAG,CAAC,CAAC,GAAG,EAAE,QAAQ,CAAC;QACjC,MAAM,QAAQ,GAAG,CAAC,CAAC,GAAG,EAAE,QAAQ,CAAC;QACjC,IAAI,CAAC,CAAC,IAAI,CAAC,QAAQ,IAAI,CAAC,QAAQ;YAAE,OAAO,IAAI,EAAE,CAAC;QAChD,MAAM,MAAM,GAAG,QAAQ,CAAC,GAAG,IAAI,GAAG,CAAC;QACnC,IAAI,SAAS,CAAC,CAAC,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC;YACjC,MAAM,YAAY,CAAC,CAAC,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;YAC1C,OAAO,WAAW,EAAE,CAAC;QACvB,CAAC;QACD,IAAI,WAAW,CAAC,QAAQ,CAAC;YAAE,OAAO,IAAI,EAAE,CAAC;QACzC,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,cAAc,CAAC,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;QACxF,MAAM,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QAC9B,IAAI,CAAC,CAAC,KAAK;YAAE,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC;IACvC,CAAC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,13 @@
1
+ import type { IncomingMessage, ServerResponse } from "node:http";
2
+ import type { WizeLens } from "../types.js";
3
+ interface KoaContextLike {
4
+ req: IncomingMessage;
5
+ res: ServerResponse;
6
+ respond?: boolean;
7
+ _matchedRoute?: unknown;
8
+ }
9
+ type KoaNext = () => Promise<unknown>;
10
+ /** Koa middleware: `app.use(wizelensKoa(wizelens))`. Use it first. Reads the route from @koa/router. */
11
+ export declare function wizelensKoa(wizelens: WizeLens): (ctx: KoaContextLike, next: KoaNext) => Promise<void>;
12
+ export {};
13
+ //# sourceMappingURL=koa.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"koa.d.ts","sourceRoot":"","sources":["../../src/frameworks/koa.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAOjE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAG5C,UAAU,cAAc;IACtB,GAAG,EAAE,eAAe,CAAC;IACrB,GAAG,EAAE,cAAc,CAAC;IACpB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AAED,KAAK,OAAO,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC;AAYtC,wGAAwG;AACxG,wBAAgB,WAAW,CAAC,QAAQ,EAAE,QAAQ,SACK,cAAc,QAAQ,OAAO,KAAG,OAAO,CAAC,IAAI,CAAC,CAoB/F"}
@@ -0,0 +1,42 @@
1
+ import { context } from "@opentelemetry/api";
2
+ import { HEADER_ENDPOINT, HEADER_TRACE } from "@wizeworks/lens-core";
3
+ import { captureOf } from "../adapters/registry.js";
4
+ import { captureRequest, isOwnPath, isPreflight, pathOf, serveOwnPath } from "../request-capture.js";
5
+ import { watchRoute } from "../route-timing.js";
6
+ import { recordOn } from "../spans.js";
7
+ const KEEP = [HEADER_TRACE, HEADER_ENDPOINT, "Access-Control-Expose-Headers"];
8
+ /** Koa's error handler removes all headers, then sets `err.headers`. Keep the WizeLens headers so the browser can link the failure. */
9
+ function keepHeaders(err, res) {
10
+ if (!err || typeof err !== "object")
11
+ return;
12
+ const e = err;
13
+ const kept = Object.fromEntries(KEEP.map((h) => [h, res.getHeader(h)]).filter(([, v]) => v !== undefined));
14
+ e.headers = { ...e.headers, ...kept };
15
+ }
16
+ /** Koa middleware: `app.use(wizelensKoa(wizelens))`. Use it first. Reads the route from @koa/router. */
17
+ export function wizelensKoa(wizelens) {
18
+ return async function wizelensKoaMiddleware(ctx, next) {
19
+ const d = captureOf(wizelens);
20
+ if (!d)
21
+ return void (await next());
22
+ const rawUrl = ctx.req.url ?? "/";
23
+ if (isOwnPath(d, pathOf(rawUrl))) {
24
+ ctx.respond = false;
25
+ return serveOwnPath(d, ctx.req, ctx.res);
26
+ }
27
+ if (isPreflight(ctx.req))
28
+ return void (await next());
29
+ const route = () => (typeof ctx._matchedRoute === "string" ? ctx._matchedRoute : undefined);
30
+ const { span, ctx: otelCtx, startedAt } = captureRequest(d, ctx.req, ctx.res, rawUrl, route);
31
+ watchRoute(ctx, "_matchedRoute", span, startedAt);
32
+ try {
33
+ await context.with(otelCtx, next);
34
+ }
35
+ catch (err) {
36
+ recordOn(span, err);
37
+ keepHeaders(err, ctx.res);
38
+ throw err;
39
+ }
40
+ };
41
+ }
42
+ //# sourceMappingURL=koa.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"koa.js","sourceRoot":"","sources":["../../src/frameworks/koa.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAC7C,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACrE,OAAO,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACrG,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAavC,MAAM,IAAI,GAAG,CAAC,YAAY,EAAE,eAAe,EAAE,+BAA+B,CAAC,CAAC;AAE9E,uIAAuI;AACvI,SAAS,WAAW,CAAC,GAAY,EAAE,GAAmB;IACpD,IAAI,CAAC,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ;QAAE,OAAO;IAC5C,MAAM,CAAC,GAAG,GAA4C,CAAC;IACvD,MAAM,IAAI,GAAG,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC;IAC3G,CAAC,CAAC,OAAO,GAAG,EAAE,GAAG,CAAC,CAAC,OAAO,EAAE,GAAG,IAAI,EAAE,CAAC;AACxC,CAAC;AAED,wGAAwG;AACxG,MAAM,UAAU,WAAW,CAAC,QAAkB;IAC5C,OAAO,KAAK,UAAU,qBAAqB,CAAC,GAAmB,EAAE,IAAa;QAC5E,MAAM,CAAC,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;QAC9B,IAAI,CAAC,CAAC;YAAE,OAAO,KAAK,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC;QACnC,MAAM,MAAM,GAAG,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC;QAClC,IAAI,SAAS,CAAC,CAAC,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC;YACjC,GAAG,CAAC,OAAO,GAAG,KAAK,CAAC;YACpB,OAAO,YAAY,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC;QAC3C,CAAC;QACD,IAAI,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC;YAAE,OAAO,KAAK,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC;QACrD,MAAM,KAAK,GAAG,GAAG,EAAE,CAAC,CAAC,OAAO,GAAG,CAAC,aAAa,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;QAC5F,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,OAAO,EAAE,SAAS,EAAE,GAAG,cAAc,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;QAC7F,UAAU,CAAC,GAAG,EAAE,eAAe,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC;QAClD,IAAI,CAAC;YACH,MAAM,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QACpC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,QAAQ,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;YACpB,WAAW,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC;YAC1B,MAAM,GAAG,CAAC;QACZ,CAAC;IACH,CAAC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,25 @@
1
+ import type { WizeLens, WizeLensOptions } from "../types.js";
2
+ import { type IgnorePath } from "./node-server.js";
3
+ export interface WizeLensNextOptions extends WizeLensOptions {
4
+ /** Paths that are not traced. Default `nextIgnore`: build files, dev overlay, and hot reload. */
5
+ ignore?: IgnorePath;
6
+ }
7
+ /** Next.js build files, dev overlay, and hot reload: many per page, and never app code. */
8
+ export declare const nextIgnore: IgnorePath;
9
+ /** Start WizeLens in a Next.js server. Call it from `register()` in instrumentation.ts, in the Node.js runtime only. */
10
+ export declare function registerWizeLens(options: WizeLensNextOptions): WizeLens;
11
+ /** The instance `registerWizeLens` started in this process, if any. */
12
+ export declare const nextWizeLens: () => WizeLens | undefined;
13
+ /** What Next.js passes to `onRequestError`. Only the fields WizeLens reads. */
14
+ export interface NextRequestInfo {
15
+ path: string;
16
+ method: string;
17
+ }
18
+ export interface NextErrorContext {
19
+ routerKind: string;
20
+ routePath: string;
21
+ routeType: string;
22
+ }
23
+ /** Next.js `onRequestError` hook: puts a server error on the request span and in the logs. Re-export it from instrumentation.ts. */
24
+ export declare function onRequestError(err: unknown, request: NextRequestInfo, ctx: NextErrorContext): void;
25
+ //# sourceMappingURL=next.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"next.d.ts","sourceRoot":"","sources":["../../src/frameworks/next.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAE7D,OAAO,EAAE,KAAK,UAAU,EAAgB,MAAM,kBAAkB,CAAC;AAEjE,MAAM,WAAW,mBAAoB,SAAQ,eAAe;IAC1D,iGAAiG;IACjG,MAAM,CAAC,EAAE,UAAU,CAAC;CACrB;AAED,2FAA2F;AAC3F,eAAO,MAAM,UAAU,EAAE,UAC8G,CAAC;AAKxI,wHAAwH;AACxH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,mBAAmB,GAAG,QAAQ,CAgBvE;AAED,uEAAuE;AACvE,eAAO,MAAM,YAAY,QAAO,QAAQ,GAAG,SAA6C,CAAC;AAEzF,+EAA+E;AAC/E,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;CAChB;AACD,MAAM,WAAW,gBAAgB;IAC/B,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAUD,oIAAoI;AACpI,wBAAgB,cAAc,CAAC,GAAG,EAAE,OAAO,EAAE,OAAO,EAAE,eAAe,EAAE,GAAG,EAAE,gBAAgB,GAAG,IAAI,CAOlG"}
@@ -0,0 +1,49 @@
1
+ import { trace } from "@opentelemetry/api";
2
+ import { captureOf, providerOf } from "../adapters/registry.js";
3
+ import { preciseProvider } from "../precise.js";
4
+ import { currentServerSpan, recordOn } from "../spans.js";
5
+ import { createWizeLens } from "../wizelens.js";
6
+ import { traceServers } from "./node-server.js";
7
+ /** Next.js build files, dev overlay, and hot reload: many per page, and never app code. */
8
+ export const nextIgnore = (path) => path.startsWith("/_next/static/") || path.startsWith("/_next/webpack-hmr") || path.startsWith("/__nextjs") || path === "/favicon.ico";
9
+ const INSTANCE = Symbol.for("wizeworks.wizelens.next");
10
+ /** Start WizeLens in a Next.js server. Call it from `register()` in instrumentation.ts, in the Node.js runtime only. */
11
+ export function registerWizeLens(options) {
12
+ const g = globalThis;
13
+ // Next.js can load instrumentation more than once. Keep one instance per process.
14
+ const existing = g[INSTANCE];
15
+ if (existing)
16
+ return existing;
17
+ const wizelens = createWizeLens(options);
18
+ g[INSTANCE] = wizelens;
19
+ const capture = captureOf(wizelens);
20
+ const provider = providerOf(wizelens);
21
+ if (!capture || !provider)
22
+ return wizelens;
23
+ // Next.js makes its render, route handler, and fetch spans with the global tracer.
24
+ if (!trace.setGlobalTracerProvider(preciseProvider(provider))) {
25
+ console.warn("[wizelens] Another OpenTelemetry SDK is registered, so Next.js spans go there. WizeLens still traces each request.");
26
+ }
27
+ traceServers(capture, options.ignore ?? nextIgnore);
28
+ return wizelens;
29
+ }
30
+ /** The instance `registerWizeLens` started in this process, if any. */
31
+ export const nextWizeLens = () => globalThis[INSTANCE];
32
+ const messageOf = (err) => (err instanceof Error ? err.message : String(err));
33
+ /** True when a span of this trace already holds this error. Next.js records some errors on its own spans. */
34
+ function alreadyRecorded(wizelens, traceId, message) {
35
+ const spans = wizelens.store.get(traceId)?.spans ?? [];
36
+ return spans.some((s) => s.events.some((e) => e.name === "exception" && e.attributes["exception.message"] === message));
37
+ }
38
+ /** Next.js `onRequestError` hook: puts a server error on the request span and in the logs. Re-export it from instrumentation.ts. */
39
+ export function onRequestError(err, request, ctx) {
40
+ const wizelens = nextWizeLens();
41
+ if (!wizelens?.enabled)
42
+ return;
43
+ const message = messageOf(err);
44
+ const span = currentServerSpan();
45
+ if (span && !alreadyRecorded(wizelens, span.spanContext().traceId, message))
46
+ recordOn(span, err);
47
+ wizelens.logger.error(message, { "next.route": ctx.routePath, "next.route_type": ctx.routeType, "url.path": request.path });
48
+ }
49
+ //# sourceMappingURL=next.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"next.js","sourceRoot":"","sources":["../../src/frameworks/next.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import { type CaptureDeps } from "../request-capture.js";
2
+ /** True for a path that is not traced, for example a static file. */
3
+ export type IgnorePath = (path: string) => boolean;
4
+ /** Trace each request of every node:http and node:https server in this process. For frameworks with no middleware hook, such as Next.js. */
5
+ export declare function traceServers(d: CaptureDeps, ignore: IgnorePath): void;
6
+ //# sourceMappingURL=node-server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"node-server.d.ts","sourceRoot":"","sources":["../../src/frameworks/node-server.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,WAAW,EAA6E,MAAM,uBAAuB,CAAC;AAEpI,qEAAqE;AACrE,MAAM,MAAM,UAAU,GAAG,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC;AAqBnD,4IAA4I;AAC5I,wBAAgB,YAAY,CAAC,CAAC,EAAE,WAAW,EAAE,MAAM,EAAE,UAAU,GAAG,IAAI,CAcrE"}
@@ -0,0 +1,35 @@
1
+ import { Server as HttpServer } from "node:http";
2
+ import { Server as HttpsServer } from "node:https";
3
+ import { context } from "@opentelemetry/api";
4
+ import { patchMethod } from "../adapters/registry.js";
5
+ import { captureRequest, isOwnPath, isPreflight, pathOf, requestSpan, serveOwnPath } from "../request-capture.js";
6
+ /** A string attribute of a live SDK span. The OTel API has no getter, so this reads the SDK field. */
7
+ function attributeOf(span, key) {
8
+ const value = span.attributes?.[key];
9
+ return typeof value === "string" ? value : undefined;
10
+ }
11
+ function onRequest(d, ignore, req, res, emit) {
12
+ const rawUrl = req.url ?? "/";
13
+ const path = pathOf(rawUrl);
14
+ if (isOwnPath(d, path)) {
15
+ void serveOwnPath(d, req, res);
16
+ return true;
17
+ }
18
+ if (isPreflight(req) || ignore(path) || requestSpan(req))
19
+ return emit();
20
+ // The framework names the route on this span: Next.js sets http.route on the span around its own.
21
+ const captured = captureRequest(d, req, res, rawUrl, () => attributeOf(captured.span, "http.route"));
22
+ return context.with(captured.ctx, emit);
23
+ }
24
+ /** Trace each request of every node:http and node:https server in this process. For frameworks with no middleware hook, such as Next.js. */
25
+ export function traceServers(d, ignore) {
26
+ for (const proto of [HttpServer.prototype, HttpsServer.prototype]) {
27
+ patchMethod(proto, "emit", (emit) => function wizelensEmit(...args) {
28
+ const [event, req, res] = args;
29
+ if (event !== "request")
30
+ return emit.apply(this, args);
31
+ return onRequest(d, ignore, req, res, () => emit.apply(this, args));
32
+ }, "server-emit");
33
+ }
34
+ }
35
+ //# sourceMappingURL=node-server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"node-server.js","sourceRoot":"","sources":["../../src/frameworks/node-server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAwB,MAAM,IAAI,UAAU,EAAuB,MAAM,WAAW,CAAC;AAC5F,OAAO,EAAE,MAAM,IAAI,WAAW,EAAE,MAAM,YAAY,CAAC;AACnD,OAAO,EAAE,OAAO,EAAyB,MAAM,oBAAoB,CAAC;AACpE,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,EAAoB,cAAc,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAKpI,sGAAsG;AACtG,SAAS,WAAW,CAAC,IAAc,EAAE,GAAW;IAC9C,MAAM,KAAK,GAAI,IAA4D,CAAC,UAAU,EAAE,CAAC,GAAG,CAAC,CAAC;IAC9F,OAAO,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;AACvD,CAAC;AAED,SAAS,SAAS,CAAC,CAAc,EAAE,MAAkB,EAAE,GAAoB,EAAE,GAAmB,EAAE,IAAmB;IACnH,MAAM,MAAM,GAAG,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC;IAC9B,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;IAC5B,IAAI,SAAS,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,CAAC;QACvB,KAAK,YAAY,CAAC,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;QAC/B,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,WAAW,CAAC,GAAG,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,WAAW,CAAC,GAAG,CAAC;QAAE,OAAO,IAAI,EAAE,CAAC;IACxE,kGAAkG;IAClG,MAAM,QAAQ,GAAG,cAAc,CAAC,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,WAAW,CAAC,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC,CAAC;IACrG,OAAO,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;AAC1C,CAAC;AAED,4IAA4I;AAC5I,MAAM,UAAU,YAAY,CAAC,CAAc,EAAE,MAAkB;IAC7D,KAAK,MAAM,KAAK,IAAI,CAAC,UAAU,CAAC,SAAS,EAAE,WAAW,CAAC,SAAS,CAAC,EAAE,CAAC;QAClE,WAAW,CACT,KAAK,EACL,MAAM,EACN,CAAC,IAAI,EAAE,EAAE,CACP,SAAS,YAAY,CAAgB,GAAG,IAAe;YACrD,MAAM,CAAC,KAAK,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,IAAI,CAAC;YAC/B,IAAI,KAAK,KAAK,SAAS;gBAAE,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;YACvD,OAAO,SAAS,CAAC,CAAC,EAAE,MAAM,EAAE,GAAsB,EAAE,GAAqB,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAY,CAAC,CAAC;QACtH,CAAC,EACH,aAAa,CACd,CAAC;IACJ,CAAC;AACH,CAAC"}
@@ -0,0 +1,6 @@
1
+ import { type Tracer } from "@opentelemetry/api";
2
+ /** Called with the trace id and the endpoint a called service reported in its trailers. */
3
+ export type OnRemote = (traceId: string, endpoint: string) => void;
4
+ /** Trace outgoing gRPC calls made inside a request: a client span, traceparent in the metadata, and the final status. */
5
+ export declare function patchGrpcChannel(proto: object, tracer: Tracer, onRemote: OnRemote): void;
6
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/grpc/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiE,KAAK,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAgBhH,2FAA2F;AAC3F,MAAM,MAAM,QAAQ,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;AA4CnE,yHAAyH;AACzH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,GAAG,IAAI,CAYxF"}
@@ -0,0 +1,52 @@
1
+ import { context, SpanKind, trace } from "@opentelemetry/api";
2
+ import { patchMethod } from "../adapters/registry.js";
3
+ import { ENDPOINT_KEY, endWithStatus, hostAndPort, metadataSetter, rpcAttributes, spanNameOf, w3c } from "./shared.js";
4
+ function startClientSpan(tracer, target, path) {
5
+ const attributes = rpcAttributes(path, "http.client");
6
+ if (target) {
7
+ const { host, port } = hostAndPort(target);
8
+ attributes["server.address"] = host;
9
+ if (port)
10
+ attributes["server.port"] = port;
11
+ }
12
+ return tracer.startSpan(spanNameOf(path), { kind: SpanKind.CLIENT, attributes });
13
+ }
14
+ /** Put traceparent into the metadata, and end the span when the status arrives. */
15
+ function traceStart(call, span, ctx, onRemote) {
16
+ const start = call.start.bind(call);
17
+ call.start = (metadata, listener) => {
18
+ w3c.inject(ctx, metadata, metadataSetter);
19
+ const wrapped = Object.create(listener);
20
+ const learn = (md) => {
21
+ const endpoint = md?.get(ENDPOINT_KEY)[0];
22
+ if (typeof endpoint === "string" && endpoint)
23
+ onRemote(span.spanContext().traceId, endpoint);
24
+ };
25
+ wrapped.onReceiveMetadata = (md) => {
26
+ learn(md);
27
+ listener.onReceiveMetadata?.(md);
28
+ };
29
+ wrapped.onReceiveStatus = (status) => {
30
+ learn(status.metadata);
31
+ endWithStatus(span, status.code, status.details);
32
+ listener.onReceiveStatus?.(status);
33
+ };
34
+ start(metadata, wrapped);
35
+ };
36
+ }
37
+ /** Trace outgoing gRPC calls made inside a request: a client span, traceparent in the metadata, and the final status. */
38
+ export function patchGrpcChannel(proto, tracer, onRemote) {
39
+ patchMethod(proto, "createCall", (original) => function (...args) {
40
+ if (!trace.getSpan(context.active()))
41
+ return original.apply(this, args);
42
+ const span = startClientSpan(tracer, this.getTarget?.(), String(args[0]));
43
+ const ctx = trace.setSpan(context.active(), span);
44
+ const call = context.with(ctx, () => original.apply(this, args));
45
+ if (call && typeof call.start === "function")
46
+ traceStart(call, span, ctx, onRemote);
47
+ else
48
+ span.end();
49
+ return call;
50
+ });
51
+ }
52
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/grpc/client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { WizeLens } from "../types.js";
2
+ /** Trace @grpc/grpc-js calls in and out: `instrumentGrpc(wizelens, grpc)`. Call it before `server.addService`. Returns false when nothing was patched. */
3
+ export declare function instrumentGrpc(wizelens: WizeLens, grpc: unknown): boolean;
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/grpc/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAK5C,0JAA0J;AAC1J,wBAAgB,cAAc,CAAC,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,GAAG,OAAO,CASzE"}
@@ -0,0 +1,16 @@
1
+ import { captureOf } from "../adapters/registry.js";
2
+ import { patchGrpcChannel } from "./client.js";
3
+ import { patchGrpcServer } from "./server.js";
4
+ /** Trace @grpc/grpc-js calls in and out: `instrumentGrpc(wizelens, grpc)`. Call it before `server.addService`. Returns false when nothing was patched. */
5
+ export function instrumentGrpc(wizelens, grpc) {
6
+ const g = grpc;
7
+ const deps = captureOf(wizelens);
8
+ if (!deps || !g?.Channel?.prototype || !g.Server?.prototype)
9
+ return false;
10
+ const onRemote = (traceId, endpoint) => !deps.selfEndpoints.has(endpoint) && wizelens.store.addRemote(traceId, endpoint);
11
+ patchGrpcChannel(g.Channel.prototype, wizelens.tracer, onRemote);
12
+ const endpoint = () => deps.publicEndpoint ?? deps.selfEndpoints.values().next().value;
13
+ patchGrpcServer(g.Server.prototype, wizelens.tracer, { endpoint, Metadata: g.Metadata });
14
+ return true;
15
+ }
16
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/grpc/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AAEpD,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAG9C,0JAA0J;AAC1J,MAAM,UAAU,cAAc,CAAC,QAAkB,EAAE,IAAa;IAC9D,MAAM,CAAC,GAAG,IAA6B,CAAC;IACxC,MAAM,IAAI,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;IACjC,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC,EAAE,OAAO,EAAE,SAAS,IAAI,CAAC,CAAC,CAAC,MAAM,EAAE,SAAS;QAAE,OAAO,KAAK,CAAC;IAC1E,MAAM,QAAQ,GAAG,CAAC,OAAe,EAAE,QAAgB,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,QAAQ,CAAC,KAAK,CAAC,SAAS,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;IACzI,gBAAgB,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,EAAE,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IACjE,MAAM,QAAQ,GAAG,GAAG,EAAE,CAAC,IAAI,CAAC,cAAc,IAAI,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC;IACvF,eAAe,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS,EAAE,QAAQ,CAAC,MAAM,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;IACzF,OAAO,IAAI,CAAC;AACd,CAAC"}
@@ -0,0 +1,10 @@
1
+ import { type Tracer } from "@opentelemetry/api";
2
+ import { type MetadataLike } from "./shared.js";
3
+ /** Where to say this service's WizeLens lives, and how to make trailer metadata. */
4
+ export interface ServerDiscovery {
5
+ endpoint: () => string | undefined;
6
+ Metadata: (new () => MetadataLike) | undefined;
7
+ }
8
+ /** Trace incoming gRPC calls: a server span per call that continues the caller's trace from the metadata. */
9
+ export declare function patchGrpcServer(proto: object, tracer: Tracer, d: ServerDiscovery): void;
10
+ //# sourceMappingURL=server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/grpc/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgG,KAAK,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAG/I,OAAO,EAA4C,KAAK,YAAY,EAAkD,MAAM,aAAa,CAAC;AAc1I,oFAAoF;AACpF,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,MAAM,MAAM,GAAG,SAAS,CAAC;IACnC,QAAQ,EAAE,CAAC,UAAU,YAAY,CAAC,GAAG,SAAS,CAAC;CAChD;AAgFD,6GAA6G;AAC7G,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,EAAE,eAAe,GAAG,IAAI,CAQvF"}