@wizeworks/lens-node 0.0.0-stage → 0.3.0-alpha.1
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 +24 -0
- package/dist/api.d.ts.map +1 -0
- package/dist/api.js +106 -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/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 +125 -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 +124 -0
- package/dist/wizelens.js.map +1 -0
- package/package.json +109 -3
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"route-timing.d.ts","sourceRoot":"","sources":["../src/route-timing.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,IAAI,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAG3D,uHAAuH;AACvH,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,CAepG;AAED,mCAAmC;AACnC,wBAAgB,UAAU,CAAC,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,CAElE"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { ATTR_ROUTED_MS } from "@wizeworks/lens-core";
|
|
2
|
+
/** Record `wizelens.server.routed_ms` when the router sets `target[property]`: the moment the matched route starts. */
|
|
3
|
+
export function watchRoute(target, property, span, startedAt) {
|
|
4
|
+
if (Object.prototype.hasOwnProperty.call(target, property))
|
|
5
|
+
return;
|
|
6
|
+
let value;
|
|
7
|
+
let seen = false;
|
|
8
|
+
Object.defineProperty(target, property, {
|
|
9
|
+
configurable: true,
|
|
10
|
+
enumerable: true,
|
|
11
|
+
get: () => value,
|
|
12
|
+
set: (next) => {
|
|
13
|
+
value = next;
|
|
14
|
+
if (seen || !next)
|
|
15
|
+
return;
|
|
16
|
+
seen = true;
|
|
17
|
+
markRouted(span, startedAt);
|
|
18
|
+
},
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
/** Record the routing time now. */
|
|
22
|
+
export function markRouted(span, startedAt) {
|
|
23
|
+
span.setAttribute(ATTR_ROUTED_MS, Math.max(0, performance.now() - startedAt));
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=route-timing.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"route-timing.js","sourceRoot":"","sources":["../src/route-timing.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAEtD,uHAAuH;AACvH,MAAM,UAAU,UAAU,CAAC,MAAc,EAAE,QAAgB,EAAE,IAAc,EAAE,SAAiB;IAC5F,IAAI,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC;QAAE,OAAO;IACnE,IAAI,KAAc,CAAC;IACnB,IAAI,IAAI,GAAG,KAAK,CAAC;IACjB,MAAM,CAAC,cAAc,CAAC,MAAM,EAAE,QAAQ,EAAE;QACtC,YAAY,EAAE,IAAI;QAClB,UAAU,EAAE,IAAI;QAChB,GAAG,EAAE,GAAG,EAAE,CAAC,KAAK;QAChB,GAAG,EAAE,CAAC,IAAa,EAAE,EAAE;YACrB,KAAK,GAAG,IAAI,CAAC;YACb,IAAI,IAAI,IAAI,CAAC,IAAI;gBAAE,OAAO;YAC1B,IAAI,GAAG,IAAI,CAAC;YACZ,UAAU,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;QAC9B,CAAC;KACF,CAAC,CAAC;AACL,CAAC;AAED,mCAAmC;AACnC,MAAM,UAAU,UAAU,CAAC,IAAc,EAAE,SAAiB;IAC1D,IAAI,CAAC,YAAY,CAAC,cAAc,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,WAAW,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC,CAAC,CAAC;AAChF,CAAC"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { type LogRecord, type SamplingInfo, type Span } from "@wizeworks/lens-core";
|
|
2
|
+
export interface SamplingOptions {
|
|
3
|
+
/** Share of traces kept, 0 to 1. Default 1 (all), or the WIZELENS_SAMPLE_RATE variable. */
|
|
4
|
+
rate?: number;
|
|
5
|
+
/** Keep traces with an error at any rate. Default true. */
|
|
6
|
+
keepErrors?: boolean;
|
|
7
|
+
/** Keep traces with a server-side span at least this slow (ms) at any rate. Null turns it off. Default 1000. */
|
|
8
|
+
keepSlowMs?: number | null;
|
|
9
|
+
}
|
|
10
|
+
/** What the store does with one span or log. `held` comes with the first "keep" of a held trace. */
|
|
11
|
+
export type Verdict = {
|
|
12
|
+
action: "keep";
|
|
13
|
+
held: Held | null;
|
|
14
|
+
} | {
|
|
15
|
+
action: "hold";
|
|
16
|
+
} | {
|
|
17
|
+
action: "drop";
|
|
18
|
+
};
|
|
19
|
+
export interface Held {
|
|
20
|
+
spans: Span[];
|
|
21
|
+
logs: LogRecord[];
|
|
22
|
+
remotes: string[];
|
|
23
|
+
}
|
|
24
|
+
/** The sampling settings, or null when every trace is kept. */
|
|
25
|
+
export declare function samplingInfo(o: SamplingOptions | undefined, env?: string | undefined): SamplingInfo | null;
|
|
26
|
+
/** Decides, per trace, what the store keeps. A trace outside the rate waits until its local root span ends, then stays only when it had an error or a slow span. */
|
|
27
|
+
export declare class TraceSampler {
|
|
28
|
+
#private;
|
|
29
|
+
readonly info: SamplingInfo;
|
|
30
|
+
constructor(info: SamplingInfo, now?: () => number);
|
|
31
|
+
/** `root`: the span starts this service's part of the trace (no parent, or a parent in another process). */
|
|
32
|
+
span(span: Span, root: boolean): Verdict;
|
|
33
|
+
log(traceId: string, log: LogRecord): Verdict;
|
|
34
|
+
/** A downstream endpoint. It never decides a trace; it waits with it. */
|
|
35
|
+
remote(traceId: string, endpoint: string): Verdict;
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=sampling.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sampling.d.ts","sourceRoot":"","sources":["../src/sampling.ts"],"names":[],"mappings":"AAAA,OAAO,EAAc,KAAK,SAAS,EAAE,KAAK,YAAY,EAAE,KAAK,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAEhG,MAAM,WAAW,eAAe;IAC9B,2FAA2F;IAC3F,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,2DAA2D;IAC3D,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,gHAAgH;IAChH,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B;AAED,oGAAoG;AACpG,MAAM,MAAM,OAAO,GAAG;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,IAAI,GAAG,IAAI,CAAA;CAAE,GAAG;IAAE,MAAM,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAEtG,MAAM,WAAW,IAAI;IACnB,KAAK,EAAE,IAAI,EAAE,CAAC;IACd,IAAI,EAAE,SAAS,EAAE,CAAC;IAClB,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAaD,+DAA+D;AAC/D,wBAAgB,YAAY,CAAC,CAAC,EAAE,eAAe,GAAG,SAAS,EAAE,GAAG,qBAAmC,GAAG,YAAY,GAAG,IAAI,CAKxH;AAED,oKAAoK;AACpK,qBAAa,YAAY;;IACvB,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAC;IAK5B,YAAY,IAAI,EAAE,YAAY,EAAE,GAAG,GAAE,MAAM,MAAiB,EAG3D;IAED,4GAA4G;IAC5G,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,GAAG,OAAO,CAYvC;IAED,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,SAAS,GAAG,OAAO,CAQ5C;IAED,yEAAyE;IACzE,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAKjD;CAyDF"}
|
package/dist/sampling.js
ADDED
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
import { keepByRate } from "@wizeworks/lens-core";
|
|
2
|
+
const KEEP = { action: "keep", held: null };
|
|
3
|
+
const HOLD = { action: "hold" };
|
|
4
|
+
const DROP = { action: "drop" };
|
|
5
|
+
const MAX_DECIDED = 20_000;
|
|
6
|
+
const MAX_PENDING = 2000;
|
|
7
|
+
const HOLD_MS = 60_000;
|
|
8
|
+
/** The sampling settings, or null when every trace is kept. */
|
|
9
|
+
export function samplingInfo(o, env = process.env.WIZELENS_SAMPLE_RATE) {
|
|
10
|
+
const raw = o?.rate ?? (env ? Number(env) : 1);
|
|
11
|
+
const rate = Number.isFinite(raw) ? Math.min(1, Math.max(0, raw)) : 1;
|
|
12
|
+
if (rate >= 1)
|
|
13
|
+
return null;
|
|
14
|
+
return { rate, keepErrors: o?.keepErrors ?? true, keepSlowMs: o?.keepSlowMs === undefined ? 1000 : o.keepSlowMs };
|
|
15
|
+
}
|
|
16
|
+
/** Decides, per trace, what the store keeps. A trace outside the rate waits until its local root span ends, then stays only when it had an error or a slow span. */
|
|
17
|
+
export class TraceSampler {
|
|
18
|
+
info;
|
|
19
|
+
#now;
|
|
20
|
+
#decided = new Map();
|
|
21
|
+
#pending = new Map();
|
|
22
|
+
constructor(info, now = Date.now) {
|
|
23
|
+
this.info = info;
|
|
24
|
+
this.#now = now;
|
|
25
|
+
}
|
|
26
|
+
/** `root`: the span starts this service's part of the trace (no parent, or a parent in another process). */
|
|
27
|
+
span(span, root) {
|
|
28
|
+
const early = this.#known(span.traceId, this.#mustKeep(span));
|
|
29
|
+
if (early)
|
|
30
|
+
return early;
|
|
31
|
+
const p = this.#hold(span.traceId);
|
|
32
|
+
if (this.#mustKeep(span))
|
|
33
|
+
return this.#keep(span.traceId, p);
|
|
34
|
+
if (!root) {
|
|
35
|
+
p.spans.push(span);
|
|
36
|
+
return HOLD;
|
|
37
|
+
}
|
|
38
|
+
this.#decide(span.traceId, false);
|
|
39
|
+
this.#pending.delete(span.traceId);
|
|
40
|
+
return DROP;
|
|
41
|
+
}
|
|
42
|
+
log(traceId, log) {
|
|
43
|
+
const important = this.info.keepErrors && log.level === "error";
|
|
44
|
+
const early = this.#known(traceId, important);
|
|
45
|
+
if (early)
|
|
46
|
+
return early;
|
|
47
|
+
const p = this.#hold(traceId);
|
|
48
|
+
if (important)
|
|
49
|
+
return this.#keep(traceId, p);
|
|
50
|
+
p.logs.push(log);
|
|
51
|
+
return HOLD;
|
|
52
|
+
}
|
|
53
|
+
/** A downstream endpoint. It never decides a trace; it waits with it. */
|
|
54
|
+
remote(traceId, endpoint) {
|
|
55
|
+
const early = this.#known(traceId, false);
|
|
56
|
+
if (early)
|
|
57
|
+
return early;
|
|
58
|
+
this.#hold(traceId).remotes.push(endpoint);
|
|
59
|
+
return HOLD;
|
|
60
|
+
}
|
|
61
|
+
// A decided or in-rate trace. An error after a drop keeps the rest of the trace.
|
|
62
|
+
#known(traceId, important) {
|
|
63
|
+
this.#expire();
|
|
64
|
+
const decided = this.#decided.get(traceId);
|
|
65
|
+
if (decided === true)
|
|
66
|
+
return KEEP;
|
|
67
|
+
if (decided === false)
|
|
68
|
+
return important ? (this.#decide(traceId, true), KEEP) : DROP;
|
|
69
|
+
if (!keepByRate(traceId, this.info.rate))
|
|
70
|
+
return null;
|
|
71
|
+
this.#decide(traceId, true);
|
|
72
|
+
return KEEP;
|
|
73
|
+
}
|
|
74
|
+
#mustKeep(span) {
|
|
75
|
+
if (this.info.keepErrors && span.status === "error")
|
|
76
|
+
return true;
|
|
77
|
+
// A browser span's length is a page or render window, not a wait: it never counts as slow.
|
|
78
|
+
return this.info.keepSlowMs !== null && span.category !== "browser" && span.durationMs >= this.info.keepSlowMs;
|
|
79
|
+
}
|
|
80
|
+
#keep(traceId, p) {
|
|
81
|
+
this.#pending.delete(traceId);
|
|
82
|
+
this.#decide(traceId, true);
|
|
83
|
+
const some = p.spans.length + p.logs.length + p.remotes.length > 0;
|
|
84
|
+
return { action: "keep", held: some ? { spans: p.spans, logs: p.logs, remotes: p.remotes } : null };
|
|
85
|
+
}
|
|
86
|
+
#hold(traceId) {
|
|
87
|
+
let p = this.#pending.get(traceId);
|
|
88
|
+
if (p)
|
|
89
|
+
return p;
|
|
90
|
+
p = { spans: [], logs: [], remotes: [], sinceMs: this.#now() };
|
|
91
|
+
this.#pending.set(traceId, p);
|
|
92
|
+
if (this.#pending.size > MAX_PENDING)
|
|
93
|
+
this.#dropOldest();
|
|
94
|
+
return p;
|
|
95
|
+
}
|
|
96
|
+
#decide(traceId, keep) {
|
|
97
|
+
this.#decided.delete(traceId);
|
|
98
|
+
this.#decided.set(traceId, keep);
|
|
99
|
+
if (this.#decided.size > MAX_DECIDED)
|
|
100
|
+
this.#decided.delete(this.#decided.keys().next().value);
|
|
101
|
+
}
|
|
102
|
+
#dropOldest() {
|
|
103
|
+
const oldest = this.#pending.keys().next().value;
|
|
104
|
+
if (oldest === undefined)
|
|
105
|
+
return;
|
|
106
|
+
this.#pending.delete(oldest);
|
|
107
|
+
this.#decide(oldest, false);
|
|
108
|
+
}
|
|
109
|
+
// A trace whose root never ended (a lost request, a job with no root) is dropped after a while.
|
|
110
|
+
#expire() {
|
|
111
|
+
const cutoff = this.#now() - HOLD_MS;
|
|
112
|
+
for (const [id, p] of this.#pending) {
|
|
113
|
+
if (p.sinceMs >= cutoff)
|
|
114
|
+
return;
|
|
115
|
+
this.#pending.delete(id);
|
|
116
|
+
this.#decide(id, false);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
//# sourceMappingURL=sampling.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sampling.js","sourceRoot":"","sources":["../src/sampling.ts"],"names":[],"mappings":"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"}
|
package/dist/spans.d.ts
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { type Span as OtelSpan } from "@opentelemetry/api";
|
|
2
|
+
/** Context key that holds the server span of the current request. */
|
|
3
|
+
export declare const SERVER_SPAN: symbol;
|
|
4
|
+
export declare function recordOn(span: OtelSpan, err: unknown): void;
|
|
5
|
+
/** The server span of the request that is running now, if any. */
|
|
6
|
+
export declare function currentServerSpan(): OtelSpan | undefined;
|
|
7
|
+
/** The innermost active span, if any. */
|
|
8
|
+
export declare function activeSpan(): OtelSpan | undefined;
|
|
9
|
+
//# sourceMappingURL=spans.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"spans.d.ts","sourceRoot":"","sources":["../src/spans.ts"],"names":[],"mappings":"AAAA,OAAO,EAA6B,KAAK,IAAI,IAAI,QAAQ,EAAyB,MAAM,oBAAoB,CAAC;AAE7G,qEAAqE;AACrE,eAAO,MAAM,WAAW,QAAqD,CAAC;AAE9E,wBAAgB,QAAQ,CAAC,IAAI,EAAE,QAAQ,EAAE,GAAG,EAAE,OAAO,GAAG,IAAI,CAI3D;AAED,kEAAkE;AAClE,wBAAgB,iBAAiB,IAAI,QAAQ,GAAG,SAAS,CAExD;AAED,yCAAyC;AACzC,wBAAgB,UAAU,IAAI,QAAQ,GAAG,SAAS,CAEjD"}
|
package/dist/spans.js
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { context, createContextKey, SpanStatusCode, trace } from "@opentelemetry/api";
|
|
2
|
+
/** Context key that holds the server span of the current request. */
|
|
3
|
+
export const SERVER_SPAN = createContextKey("wizeworks.wizelens.server-span");
|
|
4
|
+
export function recordOn(span, err) {
|
|
5
|
+
const error = err instanceof Error ? err : new Error(String(err));
|
|
6
|
+
span.recordException(error);
|
|
7
|
+
span.setStatus({ code: SpanStatusCode.ERROR, message: error.message });
|
|
8
|
+
}
|
|
9
|
+
/** The server span of the request that is running now, if any. */
|
|
10
|
+
export function currentServerSpan() {
|
|
11
|
+
return context.active().getValue(SERVER_SPAN);
|
|
12
|
+
}
|
|
13
|
+
/** The innermost active span, if any. */
|
|
14
|
+
export function activeSpan() {
|
|
15
|
+
return trace.getSpan(context.active());
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=spans.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"spans.js","sourceRoot":"","sources":["../src/spans.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,gBAAgB,EAAyB,cAAc,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAE7G,qEAAqE;AACrE,MAAM,CAAC,MAAM,WAAW,GAAG,gBAAgB,CAAC,gCAAgC,CAAC,CAAC;AAE9E,MAAM,UAAU,QAAQ,CAAC,IAAc,EAAE,GAAY;IACnD,MAAM,KAAK,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;IAClE,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;IAC5B,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,cAAc,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;AACzE,CAAC;AAED,kEAAkE;AAClE,MAAM,UAAU,iBAAiB;IAC/B,OAAO,OAAO,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,WAAW,CAAyB,CAAC;AACxE,CAAC;AAED,yCAAyC;AACzC,MAAM,UAAU,UAAU;IACxB,OAAO,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;AACzC,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { LogRecord, Span } from "@wizeworks/lens-core";
|
|
2
|
+
/** Changes to one trace since the last drain. Used by the persister. */
|
|
3
|
+
export interface TraceChanges {
|
|
4
|
+
traceId: string;
|
|
5
|
+
startMs: number;
|
|
6
|
+
remotes: string[];
|
|
7
|
+
spans: Span[];
|
|
8
|
+
/** New logs with their index in the trace (stable across flushes). */
|
|
9
|
+
logs: {
|
|
10
|
+
seq: number;
|
|
11
|
+
log: LogRecord;
|
|
12
|
+
}[];
|
|
13
|
+
}
|
|
14
|
+
/** Data loaded from disk at startup. */
|
|
15
|
+
export interface StoredTrace {
|
|
16
|
+
traceId: string;
|
|
17
|
+
startMs: number;
|
|
18
|
+
spans: Span[];
|
|
19
|
+
logs: LogRecord[];
|
|
20
|
+
remotes: string[];
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=store-types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"store-types.d.ts","sourceRoot":"","sources":["../src/store-types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAE5D,wEAAwE;AACxE,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,KAAK,EAAE,IAAI,EAAE,CAAC;IACd,sEAAsE;IACtE,IAAI,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,SAAS,CAAA;KAAE,EAAE,CAAC;CACzC;AAED,wCAAwC;AACxC,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,IAAI,EAAE,CAAC;IACd,IAAI,EAAE,SAAS,EAAE,CAAC;IAClB,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"store-types.js","sourceRoot":"","sources":["../src/store-types.ts"],"names":[],"mappings":""}
|
package/dist/store.d.ts
ADDED
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { type LogRecord, type SamplingInfo, type Span, type Trace, type TraceSummary } from "@wizeworks/lens-core";
|
|
2
|
+
import type { TraceSampler } from "./sampling.js";
|
|
3
|
+
import type { StoredTrace, TraceChanges } from "./store-types.js";
|
|
4
|
+
export type { StoredTrace, TraceChanges } from "./store-types.js";
|
|
5
|
+
export interface TraceStoreOptions {
|
|
6
|
+
/** Max traces kept. Oldest are dropped first. Default 2000. */
|
|
7
|
+
maxTraces?: number;
|
|
8
|
+
/** Max trace age in ms, measured from its start. Default 24 h. */
|
|
9
|
+
maxAgeMs?: number;
|
|
10
|
+
/** Max spans kept per trace. Default 2000. */
|
|
11
|
+
maxSpansPerTrace?: number;
|
|
12
|
+
/** Max logs kept per trace. Default 1000. */
|
|
13
|
+
maxLogsPerTrace?: number;
|
|
14
|
+
/** Clock, for tests. */
|
|
15
|
+
now?: () => number;
|
|
16
|
+
/** Decides which traces are kept. Absent: all. */
|
|
17
|
+
sampler?: TraceSampler;
|
|
18
|
+
}
|
|
19
|
+
/** One change, as the hub exporter sees it. */
|
|
20
|
+
export type StoreEvent = {
|
|
21
|
+
type: "span";
|
|
22
|
+
span: Span;
|
|
23
|
+
} | {
|
|
24
|
+
type: "log";
|
|
25
|
+
traceId: string;
|
|
26
|
+
log: LogRecord;
|
|
27
|
+
} | {
|
|
28
|
+
type: "remote";
|
|
29
|
+
traceId: string;
|
|
30
|
+
endpoint: string;
|
|
31
|
+
};
|
|
32
|
+
/** In-memory ring buffer of traces, keyed by trace id. This is always the read path. */
|
|
33
|
+
export declare class TraceStore {
|
|
34
|
+
#private;
|
|
35
|
+
constructor(options?: TraceStoreOptions);
|
|
36
|
+
get size(): number;
|
|
37
|
+
get maxTraces(): number;
|
|
38
|
+
/** Null when every trace is kept. */
|
|
39
|
+
get sampling(): SamplingInfo | null;
|
|
40
|
+
get maxAgeMs(): number;
|
|
41
|
+
/** Hear every new span, log, and remote. Returns the unsubscribe function. */
|
|
42
|
+
subscribe(listener: (e: StoreEvent) => void): () => void;
|
|
43
|
+
/** `root`: the span starts this service's part of the trace. Sampling decides when a root ends. */
|
|
44
|
+
addSpan(span: Span, root?: boolean): void;
|
|
45
|
+
addLog(traceId: string, log: LogRecord): void;
|
|
46
|
+
addRemote(traceId: string, endpoint: string): void;
|
|
47
|
+
/** Load traces from disk, oldest first. Does not mark them dirty. */
|
|
48
|
+
load(traces: Iterable<StoredTrace>): void;
|
|
49
|
+
/** Take all changes since the last call. */
|
|
50
|
+
drainChanges(): TraceChanges[];
|
|
51
|
+
/** Drop traces older than maxAgeMs. Returns how many were dropped. */
|
|
52
|
+
pruneByAge(): number;
|
|
53
|
+
get(traceId: string): Trace | undefined;
|
|
54
|
+
/** All traces, newest first. With `session`, only traces that have a browser span from that tab. */
|
|
55
|
+
all(session?: string): Trace[];
|
|
56
|
+
list(limit?: number, session?: string): TraceSummary[];
|
|
57
|
+
clear(): void;
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoC,KAAK,SAAS,EAAE,KAAK,YAAY,EAAE,KAAK,IAAI,EAAE,KAAK,KAAK,EAAE,KAAK,YAAY,EAAa,MAAM,sBAAsB,CAAC;AAChK,OAAO,KAAK,EAAQ,YAAY,EAAW,MAAM,eAAe,CAAC;AACjE,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAYlE,YAAY,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAElE,MAAM,WAAW,iBAAiB;IAChC,+DAA+D;IAC/D,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,kEAAkE;IAClE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,8CAA8C;IAC9C,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,6CAA6C;IAC7C,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,wBAAwB;IACxB,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;IACnB,kDAAkD;IAClD,OAAO,CAAC,EAAE,YAAY,CAAC;CACxB;AAED,+CAA+C;AAC/C,MAAM,MAAM,UAAU,GAClB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,IAAI,CAAA;CAAE,GAC5B;IAAE,IAAI,EAAE,KAAK,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,SAAS,CAAA;CAAE,GAChD;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC;AAQ1D,wFAAwF;AACxF,qBAAa,UAAU;;IAWrB,YAAY,OAAO,GAAE,iBAAsB,EAO1C;IAED,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,IAAI,SAAS,IAAI,MAAM,CAEtB;IAED,qCAAqC;IACrC,IAAI,QAAQ,IAAI,YAAY,GAAG,IAAI,CAElC;IAED,IAAI,QAAQ,IAAI,MAAM,CAErB;IAkBD,8EAA8E;IAC9E,SAAS,CAAC,QAAQ,EAAE,CAAC,CAAC,EAAE,UAAU,KAAK,IAAI,GAAG,MAAM,IAAI,CAGvD;IAgBD,mGAAmG;IACnG,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,UAA6B,GAAG,IAAI,CAE3D;IAED,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,SAAS,GAAG,IAAI,CAE5C;IAED,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAEjD;IAyCD,qEAAqE;IACrE,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC,WAAW,CAAC,GAAG,IAAI,CAWxC;IAED,4CAA4C;IAC5C,YAAY,IAAI,YAAY,EAAE,CAe7B;IAED,sEAAsE;IACtE,UAAU,IAAI,MAAM,CAWnB;IAED,GAAG,CAAC,OAAO,EAAE,MAAM,GAAG,KAAK,GAAG,SAAS,CAGtC;IAED,oGAAoG;IACpG,GAAG,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,KAAK,EAAE,CAS7B;IAED,IAAI,CAAC,KAAK,SAAK,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,YAAY,EAAE,CAEjD;IAED,KAAK,IAAI,IAAI,CAGZ;CACF"}
|
package/dist/store.js
ADDED
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
import { ATTR_BROWSER_SESSION, buildTrace, toSummary } from "@wizeworks/lens-core";
|
|
2
|
+
/** In-memory ring buffer of traces, keyed by trace id. This is always the read path. */
|
|
3
|
+
export class TraceStore {
|
|
4
|
+
#entries = new Map();
|
|
5
|
+
#dirty = new Map();
|
|
6
|
+
#maxTraces;
|
|
7
|
+
#maxAgeMs;
|
|
8
|
+
#maxSpans;
|
|
9
|
+
#maxLogs;
|
|
10
|
+
#now;
|
|
11
|
+
#listeners = new Set();
|
|
12
|
+
#sampler;
|
|
13
|
+
constructor(options = {}) {
|
|
14
|
+
this.#maxTraces = Math.max(1, options.maxTraces ?? 2000);
|
|
15
|
+
this.#maxAgeMs = Math.max(1, options.maxAgeMs ?? 24 * 60 * 60 * 1000);
|
|
16
|
+
this.#maxSpans = options.maxSpansPerTrace ?? 2000;
|
|
17
|
+
this.#maxLogs = options.maxLogsPerTrace ?? 1000;
|
|
18
|
+
this.#now = options.now ?? Date.now;
|
|
19
|
+
this.#sampler = options.sampler;
|
|
20
|
+
}
|
|
21
|
+
get size() {
|
|
22
|
+
return this.#entries.size;
|
|
23
|
+
}
|
|
24
|
+
get maxTraces() {
|
|
25
|
+
return this.#maxTraces;
|
|
26
|
+
}
|
|
27
|
+
/** Null when every trace is kept. */
|
|
28
|
+
get sampling() {
|
|
29
|
+
return this.#sampler?.info ?? null;
|
|
30
|
+
}
|
|
31
|
+
get maxAgeMs() {
|
|
32
|
+
return this.#maxAgeMs;
|
|
33
|
+
}
|
|
34
|
+
#entry(traceId, startMs) {
|
|
35
|
+
let entry = this.#entries.get(traceId);
|
|
36
|
+
if (!entry) {
|
|
37
|
+
entry = { traceId, spans: new Map(), logs: [], remotes: new Set(), sessions: new Set(), startMs };
|
|
38
|
+
this.#entries.set(traceId, entry);
|
|
39
|
+
while (this.#entries.size > this.#maxTraces) {
|
|
40
|
+
const oldest = this.#entries.keys().next().value;
|
|
41
|
+
if (oldest === undefined)
|
|
42
|
+
break;
|
|
43
|
+
this.#entries.delete(oldest);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
else if (startMs < entry.startMs) {
|
|
47
|
+
entry.startMs = startMs;
|
|
48
|
+
}
|
|
49
|
+
return entry;
|
|
50
|
+
}
|
|
51
|
+
/** Hear every new span, log, and remote. Returns the unsubscribe function. */
|
|
52
|
+
subscribe(listener) {
|
|
53
|
+
this.#listeners.add(listener);
|
|
54
|
+
return () => this.#listeners.delete(listener);
|
|
55
|
+
}
|
|
56
|
+
#emit(e) {
|
|
57
|
+
for (const l of this.#listeners)
|
|
58
|
+
l(e);
|
|
59
|
+
}
|
|
60
|
+
#markDirty(traceId) {
|
|
61
|
+
let d = this.#dirty.get(traceId);
|
|
62
|
+
if (!d) {
|
|
63
|
+
const entry = this.#entries.get(traceId);
|
|
64
|
+
d = { spans: new Set(), logsFrom: entry?.logs.length ?? 0, remotes: false };
|
|
65
|
+
this.#dirty.set(traceId, d);
|
|
66
|
+
}
|
|
67
|
+
return d;
|
|
68
|
+
}
|
|
69
|
+
/** `root`: the span starts this service's part of the trace. Sampling decides when a root ends. */
|
|
70
|
+
addSpan(span, root = span.parentSpanId === null) {
|
|
71
|
+
this.#gate(span.traceId, this.#sampler?.span(span, root), () => this.#putSpan(span));
|
|
72
|
+
}
|
|
73
|
+
addLog(traceId, log) {
|
|
74
|
+
this.#gate(traceId, this.#sampler?.log(traceId, log), () => this.#putLog(traceId, log));
|
|
75
|
+
}
|
|
76
|
+
addRemote(traceId, endpoint) {
|
|
77
|
+
this.#gate(traceId, this.#sampler?.remote(traceId, endpoint), () => this.#putRemote(traceId, endpoint));
|
|
78
|
+
}
|
|
79
|
+
// Store now when sampling keeps it (and what the trace held back), else nothing.
|
|
80
|
+
#gate(traceId, verdict, put) {
|
|
81
|
+
if (verdict && verdict.action !== "keep")
|
|
82
|
+
return;
|
|
83
|
+
if (verdict?.held)
|
|
84
|
+
this.#release(traceId, verdict.held);
|
|
85
|
+
put();
|
|
86
|
+
}
|
|
87
|
+
#release(traceId, held) {
|
|
88
|
+
for (const s of held.spans)
|
|
89
|
+
this.#putSpan(s);
|
|
90
|
+
for (const l of held.logs)
|
|
91
|
+
this.#putLog(traceId, l);
|
|
92
|
+
for (const r of held.remotes)
|
|
93
|
+
this.#putRemote(traceId, r);
|
|
94
|
+
}
|
|
95
|
+
#putSpan(span) {
|
|
96
|
+
const entry = this.#entry(span.traceId, span.startMs);
|
|
97
|
+
if (entry.spans.size >= this.#maxSpans && !entry.spans.has(span.spanId))
|
|
98
|
+
return;
|
|
99
|
+
entry.spans.set(span.spanId, span);
|
|
100
|
+
const session = span.attributes[ATTR_BROWSER_SESSION];
|
|
101
|
+
if (typeof session === "string" && session)
|
|
102
|
+
entry.sessions.add(session);
|
|
103
|
+
this.#markDirty(span.traceId).spans.add(span.spanId);
|
|
104
|
+
this.#emit({ type: "span", span });
|
|
105
|
+
}
|
|
106
|
+
#putLog(traceId, log) {
|
|
107
|
+
const entry = this.#entry(traceId, log.timeMs);
|
|
108
|
+
if (entry.logs.length >= this.#maxLogs)
|
|
109
|
+
return;
|
|
110
|
+
this.#markDirty(traceId);
|
|
111
|
+
entry.logs.push(log);
|
|
112
|
+
this.#emit({ type: "log", traceId, log });
|
|
113
|
+
}
|
|
114
|
+
#putRemote(traceId, endpoint) {
|
|
115
|
+
const entry = this.#entry(traceId, this.#now());
|
|
116
|
+
if (entry.remotes.has(endpoint))
|
|
117
|
+
return;
|
|
118
|
+
entry.remotes.add(endpoint);
|
|
119
|
+
this.#markDirty(traceId).remotes = true;
|
|
120
|
+
this.#emit({ type: "remote", traceId, endpoint });
|
|
121
|
+
}
|
|
122
|
+
/** Load traces from disk, oldest first. Does not mark them dirty. */
|
|
123
|
+
load(traces) {
|
|
124
|
+
for (const t of traces) {
|
|
125
|
+
const entry = this.#entry(t.traceId, t.startMs);
|
|
126
|
+
for (const s of t.spans) {
|
|
127
|
+
entry.spans.set(s.spanId, s);
|
|
128
|
+
const session = s.attributes[ATTR_BROWSER_SESSION];
|
|
129
|
+
if (typeof session === "string" && session)
|
|
130
|
+
entry.sessions.add(session);
|
|
131
|
+
}
|
|
132
|
+
entry.logs.push(...t.logs);
|
|
133
|
+
for (const r of t.remotes)
|
|
134
|
+
entry.remotes.add(r);
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
/** Take all changes since the last call. */
|
|
138
|
+
drainChanges() {
|
|
139
|
+
const out = [];
|
|
140
|
+
for (const [traceId, d] of this.#dirty) {
|
|
141
|
+
const entry = this.#entries.get(traceId);
|
|
142
|
+
if (!entry)
|
|
143
|
+
continue; // evicted before it was written: nothing to keep
|
|
144
|
+
const spans = [];
|
|
145
|
+
for (const id of d.spans) {
|
|
146
|
+
const s = entry.spans.get(id);
|
|
147
|
+
if (s)
|
|
148
|
+
spans.push(s);
|
|
149
|
+
}
|
|
150
|
+
const logs = entry.logs.slice(d.logsFrom).map((log, i) => ({ seq: d.logsFrom + i, log }));
|
|
151
|
+
out.push({ traceId, startMs: entry.startMs, remotes: [...entry.remotes], spans, logs });
|
|
152
|
+
}
|
|
153
|
+
this.#dirty.clear();
|
|
154
|
+
return out;
|
|
155
|
+
}
|
|
156
|
+
/** Drop traces older than maxAgeMs. Returns how many were dropped. */
|
|
157
|
+
pruneByAge() {
|
|
158
|
+
const cutoff = this.#now() - this.#maxAgeMs;
|
|
159
|
+
let dropped = 0;
|
|
160
|
+
for (const [id, entry] of this.#entries) {
|
|
161
|
+
if (entry.startMs < cutoff) {
|
|
162
|
+
this.#entries.delete(id);
|
|
163
|
+
this.#dirty.delete(id);
|
|
164
|
+
dropped++;
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
return dropped;
|
|
168
|
+
}
|
|
169
|
+
get(traceId) {
|
|
170
|
+
const entry = this.#entries.get(traceId);
|
|
171
|
+
return entry ? buildTrace(entry.traceId, [...entry.spans.values()], entry.logs, entry.remotes) : undefined;
|
|
172
|
+
}
|
|
173
|
+
/** All traces, newest first. With `session`, only traces that have a browser span from that tab. */
|
|
174
|
+
all(session) {
|
|
175
|
+
this.pruneByAge();
|
|
176
|
+
const traces = [];
|
|
177
|
+
for (const entry of this.#entries.values()) {
|
|
178
|
+
if (entry.spans.size === 0 && entry.logs.length === 0)
|
|
179
|
+
continue;
|
|
180
|
+
if (session !== undefined && !entry.sessions.has(session))
|
|
181
|
+
continue;
|
|
182
|
+
traces.push(buildTrace(entry.traceId, [...entry.spans.values()], entry.logs, entry.remotes));
|
|
183
|
+
}
|
|
184
|
+
return traces.sort((a, b) => b.startMs - a.startMs);
|
|
185
|
+
}
|
|
186
|
+
list(limit = 50, session) {
|
|
187
|
+
return this.all(session).slice(0, Math.max(0, limit)).map(toSummary);
|
|
188
|
+
}
|
|
189
|
+
clear() {
|
|
190
|
+
this.#entries.clear();
|
|
191
|
+
this.#dirty.clear();
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
//# sourceMappingURL=store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"store.js","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { type Tracer } from "@opentelemetry/api";
|
|
2
|
+
import { UndiciInstrumentation } from "@opentelemetry/instrumentation-undici";
|
|
3
|
+
import { BasicTracerProvider } from "@opentelemetry/sdk-trace-base";
|
|
4
|
+
import type { TraceStore } from "./store.js";
|
|
5
|
+
export interface Tracing {
|
|
6
|
+
provider: BasicTracerProvider;
|
|
7
|
+
tracer: Tracer;
|
|
8
|
+
undici: UndiciInstrumentation | undefined;
|
|
9
|
+
}
|
|
10
|
+
/** Install one ALS context manager and the W3C propagator. Apps that set their own keep them. */
|
|
11
|
+
export declare function installGlobals(): void;
|
|
12
|
+
export interface TracingOptions {
|
|
13
|
+
service: string;
|
|
14
|
+
version: string;
|
|
15
|
+
redactKeys: readonly string[];
|
|
16
|
+
fetch: boolean;
|
|
17
|
+
}
|
|
18
|
+
/** One tracer provider per WizeLens instance. Every finished span goes into the store. */
|
|
19
|
+
export declare function createTracing(store: TraceStore, o: TracingOptions, selfEndpoints: ReadonlySet<string>): Tracing;
|
|
20
|
+
//# sourceMappingURL=tracing.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tracing.d.ts","sourceRoot":"","sources":["../src/tracing.ts"],"names":[],"mappings":"AAAA,OAAO,EAAwB,KAAK,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAGvE,OAAO,EAAE,qBAAqB,EAAE,MAAM,uCAAuC,CAAC;AAE9E,OAAO,EAAmB,mBAAmB,EAAE,MAAM,+BAA+B,CAAC;AAKrF,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAE7C,MAAM,WAAW,OAAO;IACtB,QAAQ,EAAE,mBAAmB,CAAC;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,qBAAqB,GAAG,SAAS,CAAC;CAC3C;AAID,iGAAiG;AACjG,wBAAgB,cAAc,IAAI,IAAI,CAKrC;AAgBD,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,SAAS,MAAM,EAAE,CAAC;IAC9B,KAAK,EAAE,OAAO,CAAC;CAChB;AAED,0FAA0F;AAC1F,wBAAgB,aAAa,CAAC,KAAK,EAAE,UAAU,EAAE,CAAC,EAAE,cAAc,EAAE,aAAa,EAAE,WAAW,CAAC,MAAM,CAAC,GAAG,OAAO,CAS/G"}
|
package/dist/tracing.js
ADDED
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { context, propagation } from "@opentelemetry/api";
|
|
2
|
+
import { AsyncLocalStorageContextManager } from "@opentelemetry/context-async-hooks";
|
|
3
|
+
import { W3CTraceContextPropagator } from "@opentelemetry/core";
|
|
4
|
+
import { UndiciInstrumentation } from "@opentelemetry/instrumentation-undici";
|
|
5
|
+
import { resourceFromAttributes } from "@opentelemetry/resources";
|
|
6
|
+
import { AlwaysOnSampler, BasicTracerProvider } from "@opentelemetry/sdk-trace-base";
|
|
7
|
+
import { HEADER_ENDPOINT, HEADER_HOP } from "@wizeworks/lens-core";
|
|
8
|
+
import { hasRequestHeader, responseHeader } from "./http-util.js";
|
|
9
|
+
import { preciseProvider, preciseTracer } from "./precise.js";
|
|
10
|
+
import { StoreSpanProcessor } from "./processor.js";
|
|
11
|
+
let globalsInstalled = false;
|
|
12
|
+
/** Install one ALS context manager and the W3C propagator. Apps that set their own keep them. */
|
|
13
|
+
export function installGlobals() {
|
|
14
|
+
if (globalsInstalled)
|
|
15
|
+
return;
|
|
16
|
+
globalsInstalled = true;
|
|
17
|
+
context.setGlobalContextManager(new AsyncLocalStorageContextManager().enable());
|
|
18
|
+
propagation.setGlobalPropagator(new W3CTraceContextPropagator());
|
|
19
|
+
}
|
|
20
|
+
function instrumentFetch(provider, store, selfEndpoints) {
|
|
21
|
+
const undici = new UndiciInstrumentation({
|
|
22
|
+
requireParentforSpans: true,
|
|
23
|
+
// Federation calls carry X-WizeLens-Hop. Do not trace WizeLens talking to itself.
|
|
24
|
+
ignoreRequestHook: (request) => hasRequestHeader(request.headers, HEADER_HOP),
|
|
25
|
+
responseHook: (span, { response }) => {
|
|
26
|
+
const endpoint = responseHeader(response.headers, HEADER_ENDPOINT);
|
|
27
|
+
if (endpoint && !selfEndpoints.has(endpoint))
|
|
28
|
+
store.addRemote(span.spanContext().traceId, endpoint);
|
|
29
|
+
},
|
|
30
|
+
});
|
|
31
|
+
undici.setTracerProvider(preciseProvider(provider));
|
|
32
|
+
return undici;
|
|
33
|
+
}
|
|
34
|
+
/** One tracer provider per WizeLens instance. Every finished span goes into the store. */
|
|
35
|
+
export function createTracing(store, o, selfEndpoints) {
|
|
36
|
+
const provider = new BasicTracerProvider({
|
|
37
|
+
resource: resourceFromAttributes({ "service.name": o.service }),
|
|
38
|
+
sampler: new AlwaysOnSampler(),
|
|
39
|
+
spanProcessors: [new StoreSpanProcessor(store, o.service, o.redactKeys)],
|
|
40
|
+
});
|
|
41
|
+
const tracer = preciseTracer(provider.getTracer("@wizeworks/lens-node", o.version));
|
|
42
|
+
const undici = o.fetch ? instrumentFetch(provider, store, selfEndpoints) : undefined;
|
|
43
|
+
return { provider, tracer, undici };
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=tracing.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tracing.js","sourceRoot":"","sources":["../src/tracing.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,WAAW,EAAe,MAAM,oBAAoB,CAAC;AACvE,OAAO,EAAE,+BAA+B,EAAE,MAAM,oCAAoC,CAAC;AACrF,OAAO,EAAE,yBAAyB,EAAE,MAAM,qBAAqB,CAAC;AAChE,OAAO,EAAE,qBAAqB,EAAE,MAAM,uCAAuC,CAAC;AAC9E,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAClE,OAAO,EAAE,eAAe,EAAE,mBAAmB,EAAE,MAAM,+BAA+B,CAAC;AACrF,OAAO,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AACnE,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAClE,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC9D,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AASpD,IAAI,gBAAgB,GAAG,KAAK,CAAC;AAE7B,iGAAiG;AACjG,MAAM,UAAU,cAAc;IAC5B,IAAI,gBAAgB;QAAE,OAAO;IAC7B,gBAAgB,GAAG,IAAI,CAAC;IACxB,OAAO,CAAC,uBAAuB,CAAC,IAAI,+BAA+B,EAAE,CAAC,MAAM,EAAE,CAAC,CAAC;IAChF,WAAW,CAAC,mBAAmB,CAAC,IAAI,yBAAyB,EAAE,CAAC,CAAC;AACnE,CAAC;AAED,SAAS,eAAe,CAAC,QAA6B,EAAE,KAAiB,EAAE,aAAkC;IAC3G,MAAM,MAAM,GAAG,IAAI,qBAAqB,CAAC;QACvC,qBAAqB,EAAE,IAAI;QAC3B,kFAAkF;QAClF,iBAAiB,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,gBAAgB,CAAC,OAAO,CAAC,OAAO,EAAE,UAAU,CAAC;QAC7E,YAAY,EAAE,CAAC,IAAI,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE;YACnC,MAAM,QAAQ,GAAG,cAAc,CAAC,QAAQ,CAAC,OAAO,EAAE,eAAe,CAAC,CAAC;YACnE,IAAI,QAAQ,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,QAAQ,CAAC;gBAAE,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;QACtG,CAAC;KACF,CAAC,CAAC;IACH,MAAM,CAAC,iBAAiB,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC,CAAC;IACpD,OAAO,MAAM,CAAC;AAChB,CAAC;AASD,0FAA0F;AAC1F,MAAM,UAAU,aAAa,CAAC,KAAiB,EAAE,CAAiB,EAAE,aAAkC;IACpG,MAAM,QAAQ,GAAG,IAAI,mBAAmB,CAAC;QACvC,QAAQ,EAAE,sBAAsB,CAAC,EAAE,cAAc,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC;QAC/D,OAAO,EAAE,IAAI,eAAe,EAAE;QAC9B,cAAc,EAAE,CAAC,IAAI,kBAAkB,CAAC,KAAK,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,UAAU,CAAC,CAAC;KACzE,CAAC,CAAC;IACH,MAAM,MAAM,GAAG,aAAa,CAAC,QAAQ,CAAC,SAAS,CAAC,sBAAsB,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;IACpF,MAAM,MAAM,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,eAAe,CAAC,QAAQ,EAAE,KAAK,EAAE,aAAa,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IACrF,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;AACtC,CAAC"}
|