@wizeworks/lens-node 0.3.0-alpha.2 → 0.3.0-alpha.4
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/dist/adapters/elasticsearch.d.ts +21 -0
- package/dist/adapters/elasticsearch.d.ts.map +1 -0
- package/dist/adapters/elasticsearch.js +93 -0
- package/dist/adapters/elasticsearch.js.map +1 -0
- package/dist/adapters/ioredis.d.ts +4 -0
- package/dist/adapters/ioredis.d.ts.map +1 -0
- package/dist/adapters/ioredis.js +60 -0
- package/dist/adapters/ioredis.js.map +1 -0
- package/dist/adapters/mongodb-shape.d.ts +16 -0
- package/dist/adapters/mongodb-shape.d.ts.map +1 -0
- package/dist/adapters/mongodb-shape.js +81 -0
- package/dist/adapters/mongodb-shape.js.map +1 -0
- package/dist/adapters/mongodb.d.ts +4 -0
- package/dist/adapters/mongodb.d.ts.map +1 -0
- package/dist/adapters/mongodb.js +95 -0
- package/dist/adapters/mongodb.js.map +1 -0
- package/dist/adapters/nosql.d.ts +14 -0
- package/dist/adapters/nosql.d.ts.map +1 -0
- package/dist/adapters/nosql.js +61 -0
- package/dist/adapters/nosql.js.map +1 -0
- package/dist/adapters/redis-shape.d.ts +31 -0
- package/dist/adapters/redis-shape.d.ts.map +1 -0
- package/dist/adapters/redis-shape.js +80 -0
- package/dist/adapters/redis-shape.js.map +1 -0
- package/dist/adapters/redis.d.ts +4 -0
- package/dist/adapters/redis.d.ts.map +1 -0
- package/dist/adapters/redis.js +93 -0
- package/dist/adapters/redis.js.map +1 -0
- package/dist/adapters/registry.d.ts +2 -0
- package/dist/adapters/registry.d.ts.map +1 -1
- package/dist/adapters/registry.js +2 -0
- package/dist/adapters/registry.js.map +1 -1
- package/dist/api.d.ts +5 -1
- package/dist/api.d.ts.map +1 -1
- package/dist/api.js +25 -7
- package/dist/api.js.map +1 -1
- package/dist/auto/config.d.ts +14 -0
- package/dist/auto/config.d.ts.map +1 -0
- package/dist/auto/config.js +51 -0
- package/dist/auto/config.js.map +1 -0
- package/dist/auto/esm-loader.d.ts +10 -0
- package/dist/auto/esm-loader.d.ts.map +1 -0
- package/dist/auto/esm-loader.js +10 -0
- package/dist/auto/esm-loader.js.map +1 -0
- package/dist/auto/esm-source.d.ts +15 -0
- package/dist/auto/esm-source.d.ts.map +1 -0
- package/dist/auto/esm-source.js +23 -0
- package/dist/auto/esm-source.js.map +1 -0
- package/dist/auto/frameworks.d.ts +3 -0
- package/dist/auto/frameworks.d.ts.map +1 -0
- package/dist/auto/frameworks.js +112 -0
- package/dist/auto/frameworks.js.map +1 -0
- package/dist/auto/handle.d.ts +7 -0
- package/dist/auto/handle.d.ts.map +1 -0
- package/dist/auto/handle.js +47 -0
- package/dist/auto/handle.js.map +1 -0
- package/dist/auto/hono.d.ts +3 -0
- package/dist/auto/hono.d.ts.map +1 -0
- package/dist/auto/hono.js +43 -0
- package/dist/auto/hono.js.map +1 -0
- package/dist/auto/http.d.ts +18 -0
- package/dist/auto/http.d.ts.map +1 -0
- package/dist/auto/http.js +77 -0
- package/dist/auto/http.js.map +1 -0
- package/dist/auto/install.d.ts +5 -0
- package/dist/auto/install.d.ts.map +1 -0
- package/dist/auto/install.js +26 -0
- package/dist/auto/install.js.map +1 -0
- package/dist/auto/libraries.d.ts +3 -0
- package/dist/auto/libraries.d.ts.map +1 -0
- package/dist/auto/libraries.js +108 -0
- package/dist/auto/libraries.js.map +1 -0
- package/dist/auto/module-hooks.d.ts +14 -0
- package/dist/auto/module-hooks.d.ts.map +1 -0
- package/dist/auto/module-hooks.js +90 -0
- package/dist/auto/module-hooks.js.map +1 -0
- package/dist/auto/nest.d.ts +7 -0
- package/dist/auto/nest.d.ts.map +1 -0
- package/dist/auto/nest.js +26 -0
- package/dist/auto/nest.js.map +1 -0
- package/dist/auto/owner.d.ts +19 -0
- package/dist/auto/owner.d.ts.map +1 -0
- package/dist/auto/owner.js +52 -0
- package/dist/auto/owner.js.map +1 -0
- package/dist/auto/prisma.d.ts +3 -0
- package/dist/auto/prisma.d.ts.map +1 -0
- package/dist/auto/prisma.js +55 -0
- package/dist/auto/prisma.js.map +1 -0
- package/dist/auto/sqlite.d.ts +3 -0
- package/dist/auto/sqlite.d.ts.map +1 -0
- package/dist/auto/sqlite.js +31 -0
- package/dist/auto/sqlite.js.map +1 -0
- package/dist/auto/state.d.ts +14 -0
- package/dist/auto/state.d.ts.map +1 -0
- package/dist/auto/state.js +16 -0
- package/dist/auto/state.js.map +1 -0
- package/dist/auto.d.ts +2 -0
- package/dist/auto.d.ts.map +1 -0
- package/dist/auto.js +4 -0
- package/dist/auto.js.map +1 -0
- package/dist/capture.d.ts +3 -1
- package/dist/capture.d.ts.map +1 -1
- package/dist/capture.js +4 -4
- package/dist/capture.js.map +1 -1
- package/dist/client-attributes.d.ts +19 -0
- package/dist/client-attributes.d.ts.map +1 -0
- package/dist/client-attributes.js +56 -0
- package/dist/client-attributes.js.map +1 -0
- package/dist/client-spans.d.ts +6 -4
- package/dist/client-spans.d.ts.map +1 -1
- package/dist/client-spans.js +20 -9
- package/dist/client-spans.js.map +1 -1
- package/dist/db.js +1 -1
- package/dist/db.js.map +1 -1
- package/dist/frameworks/fastify.d.ts.map +1 -1
- package/dist/frameworks/fastify.js +4 -2
- package/dist/frameworks/fastify.js.map +1 -1
- package/dist/frameworks/hono.d.ts +16 -0
- package/dist/frameworks/hono.d.ts.map +1 -1
- package/dist/frameworks/hono.js +4 -4
- package/dist/frameworks/hono.js.map +1 -1
- package/dist/frameworks/koa.d.ts +2 -0
- package/dist/frameworks/koa.d.ts.map +1 -1
- package/dist/frameworks/koa.js +4 -4
- package/dist/frameworks/koa.js.map +1 -1
- package/dist/frameworks/nest-errors.d.ts +10 -0
- package/dist/frameworks/nest-errors.d.ts.map +1 -0
- package/dist/frameworks/nest-errors.js +75 -0
- package/dist/frameworks/nest-errors.js.map +1 -0
- package/dist/frameworks/nest-route.d.ts +31 -0
- package/dist/frameworks/nest-route.d.ts.map +1 -0
- package/dist/frameworks/nest-route.js +58 -0
- package/dist/frameworks/nest-route.js.map +1 -0
- package/dist/frameworks/nest.d.ts +16 -0
- package/dist/frameworks/nest.d.ts.map +1 -0
- package/dist/frameworks/nest.js +73 -0
- package/dist/frameworks/nest.js.map +1 -0
- package/dist/frameworks/node-server.d.ts +3 -0
- package/dist/frameworks/node-server.d.ts.map +1 -1
- package/dist/frameworks/node-server.js +5 -3
- package/dist/frameworks/node-server.js.map +1 -1
- package/dist/graphql/document.d.ts +13 -0
- package/dist/graphql/document.d.ts.map +1 -0
- package/dist/graphql/document.js +62 -0
- package/dist/graphql/document.js.map +1 -0
- package/dist/graphql/index.d.ts +11 -0
- package/dist/graphql/index.d.ts.map +1 -0
- package/dist/graphql/index.js +83 -0
- package/dist/graphql/index.js.map +1 -0
- package/dist/graphql/operation.d.ts +37 -0
- package/dist/graphql/operation.d.ts.map +1 -0
- package/dist/graphql/operation.js +58 -0
- package/dist/graphql/operation.js.map +1 -0
- package/dist/graphql/resolvers.d.ts +5 -0
- package/dist/graphql/resolvers.d.ts.map +1 -0
- package/dist/graphql/resolvers.js +79 -0
- package/dist/graphql/resolvers.js.map +1 -0
- package/dist/graphql/shared.d.ts +14 -0
- package/dist/graphql/shared.d.ts.map +1 -0
- package/dist/graphql/shared.js +21 -0
- package/dist/graphql/shared.js.map +1 -0
- package/dist/http-client.d.ts +8 -0
- package/dist/http-client.d.ts.map +1 -0
- package/dist/http-client.js +132 -0
- package/dist/http-client.js.map +1 -0
- package/dist/hub-connect.d.ts +2 -0
- package/dist/hub-connect.d.ts.map +1 -1
- package/dist/hub-connect.js +3 -1
- package/dist/hub-connect.js.map +1 -1
- package/dist/index.d.ts +12 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +9 -0
- package/dist/index.js.map +1 -1
- package/dist/info.d.ts +2 -0
- package/dist/info.d.ts.map +1 -1
- package/dist/info.js +1 -1
- package/dist/info.js.map +1 -1
- package/dist/kit.d.ts +3 -1
- package/dist/kit.d.ts.map +1 -1
- package/dist/kit.js +1 -0
- package/dist/kit.js.map +1 -1
- package/dist/logger.d.ts +4 -4
- package/dist/logger.d.ts.map +1 -1
- package/dist/logger.js +11 -7
- package/dist/logger.js.map +1 -1
- package/dist/logs/bunyan.d.ts +1 -1
- package/dist/logs/bunyan.d.ts.map +1 -1
- package/dist/logs/bunyan.js +2 -3
- package/dist/logs/bunyan.js.map +1 -1
- package/dist/logs/consola.d.ts +1 -1
- package/dist/logs/consola.d.ts.map +1 -1
- package/dist/logs/consola.js +1 -1
- package/dist/logs/consola.js.map +1 -1
- package/dist/logs/console.d.ts +1 -1
- package/dist/logs/console.d.ts.map +1 -1
- package/dist/logs/console.js +5 -3
- package/dist/logs/console.js.map +1 -1
- package/dist/logs/otel.d.ts.map +1 -1
- package/dist/logs/otel.js +1 -3
- package/dist/logs/otel.js.map +1 -1
- package/dist/logs/pino.d.ts +1 -1
- package/dist/logs/pino.d.ts.map +1 -1
- package/dist/logs/pino.js +2 -3
- package/dist/logs/pino.js.map +1 -1
- package/dist/logs/winston.d.ts +1 -1
- package/dist/logs/winston.d.ts.map +1 -1
- package/dist/logs/winston.js +2 -3
- package/dist/logs/winston.js.map +1 -1
- package/dist/loose-logs.d.ts +13 -0
- package/dist/loose-logs.d.ts.map +1 -0
- package/dist/loose-logs.js +21 -0
- package/dist/loose-logs.js.map +1 -0
- package/dist/mcp-find.d.ts +2 -2
- package/dist/mcp-find.d.ts.map +1 -1
- package/dist/mcp-find.js +68 -26
- package/dist/mcp-find.js.map +1 -1
- package/dist/mcp-memory.d.ts +7 -0
- package/dist/mcp-memory.d.ts.map +1 -0
- package/dist/mcp-memory.js +10 -0
- package/dist/mcp-memory.js.map +1 -0
- package/dist/mcp-metrics.d.ts +2 -2
- package/dist/mcp-metrics.d.ts.map +1 -1
- package/dist/mcp-metrics.js +11 -9
- package/dist/mcp-metrics.js.map +1 -1
- package/dist/mcp-overview.d.ts +5 -0
- package/dist/mcp-overview.d.ts.map +1 -0
- package/dist/mcp-overview.js +71 -0
- package/dist/mcp-overview.js.map +1 -0
- package/dist/mcp-page.d.ts +28 -0
- package/dist/mcp-page.d.ts.map +1 -0
- package/dist/mcp-page.js +77 -0
- package/dist/mcp-page.js.map +1 -0
- package/dist/mcp-problems.d.ts +5 -0
- package/dist/mcp-problems.d.ts.map +1 -0
- package/dist/mcp-problems.js +56 -0
- package/dist/mcp-problems.js.map +1 -0
- package/dist/mcp-projects.d.ts +11 -0
- package/dist/mcp-projects.d.ts.map +1 -0
- package/dist/mcp-projects.js +54 -0
- package/dist/mcp-projects.js.map +1 -0
- package/dist/mcp-search.d.ts +5 -0
- package/dist/mcp-search.d.ts.map +1 -0
- package/dist/mcp-search.js +53 -0
- package/dist/mcp-search.js.map +1 -0
- package/dist/mcp-shared.d.ts +83 -4
- package/dist/mcp-shared.d.ts.map +1 -1
- package/dist/mcp-shared.js +3 -0
- package/dist/mcp-shared.js.map +1 -1
- package/dist/mcp-store.d.ts +27 -0
- package/dist/mcp-store.d.ts.map +1 -0
- package/dist/mcp-store.js +56 -0
- package/dist/mcp-store.js.map +1 -0
- package/dist/mcp-tags.d.ts +8 -0
- package/dist/mcp-tags.d.ts.map +1 -0
- package/dist/mcp-tags.js +22 -0
- package/dist/mcp-tags.js.map +1 -0
- package/dist/mcp-traces.d.ts +2 -2
- package/dist/mcp-traces.d.ts.map +1 -1
- package/dist/mcp-traces.js +37 -25
- package/dist/mcp-traces.js.map +1 -1
- package/dist/mcp-traffic.d.ts +5 -0
- package/dist/mcp-traffic.d.ts.map +1 -0
- package/dist/mcp-traffic.js +87 -0
- package/dist/mcp-traffic.js.map +1 -0
- package/dist/mcp.d.ts +7 -4
- package/dist/mcp.d.ts.map +1 -1
- package/dist/mcp.js +27 -8
- package/dist/mcp.js.map +1 -1
- package/dist/messaging/bullmq.d.ts +4 -0
- package/dist/messaging/bullmq.d.ts.map +1 -0
- package/dist/messaging/bullmq.js +137 -0
- package/dist/messaging/bullmq.js.map +1 -0
- package/dist/messaging/shared.d.ts +10 -4
- package/dist/messaging/shared.d.ts.map +1 -1
- package/dist/messaging/shared.js +13 -4
- package/dist/messaging/shared.js.map +1 -1
- package/dist/messaging/sqs-message.d.ts +35 -0
- package/dist/messaging/sqs-message.d.ts.map +1 -0
- package/dist/messaging/sqs-message.js +66 -0
- package/dist/messaging/sqs-message.js.map +1 -0
- package/dist/messaging/sqs.d.ts +4 -0
- package/dist/messaging/sqs.d.ts.map +1 -0
- package/dist/messaging/sqs.js +104 -0
- package/dist/messaging/sqs.js.map +1 -0
- package/dist/processor.d.ts +2 -1
- package/dist/processor.d.ts.map +1 -1
- package/dist/processor.js +8 -3
- package/dist/processor.js.map +1 -1
- package/dist/request-capture.d.ts +7 -1
- package/dist/request-capture.d.ts.map +1 -1
- package/dist/request-capture.js +14 -1
- package/dist/request-capture.js.map +1 -1
- package/dist/request-naming.d.ts +8 -0
- package/dist/request-naming.d.ts.map +1 -0
- package/dist/request-naming.js +29 -0
- package/dist/request-naming.js.map +1 -0
- package/dist/sampling.d.ts.map +1 -1
- package/dist/sampling.js +2 -2
- package/dist/sampling.js.map +1 -1
- package/dist/search-api.d.ts +8 -0
- package/dist/search-api.d.ts.map +1 -0
- package/dist/search-api.js +21 -0
- package/dist/search-api.js.map +1 -0
- package/dist/sourcemaps.d.ts +15 -0
- package/dist/sourcemaps.d.ts.map +1 -0
- package/dist/sourcemaps.js +68 -0
- package/dist/sourcemaps.js.map +1 -0
- package/dist/spans.d.ts +3 -0
- package/dist/spans.d.ts.map +1 -1
- package/dist/spans.js +9 -1
- package/dist/spans.js.map +1 -1
- package/dist/store-entries.d.ts +34 -0
- package/dist/store-entries.d.ts.map +1 -0
- package/dist/store-entries.js +70 -0
- package/dist/store-entries.js.map +1 -0
- package/dist/store.d.ts +4 -1
- package/dist/store.d.ts.map +1 -1
- package/dist/store.js +19 -22
- package/dist/store.js.map +1 -1
- package/dist/tags-api.d.ts +9 -0
- package/dist/tags-api.d.ts.map +1 -0
- package/dist/tags-api.js +16 -0
- package/dist/tags-api.js.map +1 -0
- package/dist/tracing.d.ts +6 -0
- package/dist/tracing.d.ts.map +1 -1
- package/dist/tracing.js +11 -7
- package/dist/tracing.js.map +1 -1
- package/dist/types.d.ts +16 -2
- package/dist/types.d.ts.map +1 -1
- package/dist/ui.d.ts.map +1 -1
- package/dist/ui.js +3 -2
- package/dist/ui.js.map +1 -1
- package/dist/wizelens.d.ts +3 -1
- package/dist/wizelens.d.ts.map +1 -1
- package/dist/wizelens.js +29 -13
- package/dist/wizelens.js.map +1 -1
- package/package.json +14 -4
package/dist/mcp-traces.js
CHANGED
|
@@ -1,51 +1,63 @@
|
|
|
1
|
-
import { errorInfo, isErrorSpan } from "@wizeworks/lens-core";
|
|
1
|
+
import { errorInfo, isErrorSpan, parseSearch } from "@wizeworks/lens-core";
|
|
2
2
|
import { z } from "zod";
|
|
3
3
|
import { json, READ_ONLY } from "./mcp-shared.js";
|
|
4
|
-
|
|
4
|
+
import { allOf, findAll, rangeArg } from "./mcp-store.js";
|
|
5
|
+
const failed = (error) => ({ ...json({ error }), isError: true });
|
|
6
|
+
function registerListTraces(server, src) {
|
|
5
7
|
const inputSchema = {
|
|
8
|
+
...src.arg,
|
|
6
9
|
limit: z.number().int().min(1).max(500).optional().describe("Max traces. Default 20."),
|
|
7
10
|
minDurationMs: z.number().min(0).optional().describe("Only traces at least this long."),
|
|
8
11
|
status: z.enum(["unset", "ok", "error"]).optional().describe("Only traces with this status."),
|
|
12
|
+
q: z.string().max(2000).optional().describe("Only traces that match this search (the `search` tool's language)."),
|
|
13
|
+
range: rangeArg("to look"),
|
|
9
14
|
};
|
|
10
|
-
const description = "List
|
|
15
|
+
const description = "List request traces captured by WizeLens, newest first, from the whole store.";
|
|
11
16
|
server.registerTool("list_traces", { description, inputSchema, annotations: READ_ONLY }, async (args) => {
|
|
12
|
-
|
|
13
|
-
const
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
.slice(0, args.limit ?? 20);
|
|
18
|
-
return json(items);
|
|
17
|
+
const data = await src.open("list_traces", args);
|
|
18
|
+
const where = allOf([args.minDurationMs === undefined ? null : `duration:>=${args.minDurationMs}ms`, args.status && `status:${args.status}`, args.q]);
|
|
19
|
+
if (!where.ok)
|
|
20
|
+
return failed(where.error);
|
|
21
|
+
return json(await findAll(data, "traces", where.node, args.range ?? "24h", args.limit ?? 20));
|
|
19
22
|
});
|
|
20
23
|
}
|
|
21
|
-
function registerGetTrace(server,
|
|
24
|
+
function registerGetTrace(server, src) {
|
|
22
25
|
const inputSchema = {
|
|
26
|
+
...src.arg,
|
|
23
27
|
traceId: z.string().regex(/^[0-9a-f]{32}$/).describe("32 hex trace id."),
|
|
24
28
|
federate: z.boolean().optional().describe("Include spans from downstream services. Default true."),
|
|
25
29
|
};
|
|
26
30
|
const description = "Get one trace with all spans and logs (redacted). Federates across services by default.";
|
|
27
31
|
server.registerTool("get_trace", { description, inputSchema, annotations: READ_ONLY }, async (args) => {
|
|
28
|
-
|
|
32
|
+
const data = await src.open("get_trace", args);
|
|
29
33
|
const trace = await data.get(args.traceId, args.federate ?? true);
|
|
30
34
|
return trace ? json(trace) : { ...json({ error: "trace not found" }), isError: true };
|
|
31
35
|
});
|
|
32
36
|
}
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
const
|
|
37
|
+
/** The error spans of the newest failed traces, up to `limit`, with their stack traces. */
|
|
38
|
+
async function errorsOf(data, range, limit) {
|
|
39
|
+
const rows = [];
|
|
40
|
+
for (const item of await findAll(data, "traces", parseSearch("error:true"), range, limit)) {
|
|
41
|
+
const trace = await data.get(item.traceId, false);
|
|
42
|
+
for (const s of trace?.spans.filter(isErrorSpan) ?? [])
|
|
43
|
+
rows.push({ traceId: item.traceId, ...errorInfo(s) });
|
|
44
|
+
if (rows.length >= limit)
|
|
45
|
+
break;
|
|
46
|
+
}
|
|
47
|
+
return rows.slice(0, limit);
|
|
48
|
+
}
|
|
49
|
+
function registerGetErrors(server, src) {
|
|
50
|
+
const inputSchema = { ...src.arg, limit: z.number().int().min(1).max(500).optional().describe("Default 20."), range: rangeArg("to look") };
|
|
51
|
+
const description = "List errors and exceptions with their stack traces, newest first, from the whole store.";
|
|
36
52
|
server.registerTool("get_errors", { description, inputSchema, annotations: READ_ONLY }, async (args) => {
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
.all()
|
|
40
|
-
.flatMap((t) => t.spans.filter(isErrorSpan).map((s) => ({ traceId: t.traceId, ...errorInfo(s) })))
|
|
41
|
-
.slice(0, args.limit ?? 20);
|
|
42
|
-
return json(rows);
|
|
53
|
+
const data = await src.open("get_errors", args);
|
|
54
|
+
return json(await errorsOf(data, args.range ?? "24h", args.limit ?? 20));
|
|
43
55
|
});
|
|
44
56
|
}
|
|
45
57
|
/** list_traces, get_trace, and get_errors. */
|
|
46
|
-
export function registerTraceTools(server,
|
|
47
|
-
registerListTraces(server,
|
|
48
|
-
registerGetTrace(server,
|
|
49
|
-
registerGetErrors(server,
|
|
58
|
+
export function registerTraceTools(server, src) {
|
|
59
|
+
registerListTraces(server, src);
|
|
60
|
+
registerGetTrace(server, src);
|
|
61
|
+
registerGetErrors(server, src);
|
|
50
62
|
}
|
|
51
63
|
//# sourceMappingURL=mcp-traces.js.map
|
package/dist/mcp-traces.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp-traces.js","sourceRoot":"","sources":["../src/mcp-traces.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"mcp-traces.js","sourceRoot":"","sources":["../src/mcp-traces.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
2
|
+
import { type Source } from "./mcp-shared.js";
|
|
3
|
+
/** get_timeseries and group_requests: exact traffic from the host's stats, where the host serves page models. */
|
|
4
|
+
export declare function registerTrafficTools(server: McpServer, src: Source): void;
|
|
5
|
+
//# sourceMappingURL=mcp-traffic.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-traffic.d.ts","sourceRoot":"","sources":["../src/mcp-traffic.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAGzE,OAAO,EAAwD,KAAK,MAAM,EAAE,MAAM,iBAAiB,CAAC;AA0FpG,iHAAiH;AACjH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI,CAIzE"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { json, READ_ONLY } from "./mcp-shared.js";
|
|
3
|
+
const RANGES = ["1h", "6h", "24h", "7d", "30d"];
|
|
4
|
+
const SORTS = { requests: (e) => e.requests, errors: (e) => e.errors, errorRate: (e) => e.errorRatePercent, p95: (e) => e.p95Ms ?? -1, avg: (e) => e.avgMs ?? -1 };
|
|
5
|
+
const MAX_ENDPOINTS = 200;
|
|
6
|
+
const iso = (ms) => new Date(ms).toISOString();
|
|
7
|
+
const round = (v) => (v == null ? null : Math.round(v * 100) / 100);
|
|
8
|
+
const statsOut = (s) => ({ requests: s.requests, errors: s.errors, errorRatePercent: round(s.errorRatePercent), avgMs: round(s.avgMs), p95Ms: round(s.p95Ms) });
|
|
9
|
+
const windowArgs = {
|
|
10
|
+
range: z.enum(RANGES).optional().describe("Time range ending now. Default 24h. Ignored when `from` and `to` are given."),
|
|
11
|
+
from: z.string().optional().describe("Start of a custom window, ISO 8601 (for example 2026-10-19T00:00:00Z). Use with `to`."),
|
|
12
|
+
to: z.string().optional().describe("End of a custom window, ISO 8601. Use with `from`."),
|
|
13
|
+
service: z.string().optional().describe("Only this service (its name, as get_overview lists it)."),
|
|
14
|
+
};
|
|
15
|
+
/** Page params from the tool's window and filter arguments. A bad time is an error the agent can read. */
|
|
16
|
+
function paramsOf(args, more = {}) {
|
|
17
|
+
const out = { ...more, ...(args.service ? { service: args.service } : {}) };
|
|
18
|
+
if (!args.from && !args.to)
|
|
19
|
+
return out;
|
|
20
|
+
const from = Date.parse(args.from ?? "");
|
|
21
|
+
const to = Date.parse(args.to ?? "");
|
|
22
|
+
if (!Number.isFinite(from) || !Number.isFinite(to) || to <= from)
|
|
23
|
+
throw new Error("Give `from` and `to` as ISO 8601 times, with `to` after `from`.");
|
|
24
|
+
return { ...out, from: String(from), to: String(to) };
|
|
25
|
+
}
|
|
26
|
+
const windowOut = (m) => ({ from: iso(m.meta.window.from), to: iso(m.meta.window.to), stillSettling: m.meta.settling ?? 0 });
|
|
27
|
+
function seriesOut(m) {
|
|
28
|
+
const scope = m.scope.found ? m.scope : { ...m.scope, note: `${m.scope.service} had no traffic in this window. get_overview lists the services.` };
|
|
29
|
+
const points = m.points.map((p) => ({ start: iso(p.start), ...statsOut(p) }));
|
|
30
|
+
return { window: windowOut(m), scope, bucketMinutes: round(m.bucketMs / 60_000), totals: statsOut(m.totals), points };
|
|
31
|
+
}
|
|
32
|
+
/** Endpoints sorted and cut, and the totals before the cut. */
|
|
33
|
+
function endpointsOut(list, sort, limit, minRequests) {
|
|
34
|
+
const kept = list.filter((e) => e.requests >= minRequests);
|
|
35
|
+
const by = SORTS[sort];
|
|
36
|
+
const sorted = [...kept].sort((a, b) => by(b) - by(a) || b.requests - a.requests);
|
|
37
|
+
const rows = sorted.slice(0, limit).map((e) => ({ ...(e.project ? { project: e.project } : {}), service: e.service, endpoint: e.endpoint, ...statsOut(e) }));
|
|
38
|
+
return { endpoints: kept.length, requests: kept.reduce((t, e) => t + e.requests, 0), shown: rows.length, rows };
|
|
39
|
+
}
|
|
40
|
+
/** One project's model, or each project's on a multi-project host when no `project` is named. */
|
|
41
|
+
async function modelsOf(src, tool, args, params) {
|
|
42
|
+
const read = (data) => data.page("traffic", args.range ?? "24h", params);
|
|
43
|
+
if (args.project || !src.each)
|
|
44
|
+
return [{ project: null, model: await read(await src.open(tool, args)) }];
|
|
45
|
+
const all = await src.each(tool, args);
|
|
46
|
+
return Promise.all(all.map(async ({ project, data }) => ({ project, model: await read(data) })));
|
|
47
|
+
}
|
|
48
|
+
function registerTimeseries(server, src) {
|
|
49
|
+
const inputSchema = {
|
|
50
|
+
...src.arg,
|
|
51
|
+
...windowArgs,
|
|
52
|
+
endpoint: z.string().optional().describe('Only this endpoint, as group_requests lists it (for example "GET /orders/{id}"). With or without `service`.'),
|
|
53
|
+
buckets: z.enum(["16", "24", "48"]).optional().describe("Buckets in the window. Default 24 (hourly over 24h)."),
|
|
54
|
+
};
|
|
55
|
+
const description = "Exact request counts over time: requests, errors, error rate, average, and p95 duration per bucket, from WizeLens's own counts (not a sample). For every request, one service, or one endpoint, over a range or a custom from–to window. Good for traffic and error charts.";
|
|
56
|
+
server.registerTool("get_timeseries", { description, inputSchema, annotations: READ_ONLY }, async (args) => {
|
|
57
|
+
const params = paramsOf(args, { buckets: args.buckets ?? "24", ...(args.endpoint ? { endpoint: args.endpoint } : {}) });
|
|
58
|
+
const models = await modelsOf(src, "get_timeseries", args, params);
|
|
59
|
+
if (models.length === 1 && !models[0].project)
|
|
60
|
+
return json(seriesOut(models[0].model));
|
|
61
|
+
return json({ projects: models.map(({ project, model }) => ({ project: project?.name, projectId: project?.id, ...seriesOut(model) })) });
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
function registerGroupRequests(server, src) {
|
|
65
|
+
const inputSchema = {
|
|
66
|
+
...src.arg,
|
|
67
|
+
...windowArgs,
|
|
68
|
+
sort: z.enum(Object.keys(SORTS)).optional().describe("Order: requests (default), errors, errorRate, p95, or avg."),
|
|
69
|
+
limit: z.number().int().min(1).max(MAX_ENDPOINTS).optional().describe("Endpoints to return. Default 50."),
|
|
70
|
+
minRequests: z.number().int().min(0).optional().describe("Leave out endpoints with fewer requests, for example when sorting by p95."),
|
|
71
|
+
};
|
|
72
|
+
const description = "Requests grouped by endpoint: count, errors, error rate, average, and p95 duration of every endpoint of your APIs and web apps, from WizeLens's own counts (not a sample). Over a range or a custom from–to window; without `project` on a multi-project host, across every project.";
|
|
73
|
+
server.registerTool("group_requests", { description, inputSchema, annotations: READ_ONLY }, async (args) => {
|
|
74
|
+
const models = await modelsOf(src, "group_requests", args, paramsOf(args));
|
|
75
|
+
const list = models.flatMap(({ project, model }) => model.endpoints.map((e) => ({ ...e, ...(project ? { project: project.name } : {}) })));
|
|
76
|
+
const window = models[0] ? windowOut(models[0].model) : null;
|
|
77
|
+
return json({ window, ...endpointsOut(list, args.sort ?? "requests", args.limit ?? 50, args.minRequests ?? 0) });
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
/** get_timeseries and group_requests: exact traffic from the host's stats, where the host serves page models. */
|
|
81
|
+
export function registerTrafficTools(server, src) {
|
|
82
|
+
if (!src.defaults.overview)
|
|
83
|
+
return;
|
|
84
|
+
registerTimeseries(server, src);
|
|
85
|
+
registerGroupRequests(server, src);
|
|
86
|
+
}
|
|
87
|
+
//# sourceMappingURL=mcp-traffic.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-traffic.js","sourceRoot":"","sources":["../src/mcp-traffic.ts"],"names":[],"mappings":"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"}
|
package/dist/mcp.d.ts
CHANGED
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
import type { IncomingMessage, ServerResponse } from "node:http";
|
|
2
|
-
import {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
2
|
+
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
3
|
+
import { type McpDataSource, type McpProjects } from "./mcp-shared.js";
|
|
4
|
+
export type { McpDataSource, McpProject, McpProjects, OverviewPage } from "./mcp-shared.js";
|
|
5
|
+
/** The MCP server with every tool the data allows. */
|
|
6
|
+
export declare function createMcpServer(data: McpDataSource | McpProjects): McpServer;
|
|
7
|
+
/** Handle one MCP streamable HTTP request in stateless mode, for one data source or several projects. */
|
|
8
|
+
export declare function handleMcp(data: McpDataSource | McpProjects, req: IncomingMessage, res: ServerResponse, body: unknown): Promise<void>;
|
|
6
9
|
//# sourceMappingURL=mcp.d.ts.map
|
package/dist/mcp.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp.d.ts","sourceRoot":"","sources":["../src/mcp.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"mcp.d.ts","sourceRoot":"","sources":["../src/mcp.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AACjE,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAQpE,OAAO,EAAE,KAAK,aAAa,EAAE,KAAK,WAAW,EAAe,MAAM,iBAAiB,CAAC;AAMpF,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAM5F,sDAAsD;AACtD,wBAAgB,eAAe,CAAC,IAAI,EAAE,aAAa,GAAG,WAAW,GAAG,SAAS,CAe5E;AAED,yGAAyG;AACzG,wBAAsB,SAAS,CAAC,IAAI,EAAE,aAAa,GAAG,WAAW,EAAE,GAAG,EAAE,eAAe,EAAE,GAAG,EAAE,cAAc,EAAE,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAS1I"}
|
package/dist/mcp.js
CHANGED
|
@@ -2,19 +2,38 @@ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
|
2
2
|
import { StreamableHTTPServerTransport } from "@modelcontextprotocol/sdk/server/streamableHttp.js";
|
|
3
3
|
import { registerFindTools } from "./mcp-find.js";
|
|
4
4
|
import { registerMetricTools } from "./mcp-metrics.js";
|
|
5
|
+
import { registerOverviewTool } from "./mcp-overview.js";
|
|
6
|
+
import { registerProblemTools } from "./mcp-problems.js";
|
|
7
|
+
import { registerPageTools } from "./mcp-page.js";
|
|
8
|
+
import { projectsSource, registerProjectTools, singleSource } from "./mcp-projects.js";
|
|
5
9
|
import {} from "./mcp-shared.js";
|
|
10
|
+
import { registerSearchTools } from "./mcp-search.js";
|
|
11
|
+
import { registerTagTools } from "./mcp-tags.js";
|
|
6
12
|
import { registerTraceTools } from "./mcp-traces.js";
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
+
import { registerTrafficTools } from "./mcp-traffic.js";
|
|
14
|
+
const isProjects = (d) => "projects" in d;
|
|
15
|
+
const MANY = "You can read several projects. Call list_projects, then pass `project` to the other tools. get_overview, get_timeseries, and group_requests without `project` cover all of them.";
|
|
16
|
+
/** The MCP server with every tool the data allows. */
|
|
17
|
+
export function createMcpServer(data) {
|
|
18
|
+
const many = isProjects(data) && data.projects.length > 1;
|
|
19
|
+
const server = new McpServer({ name: "wizelens", version: data.version }, many ? { instructions: MANY } : undefined);
|
|
20
|
+
const src = isProjects(data) ? projectsSource(data) : singleSource(data);
|
|
21
|
+
if (isProjects(data))
|
|
22
|
+
registerProjectTools(server, data);
|
|
23
|
+
registerTraceTools(server, src);
|
|
24
|
+
registerFindTools(server, src);
|
|
25
|
+
registerMetricTools(server, src);
|
|
26
|
+
registerSearchTools(server, src);
|
|
27
|
+
registerTagTools(server, src);
|
|
28
|
+
registerOverviewTool(server, src);
|
|
29
|
+
registerTrafficTools(server, src);
|
|
30
|
+
registerProblemTools(server, src);
|
|
31
|
+
registerPageTools(server, src);
|
|
13
32
|
return server;
|
|
14
33
|
}
|
|
15
|
-
/** Handle one MCP streamable HTTP request in stateless mode. */
|
|
34
|
+
/** Handle one MCP streamable HTTP request in stateless mode, for one data source or several projects. */
|
|
16
35
|
export async function handleMcp(data, req, res, body) {
|
|
17
|
-
const server =
|
|
36
|
+
const server = createMcpServer(data);
|
|
18
37
|
const transport = new StreamableHTTPServerTransport({ sessionIdGenerator: undefined, enableJsonResponse: true });
|
|
19
38
|
res.on("close", () => {
|
|
20
39
|
void transport.close();
|
package/dist/mcp.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp.js","sourceRoot":"","sources":["../src/mcp.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,6BAA6B,EAAE,MAAM,oDAAoD,CAAC;AACnG,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAClD,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,
|
|
1
|
+
{"version":3,"file":"mcp.js","sourceRoot":"","sources":["../src/mcp.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { WizeLens } from "../types.js";
|
|
2
|
+
/** Trace BullMQ jobs. Pass the module (or `{ Queue, Worker, FlowProducer }`), or one instance. Returns false when nothing was patched. */
|
|
3
|
+
export declare function instrumentBullMq(wizelens: WizeLens, target: unknown): boolean;
|
|
4
|
+
//# sourceMappingURL=bullmq.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bullmq.d.ts","sourceRoot":"","sources":["../../src/messaging/bullmq.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AA2J5C,0IAA0I;AAC1I,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,GAAG,OAAO,CAS7E"}
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
import { ATTR_MESSAGING } from "@wizeworks/lens-core";
|
|
2
|
+
import { captureOf, patchMethod } from "../adapters/registry.js";
|
|
3
|
+
import { injectInto, OPERATION_NAME, runInSpan, startConsumer, startProducer, tap } from "./shared.js";
|
|
4
|
+
const JOB_NAME = "messaging.bullmq.job.name";
|
|
5
|
+
const JOB_ATTEMPT = "messaging.bullmq.job.attempt";
|
|
6
|
+
const JOB_ATTEMPTS = "messaging.bullmq.job.attempts";
|
|
7
|
+
const JOB_DELAY = "messaging.bullmq.job.delay";
|
|
8
|
+
/** Errors BullMQ uses to move a job (delay it, wait for children, rate limit): not failures. */
|
|
9
|
+
const MOVES = new Set(["DelayedError", "WaitingChildrenError", "WaitingError", "RateLimitError"]);
|
|
10
|
+
const isMove = (err) => MOVES.has(String(err?.name));
|
|
11
|
+
const queueOf = (self) => String(self?.name ?? "unknown");
|
|
12
|
+
/** Job options carrying the trace in BullMQ's own telemetry slot. Repeating and opted-out jobs keep theirs. */
|
|
13
|
+
function stamp(ctx, opts) {
|
|
14
|
+
if (opts?.repeat || opts?.telemetry?.omitContext || opts?.telemetry?.metadata)
|
|
15
|
+
return opts;
|
|
16
|
+
const carrier = {};
|
|
17
|
+
injectInto(ctx, carrier);
|
|
18
|
+
return { ...opts, telemetry: { ...opts?.telemetry, metadata: JSON.stringify(carrier) } };
|
|
19
|
+
}
|
|
20
|
+
/** The trace headers a job carries, or undefined. */
|
|
21
|
+
function carrierOf(job) {
|
|
22
|
+
const metadata = job.opts?.telemetry?.metadata;
|
|
23
|
+
if (typeof metadata !== "string")
|
|
24
|
+
return undefined;
|
|
25
|
+
try {
|
|
26
|
+
const parsed = JSON.parse(metadata);
|
|
27
|
+
return parsed && typeof parsed === "object" ? parsed : undefined;
|
|
28
|
+
}
|
|
29
|
+
catch {
|
|
30
|
+
return undefined;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
/** The job name when every job shares it, plus the delay of a single delayed job. */
|
|
34
|
+
function jobAttributes(op, jobs) {
|
|
35
|
+
const names = new Set(jobs.map((j) => j.name));
|
|
36
|
+
const a = { [OPERATION_NAME]: op };
|
|
37
|
+
if (names.size === 1)
|
|
38
|
+
a[JOB_NAME] = jobs[0].name;
|
|
39
|
+
if (jobs.length === 1 && jobs[0].opts?.delay)
|
|
40
|
+
a[JOB_DELAY] = jobs[0].opts.delay;
|
|
41
|
+
return a;
|
|
42
|
+
}
|
|
43
|
+
const setJobId = (span) => (job) => {
|
|
44
|
+
const id = job?.id;
|
|
45
|
+
if (id !== undefined && id !== null)
|
|
46
|
+
span.setAttribute(ATTR_MESSAGING.messageId, String(id));
|
|
47
|
+
};
|
|
48
|
+
function patchQueue(proto, tracer) {
|
|
49
|
+
patchMethod(proto, "add", (original) => function (...args) {
|
|
50
|
+
const [name, data, opts] = args;
|
|
51
|
+
const open = startProducer(tracer, { system: "bullmq", destination: queueOf(this), extra: jobAttributes("add", [{ name, opts }]) });
|
|
52
|
+
if (!open)
|
|
53
|
+
return original.apply(this, args);
|
|
54
|
+
const next = [name, data, stamp(open.ctx, opts), ...args.slice(3)];
|
|
55
|
+
return runInSpan(open.span, open.ctx, () => tap(original.apply(this, next), setJobId(open.span)));
|
|
56
|
+
});
|
|
57
|
+
patchMethod(proto, "addBulk", (original) => function (...args) {
|
|
58
|
+
const jobs = Array.isArray(args[0]) ? args[0] : [];
|
|
59
|
+
const facts = { system: "bullmq", destination: queueOf(this), batchSize: jobs.length, extra: jobAttributes("addBulk", jobs) };
|
|
60
|
+
const open = startProducer(tracer, facts);
|
|
61
|
+
if (!open)
|
|
62
|
+
return original.apply(this, args);
|
|
63
|
+
const next = jobs.map((j) => ({ ...j, opts: stamp(open.ctx, j.opts) }));
|
|
64
|
+
return runInSpan(open.span, open.ctx, () => original.apply(this, [next, ...args.slice(1)]));
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
/** Every job of a flow tree, root first. */
|
|
68
|
+
const nodesOf = (flow) => [flow, ...(flow.children ?? []).flatMap(nodesOf)];
|
|
69
|
+
const stampFlow = (ctx, flow) => ({
|
|
70
|
+
...flow,
|
|
71
|
+
opts: stamp(ctx, flow.opts),
|
|
72
|
+
...(flow.children ? { children: flow.children.map((c) => stampFlow(ctx, c)) } : {}),
|
|
73
|
+
});
|
|
74
|
+
/** One send span for a whole flow (or flows): every job in the tree carries the trace. */
|
|
75
|
+
function traceFlows(tracer, op, flows, add) {
|
|
76
|
+
const jobs = flows.flatMap(nodesOf);
|
|
77
|
+
const destination = [...new Set(jobs.map((j) => j.queueName))].join(", ") || "unknown";
|
|
78
|
+
const open = startProducer(tracer, { system: "bullmq", destination, batchSize: jobs.length, extra: jobAttributes(op, flows) });
|
|
79
|
+
if (!open)
|
|
80
|
+
return add(flows);
|
|
81
|
+
return runInSpan(open.span, open.ctx, () => add(flows.map((f) => stampFlow(open.ctx, f))));
|
|
82
|
+
}
|
|
83
|
+
function patchFlowProducer(proto, tracer) {
|
|
84
|
+
patchMethod(proto, "add", (original) => function (flow, ...rest) {
|
|
85
|
+
if (!flow || typeof flow !== "object")
|
|
86
|
+
return original.call(this, flow, ...rest);
|
|
87
|
+
return traceFlows(tracer, "add", [flow], ([next]) => original.call(this, next, ...rest));
|
|
88
|
+
});
|
|
89
|
+
patchMethod(proto, "addBulk", (original) => function (flows, ...rest) {
|
|
90
|
+
if (!Array.isArray(flows))
|
|
91
|
+
return original.call(this, flows, ...rest);
|
|
92
|
+
return traceFlows(tracer, "addBulk", flows, (next) => original.call(this, next, ...rest));
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
/** Process span facts for one job: queue, id, name, and which attempt this is. */
|
|
96
|
+
function processFacts(job, queue) {
|
|
97
|
+
const extra = { [OPERATION_NAME]: "process", [JOB_ATTEMPT]: (job.attemptsMade ?? 0) + 1, [JOB_ATTEMPTS]: job.opts?.attempts ?? 1 };
|
|
98
|
+
if (job.name !== undefined)
|
|
99
|
+
extra[JOB_NAME] = job.name;
|
|
100
|
+
const messageId = job.id === undefined || job.id === null ? undefined : String(job.id);
|
|
101
|
+
return { system: "bullmq", destination: job.queueName ?? queue, messageId, extra };
|
|
102
|
+
}
|
|
103
|
+
/** A Worker runs its processor for each job (inline or sandboxed) through `callProcessJob`. */
|
|
104
|
+
function patchWorker(target, tracer) {
|
|
105
|
+
patchMethod(target, "callProcessJob", (original) => function (...args) {
|
|
106
|
+
const job = args[0];
|
|
107
|
+
if (!job || typeof job !== "object")
|
|
108
|
+
return original.apply(this, args);
|
|
109
|
+
const { span, ctx } = startConsumer(tracer, processFacts(job, queueOf(this)), carrierOf(job));
|
|
110
|
+
return runInSpan(span, ctx, () => original.apply(this, args), isMove);
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
const CLASSES = [["Queue", patchQueue], ["FlowProducer", patchFlowProducer], ["Worker", patchWorker]];
|
|
114
|
+
/** Patch one instance: a Worker, a FlowProducer, or a Queue. */
|
|
115
|
+
function patchInstance(t, tracer) {
|
|
116
|
+
if (typeof t.callProcessJob === "function")
|
|
117
|
+
return (patchWorker(t, tracer), true);
|
|
118
|
+
if (typeof t.getFlow === "function")
|
|
119
|
+
return (patchFlowProducer(t, tracer), true);
|
|
120
|
+
if (typeof t.add === "function" && typeof t.addBulk === "function")
|
|
121
|
+
return (patchQueue(t, tracer), true);
|
|
122
|
+
return false;
|
|
123
|
+
}
|
|
124
|
+
/** Trace BullMQ jobs. Pass the module (or `{ Queue, Worker, FlowProducer }`), or one instance. Returns false when nothing was patched. */
|
|
125
|
+
export function instrumentBullMq(wizelens, target) {
|
|
126
|
+
const t = target;
|
|
127
|
+
if (!captureOf(wizelens) || !t || typeof t !== "object")
|
|
128
|
+
return false;
|
|
129
|
+
let found = false;
|
|
130
|
+
for (const [name, patch] of CLASSES) {
|
|
131
|
+
const proto = t[name]?.prototype;
|
|
132
|
+
if (proto)
|
|
133
|
+
(patch(proto, wizelens.tracer), (found = true));
|
|
134
|
+
}
|
|
135
|
+
return found || patchInstance(t, wizelens.tracer);
|
|
136
|
+
}
|
|
137
|
+
//# sourceMappingURL=bullmq.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bullmq.js","sourceRoot":"","sources":["../../src/messaging/bullmq.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,11 +1,15 @@
|
|
|
1
|
-
import { type Context, type Span as OtelSpan, type Tracer } from "@opentelemetry/api";
|
|
2
|
-
export type MessagingSystem = "rabbitmq" | "kafka" | "servicebus";
|
|
1
|
+
import { type Attributes, type Context, type Span as OtelSpan, type Tracer } from "@opentelemetry/api";
|
|
2
|
+
export type MessagingSystem = "rabbitmq" | "kafka" | "servicebus" | "bullmq" | "aws_sqs";
|
|
3
|
+
/** OTel `messaging.operation.name`: the library's own name for the call ("add", "SendMessage"). */
|
|
4
|
+
export declare const OPERATION_NAME = "messaging.operation.name";
|
|
3
5
|
export interface MessageFacts {
|
|
4
6
|
system: MessagingSystem;
|
|
5
7
|
destination: string;
|
|
6
8
|
messageId?: string;
|
|
7
9
|
batchSize?: number;
|
|
8
10
|
bodySize?: number;
|
|
11
|
+
/** Library attributes for the span, for example the BullMQ job name. */
|
|
12
|
+
extra?: Attributes;
|
|
9
13
|
}
|
|
10
14
|
/** Start a send span inside the current request, or null when there is no request or a send is already open. */
|
|
11
15
|
export declare function startProducer(tracer: Tracer, m: MessageFacts): {
|
|
@@ -23,8 +27,10 @@ export declare function startConsumer(tracer: Tracer, m: MessageFacts, headers:
|
|
|
23
27
|
export { preciseNow as nowMs } from "../precise.js";
|
|
24
28
|
/** Record a finished pull (`get`, `receiveMessages`): one receive span from `startedMs`, joined to the producer when one message came back. */
|
|
25
29
|
export declare function recordReceive(tracer: Tracer, m: MessageFacts, headers: Record<string, unknown> | undefined, startedMs: number): void;
|
|
26
|
-
/** Run `fn` in the span's context and end the span when it settles (sync or promise).
|
|
27
|
-
export declare function runInSpan<T>(span: OtelSpan, ctx: Context, fn: () => T): T;
|
|
30
|
+
/** Run `fn` in the span's context and end the span when it settles (sync or promise). Errors `expected` accepts are not failures. */
|
|
31
|
+
export declare function runInSpan<T>(span: OtelSpan, ctx: Context, fn: () => T, expected?: (err: unknown) => boolean): T;
|
|
32
|
+
/** Hand the result to `fn` once it is ready (sync or promise), then pass it on unchanged. */
|
|
33
|
+
export declare function tap<T>(out: T, fn: (value: unknown) => void): T;
|
|
28
34
|
/** Byte length of a message body, when it is a string or bytes. */
|
|
29
35
|
export declare const sizeOf: (body: unknown) => number | undefined;
|
|
30
36
|
//# sourceMappingURL=shared.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shared.d.ts","sourceRoot":"","sources":["../../src/messaging/shared.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"shared.d.ts","sourceRoot":"","sources":["../../src/messaging/shared.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,UAAU,EAAE,KAAK,OAAO,EAA2C,KAAK,IAAI,IAAI,QAAQ,EAAmB,KAAK,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAOjK,MAAM,MAAM,eAAe,GAAG,UAAU,GAAG,OAAO,GAAG,YAAY,GAAG,QAAQ,GAAG,SAAS,CAAC;AAEzF,mGAAmG;AACnG,eAAO,MAAM,cAAc,6BAA6B,CAAC;AAEzD,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,eAAe,CAAC;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,wEAAwE;IACxE,KAAK,CAAC,EAAE,UAAU,CAAC;CACpB;AAmBD,gHAAgH;AAChH,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,EAAE,YAAY,GAAG;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,GAAG,EAAE,OAAO,CAAA;CAAE,GAAG,IAAI,CAKtG;AAED,yEAAyE;AACzE,wBAAgB,UAAU,CAAC,GAAG,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAE/E;AAOD,sGAAsG;AACtG,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,GAAG;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,GAAG,EAAE,OAAO,CAAA;CAAE,CAI7I;AAED,0FAA0F;AAC1F,OAAO,EAAE,UAAU,IAAI,KAAK,EAAE,MAAM,eAAe,CAAC;AAEpD,+IAA+I;AAC/I,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,CAGpI;AAED,qIAAqI;AACrI,wBAAgB,SAAS,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,EAAE,OAAO,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,QAAQ,CAAC,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,OAAO,GAAG,CAAC,CAc/G;AAED,6FAA6F;AAC7F,wBAAgB,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,GAAG,CAAC,CAG9D;AAED,mEAAmE;AACnE,eAAO,MAAM,MAAM,SAAU,OAAO,KAAG,MAAM,GAAG,SAC+D,CAAC"}
|
package/dist/messaging/shared.js
CHANGED
|
@@ -4,6 +4,8 @@ import { ATTR_MESSAGING } from "@wizeworks/lens-core";
|
|
|
4
4
|
import { isThenable } from "../db.js";
|
|
5
5
|
import { CATEGORY_ATTR } from "../processor.js";
|
|
6
6
|
import { recordOn, SERVER_SPAN } from "../spans.js";
|
|
7
|
+
/** OTel `messaging.operation.name`: the library's own name for the call ("add", "SendMessage"). */
|
|
8
|
+
export const OPERATION_NAME = "messaging.operation.name";
|
|
7
9
|
const w3c = new W3CTraceContextPropagator();
|
|
8
10
|
/** Set inside a producer span: a library calling its own send method again is part of it. */
|
|
9
11
|
const INSIDE_SEND = createContextKey("wizelens.messaging.inside-send");
|
|
@@ -20,7 +22,7 @@ function attributesOf(op, m) {
|
|
|
20
22
|
a[ATTR_MESSAGING.batchSize] = m.batchSize;
|
|
21
23
|
if (m.bodySize !== undefined)
|
|
22
24
|
a[ATTR_MESSAGING.bodySize] = m.bodySize;
|
|
23
|
-
return a;
|
|
25
|
+
return m.extra ? { ...m.extra, ...a } : a;
|
|
24
26
|
}
|
|
25
27
|
/** Start a send span inside the current request, or null when there is no request or a send is already open. */
|
|
26
28
|
export function startProducer(tracer, m) {
|
|
@@ -50,10 +52,11 @@ export function recordReceive(tracer, m, headers, startedMs) {
|
|
|
50
52
|
const parent = headers ? w3c.extract(ROOT_CONTEXT, headers, getter) : ROOT_CONTEXT;
|
|
51
53
|
tracer.startSpan(`receive ${m.destination}`, { kind: SpanKind.CONSUMER, attributes: attributesOf("receive", m), startTime: startedMs }, parent).end();
|
|
52
54
|
}
|
|
53
|
-
/** Run `fn` in the span's context and end the span when it settles (sync or promise).
|
|
54
|
-
export function runInSpan(span, ctx, fn) {
|
|
55
|
+
/** Run `fn` in the span's context and end the span when it settles (sync or promise). Errors `expected` accepts are not failures. */
|
|
56
|
+
export function runInSpan(span, ctx, fn, expected) {
|
|
55
57
|
const fail = (err) => {
|
|
56
|
-
|
|
58
|
+
if (!expected?.(err))
|
|
59
|
+
recordOn(span, err);
|
|
57
60
|
span.end();
|
|
58
61
|
};
|
|
59
62
|
try {
|
|
@@ -69,6 +72,12 @@ export function runInSpan(span, ctx, fn) {
|
|
|
69
72
|
throw err;
|
|
70
73
|
}
|
|
71
74
|
}
|
|
75
|
+
/** Hand the result to `fn` once it is ready (sync or promise), then pass it on unchanged. */
|
|
76
|
+
export function tap(out, fn) {
|
|
77
|
+
if (!isThenable(out))
|
|
78
|
+
return (fn(out), out);
|
|
79
|
+
return out.then((value) => (fn(value), value));
|
|
80
|
+
}
|
|
72
81
|
/** Byte length of a message body, when it is a string or bytes. */
|
|
73
82
|
export const sizeOf = (body) => typeof body === "string" ? Buffer.byteLength(body) : body instanceof Uint8Array ? body.byteLength : undefined;
|
|
74
83
|
//# sourceMappingURL=shared.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shared.js","sourceRoot":"","sources":["../../src/messaging/shared.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiC,OAAO,EAAE,gBAAgB,EAAE,YAAY,EAAyB,QAAQ,EAAE,KAAK,EAAe,MAAM,oBAAoB,CAAC;AACjK,OAAO,EAAE,yBAAyB,EAAE,MAAM,qBAAqB,CAAC;AAChE,OAAO,EAAE,cAAc,EAA2B,MAAM,sBAAsB,CAAC;AAC/E,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AACtC,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"shared.js","sourceRoot":"","sources":["../../src/messaging/shared.ts"],"names":[],"mappings":"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"}
|