@composed-di/observability 0.5.0-alpha → 0.6.0-alpha
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/cli.js.map +1 -1
- package/dist/dashboardClient.d.ts +19 -11
- package/dist/dashboardClient.d.ts.map +1 -1
- package/dist/dashboardClient.js +30 -11
- package/dist/dashboardClient.js.map +1 -1
- package/dist/dashboardEventListener.d.ts +27 -8
- package/dist/dashboardEventListener.d.ts.map +1 -1
- package/dist/dashboardEventListener.js +38 -16
- package/dist/dashboardEventListener.js.map +1 -1
- package/dist/dashboardHtml.d.ts +6 -0
- package/dist/dashboardHtml.d.ts.map +1 -1
- package/dist/dashboardHtml.js +618 -98
- package/dist/dashboardHtml.js.map +1 -1
- package/dist/dashboardInstrumentation.d.ts +42 -0
- package/dist/dashboardInstrumentation.d.ts.map +1 -0
- package/dist/dashboardInstrumentation.js +116 -0
- package/dist/dashboardInstrumentation.js.map +1 -0
- package/dist/dashboardServer.d.ts +14 -8
- package/dist/dashboardServer.d.ts.map +1 -1
- package/dist/dashboardServer.js +54 -14
- package/dist/dashboardServer.js.map +1 -1
- package/dist/events.d.ts +20 -1
- package/dist/events.d.ts.map +1 -1
- package/dist/events.js +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/moduleGraph.d.ts.map +1 -1
- package/dist/moduleGraph.js.map +1 -1
- package/package.json +24 -23
- package/src/cli.ts +19 -19
- package/src/dashboardClient.ts +96 -83
- package/src/dashboardHtml.ts +620 -100
- package/src/dashboardInstrumentation.ts +151 -0
- package/src/dashboardServer.ts +185 -148
- package/src/events.ts +55 -35
- package/src/index.ts +5 -5
- package/src/moduleGraph.ts +9 -9
- package/src/dashboardEventListener.ts +0 -104
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";;;;;;;;;;;;AACA;;;;;;GAMG;AACH,
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";;;;;;;;;;;;AACA;;;;;;GAMG;AACH,uDAAoD;AAEpD,SAAS,QAAQ,CAAC,IAAY;IAC5B,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;IACxC,OAAO,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;AACzD,CAAC;AAED,SAAe,IAAI;;;QACjB,MAAM,IAAI,GAAG,MAAM,CAAC,MAAA,MAAA,QAAQ,CAAC,QAAQ,CAAC,mCAAI,OAAO,CAAC,GAAG,CAAC,IAAI,mCAAI,IAAI,CAAC,CAAA;QACnE,MAAM,IAAI,GAAG,MAAA,QAAQ,CAAC,QAAQ,CAAC,mCAAI,WAAW,CAAA;QAC9C,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,IAAI,GAAG,CAAC,IAAI,IAAI,GAAG,KAAK,EAAE,CAAC;YACxD,OAAO,CAAC,KAAK,CAAC,iBAAiB,MAAA,QAAQ,CAAC,QAAQ,CAAC,mCAAI,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAA;YACxE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QACjB,CAAC;QAED,MAAM,SAAS,GAAG,IAAI,kCAAgB,EAAE,CAAA;QACxC,MAAM,GAAG,GAAG,MAAM,SAAS,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,CAAA;QAC9C,OAAO,CAAC,GAAG,CAAC,sCAAsC,GAAG,EAAE,CAAC,CAAA;QACxD,OAAO,CAAC,GAAG,CACT,4FAA4F,CAC7F,CAAA;QAED,MAAM,QAAQ,GAAG,GAAS,EAAE;YAC1B,MAAM,SAAS,CAAC,KAAK,EAAE,CAAA;YACvB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QACjB,CAAC,CAAA,CAAA;QACD,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAA;QAC9B,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAA;IACjC,CAAC;CAAA;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IACrB,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA;IACpB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;AACjB,CAAC,CAAC,CAAA"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { ServiceModule } from '@composed-di/core';
|
|
2
|
-
import {
|
|
3
|
-
export interface DashboardClientOptions {
|
|
2
|
+
import { DashboardInstrumentation, DashboardInstrumentationOptions } from './dashboardInstrumentation';
|
|
3
|
+
export interface DashboardClientOptions extends DashboardInstrumentationOptions {
|
|
4
4
|
/** Base URL of the standalone dashboard server, e.g. "http://localhost:4321". */
|
|
5
5
|
url: string;
|
|
6
6
|
/** How long to buffer events before exporting a batch. Default 250ms. */
|
|
@@ -19,22 +19,30 @@ export interface DashboardClientOptions {
|
|
|
19
19
|
* Exports service observability to a standalone dashboard server, the way
|
|
20
20
|
* an OpenTelemetry SDK exports spans to a collector.
|
|
21
21
|
*
|
|
22
|
-
* The application owns only this client:
|
|
23
|
-
* `
|
|
24
|
-
* graph with the server. Span events are
|
|
25
|
-
* export failures are retried on the next
|
|
26
|
-
* application.
|
|
22
|
+
* The application owns only this client: wrap the factories with
|
|
23
|
+
* `instrument()` and this client's `instrumentation`, then `attach` the
|
|
24
|
+
* module to register its dependency graph with the server. Span events are
|
|
25
|
+
* buffered and shipped in batches; export failures are retried on the next
|
|
26
|
+
* flush and never affect the application.
|
|
27
27
|
*
|
|
28
28
|
* @example
|
|
29
29
|
* ```ts
|
|
30
30
|
* const client = new DashboardClient({ url: 'http://localhost:4321' });
|
|
31
|
-
* const module = ServiceModule.from(
|
|
31
|
+
* const module = ServiceModule.from(
|
|
32
|
+
* instrument(factories, {
|
|
33
|
+
* instrumentation: client.instrumentation,
|
|
34
|
+
* // Show call arguments and results in the dashboard; leave these
|
|
35
|
+
* // off when values may contain secrets.
|
|
36
|
+
* captureArguments: true,
|
|
37
|
+
* captureResults: true,
|
|
38
|
+
* }),
|
|
39
|
+
* );
|
|
32
40
|
* client.attach(module);
|
|
33
41
|
* ```
|
|
34
42
|
*/
|
|
35
43
|
export declare class DashboardClient {
|
|
36
|
-
/** Pass this
|
|
37
|
-
readonly
|
|
44
|
+
/** Pass this to `instrument()` when composing the module. */
|
|
45
|
+
readonly instrumentation: DashboardInstrumentation;
|
|
38
46
|
private readonly url;
|
|
39
47
|
private readonly flushIntervalMs;
|
|
40
48
|
private readonly maxBatchSize;
|
|
@@ -48,7 +56,7 @@ export declare class DashboardClient {
|
|
|
48
56
|
private exporting;
|
|
49
57
|
private warned;
|
|
50
58
|
private closed;
|
|
51
|
-
constructor({ url, flushIntervalMs, maxBatchSize, maxQueueSize, onError, }: DashboardClientOptions);
|
|
59
|
+
constructor({ url, flushIntervalMs, maxBatchSize, maxQueueSize, onError, ...instrumentationOptions }: DashboardClientOptions);
|
|
52
60
|
/**
|
|
53
61
|
* Registers the module's dependency graph with the dashboard server.
|
|
54
62
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dashboardClient.d.ts","sourceRoot":"","sources":["../src/dashboardClient.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,
|
|
1
|
+
{"version":3,"file":"dashboardClient.d.ts","sourceRoot":"","sources":["../src/dashboardClient.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;AACjD,OAAO,EACL,wBAAwB,EACxB,+BAA+B,EAChC,MAAM,4BAA4B,CAAA;AAInC,MAAM,WAAW,sBAAuB,SAAQ,+BAA+B;IAC7E,iFAAiF;IACjF,GAAG,EAAE,MAAM,CAAA;IACX,yEAAyE;IACzE,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,yEAAyE;IACzE,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,qFAAqF;IACrF,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB;;;OAGG;IACH,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAA;CACjC;AAED;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,qBAAa,eAAe;IAC1B,6DAA6D;IAC7D,QAAQ,CAAC,eAAe,EAAE,wBAAwB,CAAA;IAElD,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAQ;IAC5B,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAQ;IACxC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAQ;IACrC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAQ;IACrC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAwB;IAEhD,OAAO,CAAC,KAAK,CAAkB;IAC/B,OAAO,CAAC,KAAK,CAA2B;IACxC,OAAO,CAAC,SAAS,CAAQ;IACzB,OAAO,CAAC,KAAK,CAA8B;IAC3C,8DAA8D;IAC9D,OAAO,CAAC,SAAS,CAAmC;IACpD,OAAO,CAAC,MAAM,CAAQ;IACtB,OAAO,CAAC,MAAM,CAAQ;gBAEV,EACV,GAAG,EACH,eAAqB,EACrB,YAAiB,EACjB,YAAmB,EACnB,OAAO,EACP,GAAG,sBAAsB,EAC1B,EAAE,sBAAsB;IAkBzB;;OAEG;IACH,MAAM,CAAC,MAAM,EAAE,aAAa,GAAG,IAAI;IAOnC,8EAA8E;IAC9E,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAKtB,2DAA2D;IACrD,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAS5B,OAAO,CAAC,OAAO;IAaf,OAAO,CAAC,aAAa;YASP,MAAM;IAgCpB,iEAAiE;IACjE,OAAO,CAAC,UAAU;YAMJ,IAAI;CAqBnB"}
|
package/dist/dashboardClient.js
CHANGED
|
@@ -8,31 +8,49 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
8
8
|
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
9
|
});
|
|
10
10
|
};
|
|
11
|
+
var __rest = (this && this.__rest) || function (s, e) {
|
|
12
|
+
var t = {};
|
|
13
|
+
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
|
|
14
|
+
t[p] = s[p];
|
|
15
|
+
if (s != null && typeof Object.getOwnPropertySymbols === "function")
|
|
16
|
+
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
|
|
17
|
+
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
|
|
18
|
+
t[p[i]] = s[p[i]];
|
|
19
|
+
}
|
|
20
|
+
return t;
|
|
21
|
+
};
|
|
11
22
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
23
|
exports.DashboardClient = void 0;
|
|
13
|
-
const
|
|
24
|
+
const dashboardInstrumentation_1 = require("./dashboardInstrumentation");
|
|
14
25
|
const moduleGraph_1 = require("./moduleGraph");
|
|
15
26
|
/**
|
|
16
27
|
* Exports service observability to a standalone dashboard server, the way
|
|
17
28
|
* an OpenTelemetry SDK exports spans to a collector.
|
|
18
29
|
*
|
|
19
|
-
* The application owns only this client:
|
|
20
|
-
* `
|
|
21
|
-
* graph with the server. Span events are
|
|
22
|
-
* export failures are retried on the next
|
|
23
|
-
* application.
|
|
30
|
+
* The application owns only this client: wrap the factories with
|
|
31
|
+
* `instrument()` and this client's `instrumentation`, then `attach` the
|
|
32
|
+
* module to register its dependency graph with the server. Span events are
|
|
33
|
+
* buffered and shipped in batches; export failures are retried on the next
|
|
34
|
+
* flush and never affect the application.
|
|
24
35
|
*
|
|
25
36
|
* @example
|
|
26
37
|
* ```ts
|
|
27
38
|
* const client = new DashboardClient({ url: 'http://localhost:4321' });
|
|
28
|
-
* const module = ServiceModule.from(
|
|
39
|
+
* const module = ServiceModule.from(
|
|
40
|
+
* instrument(factories, {
|
|
41
|
+
* instrumentation: client.instrumentation,
|
|
42
|
+
* // Show call arguments and results in the dashboard; leave these
|
|
43
|
+
* // off when values may contain secrets.
|
|
44
|
+
* captureArguments: true,
|
|
45
|
+
* captureResults: true,
|
|
46
|
+
* }),
|
|
47
|
+
* );
|
|
29
48
|
* client.attach(module);
|
|
30
49
|
* ```
|
|
31
50
|
*/
|
|
32
51
|
class DashboardClient {
|
|
33
|
-
constructor(
|
|
34
|
-
|
|
35
|
-
this.listener = new dashboardEventListener_1.DashboardEventListener();
|
|
52
|
+
constructor(_a) {
|
|
53
|
+
var { url, flushIntervalMs = 250, maxBatchSize = 64, maxQueueSize = 5000, onError } = _a, instrumentationOptions = __rest(_a, ["url", "flushIntervalMs", "maxBatchSize", "maxQueueSize", "onError"]);
|
|
36
54
|
this.queue = [];
|
|
37
55
|
this.graph = null;
|
|
38
56
|
this.graphSent = false;
|
|
@@ -41,6 +59,7 @@ class DashboardClient {
|
|
|
41
59
|
this.exporting = Promise.resolve();
|
|
42
60
|
this.warned = false;
|
|
43
61
|
this.closed = false;
|
|
62
|
+
this.instrumentation = new dashboardInstrumentation_1.DashboardInstrumentation(instrumentationOptions);
|
|
44
63
|
this.url = url.replace(/\/$/, '');
|
|
45
64
|
this.flushIntervalMs = flushIntervalMs;
|
|
46
65
|
this.maxBatchSize = maxBatchSize;
|
|
@@ -52,7 +71,7 @@ class DashboardClient {
|
|
|
52
71
|
this.warned = true;
|
|
53
72
|
console.warn(`[composed-di] dashboard export to ${this.url} failed (will keep retrying): ${error.message}`);
|
|
54
73
|
});
|
|
55
|
-
this.
|
|
74
|
+
this.instrumentation.subscribe((event) => this.enqueue(event));
|
|
56
75
|
}
|
|
57
76
|
/**
|
|
58
77
|
* Registers the module's dependency graph with the dashboard server.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dashboardClient.js","sourceRoot":"","sources":["../src/dashboardClient.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"dashboardClient.js","sourceRoot":"","sources":["../src/dashboardClient.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,22 +1,40 @@
|
|
|
1
|
-
import type { DisposeContext, EventSpan, InitializeContext, MethodCallContext,
|
|
1
|
+
import type { DisposeContext, EventSpan, InitializeContext, MethodCallContext, ServiceInstrumentation } from '@composed-di/instrumentation-core';
|
|
2
2
|
import { SpanEvent } from './events';
|
|
3
|
+
export interface DashboardEventListenerOptions {
|
|
4
|
+
/**
|
|
5
|
+
* Serialize method arguments onto call spans, so the dashboard can show
|
|
6
|
+
* them. On by default — the dashboard is a development tool — but turn
|
|
7
|
+
* this off when arguments may contain secrets, or when events are
|
|
8
|
+
* exported to a dashboard server you don't control.
|
|
9
|
+
*/
|
|
10
|
+
captureArguments?: boolean;
|
|
11
|
+
/**
|
|
12
|
+
* Serialize return / resolved values onto call spans. On by default,
|
|
13
|
+
* with the same caveats as `captureArguments`.
|
|
14
|
+
*/
|
|
15
|
+
captureResults?: boolean;
|
|
16
|
+
/** Longest serialized value kept; longer ones are truncated. Default 200. */
|
|
17
|
+
maxValueLength?: number;
|
|
18
|
+
}
|
|
3
19
|
/**
|
|
4
20
|
* A ServiceEventListener that turns service events into structured
|
|
5
21
|
* start/end span events for the realtime dashboard.
|
|
6
22
|
*
|
|
7
23
|
* - Uses AsyncLocalStorage to link spans to the span that was active when
|
|
8
24
|
* they started, which lets the dashboard draw cross-service call edges
|
|
9
|
-
* (e.g. UserService.getUser -> Database.query).
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
* synchronous frame; the dashboard tolerates this, as parents are only
|
|
13
|
-
* resolved among still-open spans.
|
|
25
|
+
* (e.g. UserService.getUser -> Database.query). The observed operation
|
|
26
|
+
* is invoked through the span's `run` wrapper, so the context is scoped
|
|
27
|
+
* to the operation and its async continuations.
|
|
14
28
|
* - Emits events synchronously to subscribers; it never buffers.
|
|
15
29
|
*/
|
|
16
|
-
export declare class DashboardEventListener implements
|
|
30
|
+
export declare class DashboardEventListener implements ServiceInstrumentation {
|
|
17
31
|
private readonly context;
|
|
18
32
|
private readonly listeners;
|
|
19
33
|
private nextId;
|
|
34
|
+
private readonly captureArguments;
|
|
35
|
+
private readonly captureResults;
|
|
36
|
+
private readonly maxValueLength;
|
|
37
|
+
constructor({ captureArguments, captureResults, maxValueLength, }?: DashboardEventListenerOptions);
|
|
20
38
|
/**
|
|
21
39
|
* Subscribes to span events.
|
|
22
40
|
*
|
|
@@ -25,8 +43,9 @@ export declare class DashboardEventListener implements ServiceEventListener {
|
|
|
25
43
|
subscribe(listener: (event: SpanEvent) => void): () => void;
|
|
26
44
|
onInitialize({ key }: InitializeContext): EventSpan;
|
|
27
45
|
onDispose({ key }: DisposeContext): EventSpan;
|
|
28
|
-
onMethodCall({ key,
|
|
46
|
+
onMethodCall({ key, functionName, args }: MethodCallContext): EventSpan;
|
|
29
47
|
private startSpan;
|
|
48
|
+
private serialize;
|
|
30
49
|
private emit;
|
|
31
50
|
}
|
|
32
51
|
//# sourceMappingURL=dashboardEventListener.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dashboardEventListener.d.ts","sourceRoot":"","sources":["../src/dashboardEventListener.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,cAAc,EACd,SAAS,EACT,iBAAiB,EACjB,iBAAiB,EACjB,
|
|
1
|
+
{"version":3,"file":"dashboardEventListener.d.ts","sourceRoot":"","sources":["../src/dashboardEventListener.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,cAAc,EACd,SAAS,EACT,iBAAiB,EACjB,iBAAiB,EACjB,sBAAsB,EACvB,MAAM,mCAAmC,CAAC;AAC3C,OAAO,EAAE,SAAS,EAAY,MAAM,UAAU,CAAC;AAO/C,MAAM,WAAW,6BAA6B;IAC5C;;;;;OAKG;IACH,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAE3B;;;OAGG;IACH,cAAc,CAAC,EAAE,OAAO,CAAC;IAEzB,6EAA6E;IAC7E,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED;;;;;;;;;;GAUG;AACH,qBAAa,sBAAuB,YAAW,sBAAsB;IACnE,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAwC;IAChE,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAyC;IACnE,OAAO,CAAC,MAAM,CAAK;IACnB,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAU;IAC3C,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAU;IACzC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAS;gBAE5B,EACV,gBAAuB,EACvB,cAAqB,EACrB,cAAoB,GACrB,GAAE,6BAAkC;IAMrC;;;;OAIG;IACH,SAAS,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,SAAS,KAAK,IAAI,GAAG,MAAM,IAAI;IAK3D,YAAY,CAAC,EAAE,GAAG,EAAE,EAAE,iBAAiB,GAAG,SAAS;IAInD,SAAS,CAAC,EAAE,GAAG,EAAE,EAAE,cAAc,GAAG,SAAS;IAI7C,YAAY,CAAC,EAAE,GAAG,EAAE,YAAY,EAAE,IAAI,EAAE,EAAE,iBAAiB,GAAG,SAAS;IASvE,OAAO,CAAC,SAAS;IAmDjB,OAAO,CAAC,SAAS;IAYjB,OAAO,CAAC,IAAI;CAGb"}
|
|
@@ -9,18 +9,19 @@ const node_perf_hooks_1 = require("node:perf_hooks");
|
|
|
9
9
|
*
|
|
10
10
|
* - Uses AsyncLocalStorage to link spans to the span that was active when
|
|
11
11
|
* they started, which lets the dashboard draw cross-service call edges
|
|
12
|
-
* (e.g. UserService.getUser -> Database.query).
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
* synchronous frame; the dashboard tolerates this, as parents are only
|
|
16
|
-
* resolved among still-open spans.
|
|
12
|
+
* (e.g. UserService.getUser -> Database.query). The observed operation
|
|
13
|
+
* is invoked through the span's `run` wrapper, so the context is scoped
|
|
14
|
+
* to the operation and its async continuations.
|
|
17
15
|
* - Emits events synchronously to subscribers; it never buffers.
|
|
18
16
|
*/
|
|
19
17
|
class DashboardEventListener {
|
|
20
|
-
constructor() {
|
|
18
|
+
constructor({ captureArguments = true, captureResults = true, maxValueLength = 200, } = {}) {
|
|
21
19
|
this.context = new node_async_hooks_1.AsyncLocalStorage();
|
|
22
20
|
this.listeners = new Set();
|
|
23
21
|
this.nextId = 1;
|
|
22
|
+
this.captureArguments = captureArguments;
|
|
23
|
+
this.captureResults = captureResults;
|
|
24
|
+
this.maxValueLength = maxValueLength;
|
|
24
25
|
}
|
|
25
26
|
/**
|
|
26
27
|
* Subscribes to span events.
|
|
@@ -37,10 +38,10 @@ class DashboardEventListener {
|
|
|
37
38
|
onDispose({ key }) {
|
|
38
39
|
return this.startSpan(key.name, 'dispose', 'dispose');
|
|
39
40
|
}
|
|
40
|
-
onMethodCall({ key,
|
|
41
|
-
return this.startSpan(key.name,
|
|
41
|
+
onMethodCall({ key, functionName, args }) {
|
|
42
|
+
return this.startSpan(key.name, functionName, 'call', this.captureArguments ? this.serialize(args) : undefined);
|
|
42
43
|
}
|
|
43
|
-
startSpan(service, method, kind) {
|
|
44
|
+
startSpan(service, method, kind, args) {
|
|
44
45
|
var _a;
|
|
45
46
|
const id = this.nextId++;
|
|
46
47
|
const parent = this.context.getStore();
|
|
@@ -53,10 +54,11 @@ class DashboardEventListener {
|
|
|
53
54
|
method,
|
|
54
55
|
kind,
|
|
55
56
|
time: Date.now(),
|
|
57
|
+
args,
|
|
56
58
|
});
|
|
57
59
|
const startedAt = node_perf_hooks_1.performance.now();
|
|
58
60
|
let ended = false;
|
|
59
|
-
const end = (error) => {
|
|
61
|
+
const end = (error, result) => {
|
|
60
62
|
if (ended)
|
|
61
63
|
return;
|
|
62
64
|
ended = true;
|
|
@@ -66,17 +68,37 @@ class DashboardEventListener {
|
|
|
66
68
|
time: Date.now(),
|
|
67
69
|
durationMs: node_perf_hooks_1.performance.now() - startedAt,
|
|
68
70
|
error,
|
|
71
|
+
result,
|
|
69
72
|
});
|
|
70
73
|
};
|
|
71
|
-
// The observed operation runs right after this hook returns, in the
|
|
72
|
-
// same synchronous frame, so entering the context here makes this span
|
|
73
|
-
// the parent of any spans started inside the operation.
|
|
74
|
-
this.context.enterWith({ id });
|
|
75
74
|
return {
|
|
76
|
-
|
|
77
|
-
|
|
75
|
+
// Running the operation inside this span's context makes it the
|
|
76
|
+
// parent of any spans started within.
|
|
77
|
+
run: (fn) => this.context.run({ id }, fn),
|
|
78
|
+
end: (outcome) => {
|
|
79
|
+
if (outcome.type === 'failure') {
|
|
80
|
+
end(errorMessage(outcome.error));
|
|
81
|
+
}
|
|
82
|
+
else {
|
|
83
|
+
const capture = kind === 'call' && this.captureResults;
|
|
84
|
+
end(null, capture ? this.serialize(outcome.value) : undefined);
|
|
85
|
+
}
|
|
86
|
+
},
|
|
78
87
|
};
|
|
79
88
|
}
|
|
89
|
+
serialize(value) {
|
|
90
|
+
var _a;
|
|
91
|
+
let text;
|
|
92
|
+
try {
|
|
93
|
+
text = (_a = JSON.stringify(value)) !== null && _a !== void 0 ? _a : String(value);
|
|
94
|
+
}
|
|
95
|
+
catch (_b) {
|
|
96
|
+
text = '[unserializable]';
|
|
97
|
+
}
|
|
98
|
+
return text.length > this.maxValueLength
|
|
99
|
+
? text.slice(0, this.maxValueLength) + '…'
|
|
100
|
+
: text;
|
|
101
|
+
}
|
|
80
102
|
emit(event) {
|
|
81
103
|
this.listeners.forEach((listener) => listener(event));
|
|
82
104
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dashboardEventListener.js","sourceRoot":"","sources":["../src/dashboardEventListener.ts"],"names":[],"mappings":";;;AAAA,uDAAqD;AACrD,qDAA8C;
|
|
1
|
+
{"version":3,"file":"dashboardEventListener.js","sourceRoot":"","sources":["../src/dashboardEventListener.ts"],"names":[],"mappings":"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"}
|
package/dist/dashboardHtml.d.ts
CHANGED
|
@@ -6,6 +6,12 @@
|
|
|
6
6
|
* dependency ranks, dependencies on the left), a stat-tile row, a services
|
|
7
7
|
* table, and an event log. Service state is shown as a status glyph + word,
|
|
8
8
|
* never color alone.
|
|
9
|
+
*
|
|
10
|
+
* Visual language: warm paper surfaces, ink text, hairline rules. The orange
|
|
11
|
+
* accent is reserved for live activity (call flashes, active edges,
|
|
12
|
+
* selection); blue means initializing, green means ready. Display type is
|
|
13
|
+
* Poppins and editorial notes are Lora — both resolve to local fonts only
|
|
14
|
+
* (Arial / Georgia fallbacks), keeping the no-CDN contract.
|
|
9
15
|
*/
|
|
10
16
|
export declare function renderDashboardHtml(): string;
|
|
11
17
|
//# sourceMappingURL=dashboardHtml.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dashboardHtml.d.ts","sourceRoot":"","sources":["../src/dashboardHtml.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"dashboardHtml.d.ts","sourceRoot":"","sources":["../src/dashboardHtml.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,mBAAmB,IAAI,MAAM,CAE5C"}
|