@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.
- package/LICENSE +21 -0
- package/README.md +65 -2
- package/dist/adapters/drizzle.d.ts +7 -0
- package/dist/adapters/drizzle.d.ts.map +1 -0
- package/dist/adapters/drizzle.js +41 -0
- package/dist/adapters/drizzle.js.map +1 -0
- package/dist/adapters/mysql2.d.ts +6 -0
- package/dist/adapters/mysql2.d.ts.map +1 -0
- package/dist/adapters/mysql2.js +60 -0
- package/dist/adapters/mysql2.js.map +1 -0
- package/dist/adapters/pg.d.ts +6 -0
- package/dist/adapters/pg.d.ts.map +1 -0
- package/dist/adapters/pg.js +50 -0
- package/dist/adapters/pg.js.map +1 -0
- package/dist/adapters/prisma.d.ts +22 -0
- package/dist/adapters/prisma.d.ts.map +1 -0
- package/dist/adapters/prisma.js +48 -0
- package/dist/adapters/prisma.js.map +1 -0
- package/dist/adapters/registry.d.ts +37 -0
- package/dist/adapters/registry.d.ts.map +1 -0
- package/dist/adapters/registry.js +41 -0
- package/dist/adapters/registry.js.map +1 -0
- package/dist/adapters/sqlite.d.ts +10 -0
- package/dist/adapters/sqlite.d.ts.map +1 -0
- package/dist/adapters/sqlite.js +59 -0
- package/dist/adapters/sqlite.js.map +1 -0
- package/dist/adapters/typeorm.d.ts +4 -0
- package/dist/adapters/typeorm.d.ts.map +1 -0
- package/dist/adapters/typeorm.js +43 -0
- package/dist/adapters/typeorm.js.map +1 -0
- package/dist/api.d.ts +26 -0
- package/dist/api.d.ts.map +1 -0
- package/dist/api.js +112 -0
- package/dist/api.js.map +1 -0
- package/dist/body-capture.d.ts +13 -0
- package/dist/body-capture.d.ts.map +1 -0
- package/dist/body-capture.js +54 -0
- package/dist/body-capture.js.map +1 -0
- package/dist/capture.d.ts +8 -0
- package/dist/capture.d.ts.map +1 -0
- package/dist/capture.js +33 -0
- package/dist/capture.js.map +1 -0
- package/dist/client-spans.d.ts +11 -0
- package/dist/client-spans.d.ts.map +1 -0
- package/dist/client-spans.js +83 -0
- package/dist/client-spans.js.map +1 -0
- package/dist/db.d.ts +25 -0
- package/dist/db.d.ts.map +1 -0
- package/dist/db.js +107 -0
- package/dist/db.js.map +1 -0
- package/dist/disabled.d.ts +4 -0
- package/dist/disabled.d.ts.map +1 -0
- package/dist/disabled.js +25 -0
- package/dist/disabled.js.map +1 -0
- package/dist/expose-headers.d.ts +6 -0
- package/dist/expose-headers.d.ts.map +1 -0
- package/dist/expose-headers.js +43 -0
- package/dist/expose-headers.js.map +1 -0
- package/dist/federation.d.ts +7 -0
- package/dist/federation.d.ts.map +1 -0
- package/dist/federation.js +33 -0
- package/dist/federation.js.map +1 -0
- package/dist/frameworks/fastify.d.ts +6 -0
- package/dist/frameworks/fastify.d.ts.map +1 -0
- package/dist/frameworks/fastify.js +60 -0
- package/dist/frameworks/fastify.js.map +1 -0
- package/dist/frameworks/hono.d.ts +6 -0
- package/dist/frameworks/hono.d.ts.map +1 -0
- package/dist/frameworks/hono.js +34 -0
- package/dist/frameworks/hono.js.map +1 -0
- package/dist/frameworks/koa.d.ts +13 -0
- package/dist/frameworks/koa.d.ts.map +1 -0
- package/dist/frameworks/koa.js +42 -0
- package/dist/frameworks/koa.js.map +1 -0
- package/dist/frameworks/next.d.ts +25 -0
- package/dist/frameworks/next.d.ts.map +1 -0
- package/dist/frameworks/next.js +49 -0
- package/dist/frameworks/next.js.map +1 -0
- package/dist/frameworks/node-server.d.ts +6 -0
- package/dist/frameworks/node-server.d.ts.map +1 -0
- package/dist/frameworks/node-server.js +35 -0
- package/dist/frameworks/node-server.js.map +1 -0
- package/dist/grpc/client.d.ts +6 -0
- package/dist/grpc/client.d.ts.map +1 -0
- package/dist/grpc/client.js +52 -0
- package/dist/grpc/client.js.map +1 -0
- package/dist/grpc/index.d.ts +4 -0
- package/dist/grpc/index.d.ts.map +1 -0
- package/dist/grpc/index.js +16 -0
- package/dist/grpc/index.js.map +1 -0
- package/dist/grpc/server.d.ts +10 -0
- package/dist/grpc/server.d.ts.map +1 -0
- package/dist/grpc/server.js +98 -0
- package/dist/grpc/server.js.map +1 -0
- package/dist/grpc/shared.d.ts +40 -0
- package/dist/grpc/shared.d.ts.map +1 -0
- package/dist/grpc/shared.js +45 -0
- package/dist/grpc/shared.js.map +1 -0
- package/dist/http-util.d.ts +10 -0
- package/dist/http-util.d.ts.map +1 -0
- package/dist/http-util.js +47 -0
- package/dist/http-util.js.map +1 -0
- package/dist/hub-connect.d.ts +10 -0
- package/dist/hub-connect.d.ts.map +1 -0
- package/dist/hub-connect.js +22 -0
- package/dist/hub-connect.js.map +1 -0
- package/dist/hub-export.d.ts +34 -0
- package/dist/hub-export.d.ts.map +1 -0
- package/dist/hub-export.js +135 -0
- package/dist/hub-export.js.map +1 -0
- package/dist/index.d.ts +35 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +27 -0
- package/dist/index.js.map +1 -0
- package/dist/info.d.ts +18 -0
- package/dist/info.d.ts.map +1 -0
- package/dist/info.js +31 -0
- package/dist/info.js.map +1 -0
- package/dist/kit.d.ts +14 -0
- package/dist/kit.d.ts.map +1 -0
- package/dist/kit.js +12 -0
- package/dist/kit.js.map +1 -0
- package/dist/logger.d.ts +29 -0
- package/dist/logger.d.ts.map +1 -0
- package/dist/logger.js +82 -0
- package/dist/logger.js.map +1 -0
- package/dist/logs/bunyan.d.ts +4 -0
- package/dist/logs/bunyan.d.ts.map +1 -0
- package/dist/logs/bunyan.js +42 -0
- package/dist/logs/bunyan.js.map +1 -0
- package/dist/logs/captured.d.ts +4 -0
- package/dist/logs/captured.d.ts.map +1 -0
- package/dist/logs/captured.js +9 -0
- package/dist/logs/captured.js.map +1 -0
- package/dist/logs/consola.d.ts +4 -0
- package/dist/logs/consola.d.ts.map +1 -0
- package/dist/logs/consola.js +25 -0
- package/dist/logs/consola.js.map +1 -0
- package/dist/logs/console.d.ts +4 -0
- package/dist/logs/console.d.ts.map +1 -0
- package/dist/logs/console.js +49 -0
- package/dist/logs/console.js.map +1 -0
- package/dist/logs/levels.d.ts +14 -0
- package/dist/logs/levels.d.ts.map +1 -0
- package/dist/logs/levels.js +58 -0
- package/dist/logs/levels.js.map +1 -0
- package/dist/logs/log4js.d.ts +16 -0
- package/dist/logs/log4js.d.ts.map +1 -0
- package/dist/logs/log4js.js +21 -0
- package/dist/logs/log4js.js.map +1 -0
- package/dist/logs/nest.d.ts +6 -0
- package/dist/logs/nest.d.ts.map +1 -0
- package/dist/logs/nest.js +34 -0
- package/dist/logs/nest.js.map +1 -0
- package/dist/logs/otel.d.ts +24 -0
- package/dist/logs/otel.d.ts.map +1 -0
- package/dist/logs/otel.js +31 -0
- package/dist/logs/otel.js.map +1 -0
- package/dist/logs/pino.d.ts +4 -0
- package/dist/logs/pino.d.ts.map +1 -0
- package/dist/logs/pino.js +86 -0
- package/dist/logs/pino.js.map +1 -0
- package/dist/logs/winston.d.ts +4 -0
- package/dist/logs/winston.d.ts.map +1 -0
- package/dist/logs/winston.js +65 -0
- package/dist/logs/winston.js.map +1 -0
- package/dist/mcp-find.d.ts +5 -0
- package/dist/mcp-find.d.ts.map +1 -0
- package/dist/mcp-find.js +42 -0
- package/dist/mcp-find.js.map +1 -0
- package/dist/mcp-metrics.d.ts +5 -0
- package/dist/mcp-metrics.d.ts.map +1 -0
- package/dist/mcp-metrics.js +77 -0
- package/dist/mcp-metrics.js.map +1 -0
- package/dist/mcp-shared.d.ts +30 -0
- package/dist/mcp-shared.d.ts.map +1 -0
- package/dist/mcp-shared.js +5 -0
- package/dist/mcp-shared.js.map +1 -0
- package/dist/mcp-traces.d.ts +5 -0
- package/dist/mcp-traces.d.ts.map +1 -0
- package/dist/mcp-traces.js +51 -0
- package/dist/mcp-traces.js.map +1 -0
- package/dist/mcp.d.ts +6 -0
- package/dist/mcp.d.ts.map +1 -0
- package/dist/mcp.js +26 -0
- package/dist/mcp.js.map +1 -0
- package/dist/messaging/amqplib.d.ts +4 -0
- package/dist/messaging/amqplib.d.ts.map +1 -0
- package/dist/messaging/amqplib.js +89 -0
- package/dist/messaging/amqplib.js.map +1 -0
- package/dist/messaging/kafkajs.d.ts +4 -0
- package/dist/messaging/kafkajs.d.ts.map +1 -0
- package/dist/messaging/kafkajs.js +78 -0
- package/dist/messaging/kafkajs.js.map +1 -0
- package/dist/messaging/servicebus.d.ts +4 -0
- package/dist/messaging/servicebus.d.ts.map +1 -0
- package/dist/messaging/servicebus.js +85 -0
- package/dist/messaging/servicebus.js.map +1 -0
- package/dist/messaging/shared.d.ts +30 -0
- package/dist/messaging/shared.d.ts.map +1 -0
- package/dist/messaging/shared.js +74 -0
- package/dist/messaging/shared.js.map +1 -0
- package/dist/metrics/exponential.d.ts +17 -0
- package/dist/metrics/exponential.d.ts.map +1 -0
- package/dist/metrics/exponential.js +12 -0
- package/dist/metrics/exponential.js.map +1 -0
- package/dist/metrics/gc.d.ts +15 -0
- package/dist/metrics/gc.d.ts.map +1 -0
- package/dist/metrics/gc.js +44 -0
- package/dist/metrics/gc.js.map +1 -0
- package/dist/metrics/otel.d.ts +39 -0
- package/dist/metrics/otel.d.ts.map +1 -0
- package/dist/metrics/otel.js +62 -0
- package/dist/metrics/otel.js.map +1 -0
- package/dist/metrics/runtime.d.ts +17 -0
- package/dist/metrics/runtime.d.ts.map +1 -0
- package/dist/metrics/runtime.js +100 -0
- package/dist/metrics/runtime.js.map +1 -0
- package/dist/metrics/setup.d.ts +13 -0
- package/dist/metrics/setup.d.ts.map +1 -0
- package/dist/metrics/setup.js +20 -0
- package/dist/metrics/setup.js.map +1 -0
- package/dist/metrics/store.d.ts +34 -0
- package/dist/metrics/store.d.ts.map +1 -0
- package/dist/metrics/store.js +94 -0
- package/dist/metrics/store.js.map +1 -0
- package/dist/mode.d.ts +6 -0
- package/dist/mode.d.ts.map +1 -0
- package/dist/mode.js +7 -0
- package/dist/mode.js.map +1 -0
- package/dist/next.d.ts +5 -0
- package/dist/next.d.ts.map +1 -0
- package/dist/next.js +2 -0
- package/dist/next.js.map +1 -0
- package/dist/persist-schema.d.ts +14 -0
- package/dist/persist-schema.d.ts.map +1 -0
- package/dist/persist-schema.js +41 -0
- package/dist/persist-schema.js.map +1 -0
- package/dist/persist-util.d.ts +4 -0
- package/dist/persist-util.d.ts.map +1 -0
- package/dist/persist-util.js +30 -0
- package/dist/persist-util.js.map +1 -0
- package/dist/persist.d.ts +27 -0
- package/dist/persist.d.ts.map +1 -0
- package/dist/persist.js +159 -0
- package/dist/persist.js.map +1 -0
- package/dist/precise.d.ts +8 -0
- package/dist/precise.d.ts.map +1 -0
- package/dist/precise.js +28 -0
- package/dist/precise.js.map +1 -0
- package/dist/processor.d.ts +20 -0
- package/dist/processor.d.ts.map +1 -0
- package/dist/processor.js +102 -0
- package/dist/processor.js.map +1 -0
- package/dist/request-api.d.ts +12 -0
- package/dist/request-api.d.ts.map +1 -0
- package/dist/request-api.js +31 -0
- package/dist/request-api.js.map +1 -0
- package/dist/request-attributes.d.ts +9 -0
- package/dist/request-attributes.d.ts.map +1 -0
- package/dist/request-attributes.js +48 -0
- package/dist/request-attributes.js.map +1 -0
- package/dist/request-capture.d.ts +32 -0
- package/dist/request-capture.d.ts.map +1 -0
- package/dist/request-capture.js +94 -0
- package/dist/request-capture.js.map +1 -0
- package/dist/route-timing.d.ts +6 -0
- package/dist/route-timing.d.ts.map +1 -0
- package/dist/route-timing.js +25 -0
- package/dist/route-timing.js.map +1 -0
- package/dist/sampling.d.ts +37 -0
- package/dist/sampling.d.ts.map +1 -0
- package/dist/sampling.js +120 -0
- package/dist/sampling.js.map +1 -0
- package/dist/spans.d.ts +9 -0
- package/dist/spans.d.ts.map +1 -0
- package/dist/spans.js +17 -0
- package/dist/spans.js.map +1 -0
- package/dist/store-types.d.ts +22 -0
- package/dist/store-types.d.ts.map +1 -0
- package/dist/store-types.js +2 -0
- package/dist/store-types.js.map +1 -0
- package/dist/store.d.ts +59 -0
- package/dist/store.d.ts.map +1 -0
- package/dist/store.js +194 -0
- package/dist/store.js.map +1 -0
- package/dist/tracing.d.ts +20 -0
- package/dist/tracing.d.ts.map +1 -0
- package/dist/tracing.js +45 -0
- package/dist/tracing.js.map +1 -0
- package/dist/types.d.ts +127 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/ui.d.ts +6 -0
- package/dist/ui.d.ts.map +1 -0
- package/dist/ui.js +62 -0
- package/dist/ui.js.map +1 -0
- package/dist/wizelens.d.ts +5 -0
- package/dist/wizelens.d.ts.map +1 -0
- package/dist/wizelens.js +127 -0
- package/dist/wizelens.js.map +1 -0
- package/package.json +109 -3
package/dist/api.d.ts
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { IncomingMessage, ServerResponse } from "node:http";
|
|
2
|
+
import { type ServiceInfo, type Trace, type TraceSummary } from "@wizeworks/lens-core";
|
|
3
|
+
import { type McpDataSource } from "./mcp.js";
|
|
4
|
+
import type { MetricStore } from "./metrics/store.js";
|
|
5
|
+
import type { TraceStore } from "./store.js";
|
|
6
|
+
export interface ApiDeps {
|
|
7
|
+
basePath: string;
|
|
8
|
+
store: TraceStore;
|
|
9
|
+
redactKeys: readonly string[];
|
|
10
|
+
uiDir: string | null;
|
|
11
|
+
enableMcp: boolean;
|
|
12
|
+
mcp: McpDataSource;
|
|
13
|
+
info: () => ServiceInfo;
|
|
14
|
+
getTrace: (traceId: string, federate: boolean, hop: number) => Promise<Trace | undefined>;
|
|
15
|
+
/** Null when metrics are off. */
|
|
16
|
+
metrics?: MetricStore | null;
|
|
17
|
+
/** This service's own endpoints: never a remote of its own traces. */
|
|
18
|
+
selfEndpoints: ReadonlySet<string>;
|
|
19
|
+
/** False is send-only: only the browser span intake answers. */
|
|
20
|
+
dashboard: boolean;
|
|
21
|
+
}
|
|
22
|
+
/** `api/traces`: summaries by default, full local traces with `full=true` (and `since`). */
|
|
23
|
+
export declare function listTraces(store: TraceStore, params: URLSearchParams): TraceSummary[] | Trace[];
|
|
24
|
+
/** Plain Node handler for `{basePath}`: API, MCP, and the dashboard, or only the browser span intake when send-only. Resolves false for other paths. */
|
|
25
|
+
export declare function createHandler(d: ApiDeps): (req: IncomingMessage, res: ServerResponse) => Promise<boolean>;
|
|
26
|
+
//# sourceMappingURL=api.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AACjE,OAAO,EAAc,KAAK,WAAW,EAAE,KAAK,KAAK,EAAE,KAAK,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAGnG,OAAO,EAAa,KAAK,aAAa,EAAE,MAAM,UAAU,CAAC;AACzD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAO7C,MAAM,WAAW,OAAO;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,UAAU,CAAC;IAClB,UAAU,EAAE,SAAS,MAAM,EAAE,CAAC;IAC9B,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,SAAS,EAAE,OAAO,CAAC;IACnB,GAAG,EAAE,aAAa,CAAC;IACnB,IAAI,EAAE,MAAM,WAAW,CAAC;IACxB,QAAQ,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,KAAK,GAAG,SAAS,CAAC,CAAC;IAC1F,iCAAiC;IACjC,OAAO,CAAC,EAAE,WAAW,GAAG,IAAI,CAAC;IAC7B,sEAAsE;IACtE,aAAa,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IACnC,gEAAgE;IAChE,SAAS,EAAE,OAAO,CAAC;CACpB;AAMD,4FAA4F;AAC5F,wBAAgB,UAAU,CAAC,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,eAAe,GAAG,YAAY,EAAE,GAAG,KAAK,EAAE,CAS/F;AAmDD,wJAAwJ;AACxJ,wBAAgB,aAAa,CAAC,CAAC,EAAE,OAAO,SACH,eAAe,OAAO,cAAc,KAAG,OAAO,CAAC,OAAO,CAAC,CAyB3F"}
|
package/dist/api.js
ADDED
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
import { HEADER_HOP } from "@wizeworks/lens-core";
|
|
2
|
+
import { remoteOf, sanitizeClientLog, sanitizeClientSpan } from "./client-spans.js";
|
|
3
|
+
import { firstHeader, readJson, sendJson, setCors } from "./http-util.js";
|
|
4
|
+
import { handleMcp } from "./mcp.js";
|
|
5
|
+
import { serveUi } from "./ui.js";
|
|
6
|
+
const MAX_CLIENT_SPANS = 500;
|
|
7
|
+
const MAX_CLIENT_LOGS = 100;
|
|
8
|
+
const CLIENT_SPANS = "api/client-spans";
|
|
9
|
+
const clamp = (v, min, max) => Math.min(max, Math.max(min, v));
|
|
10
|
+
/** `api/traces`: summaries by default, full local traces with `full=true` (and `since`). */
|
|
11
|
+
export function listTraces(store, params) {
|
|
12
|
+
const full = params.get("full") === "true";
|
|
13
|
+
const session = params.get("session") || undefined;
|
|
14
|
+
const limit = clamp(Number(params.get("limit")) || (full ? 1000 : 50), 1, full ? 5000 : 1000);
|
|
15
|
+
if (!full)
|
|
16
|
+
return store.list(limit, session);
|
|
17
|
+
const since = Number(params.get("since"));
|
|
18
|
+
const all = store.all(session);
|
|
19
|
+
const recent = params.has("since") && Number.isFinite(since) ? all.filter((t) => t.startMs + t.durationMs >= since) : all;
|
|
20
|
+
return recent.slice(0, limit);
|
|
21
|
+
}
|
|
22
|
+
async function sendTrace(d, traceId, req, res, url) {
|
|
23
|
+
const hop = Number(firstHeader(req.headers[HEADER_HOP.toLowerCase()])) || 0;
|
|
24
|
+
const result = await d.getTrace(traceId, url.searchParams.get("federate") === "true", hop);
|
|
25
|
+
if (result)
|
|
26
|
+
sendJson(res, 200, result);
|
|
27
|
+
else
|
|
28
|
+
sendJson(res, 404, { error: "trace not found" });
|
|
29
|
+
}
|
|
30
|
+
async function receiveClientSpans(d, req, res) {
|
|
31
|
+
try {
|
|
32
|
+
const body = (await readJson(req));
|
|
33
|
+
const spans = Array.isArray(body?.spans) ? body.spans.slice(0, MAX_CLIENT_SPANS) : [];
|
|
34
|
+
const origin = firstHeader(req.headers.origin);
|
|
35
|
+
for (const raw of spans) {
|
|
36
|
+
const span = sanitizeClientSpan(raw, d.redactKeys);
|
|
37
|
+
if (!span)
|
|
38
|
+
continue;
|
|
39
|
+
d.store.addSpan(span);
|
|
40
|
+
const remote = remoteOf(span, origin);
|
|
41
|
+
if (remote && !d.selfEndpoints.has(remote))
|
|
42
|
+
d.store.addRemote(span.traceId, remote);
|
|
43
|
+
}
|
|
44
|
+
const logs = Array.isArray(body?.logs) ? body.logs.slice(0, MAX_CLIENT_LOGS) : [];
|
|
45
|
+
for (const raw of logs) {
|
|
46
|
+
const entry = sanitizeClientLog(raw, d.redactKeys);
|
|
47
|
+
if (entry)
|
|
48
|
+
d.store.addLog(entry.traceId, entry.log);
|
|
49
|
+
}
|
|
50
|
+
res.writeHead(204).end();
|
|
51
|
+
}
|
|
52
|
+
catch {
|
|
53
|
+
sendJson(res, 400, { error: "invalid body" });
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
async function handleApi(d, sub, method, req, res, url) {
|
|
57
|
+
if (sub === "api/info" && method === "GET")
|
|
58
|
+
return sendJson(res, 200, d.info());
|
|
59
|
+
if (sub === "api/traces" && method === "GET")
|
|
60
|
+
return sendJson(res, 200, listTraces(d.store, url.searchParams));
|
|
61
|
+
const traceMatch = /^api\/traces\/([0-9a-f]{32})$/.exec(sub);
|
|
62
|
+
if (traceMatch && method === "GET")
|
|
63
|
+
return sendTrace(d, traceMatch[1], req, res, url);
|
|
64
|
+
if (sub === CLIENT_SPANS && method === "POST")
|
|
65
|
+
return receiveClientSpans(d, req, res);
|
|
66
|
+
if (sub === "api/metrics/points" && method === "GET" && d.metrics) {
|
|
67
|
+
const since = Number(url.searchParams.get("since"));
|
|
68
|
+
return sendJson(res, 200, { points: d.metrics.since(Number.isFinite(since) ? since : 0) });
|
|
69
|
+
}
|
|
70
|
+
sendJson(res, 404, { error: "not found" });
|
|
71
|
+
}
|
|
72
|
+
async function handleMcpRoute(d, req, res, method) {
|
|
73
|
+
if (!d.enableMcp)
|
|
74
|
+
return sendJson(res, 404, { error: "MCP is disabled. Set enableMcp: true." });
|
|
75
|
+
const body = method === "POST" ? await readJson(req) : undefined;
|
|
76
|
+
await handleMcp(d.mcp, req, res, body);
|
|
77
|
+
}
|
|
78
|
+
/** Plain Node handler for `{basePath}`: API, MCP, and the dashboard, or only the browser span intake when send-only. Resolves false for other paths. */
|
|
79
|
+
export function createHandler(d) {
|
|
80
|
+
return async function handler(req, res) {
|
|
81
|
+
const r = req;
|
|
82
|
+
const url = new URL(r.originalUrl ?? r.url ?? "/", "http://localhost");
|
|
83
|
+
const path = url.pathname;
|
|
84
|
+
if (path !== d.basePath && !path.startsWith(d.basePath + "/"))
|
|
85
|
+
return false;
|
|
86
|
+
const sub = path.slice(d.basePath.length + 1);
|
|
87
|
+
const method = req.method ?? "GET";
|
|
88
|
+
// Send-only: nothing here can be read, so traces never leave the service except to the hub.
|
|
89
|
+
if (!d.dashboard && sub !== CLIENT_SPANS) {
|
|
90
|
+
sendJson(res, 404, { error: "not found" });
|
|
91
|
+
return true;
|
|
92
|
+
}
|
|
93
|
+
if (path === d.basePath) {
|
|
94
|
+
res.writeHead(302, { Location: `${d.basePath}/${url.search}` });
|
|
95
|
+
res.end();
|
|
96
|
+
return true;
|
|
97
|
+
}
|
|
98
|
+
setCors(res);
|
|
99
|
+
if (method === "OPTIONS")
|
|
100
|
+
res.writeHead(204).end();
|
|
101
|
+
else if (sub === "mcp")
|
|
102
|
+
await handleMcpRoute(d, r, res, method);
|
|
103
|
+
else if (sub.startsWith("api/"))
|
|
104
|
+
await handleApi(d, sub, method, r, res, url);
|
|
105
|
+
else if (method !== "GET" && method !== "HEAD")
|
|
106
|
+
res.writeHead(405).end();
|
|
107
|
+
else
|
|
108
|
+
await serveUi(d.uiDir, sub, res);
|
|
109
|
+
return true;
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
//# sourceMappingURL=api.js.map
|
package/dist/api.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api.js","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { ServerResponse } from "node:http";
|
|
2
|
+
export interface ResponseTap {
|
|
3
|
+
/** Bytes the app wrote to the response. */
|
|
4
|
+
bytes(): number;
|
|
5
|
+
/** The kept body, or null when capture is off or the body is not text or JSON. */
|
|
6
|
+
body(): {
|
|
7
|
+
text: string;
|
|
8
|
+
truncated: boolean;
|
|
9
|
+
} | null;
|
|
10
|
+
}
|
|
11
|
+
/** Counts (and optionally keeps the start of) what the app writes. Never changes what the client gets. */
|
|
12
|
+
export declare function tapResponse(res: ServerResponse, capture: boolean): ResponseTap;
|
|
13
|
+
//# sourceMappingURL=body-capture.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"body-capture.d.ts","sourceRoot":"","sources":["../src/body-capture.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAKhD,MAAM,WAAW,WAAW;IAC1B,2CAA2C;IAC3C,KAAK,IAAI,MAAM,CAAC;IAChB,kFAAkF;IAClF,IAAI,IAAI;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,OAAO,CAAA;KAAE,GAAG,IAAI,CAAC;CACrD;AAiBD,0GAA0G;AAC1G,wBAAgB,WAAW,CAAC,GAAG,EAAE,cAAc,EAAE,OAAO,EAAE,OAAO,GAAG,WAAW,CAsB9E"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
const BODY_LIMIT = 16 * 1024;
|
|
2
|
+
const TEXT_TYPE = /^(text\/|application\/(.+\+)?json\b)/i;
|
|
3
|
+
function isTextBody(res) {
|
|
4
|
+
if (res.getHeader("content-encoding"))
|
|
5
|
+
return false;
|
|
6
|
+
return TEXT_TYPE.test(String(res.getHeader("content-type") ?? ""));
|
|
7
|
+
}
|
|
8
|
+
function toBuffer(chunk, encoding) {
|
|
9
|
+
return typeof chunk === "string" ? Buffer.from(chunk, encoding) : Buffer.from(chunk.buffer, chunk.byteOffset, chunk.byteLength);
|
|
10
|
+
}
|
|
11
|
+
function sizeOf(chunk, encoding) {
|
|
12
|
+
return typeof chunk === "string" ? Buffer.byteLength(chunk, encoding) : chunk.byteLength;
|
|
13
|
+
}
|
|
14
|
+
/** Counts (and optionally keeps the start of) what the app writes. Never changes what the client gets. */
|
|
15
|
+
export function tapResponse(res, capture) {
|
|
16
|
+
let bytes = 0;
|
|
17
|
+
let kept = 0;
|
|
18
|
+
let eligible;
|
|
19
|
+
const parts = [];
|
|
20
|
+
const take = (chunk, enc) => {
|
|
21
|
+
if (typeof chunk !== "string" && !(chunk instanceof Uint8Array))
|
|
22
|
+
return;
|
|
23
|
+
const encoding = typeof enc === "string" ? enc : undefined;
|
|
24
|
+
bytes += sizeOf(chunk, encoding);
|
|
25
|
+
if (!capture)
|
|
26
|
+
return;
|
|
27
|
+
eligible ??= isTextBody(res);
|
|
28
|
+
if (!eligible || kept >= BODY_LIMIT)
|
|
29
|
+
return;
|
|
30
|
+
const part = toBuffer(chunk, encoding).subarray(0, BODY_LIMIT - kept);
|
|
31
|
+
parts.push(Buffer.from(part));
|
|
32
|
+
kept += part.length;
|
|
33
|
+
};
|
|
34
|
+
wrap(res, "write", take);
|
|
35
|
+
wrap(res, "end", take);
|
|
36
|
+
return {
|
|
37
|
+
bytes: () => bytes,
|
|
38
|
+
body: () => (capture && eligible ? { text: Buffer.concat(parts).toString("utf8"), truncated: bytes > kept } : null),
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
function wrap(res, method, take) {
|
|
42
|
+
const original = res[method];
|
|
43
|
+
const wrapped = function (...args) {
|
|
44
|
+
try {
|
|
45
|
+
take(args[0], args[1]);
|
|
46
|
+
}
|
|
47
|
+
catch {
|
|
48
|
+
// Counting must never break the response.
|
|
49
|
+
}
|
|
50
|
+
return original.apply(this, args);
|
|
51
|
+
};
|
|
52
|
+
res[method] = wrapped;
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=body-capture.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"body-capture.js","sourceRoot":"","sources":["../src/body-capture.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { IncomingMessage, ServerResponse } from "node:http";
|
|
2
|
+
import { type CaptureDeps } from "./request-capture.js";
|
|
3
|
+
import type { Next } from "./types.js";
|
|
4
|
+
export type { CaptureDeps } from "./request-capture.js";
|
|
5
|
+
export { requestSpan } from "./request-capture.js";
|
|
6
|
+
/** Express / Connect middleware: one server span per request, plus the WizeLens routes. */
|
|
7
|
+
export declare function createMiddleware(d: CaptureDeps): (req: IncomingMessage, res: ServerResponse, next: Next) => void;
|
|
8
|
+
//# sourceMappingURL=capture.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"capture.d.ts","sourceRoot":"","sources":["../src/capture.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAEjE,OAAO,EAAkB,KAAK,WAAW,EAAgD,MAAM,sBAAsB,CAAC;AAGtH,OAAO,KAAK,EAAE,IAAI,EAAO,MAAM,YAAY,CAAC;AAE5C,YAAY,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAQnD,2FAA2F;AAC3F,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,WAAW,SACb,eAAe,OAAO,cAAc,QAAQ,IAAI,KAAG,IAAI,CAgBxF"}
|
package/dist/capture.js
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { context } from "@opentelemetry/api";
|
|
2
|
+
import { captureRequest, isOwnPath, isPreflight, pathOf, serveOwnPath } from "./request-capture.js";
|
|
3
|
+
import { watchRoute } from "./route-timing.js";
|
|
4
|
+
import { recordOn } from "./spans.js";
|
|
5
|
+
export { requestSpan } from "./request-capture.js";
|
|
6
|
+
/** Express route template, including the mount path of nested routers. */
|
|
7
|
+
function expressRoute(req) {
|
|
8
|
+
const routePath = req.route?.path;
|
|
9
|
+
return typeof routePath === "string" ? `${req.baseUrl ?? ""}${routePath}` : undefined;
|
|
10
|
+
}
|
|
11
|
+
/** Express / Connect middleware: one server span per request, plus the WizeLens routes. */
|
|
12
|
+
export function createMiddleware(d) {
|
|
13
|
+
return function middleware(req, res, next) {
|
|
14
|
+
const r = req;
|
|
15
|
+
const rawUrl = r.originalUrl ?? r.url ?? "/";
|
|
16
|
+
if (isOwnPath(d, pathOf(rawUrl)))
|
|
17
|
+
return void serveOwnPath(d, req, res);
|
|
18
|
+
if (isPreflight(req))
|
|
19
|
+
return next();
|
|
20
|
+
const { span, ctx, startedAt } = captureRequest(d, req, res, rawUrl, () => expressRoute(r));
|
|
21
|
+
watchRoute(req, "route", span, startedAt);
|
|
22
|
+
context.with(ctx, () => {
|
|
23
|
+
try {
|
|
24
|
+
next();
|
|
25
|
+
}
|
|
26
|
+
catch (err) {
|
|
27
|
+
recordOn(span, err);
|
|
28
|
+
throw err;
|
|
29
|
+
}
|
|
30
|
+
});
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=capture.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"capture.js","sourceRoot":"","sources":["../src/capture.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAC7C,OAAO,EAAE,cAAc,EAAoB,SAAS,EAAE,WAAW,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACtH,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAItC,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAEnD,0EAA0E;AAC1E,SAAS,YAAY,CAAC,GAAQ;IAC5B,MAAM,SAAS,GAAG,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC;IAClC,OAAO,OAAO,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,OAAO,IAAI,EAAE,GAAG,SAAS,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;AACxF,CAAC;AAED,2FAA2F;AAC3F,MAAM,UAAU,gBAAgB,CAAC,CAAc;IAC7C,OAAO,SAAS,UAAU,CAAC,GAAoB,EAAE,GAAmB,EAAE,IAAU;QAC9E,MAAM,CAAC,GAAG,GAAU,CAAC;QACrB,MAAM,MAAM,GAAG,CAAC,CAAC,WAAW,IAAI,CAAC,CAAC,GAAG,IAAI,GAAG,CAAC;QAC7C,IAAI,SAAS,CAAC,CAAC,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;YAAE,OAAO,KAAK,YAAY,CAAC,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;QACxE,IAAI,WAAW,CAAC,GAAG,CAAC;YAAE,OAAO,IAAI,EAAE,CAAC;QACpC,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,cAAc,CAAC,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC;QAC5F,UAAU,CAAC,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC;QAC1C,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE;YACrB,IAAI,CAAC;gBACH,IAAI,EAAE,CAAC;YACT,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,QAAQ,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;gBACpB,MAAM,GAAG,CAAC;YACZ,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { type LogRecord, type Span } from "@wizeworks/lens-core";
|
|
2
|
+
/** Validate and redact one span posted by the browser. Returns null when it is not a valid span. */
|
|
3
|
+
export declare function sanitizeClientSpan(raw: unknown, redactKeys: readonly string[]): Span | null;
|
|
4
|
+
/** Validate and redact one browser log line. Returns null when it has no valid trace. */
|
|
5
|
+
export declare function sanitizeClientLog(raw: unknown, redactKeys: readonly string[]): {
|
|
6
|
+
traceId: string;
|
|
7
|
+
log: LogRecord;
|
|
8
|
+
} | null;
|
|
9
|
+
/** The server a browser span says answered it. Kept only on the page's own origin, so a page cannot point the federation at any URL it likes. */
|
|
10
|
+
export declare function remoteOf(span: Span, origin: string | undefined): string | null;
|
|
11
|
+
//# sourceMappingURL=client-spans.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client-spans.d.ts","sourceRoot":"","sources":["../src/client-spans.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,KAAK,SAAS,EAEd,KAAK,IAAI,EAKV,MAAM,sBAAsB,CAAC;AA2B9B,oGAAoG;AACpG,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,OAAO,EAAE,UAAU,EAAE,SAAS,MAAM,EAAE,GAAG,IAAI,GAAG,IAAI,CAqB3F;AAED,yFAAyF;AACzF,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,OAAO,EAAE,UAAU,EAAE,SAAS,MAAM,EAAE,GAAG;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,SAAS,CAAA;CAAE,GAAG,IAAI,CAczH;AAED,iJAAiJ;AACjJ,wBAAgB,QAAQ,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,IAAI,CAS9E"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import { ATTR_BROWSER_REMOTE, redactAttributes, toAttributeValue, } from "@wizeworks/lens-core";
|
|
2
|
+
const SPAN_KINDS = ["server", "client", "internal", "producer", "consumer"];
|
|
3
|
+
const CATEGORIES = ["http.server", "http.client", "db", "messaging", "browser", "internal"];
|
|
4
|
+
const HEX32 = /^[0-9a-f]{32}$/;
|
|
5
|
+
const HEX16 = /^[0-9a-f]{16}$/;
|
|
6
|
+
const MAX_EVENTS = 50;
|
|
7
|
+
const LEVELS = ["trace", "debug", "info", "warn", "error", "critical"];
|
|
8
|
+
const text = (v, fallback, max) => (typeof v === "string" && v ? v.slice(0, max) : fallback);
|
|
9
|
+
function toAttributes(raw, redactKeys) {
|
|
10
|
+
const out = {};
|
|
11
|
+
if (raw && typeof raw === "object") {
|
|
12
|
+
for (const [k, v] of Object.entries(raw))
|
|
13
|
+
out[k] = toAttributeValue(v);
|
|
14
|
+
}
|
|
15
|
+
return redactAttributes(out, redactKeys);
|
|
16
|
+
}
|
|
17
|
+
function toEvents(raw, redactKeys) {
|
|
18
|
+
const events = Array.isArray(raw) ? raw : [];
|
|
19
|
+
return events.slice(0, MAX_EVENTS).flatMap((e) => {
|
|
20
|
+
if (!e || typeof e !== "object")
|
|
21
|
+
return [];
|
|
22
|
+
const ev = e;
|
|
23
|
+
return [{ name: String(ev.name ?? "event"), timeMs: Number(ev.timeMs) || 0, attributes: toAttributes(ev.attributes, redactKeys) }];
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
/** Validate and redact one span posted by the browser. Returns null when it is not a valid span. */
|
|
27
|
+
export function sanitizeClientSpan(raw, redactKeys) {
|
|
28
|
+
if (!raw || typeof raw !== "object")
|
|
29
|
+
return null;
|
|
30
|
+
const s = raw;
|
|
31
|
+
if (typeof s.traceId !== "string" || !HEX32.test(s.traceId))
|
|
32
|
+
return null;
|
|
33
|
+
if (typeof s.spanId !== "string" || !HEX16.test(s.spanId))
|
|
34
|
+
return null;
|
|
35
|
+
const parent = typeof s.parentSpanId === "string" && HEX16.test(s.parentSpanId) ? s.parentSpanId : null;
|
|
36
|
+
return {
|
|
37
|
+
traceId: s.traceId,
|
|
38
|
+
spanId: s.spanId,
|
|
39
|
+
parentSpanId: parent,
|
|
40
|
+
name: typeof s.name === "string" ? s.name.slice(0, 500) : "browser",
|
|
41
|
+
kind: SPAN_KINDS.includes(s.kind) ? s.kind : "client",
|
|
42
|
+
category: CATEGORIES.includes(s.category) ? s.category : "browser",
|
|
43
|
+
service: typeof s.service === "string" && s.service ? s.service.slice(0, 100) : "browser",
|
|
44
|
+
startMs: Number(s.startMs) || 0,
|
|
45
|
+
durationMs: Math.max(0, Number(s.durationMs) || 0),
|
|
46
|
+
status: s.status === "error" || s.status === "ok" ? s.status : "unset",
|
|
47
|
+
statusMessage: typeof s.statusMessage === "string" ? s.statusMessage : null,
|
|
48
|
+
attributes: toAttributes(s.attributes, redactKeys),
|
|
49
|
+
events: toEvents(s.events, redactKeys),
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
/** Validate and redact one browser log line. Returns null when it has no valid trace. */
|
|
53
|
+
export function sanitizeClientLog(raw, redactKeys) {
|
|
54
|
+
if (!raw || typeof raw !== "object")
|
|
55
|
+
return null;
|
|
56
|
+
const l = raw;
|
|
57
|
+
if (typeof l.traceId !== "string" || !HEX32.test(l.traceId))
|
|
58
|
+
return null;
|
|
59
|
+
const log = {
|
|
60
|
+
timeMs: Number(l.timeMs) || Date.now(),
|
|
61
|
+
level: LEVELS.includes(l.level) ? l.level : "info",
|
|
62
|
+
category: text(l.category, "console", 100),
|
|
63
|
+
message: typeof l.message === "string" ? l.message.slice(0, 4000) : "",
|
|
64
|
+
service: text(l.service, "browser", 100),
|
|
65
|
+
spanId: typeof l.spanId === "string" && HEX16.test(l.spanId) ? l.spanId : null,
|
|
66
|
+
attributes: toAttributes(l.attributes, redactKeys),
|
|
67
|
+
};
|
|
68
|
+
return { traceId: l.traceId, log };
|
|
69
|
+
}
|
|
70
|
+
/** The server a browser span says answered it. Kept only on the page's own origin, so a page cannot point the federation at any URL it likes. */
|
|
71
|
+
export function remoteOf(span, origin) {
|
|
72
|
+
const remote = span.attributes[ATTR_BROWSER_REMOTE];
|
|
73
|
+
if (typeof remote !== "string" || !origin)
|
|
74
|
+
return null;
|
|
75
|
+
try {
|
|
76
|
+
const url = new URL(remote);
|
|
77
|
+
return url.origin === origin && /^https?:$/.test(url.protocol) ? url.href.replace(/\/+$/, "") : null;
|
|
78
|
+
}
|
|
79
|
+
catch {
|
|
80
|
+
return null;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
//# sourceMappingURL=client-spans.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client-spans.js","sourceRoot":"","sources":["../src/client-spans.ts"],"names":[],"mappings":"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"}
|
package/dist/db.d.ts
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { type Context, type Tracer } from "@opentelemetry/api";
|
|
2
|
+
import type { DbCallInfo } from "./types.js";
|
|
3
|
+
export declare function parseSql(sql: string): {
|
|
4
|
+
operation: string;
|
|
5
|
+
collection: string | undefined;
|
|
6
|
+
};
|
|
7
|
+
export declare function isThenable(value: unknown): value is PromiseLike<unknown>;
|
|
8
|
+
/** One open database span. `ctx` makes it the parent of anything started inside the call. */
|
|
9
|
+
export interface DbSpan {
|
|
10
|
+
ctx: Context;
|
|
11
|
+
end(result: unknown): void;
|
|
12
|
+
fail(err: unknown): void;
|
|
13
|
+
}
|
|
14
|
+
/** Start a database span, or null when the call runs inside another database span. ORM calls (`outermost`) always start one. */
|
|
15
|
+
export type StartDbSpan = (info: DbCallInfo, sql: string, params: unknown) => DbSpan | null;
|
|
16
|
+
export declare function createDbSpans(tracer: Tracer, redactKeys: readonly string[], outsideRequests?: boolean): StartDbSpan;
|
|
17
|
+
/** Run a call (sync, promise, or with a trailing callback) inside a database span. Returns what the call returns. */
|
|
18
|
+
export declare function runTraced(span: DbSpan | null, args: unknown[], invoke: (args: unknown[]) => unknown): unknown;
|
|
19
|
+
/** Run WizeLens's own database work (its trace storage) so the adapters never trace it. */
|
|
20
|
+
export declare const untraced: <T>(fn: () => T) => T;
|
|
21
|
+
/** Run `fn` so that driver spans inside it carry `label` as their adapter. */
|
|
22
|
+
export declare const withAdapterLabel: <T>(label: string, fn: () => T) => T;
|
|
23
|
+
/** Build `traceDb`: wraps one database call (sync or async) in a db span. */
|
|
24
|
+
export declare function createTraceDb(start: StartDbSpan): <T>(info: DbCallInfo, sql: string, params: unknown, fn: () => T) => T;
|
|
25
|
+
//# sourceMappingURL=db.d.ts.map
|
package/dist/db.d.ts.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"db.d.ts","sourceRoot":"","sources":["../src/db.ts"],"names":[],"mappings":"AAAA,OAAO,EAAqC,KAAK,OAAO,EAA4D,KAAK,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAI5J,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAO7C,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE,CAI3F;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,WAAW,CAAC,OAAO,CAAC,CAExE;AA0BD,6FAA6F;AAC7F,MAAM,WAAW,MAAM;IACrB,GAAG,EAAE,OAAO,CAAC;IACb,GAAG,CAAC,MAAM,EAAE,OAAO,GAAG,IAAI,CAAC;IAC3B,IAAI,CAAC,GAAG,EAAE,OAAO,GAAG,IAAI,CAAC;CAC1B;AAED,gIAAgI;AAChI,MAAM,MAAM,WAAW,GAAG,CAAC,IAAI,EAAE,UAAU,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,KAAK,MAAM,GAAG,IAAI,CAAC;AAO5F,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,MAAM,EAAE,EAAE,eAAe,UAAQ,GAAG,WAAW,CAkBjH;AAED,qHAAqH;AACrH,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,MAAM,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,OAAO,GAAG,OAAO,CAoB7G;AAED,2FAA2F;AAC3F,eAAO,MAAM,QAAQ,GAAI,CAAC,MAAM,MAAM,CAAC,KAAG,CAA6D,CAAC;AAExG,8EAA8E;AAC9E,eAAO,MAAM,gBAAgB,GAAI,CAAC,SAAS,MAAM,MAAM,MAAM,CAAC,KAAG,CAAsE,CAAC;AAExI,6EAA6E;AAC7E,wBAAgB,aAAa,CAAC,KAAK,EAAE,WAAW,IACtB,CAAC,QAAQ,UAAU,OAAO,MAAM,UAAU,OAAO,MAAM,MAAM,CAAC,KAAG,CAAC,CAG3F"}
|
package/dist/db.js
ADDED
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
import { context, createContextKey, ROOT_CONTEXT, SpanKind, trace } from "@opentelemetry/api";
|
|
2
|
+
import { redactParams } from "@wizeworks/lens-core";
|
|
3
|
+
import { CATEGORY_ATTR } from "./processor.js";
|
|
4
|
+
import { recordOn } from "./spans.js";
|
|
5
|
+
/** Set inside any database span: driver calls below it (a pool calling its connection, a driver under an ORM) are part of it. */
|
|
6
|
+
const INSIDE_DB = createContextKey("wizelens.db.inside");
|
|
7
|
+
/** Set by a library that runs on a driver (Drizzle): the driver spans carry its name as the adapter. */
|
|
8
|
+
const ADAPTER_LABEL = createContextKey("wizelens.db.adapter-label");
|
|
9
|
+
export function parseSql(sql) {
|
|
10
|
+
const operation = (/^\s*(\w+)/.exec(sql)?.[1] ?? "QUERY").toUpperCase();
|
|
11
|
+
const collection = /\b(?:FROM|INTO|UPDATE|JOIN)\s+["`[]?([\w.]+)/i.exec(sql)?.[1];
|
|
12
|
+
return { operation, collection };
|
|
13
|
+
}
|
|
14
|
+
export function isThenable(value) {
|
|
15
|
+
return typeof value?.then === "function";
|
|
16
|
+
}
|
|
17
|
+
function dbAttributes(info, sql, params, redactKeys) {
|
|
18
|
+
const parsed = parseSql(sql);
|
|
19
|
+
const label = context.active().getValue(ADAPTER_LABEL);
|
|
20
|
+
const attributes = {
|
|
21
|
+
[CATEGORY_ATTR]: "db",
|
|
22
|
+
"db.system.name": info.system,
|
|
23
|
+
"db.query.text": sql,
|
|
24
|
+
"db.operation.name": info.operation ?? parsed.operation,
|
|
25
|
+
"wizelens.db.adapter": typeof label === "string" ? label : (info.adapter ?? info.system),
|
|
26
|
+
};
|
|
27
|
+
const collection = info.collection ?? parsed.collection;
|
|
28
|
+
if (collection)
|
|
29
|
+
attributes["db.collection.name"] = collection;
|
|
30
|
+
if (info.namespace)
|
|
31
|
+
attributes["db.namespace"] = info.namespace;
|
|
32
|
+
const p = redactParams(params, redactKeys);
|
|
33
|
+
if (p !== null)
|
|
34
|
+
attributes["wizelens.db.parameters"] = p;
|
|
35
|
+
return attributes;
|
|
36
|
+
}
|
|
37
|
+
function spanName(attributes) {
|
|
38
|
+
const op = String(attributes["db.operation.name"]);
|
|
39
|
+
const collection = attributes["db.collection.name"];
|
|
40
|
+
return collection ? `${op} ${String(collection)}` : op;
|
|
41
|
+
}
|
|
42
|
+
function rowsIn(info, result) {
|
|
43
|
+
if (info.rowsOf)
|
|
44
|
+
return info.rowsOf(result);
|
|
45
|
+
return Array.isArray(result) ? result.length : undefined;
|
|
46
|
+
}
|
|
47
|
+
export function createDbSpans(tracer, redactKeys, outsideRequests = false) {
|
|
48
|
+
return (info, sql, params) => {
|
|
49
|
+
if (!info.outermost && context.active().getValue(INSIDE_DB))
|
|
50
|
+
return null;
|
|
51
|
+
if (info.requireParent && !outsideRequests && !trace.getSpan(context.active()))
|
|
52
|
+
return null;
|
|
53
|
+
const attributes = dbAttributes(info, sql, params, redactKeys);
|
|
54
|
+
const span = tracer.startSpan(spanName(attributes), { kind: SpanKind.CLIENT, attributes });
|
|
55
|
+
const ctx = trace.setSpan(context.active(), span).setValue(INSIDE_DB, true);
|
|
56
|
+
const end = (result) => {
|
|
57
|
+
const rows = rowsIn(info, result);
|
|
58
|
+
if (rows !== undefined)
|
|
59
|
+
span.setAttribute("db.response.returned_rows", rows);
|
|
60
|
+
span.end();
|
|
61
|
+
};
|
|
62
|
+
const fail = (err) => {
|
|
63
|
+
recordOn(span, err);
|
|
64
|
+
span.end();
|
|
65
|
+
};
|
|
66
|
+
return { ctx, end, fail };
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
/** Run a call (sync, promise, or with a trailing callback) inside a database span. Returns what the call returns. */
|
|
70
|
+
export function runTraced(span, args, invoke) {
|
|
71
|
+
if (!span)
|
|
72
|
+
return invoke(args);
|
|
73
|
+
const last = args[args.length - 1];
|
|
74
|
+
if (typeof last === "function") {
|
|
75
|
+
const callback = (err, ...rest) => {
|
|
76
|
+
if (err)
|
|
77
|
+
span.fail(err);
|
|
78
|
+
else
|
|
79
|
+
span.end(rest[0]);
|
|
80
|
+
return last(err, ...rest);
|
|
81
|
+
};
|
|
82
|
+
return context.with(span.ctx, () => invoke([...args.slice(0, -1), callback]));
|
|
83
|
+
}
|
|
84
|
+
try {
|
|
85
|
+
const out = context.with(span.ctx, () => invoke(args));
|
|
86
|
+
if (isThenable(out))
|
|
87
|
+
out.then(span.end, span.fail);
|
|
88
|
+
else
|
|
89
|
+
span.end(out);
|
|
90
|
+
return out;
|
|
91
|
+
}
|
|
92
|
+
catch (err) {
|
|
93
|
+
span.fail(err);
|
|
94
|
+
throw err;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
/** Run WizeLens's own database work (its trace storage) so the adapters never trace it. */
|
|
98
|
+
export const untraced = (fn) => context.with(ROOT_CONTEXT.setValue(INSIDE_DB, true), fn);
|
|
99
|
+
/** Run `fn` so that driver spans inside it carry `label` as their adapter. */
|
|
100
|
+
export const withAdapterLabel = (label, fn) => context.with(context.active().setValue(ADAPTER_LABEL, label), fn);
|
|
101
|
+
/** Build `traceDb`: wraps one database call (sync or async) in a db span. */
|
|
102
|
+
export function createTraceDb(start) {
|
|
103
|
+
return function traceDb(info, sql, params, fn) {
|
|
104
|
+
return runTraced(start(info, sql, params), [], () => fn());
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
//# sourceMappingURL=db.js.map
|
package/dist/db.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"db.js","sourceRoot":"","sources":["../src/db.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { WizeLens, WizeLensOptions } from "./types.js";
|
|
2
|
+
/** The instance used when WizeLens is off: every call passes through or does nothing. */
|
|
3
|
+
export declare function disabledWizeLens(options: WizeLensOptions, basePath: string): WizeLens;
|
|
4
|
+
//# sourceMappingURL=disabled.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"disabled.d.ts","sourceRoot":"","sources":["../src/disabled.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAE5D,yFAAyF;AACzF,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,GAAG,QAAQ,CAmBrF"}
|
package/dist/disabled.js
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { trace } from "@opentelemetry/api";
|
|
2
|
+
import { noopLogger } from "./logger.js";
|
|
3
|
+
import { TraceStore } from "./store.js";
|
|
4
|
+
/** The instance used when WizeLens is off: every call passes through or does nothing. */
|
|
5
|
+
export function disabledWizeLens(options, basePath) {
|
|
6
|
+
return {
|
|
7
|
+
enabled: false,
|
|
8
|
+
serviceName: options.serviceName,
|
|
9
|
+
basePath,
|
|
10
|
+
store: new TraceStore({ maxTraces: 1 }),
|
|
11
|
+
storagePath: null,
|
|
12
|
+
tracer: trace.getTracer("@wizeworks/lens-node"),
|
|
13
|
+
middleware: (_req, _res, next) => next(),
|
|
14
|
+
errorMiddleware: (err, _req, _res, next) => next(err),
|
|
15
|
+
handler: async () => false,
|
|
16
|
+
traceDb: (_info, _sql, _params, fn) => fn(),
|
|
17
|
+
logger: noopLogger(),
|
|
18
|
+
recordException: () => { },
|
|
19
|
+
tag: () => { },
|
|
20
|
+
setUser: () => { },
|
|
21
|
+
getTrace: async () => undefined,
|
|
22
|
+
shutdown: async () => { },
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=disabled.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"disabled.js","sourceRoot":"","sources":["../src/disabled.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAGxC,yFAAyF;AACzF,MAAM,UAAU,gBAAgB,CAAC,OAAwB,EAAE,QAAgB;IACzE,OAAO;QACL,OAAO,EAAE,KAAK;QACd,WAAW,EAAE,OAAO,CAAC,WAAW;QAChC,QAAQ;QACR,KAAK,EAAE,IAAI,UAAU,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC;QACvC,WAAW,EAAE,IAAI;QACjB,MAAM,EAAE,KAAK,CAAC,SAAS,CAAC,sBAAsB,CAAC;QAC/C,UAAU,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE;QACxC,eAAe,EAAE,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC;QACrD,OAAO,EAAE,KAAK,IAAI,EAAE,CAAC,KAAK;QAC1B,OAAO,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE;QAC3C,MAAM,EAAE,UAAU,EAAE;QACpB,eAAe,EAAE,GAAG,EAAE,GAAE,CAAC;QACzB,GAAG,EAAE,GAAG,EAAE,GAAE,CAAC;QACb,OAAO,EAAE,GAAG,EAAE,GAAE,CAAC;QACjB,QAAQ,EAAE,KAAK,IAAI,EAAE,CAAC,SAAS;QAC/B,QAAQ,EAAE,KAAK,IAAI,EAAE,GAAE,CAAC;KACzB,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { ServerResponse } from "node:http";
|
|
2
|
+
/** The header value with our two names added, without repeats. */
|
|
3
|
+
export declare function withOurNames(value: unknown): string;
|
|
4
|
+
/** Keep our names in Access-Control-Expose-Headers, even when a CORS layer sets that header after us. */
|
|
5
|
+
export declare function keepExposeHeaders(res: ServerResponse): void;
|
|
6
|
+
//# sourceMappingURL=expose-headers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"expose-headers.d.ts","sourceRoot":"","sources":["../src/expose-headers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAMhD,kEAAkE;AAClE,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAKnD;AAkBD,yGAAyG;AACzG,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,cAAc,GAAG,IAAI,CAS3D"}
|