@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,62 @@
1
+ import { toAttributeValue } from "@wizeworks/lens-core";
2
+ import { metricsOf } from "../adapters/registry.js";
3
+ import { exponentialToExplicit } from "./exponential.js";
4
+ // sdk-metrics enums: DataPointType and AggregationTemporality.
5
+ const HISTOGRAM = 0;
6
+ const EXPONENTIAL = 1;
7
+ const SUM = 3;
8
+ const DELTA = 0;
9
+ const toMs = (t) => (t ? t[0] * 1000 + t[1] / 1e6 : undefined);
10
+ function attributesOf(raw) {
11
+ const out = {};
12
+ for (const [k, v] of Object.entries(raw ?? {}))
13
+ out[k] = toAttributeValue(v);
14
+ return out;
15
+ }
16
+ function histogramOf(type, v) {
17
+ const explicit = type === EXPONENTIAL ? exponentialToExplicit(v) : { bounds: [...(v.buckets?.boundaries ?? [])], counts: [...(v.buckets?.counts ?? [])] };
18
+ return { count: Number(v.count ?? 0), sum: Number(v.sum ?? 0), min: v.min ?? null, max: v.max ?? null, ...explicit };
19
+ }
20
+ function pointOf(m, d) {
21
+ const type = m.dataPointType ?? 2;
22
+ const histogram = type === HISTOGRAM || type === EXPONENTIAL;
23
+ const timeMs = toMs(d.endTime);
24
+ if (timeMs === undefined || (!histogram && typeof d.value !== "number"))
25
+ return null;
26
+ const p = { name: m.descriptor?.name ?? "", kind: histogram ? "histogram" : type === SUM ? "sum" : "gauge", unit: m.descriptor?.unit ?? "", service: "", attributes: attributesOf(d.attributes), timeMs };
27
+ if (m.descriptor?.description)
28
+ p.description = m.descriptor.description;
29
+ if (p.kind === "sum")
30
+ p.monotonic = !!m.isMonotonic;
31
+ if (p.kind !== "gauge")
32
+ p.temporality = m.aggregationTemporality === DELTA ? "delta" : "cumulative";
33
+ const startMs = toMs(d.startTime);
34
+ if (startMs !== undefined)
35
+ p.startMs = startMs;
36
+ if (histogram)
37
+ p.histogram = histogramOf(type, d.value);
38
+ else
39
+ p.value = d.value;
40
+ return p.name ? p : null;
41
+ }
42
+ /** OpenTelemetry SDK metrics as WizeLens points. */
43
+ export function pointsFromSdk(rm) {
44
+ return (rm.scopeMetrics ?? []).flatMap((sm) => (sm.metrics ?? []).flatMap((m) => (m.dataPoints ?? []).flatMap((d) => pointOf(m, d) ?? [])));
45
+ }
46
+ /** An OpenTelemetry exporter for app metrics: `new PeriodicExportingMetricReader({ exporter: wizelensMetricExporter(wizelens) })`. */
47
+ export function wizelensMetricExporter(wizelens) {
48
+ return {
49
+ export(metrics, resultCallback) {
50
+ try {
51
+ metricsOf(wizelens)?.add(pointsFromSdk(metrics));
52
+ resultCallback({ code: 0 });
53
+ }
54
+ catch (err) {
55
+ resultCallback({ code: 1, error: err instanceof Error ? err : new Error(String(err)) });
56
+ }
57
+ },
58
+ forceFlush: async () => { },
59
+ shutdown: async () => { },
60
+ };
61
+ }
62
+ //# sourceMappingURL=otel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"otel.js","sourceRoot":"","sources":["../../src/metrics/otel.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import type { MetricPoint } from "@wizeworks/lens-core";
2
+ export interface RuntimeCollectorOptions {
3
+ /** How often to sample. Default 10000 ms. */
4
+ intervalMs?: number;
5
+ add: (points: MetricPoint[]) => void;
6
+ now?: () => number;
7
+ }
8
+ /** Samples CPU, memory, heap, event loop, and GC every interval. Never traced, never keeps the process alive. */
9
+ export declare class RuntimeCollector {
10
+ #private;
11
+ constructor(options: RuntimeCollectorOptions);
12
+ start(): void;
13
+ /** One round of runtime points. Rates cover the time since the last round. */
14
+ sample(): MetricPoint[];
15
+ stop(): void;
16
+ }
17
+ //# sourceMappingURL=runtime.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../../src/metrics/runtime.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAc,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAGpE,MAAM,WAAW,uBAAuB;IACtC,6CAA6C;IAC7C,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,GAAG,EAAE,CAAC,MAAM,EAAE,WAAW,EAAE,KAAK,IAAI,CAAC;IACrC,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;CACpB;AA6BD,iHAAiH;AACjH,qBAAa,gBAAgB;;IAU3B,YAAY,OAAO,EAAE,uBAAuB,EAK3C;IAED,KAAK,IAAI,IAAI,CAUZ;IAED,8EAA8E;IAC9E,MAAM,IAAI,WAAW,EAAE,CAqBtB;IAcD,IAAI,IAAI,IAAI,CAKX;CACF"}
@@ -0,0 +1,100 @@
1
+ import { availableParallelism } from "node:os";
2
+ import { monitorEventLoopDelay, PerformanceObserver, performance } from "node:perf_hooks";
3
+ import { getHeapStatistics } from "node:v8";
4
+ import { context, ROOT_CONTEXT } from "@opentelemetry/api";
5
+ import { GcHistogram } from "./gc.js";
6
+ const gauge = (name, unit, value, timeMs, description, attributes = {}) => ({
7
+ name,
8
+ kind: "gauge",
9
+ unit,
10
+ description,
11
+ service: "",
12
+ attributes,
13
+ timeMs,
14
+ value,
15
+ });
16
+ const cpuTime = (mode, seconds, timeMs, startMs) => ({
17
+ name: "process.cpu.time",
18
+ kind: "sum",
19
+ unit: "s",
20
+ description: "Total CPU seconds by mode.",
21
+ service: "",
22
+ monotonic: true,
23
+ temporality: "cumulative",
24
+ attributes: { "cpu.mode": mode },
25
+ timeMs,
26
+ startMs,
27
+ value: seconds,
28
+ });
29
+ /** Samples CPU, memory, heap, event loop, and GC every interval. Never traced, never keeps the process alive. */
30
+ export class RuntimeCollector {
31
+ #o;
32
+ #now;
33
+ #gc = new GcHistogram();
34
+ #startMs;
35
+ #loop;
36
+ #observer;
37
+ #timer;
38
+ #last;
39
+ constructor(options) {
40
+ this.#o = options;
41
+ this.#now = options.now ?? Date.now;
42
+ this.#startMs = this.#now() - process.uptime() * 1000;
43
+ this.#last = { cpu: process.cpuUsage(), atMs: this.#now(), elu: performance.eventLoopUtilization() };
44
+ }
45
+ start() {
46
+ if (this.#timer)
47
+ return;
48
+ context.with(ROOT_CONTEXT, () => {
49
+ this.#loop = monitorEventLoopDelay({ resolution: 20 });
50
+ this.#loop.enable();
51
+ this.#observer = new PerformanceObserver((list) => list.getEntries().forEach((e) => this.#gc.record(e)));
52
+ this.#observer.observe({ entryTypes: ["gc"] });
53
+ this.#timer = setInterval(() => context.with(ROOT_CONTEXT, () => this.#o.add(this.sample())), this.#o.intervalMs ?? 10_000);
54
+ this.#timer.unref?.();
55
+ });
56
+ }
57
+ /** One round of runtime points. Rates cover the time since the last round. */
58
+ sample() {
59
+ const now = this.#now();
60
+ const cpu = process.cpuUsage();
61
+ const elu = performance.eventLoopUtilization();
62
+ const last = this.#last;
63
+ const wallS = Math.max(0.001, (now - last.atMs) / 1000);
64
+ const cpuS = (cpu.user - last.cpu.user + cpu.system - last.cpu.system) / 1e6;
65
+ const heap = getHeapStatistics();
66
+ const points = [
67
+ gauge("process.cpu.utilization", "1", cpuS / wallS / availableParallelism(), now, "CPU used by the process, as a share of all CPUs."),
68
+ cpuTime("user", cpu.user / 1e6, now, this.#startMs),
69
+ cpuTime("system", cpu.system / 1e6, now, this.#startMs),
70
+ gauge("process.memory.usage", "By", process.memoryUsage.rss(), now, "Resident memory of the process."),
71
+ gauge("v8js.memory.heap.used", "By", heap.used_heap_size, now, "V8 heap in use."),
72
+ gauge("v8js.memory.heap.limit", "By", heap.heap_size_limit, now, "V8 heap size limit."),
73
+ gauge("nodejs.eventloop.utilization", "1", performance.eventLoopUtilization(elu, last.elu).utilization, now, "Share of time the event loop was busy."),
74
+ ...this.#loopPoints(now),
75
+ ...this.#gc.drain(last.atMs, now),
76
+ ];
77
+ this.#last = { cpu, atMs: now, elu };
78
+ return points;
79
+ }
80
+ #loopPoints(now) {
81
+ const h = this.#loop;
82
+ if (!h || h.count === 0)
83
+ return [];
84
+ const points = [
85
+ gauge("nodejs.eventloop.delay.p50", "s", h.percentile(50) / 1e9, now, "Event loop delay, median."),
86
+ gauge("nodejs.eventloop.delay.p99", "s", h.percentile(99) / 1e9, now, "Event loop delay, 99th percentile."),
87
+ gauge("nodejs.eventloop.delay.max", "s", h.max / 1e9, now, "Event loop delay, longest."),
88
+ ];
89
+ h.reset();
90
+ return points;
91
+ }
92
+ stop() {
93
+ if (this.#timer)
94
+ clearInterval(this.#timer);
95
+ this.#timer = undefined;
96
+ this.#loop?.disable();
97
+ this.#observer?.disconnect();
98
+ }
99
+ }
100
+ //# sourceMappingURL=runtime.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime.js","sourceRoot":"","sources":["../../src/metrics/runtime.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import type { McpDataSource } from "../mcp-shared.js";
2
+ import type { WizeLensOptions } from "../types.js";
3
+ import { RuntimeCollector } from "./runtime.js";
4
+ import { MetricStore } from "./store.js";
5
+ export interface MetricParts {
6
+ store: MetricStore;
7
+ collector: RuntimeCollector;
8
+ }
9
+ /** The metric store and runtime collector, or null when `captureMetrics` is false. Call `start` on the collector. */
10
+ export declare function createMetricParts(o: WizeLensOptions, redactKeys: readonly string[]): MetricParts | null;
11
+ /** The MCP metric tools' view of the store. */
12
+ export declare function mcpMetrics(store: MetricStore | null): Pick<McpDataSource, "metrics" | "metricRanges">;
13
+ //# sourceMappingURL=setup.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../../src/metrics/setup.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAEzC,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,WAAW,CAAC;IACnB,SAAS,EAAE,gBAAgB,CAAC;CAC7B;AAED,qHAAqH;AACrH,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,eAAe,EAAE,UAAU,EAAE,SAAS,MAAM,EAAE,GAAG,WAAW,GAAG,IAAI,CAKvG;AAKD,+CAA+C;AAC/C,wBAAgB,UAAU,CAAC,KAAK,EAAE,WAAW,GAAG,IAAI,GAAG,IAAI,CAAC,aAAa,EAAE,SAAS,GAAG,cAAc,CAAC,CAGrG"}
@@ -0,0 +1,20 @@
1
+ import { metricsModel } from "@wizeworks/lens-core";
2
+ import { RuntimeCollector } from "./runtime.js";
3
+ import { MetricStore } from "./store.js";
4
+ /** The metric store and runtime collector, or null when `captureMetrics` is false. Call `start` on the collector. */
5
+ export function createMetricParts(o, redactKeys) {
6
+ if (o.captureMetrics === false)
7
+ return null;
8
+ const store = new MetricStore({ service: o.serviceName, redactKeys, maxAgeMs: o.metricsMaxAgeMs });
9
+ const collector = new RuntimeCollector({ intervalMs: o.metricsIntervalMs, add: (points) => void store.add(points) });
10
+ return { store, collector };
11
+ }
12
+ /** In-app ranges: the add-on keeps an hour by default. */
13
+ const IN_APP_RANGES = ["15m", "1h"];
14
+ /** The MCP metric tools' view of the store. */
15
+ export function mcpMetrics(store) {
16
+ if (!store)
17
+ return {};
18
+ return { metrics: (range, params) => metricsModel({ points: store.all(), range, now: Date.now(), params }), metricRanges: IN_APP_RANGES };
19
+ }
20
+ //# sourceMappingURL=setup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup.js","sourceRoot":"","sources":["../../src/metrics/setup.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAkB,MAAM,sBAAsB,CAAC;AAGpE,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAOzC,qHAAqH;AACrH,MAAM,UAAU,iBAAiB,CAAC,CAAkB,EAAE,UAA6B;IACjF,IAAI,CAAC,CAAC,cAAc,KAAK,KAAK;QAAE,OAAO,IAAI,CAAC;IAC5C,MAAM,KAAK,GAAG,IAAI,WAAW,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,WAAW,EAAE,UAAU,EAAE,QAAQ,EAAE,CAAC,CAAC,eAAe,EAAE,CAAC,CAAC;IACnG,MAAM,SAAS,GAAG,IAAI,gBAAgB,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC,iBAAiB,EAAE,GAAG,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,KAAK,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IACrH,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;AAC9B,CAAC;AAED,0DAA0D;AAC1D,MAAM,aAAa,GAAyB,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;AAE1D,+CAA+C;AAC/C,MAAM,UAAU,UAAU,CAAC,KAAyB;IAClD,IAAI,CAAC,KAAK;QAAE,OAAO,EAAE,CAAC;IACtB,OAAO,EAAE,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,CAAC,YAAY,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,YAAY,EAAE,aAAa,EAAE,CAAC;AAC5I,CAAC"}
@@ -0,0 +1,34 @@
1
+ import { type MetricPoint } from "@wizeworks/lens-core";
2
+ export interface MetricStoreOptions {
3
+ service: string;
4
+ redactKeys: readonly string[];
5
+ /** Oldest point kept, in ms. Default 1 h. */
6
+ maxAgeMs?: number;
7
+ /** Most points kept. The oldest are dropped first. Default 50000. */
8
+ maxPoints?: number;
9
+ /** Most series kept. Points of new series past it are dropped. Default 1000. */
10
+ maxSeries?: number;
11
+ now?: () => number;
12
+ }
13
+ export type MetricListener = (points: readonly MetricPoint[]) => void;
14
+ export declare const MAX_METRIC_POINTS = 50000;
15
+ /** The add-on's metrics: a time-ordered window of points, in memory only. */
16
+ export declare class MetricStore {
17
+ #private;
18
+ readonly maxAgeMs: number;
19
+ readonly maxPoints: number;
20
+ readonly maxSeries: number;
21
+ dropped: number;
22
+ constructor(options: MetricStoreOptions);
23
+ get size(): number;
24
+ get seriesCount(): number;
25
+ subscribe(listener: MetricListener): () => void;
26
+ /** Check, redact, and keep points. Returns the ones kept. */
27
+ add(raw: readonly unknown[]): MetricPoint[];
28
+ /** Drop points past the age or count limit. */
29
+ prune(): void;
30
+ /** Points at or after `sinceMs`, oldest first, at most `limit` (the newest are kept). */
31
+ since(sinceMs?: number, limit?: number): MetricPoint[];
32
+ all(): readonly MetricPoint[];
33
+ }
34
+ //# sourceMappingURL=store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/metrics/store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,WAAW,EAAoC,MAAM,sBAAsB,CAAC;AAE1F,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,SAAS,MAAM,EAAE,CAAC;IAC9B,6CAA6C;IAC7C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,qEAAqE;IACrE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,gFAAgF;IAChF,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;CACpB;AAED,MAAM,MAAM,cAAc,GAAG,CAAC,MAAM,EAAE,SAAS,WAAW,EAAE,KAAK,IAAI,CAAC;AAEtE,eAAO,MAAM,iBAAiB,QAAS,CAAC;AAExC,6EAA6E;AAC7E,qBAAa,WAAW;;IACtB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAM3B,OAAO,SAAK;IAEZ,YAAY,OAAO,EAAE,kBAAkB,EAMtC;IAED,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,IAAI,WAAW,IAAI,MAAM,CAExB;IAED,SAAS,CAAC,QAAQ,EAAE,cAAc,GAAG,MAAM,IAAI,CAG9C;IAED,6DAA6D;IAC7D,GAAG,CAAC,GAAG,EAAE,SAAS,OAAO,EAAE,GAAG,WAAW,EAAE,CAY1C;IAsBD,+CAA+C;IAC/C,KAAK,IAAI,IAAI,CAMZ;IAED,yFAAyF;IACzF,KAAK,CAAC,OAAO,SAAI,EAAE,KAAK,SAAoB,GAAG,WAAW,EAAE,CAM3D;IAED,GAAG,IAAI,SAAS,WAAW,EAAE,CAG5B;CACF"}
@@ -0,0 +1,94 @@
1
+ import { sanitizeMetricPoint, seriesKeyOf } from "@wizeworks/lens-core";
2
+ export const MAX_METRIC_POINTS = 50_000;
3
+ /** The add-on's metrics: a time-ordered window of points, in memory only. */
4
+ export class MetricStore {
5
+ maxAgeMs;
6
+ maxPoints;
7
+ maxSeries;
8
+ #o;
9
+ #now;
10
+ #listeners = new Set();
11
+ #series = new Map();
12
+ #points = [];
13
+ dropped = 0;
14
+ constructor(options) {
15
+ this.#o = options;
16
+ this.maxAgeMs = Math.max(60_000, options.maxAgeMs ?? 60 * 60_000);
17
+ this.maxPoints = Math.max(100, options.maxPoints ?? MAX_METRIC_POINTS);
18
+ this.maxSeries = Math.max(1, options.maxSeries ?? 1000);
19
+ this.#now = options.now ?? Date.now;
20
+ }
21
+ get size() {
22
+ return this.#points.length;
23
+ }
24
+ get seriesCount() {
25
+ return this.#series.size;
26
+ }
27
+ subscribe(listener) {
28
+ this.#listeners.add(listener);
29
+ return () => void this.#listeners.delete(listener);
30
+ }
31
+ /** Check, redact, and keep points. Returns the ones kept. */
32
+ add(raw) {
33
+ const kept = [];
34
+ for (const r of raw) {
35
+ const p = sanitizeMetricPoint(r, this.#o.redactKeys, this.#o.service);
36
+ if (p && this.#track(p))
37
+ kept.push(p);
38
+ }
39
+ if (kept.length === 0)
40
+ return kept;
41
+ this.#points.push(...kept);
42
+ if (kept.some((p, i) => i > 0 && p.timeMs < kept[i - 1].timeMs) || this.#outOfOrder(kept))
43
+ this.#points.sort((a, b) => a.timeMs - b.timeMs);
44
+ this.prune();
45
+ for (const l of this.#listeners)
46
+ l(kept);
47
+ return kept;
48
+ }
49
+ #outOfOrder(kept) {
50
+ const before = this.#points[this.#points.length - kept.length - 1];
51
+ return !!before && before.timeMs > kept[0].timeMs;
52
+ }
53
+ #track(p) {
54
+ const key = seriesKeyOf(p);
55
+ const count = this.#series.get(key);
56
+ if (count === undefined && this.#series.size >= this.maxSeries)
57
+ return void this.dropped++, false;
58
+ this.#series.set(key, (count ?? 0) + 1);
59
+ return true;
60
+ }
61
+ #forget(p) {
62
+ const key = seriesKeyOf(p);
63
+ const count = (this.#series.get(key) ?? 1) - 1;
64
+ if (count <= 0)
65
+ this.#series.delete(key);
66
+ else
67
+ this.#series.set(key, count);
68
+ }
69
+ /** Drop points past the age or count limit. */
70
+ prune() {
71
+ const cutoff = this.#now() - this.maxAgeMs;
72
+ let drop = 0;
73
+ while (drop < this.#points.length && (this.#points[drop].timeMs < cutoff || this.#points.length - drop > this.maxPoints))
74
+ drop++;
75
+ if (drop === 0)
76
+ return;
77
+ for (const p of this.#points.splice(0, drop))
78
+ this.#forget(p);
79
+ }
80
+ /** Points at or after `sinceMs`, oldest first, at most `limit` (the newest are kept). */
81
+ since(sinceMs = 0, limit = MAX_METRIC_POINTS) {
82
+ this.prune();
83
+ const from = this.#points.findIndex((p) => p.timeMs >= sinceMs);
84
+ if (from < 0)
85
+ return [];
86
+ const list = this.#points.slice(from);
87
+ return list.length > limit ? list.slice(list.length - limit) : list;
88
+ }
89
+ all() {
90
+ this.prune();
91
+ return this.#points;
92
+ }
93
+ }
94
+ //# sourceMappingURL=store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/metrics/store.ts"],"names":[],"mappings":"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"}
package/dist/mode.d.ts ADDED
@@ -0,0 +1,6 @@
1
+ import type { WizeLensOptions } from "./types.js";
2
+ /** On or off: the option, then WIZELENS_ENABLED, then on outside production. */
3
+ export declare const isEnabled: (o: WizeLensOptions) => boolean;
4
+ /** Serve reads (dashboard, API, MCP): the option, then WIZELENS_DASHBOARD, then on outside production. */
5
+ export declare const servesDashboard: (o: WizeLensOptions) => boolean;
6
+ //# sourceMappingURL=mode.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mode.d.ts","sourceRoot":"","sources":["../src/mode.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAIlD,gFAAgF;AAChF,eAAO,MAAM,SAAS,MAAO,eAAe,KAAG,OAA0E,CAAC;AAE1H,0GAA0G;AAC1G,eAAO,MAAM,eAAe,MAAO,eAAe,KAAG,OAA8E,CAAC"}
package/dist/mode.js ADDED
@@ -0,0 +1,7 @@
1
+ import { DASHBOARD_ENV, ENABLED_ENV, envFlag } from "@wizeworks/lens-core";
2
+ const production = () => process.env.NODE_ENV === "production";
3
+ /** On or off: the option, then WIZELENS_ENABLED, then on outside production. */
4
+ export const isEnabled = (o) => o.enabled ?? envFlag(process.env[ENABLED_ENV]) ?? !production();
5
+ /** Serve reads (dashboard, API, MCP): the option, then WIZELENS_DASHBOARD, then on outside production. */
6
+ export const servesDashboard = (o) => o.dashboard ?? envFlag(process.env[DASHBOARD_ENV]) ?? !production();
7
+ //# sourceMappingURL=mode.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mode.js","sourceRoot":"","sources":["../src/mode.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAG3E,MAAM,UAAU,GAAG,GAAY,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,YAAY,CAAC;AAExE,gFAAgF;AAChF,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,CAAkB,EAAW,EAAE,CAAC,CAAC,CAAC,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;AAE1H,0GAA0G;AAC1G,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,CAAkB,EAAW,EAAE,CAAC,CAAC,CAAC,SAAS,IAAI,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC"}
package/dist/next.d.ts ADDED
@@ -0,0 +1,5 @@
1
+ export { nextIgnore, nextWizeLens, onRequestError, registerWizeLens } from "./frameworks/next.js";
2
+ export type { NextErrorContext, NextRequestInfo, WizeLensNextOptions } from "./frameworks/next.js";
3
+ export type { IgnorePath } from "./frameworks/node-server.js";
4
+ export type { WizeLens, WizeLensOptions } from "./types.js";
5
+ //# sourceMappingURL=next.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"next.d.ts","sourceRoot":"","sources":["../src/next.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAClG,YAAY,EAAE,gBAAgB,EAAE,eAAe,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AACnG,YAAY,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAC;AAC9D,YAAY,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC"}
package/dist/next.js ADDED
@@ -0,0 +1,2 @@
1
+ export { nextIgnore, nextWizeLens, onRequestError, registerWizeLens } from "./frameworks/next.js";
2
+ //# sourceMappingURL=next.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"next.js","sourceRoot":"","sources":["../src/next.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC"}
@@ -0,0 +1,14 @@
1
+ import type { DatabaseSync, StatementSync } from "node:sqlite";
2
+ export declare const SCHEMA_VERSION = "1";
3
+ export declare const SCHEMA = "\nCREATE TABLE IF NOT EXISTS meta (key TEXT PRIMARY KEY, value TEXT NOT NULL);\nCREATE TABLE IF NOT EXISTS traces (\n trace_id TEXT PRIMARY KEY, start_ms REAL NOT NULL, updated_ms REAL NOT NULL,\n remotes TEXT NOT NULL DEFAULT '[]'\n);\nCREATE TABLE IF NOT EXISTS spans (\n trace_id TEXT NOT NULL, span_id TEXT NOT NULL, parent_span_id TEXT,\n name TEXT NOT NULL, kind TEXT NOT NULL, category TEXT NOT NULL, service TEXT NOT NULL,\n start_ms REAL NOT NULL, duration_ms REAL NOT NULL, status TEXT NOT NULL,\n session TEXT,\n json TEXT NOT NULL,\n PRIMARY KEY (trace_id, span_id)\n);\nCREATE TABLE IF NOT EXISTS logs (\n trace_id TEXT NOT NULL, seq INTEGER NOT NULL, time_ms REAL NOT NULL, level TEXT NOT NULL,\n json TEXT NOT NULL,\n PRIMARY KEY (trace_id, seq)\n);\nCREATE INDEX IF NOT EXISTS ix_traces_start ON traces(start_ms);\nCREATE INDEX IF NOT EXISTS ix_spans_session ON spans(session) WHERE session IS NOT NULL;\nCREATE INDEX IF NOT EXISTS ix_spans_cat_dur ON spans(category, duration_ms);\n";
4
+ export interface Statements {
5
+ upsertTrace: StatementSync;
6
+ upsertSpan: StatementSync;
7
+ insertLog: StatementSync;
8
+ pruneAge: StatementSync;
9
+ pruneCount: StatementSync;
10
+ pruneSpans: StatementSync;
11
+ pruneLogs: StatementSync;
12
+ }
13
+ export declare function prepareStatements(db: DatabaseSync): Statements;
14
+ //# sourceMappingURL=persist-schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"persist-schema.d.ts","sourceRoot":"","sources":["../src/persist-schema.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAG/D,eAAO,MAAM,cAAc,MAAM,CAAC;AAClC,eAAO,MAAM,MAAM,6/BAsBlB,CAAC;AAEF,MAAM,WAAW,UAAU;IACzB,WAAW,EAAE,aAAa,CAAC;IAC3B,UAAU,EAAE,aAAa,CAAC;IAC1B,SAAS,EAAE,aAAa,CAAC;IACzB,QAAQ,EAAE,aAAa,CAAC;IACxB,UAAU,EAAE,aAAa,CAAC;IAC1B,UAAU,EAAE,aAAa,CAAC;IAC1B,SAAS,EAAE,aAAa,CAAC;CAC1B;AAED,wBAAgB,iBAAiB,CAAC,EAAE,EAAE,YAAY,GAAG,UAAU,CAgB9D"}
@@ -0,0 +1,41 @@
1
+ // Shared schema (docs/CONTRACT.md, "Storage"). The phase 2 hub reads these files too.
2
+ export const SCHEMA_VERSION = "1";
3
+ export const SCHEMA = `
4
+ CREATE TABLE IF NOT EXISTS meta (key TEXT PRIMARY KEY, value TEXT NOT NULL);
5
+ CREATE TABLE IF NOT EXISTS traces (
6
+ trace_id TEXT PRIMARY KEY, start_ms REAL NOT NULL, updated_ms REAL NOT NULL,
7
+ remotes TEXT NOT NULL DEFAULT '[]'
8
+ );
9
+ CREATE TABLE IF NOT EXISTS spans (
10
+ trace_id TEXT NOT NULL, span_id TEXT NOT NULL, parent_span_id TEXT,
11
+ name TEXT NOT NULL, kind TEXT NOT NULL, category TEXT NOT NULL, service TEXT NOT NULL,
12
+ start_ms REAL NOT NULL, duration_ms REAL NOT NULL, status TEXT NOT NULL,
13
+ session TEXT,
14
+ json TEXT NOT NULL,
15
+ PRIMARY KEY (trace_id, span_id)
16
+ );
17
+ CREATE TABLE IF NOT EXISTS logs (
18
+ trace_id TEXT NOT NULL, seq INTEGER NOT NULL, time_ms REAL NOT NULL, level TEXT NOT NULL,
19
+ json TEXT NOT NULL,
20
+ PRIMARY KEY (trace_id, seq)
21
+ );
22
+ CREATE INDEX IF NOT EXISTS ix_traces_start ON traces(start_ms);
23
+ CREATE INDEX IF NOT EXISTS ix_spans_session ON spans(session) WHERE session IS NOT NULL;
24
+ CREATE INDEX IF NOT EXISTS ix_spans_cat_dur ON spans(category, duration_ms);
25
+ `;
26
+ export function prepareStatements(db) {
27
+ return {
28
+ upsertTrace: db.prepare(`INSERT INTO traces (trace_id, start_ms, updated_ms, remotes) VALUES (?, ?, ?, ?)
29
+ ON CONFLICT(trace_id) DO UPDATE SET start_ms = min(start_ms, excluded.start_ms),
30
+ updated_ms = excluded.updated_ms, remotes = excluded.remotes`),
31
+ upsertSpan: db.prepare(`INSERT OR REPLACE INTO spans
32
+ (trace_id, span_id, parent_span_id, name, kind, category, service, start_ms, duration_ms, status, session, json)
33
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`),
34
+ insertLog: db.prepare("INSERT OR IGNORE INTO logs (trace_id, seq, time_ms, level, json) VALUES (?, ?, ?, ?, ?)"),
35
+ pruneAge: db.prepare("DELETE FROM traces WHERE start_ms < ?"),
36
+ pruneCount: db.prepare("DELETE FROM traces WHERE trace_id NOT IN (SELECT trace_id FROM traces ORDER BY start_ms DESC LIMIT ?)"),
37
+ pruneSpans: db.prepare("DELETE FROM spans WHERE trace_id NOT IN (SELECT trace_id FROM traces)"),
38
+ pruneLogs: db.prepare("DELETE FROM logs WHERE trace_id NOT IN (SELECT trace_id FROM traces)"),
39
+ };
40
+ }
41
+ //# sourceMappingURL=persist-schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"persist-schema.js","sourceRoot":"","sources":["../src/persist-schema.ts"],"names":[],"mappings":"AAEA,sFAAsF;AACtF,MAAM,CAAC,MAAM,cAAc,GAAG,GAAG,CAAC;AAClC,MAAM,CAAC,MAAM,MAAM,GAAG;;;;;;;;;;;;;;;;;;;;;;CAsBrB,CAAC;AAYF,MAAM,UAAU,iBAAiB,CAAC,EAAgB;IAChD,OAAO;QACL,WAAW,EAAE,EAAE,CAAC,OAAO,CAAC;;qEAEyC,CAAC;QAClE,UAAU,EAAE,EAAE,CAAC,OAAO,CAAC;;kDAEuB,CAAC;QAC/C,SAAS,EAAE,EAAE,CAAC,OAAO,CAAC,yFAAyF,CAAC;QAChH,QAAQ,EAAE,EAAE,CAAC,OAAO,CAAC,uCAAuC,CAAC;QAC7D,UAAU,EAAE,EAAE,CAAC,OAAO,CACpB,uGAAuG,CACxG;QACD,UAAU,EAAE,EAAE,CAAC,OAAO,CAAC,uEAAuE,CAAC;QAC/F,SAAS,EAAE,EAAE,CAAC,OAAO,CAAC,sEAAsE,CAAC;KAC9F,CAAC;AACJ,CAAC"}
@@ -0,0 +1,4 @@
1
+ export declare function parseArray<T>(json: string): T[];
2
+ /** Run `flush` on exit and on SIGINT/SIGTERM; re-raise the signal when no one else listens. */
3
+ export declare function hookProcessExit(flush: () => void): () => void;
4
+ //# sourceMappingURL=persist-util.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"persist-util.d.ts","sourceRoot":"","sources":["../src/persist-util.ts"],"names":[],"mappings":"AAAA,wBAAgB,UAAU,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,GAAG,CAAC,EAAE,CAO/C;AAED,+FAA+F;AAC/F,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,IAAI,GAAG,MAAM,IAAI,CAgB7D"}
@@ -0,0 +1,30 @@
1
+ export function parseArray(json) {
2
+ try {
3
+ const v = JSON.parse(json);
4
+ return Array.isArray(v) ? v : [];
5
+ }
6
+ catch {
7
+ return [];
8
+ }
9
+ }
10
+ /** Run `flush` on exit and on SIGINT/SIGTERM; re-raise the signal when no one else listens. */
11
+ export function hookProcessExit(flush) {
12
+ const onExit = () => flush();
13
+ const signals = ["SIGINT", "SIGTERM"];
14
+ const onSignal = (signal) => {
15
+ flush();
16
+ if (process.listenerCount(signal) === 1) {
17
+ process.removeListener(signal, onSignal);
18
+ process.kill(process.pid, signal);
19
+ }
20
+ };
21
+ process.on("exit", onExit);
22
+ for (const s of signals)
23
+ process.on(s, onSignal);
24
+ return () => {
25
+ process.removeListener("exit", onExit);
26
+ for (const s of signals)
27
+ process.removeListener(s, onSignal);
28
+ };
29
+ }
30
+ //# sourceMappingURL=persist-util.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"persist-util.js","sourceRoot":"","sources":["../src/persist-util.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,UAAU,CAAI,IAAY;IACxC,IAAI,CAAC;QACH,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAY,CAAC;QACtC,OAAO,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAE,CAAS,CAAC,CAAC,CAAC,EAAE,CAAC;IAC5C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,+FAA+F;AAC/F,MAAM,UAAU,eAAe,CAAC,KAAiB;IAC/C,MAAM,MAAM,GAAG,GAAG,EAAE,CAAC,KAAK,EAAE,CAAC;IAC7B,MAAM,OAAO,GAAqB,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;IACxD,MAAM,QAAQ,GAAG,CAAC,MAAsB,EAAE,EAAE;QAC1C,KAAK,EAAE,CAAC;QACR,IAAI,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;YACxC,OAAO,CAAC,cAAc,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;YACzC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QACpC,CAAC;IACH,CAAC,CAAC;IACF,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC3B,KAAK,MAAM,CAAC,IAAI,OAAO;QAAE,OAAO,CAAC,EAAE,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;IACjD,OAAO,GAAG,EAAE;QACV,OAAO,CAAC,cAAc,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACvC,KAAK,MAAM,CAAC,IAAI,OAAO;YAAE,OAAO,CAAC,cAAc,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;IAC/D,CAAC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,27 @@
1
+ import type { TraceStore } from "./store.js";
2
+ export interface PersisterOptions {
3
+ path: string;
4
+ serviceName: string;
5
+ /** Flush interval in ms. Default 500. */
6
+ intervalMs?: number;
7
+ /** Called once when the file cannot be used. WizeLens then keeps working in memory. */
8
+ warn?: (message: string) => void;
9
+ /** Clock, for tests. */
10
+ now?: () => number;
11
+ }
12
+ /** Writes the store to a SQLite file and loads it back on startup; any error turns it off with one warning. */
13
+ export declare class SqlitePersister {
14
+ #private;
15
+ readonly path: string;
16
+ constructor(store: TraceStore, options: PersisterOptions);
17
+ get active(): boolean;
18
+ /** Open the file, prune it, and load recent traces into the store. Returns false on failure. */
19
+ open(): boolean;
20
+ /** Flush every `intervalMs`, and once more when the process exits. */
21
+ start(): void;
22
+ /** Write all changed traces in one transaction, then prune. Synchronous on purpose (safe in `exit`). */
23
+ flush(): void;
24
+ /** Final flush, then close the file. */
25
+ close(): void;
26
+ }
27
+ //# sourceMappingURL=persist.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"persist.d.ts","sourceRoot":"","sources":["../src/persist.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAe,UAAU,EAAE,MAAM,YAAY,CAAC;AAI1D,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,yCAAyC;IACzC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,uFAAuF;IACvF,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IACjC,wBAAwB;IACxB,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;CACpB;AAED,+GAA+G;AAC/G,qBAAa,eAAe;;IAC1B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAUtB,YAAY,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,gBAAgB,EAKvD;IAED,IAAI,MAAM,IAAI,OAAO,CAEpB;IAED,gGAAgG;IAChG,IAAI,IAAI,OAAO,CAEd;IAwBD,sEAAsE;IACtE,KAAK,IAAI,IAAI,CAKZ;IAED,wGAAwG;IACxG,KAAK,IAAI,IAAI,CAEZ;IA4CD,wCAAwC;IACxC,KAAK,IAAI,IAAI,CAYZ;CA6CF"}