eimer 0.1.2 → 0.2.0
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/README.md +12 -6
- package/dist/cjs/eimer/Eimer.d.ts +9 -5
- package/dist/cjs/eimer/Eimer.d.ts.map +1 -1
- package/dist/cjs/eimer/Eimer.js +28 -10
- package/dist/cjs/eimer/Eimer.js.map +1 -1
- package/dist/cjs/eimer/EimerDependencies.d.ts +2 -0
- package/dist/cjs/eimer/EimerDependencies.d.ts.map +1 -1
- package/dist/cjs/eimer/EimerDependencies.js.map +1 -1
- package/dist/cjs/eimer/EimerMessage.d.ts +4 -1
- package/dist/cjs/eimer/EimerMessage.d.ts.map +1 -1
- package/dist/cjs/eimer/EimerMessage.js +3 -1
- package/dist/cjs/eimer/EimerMessage.js.map +1 -1
- package/dist/cjs/eimer/EimerMessageMeta.d.ts +17 -0
- package/dist/cjs/eimer/EimerMessageMeta.d.ts.map +1 -0
- package/dist/cjs/eimer/EimerMessageMeta.js +3 -0
- package/dist/cjs/eimer/EimerMessageMeta.js.map +1 -0
- package/dist/cjs/eimer/PayloadHandler.d.ts +2 -1
- package/dist/cjs/eimer/PayloadHandler.d.ts.map +1 -1
- package/dist/cjs/eimer/RpcHandler.d.ts +2 -1
- package/dist/cjs/eimer/RpcHandler.d.ts.map +1 -1
- package/dist/cjs/eimer/RpcManager.d.ts +4 -2
- package/dist/cjs/eimer/RpcManager.d.ts.map +1 -1
- package/dist/cjs/eimer/TraceContext.d.ts +13 -0
- package/dist/cjs/eimer/TraceContext.d.ts.map +1 -0
- package/dist/cjs/eimer/TraceContext.js +3 -0
- package/dist/cjs/eimer/TraceContext.js.map +1 -0
- package/dist/cjs/eimer/TraceSpan.d.ts +14 -0
- package/dist/cjs/eimer/TraceSpan.d.ts.map +1 -0
- package/dist/cjs/eimer/TraceSpan.js +3 -0
- package/dist/cjs/eimer/TraceSpan.js.map +1 -0
- package/dist/cjs/eimer/Tracer.d.ts +34 -0
- package/dist/cjs/eimer/Tracer.d.ts.map +1 -0
- package/dist/cjs/eimer/Tracer.js +3 -0
- package/dist/cjs/eimer/Tracer.js.map +1 -0
- package/dist/cjs/eimer/TracerBackend.d.ts +21 -0
- package/dist/cjs/eimer/TracerBackend.d.ts.map +1 -0
- package/dist/cjs/eimer/TracerBackend.js +3 -0
- package/dist/cjs/eimer/TracerBackend.js.map +1 -0
- package/dist/cjs/eimer/index.d.ts +5 -0
- package/dist/cjs/eimer/index.d.ts.map +1 -1
- package/dist/cjs/eimer/index.js +5 -0
- package/dist/cjs/eimer/index.js.map +1 -1
- package/dist/cjs/eimer/now.d.ts +12 -0
- package/dist/cjs/eimer/now.d.ts.map +1 -0
- package/dist/cjs/eimer/now.js +17 -0
- package/dist/cjs/eimer/now.js.map +1 -0
- package/dist/cjs/message-bus/EimerMessageBus.d.ts +3 -2
- package/dist/cjs/message-bus/EimerMessageBus.d.ts.map +1 -1
- package/dist/cjs/message-bus/EimerMessageBus.js +21 -3
- package/dist/cjs/message-bus/EimerMessageBus.js.map +1 -1
- package/dist/cjs/rpc/EimerRpcManager.d.ts +9 -6
- package/dist/cjs/rpc/EimerRpcManager.d.ts.map +1 -1
- package/dist/cjs/rpc/EimerRpcManager.js +31 -9
- package/dist/cjs/rpc/EimerRpcManager.js.map +1 -1
- package/dist/cjs/rpc/EimerRpcRequestMessage.d.ts +2 -1
- package/dist/cjs/rpc/EimerRpcRequestMessage.d.ts.map +1 -1
- package/dist/cjs/rpc/EimerRpcRequestMessage.js +2 -2
- package/dist/cjs/rpc/EimerRpcRequestMessage.js.map +1 -1
- package/dist/cjs/rpc/EimerRpcResponseMessage.d.ts +2 -1
- package/dist/cjs/rpc/EimerRpcResponseMessage.d.ts.map +1 -1
- package/dist/cjs/rpc/EimerRpcResponseMessage.js +2 -2
- package/dist/cjs/rpc/EimerRpcResponseMessage.js.map +1 -1
- package/dist/cjs/tracing/ConsoleLoggingTracerBackend.d.ts +53 -0
- package/dist/cjs/tracing/ConsoleLoggingTracerBackend.d.ts.map +1 -0
- package/dist/cjs/tracing/ConsoleLoggingTracerBackend.js +113 -0
- package/dist/cjs/tracing/ConsoleLoggingTracerBackend.js.map +1 -0
- package/dist/cjs/tracing/EimerLoggerTracerBackend.d.ts +12 -0
- package/dist/cjs/tracing/EimerLoggerTracerBackend.d.ts.map +1 -0
- package/dist/cjs/tracing/EimerLoggerTracerBackend.js +18 -0
- package/dist/cjs/tracing/EimerLoggerTracerBackend.js.map +1 -0
- package/dist/cjs/tracing/EimerNoopTracer.d.ts +17 -0
- package/dist/cjs/tracing/EimerNoopTracer.d.ts.map +1 -0
- package/dist/cjs/tracing/EimerNoopTracer.js +27 -0
- package/dist/cjs/tracing/EimerNoopTracer.js.map +1 -0
- package/dist/cjs/tracing/EimerPublishingTracerBackend.d.ts +17 -0
- package/dist/cjs/tracing/EimerPublishingTracerBackend.d.ts.map +1 -0
- package/dist/cjs/tracing/EimerPublishingTracerBackend.js +20 -0
- package/dist/cjs/tracing/EimerPublishingTracerBackend.js.map +1 -0
- package/dist/cjs/tracing/EimerTraceSubscriber.d.ts +17 -0
- package/dist/cjs/tracing/EimerTraceSubscriber.d.ts.map +1 -0
- package/dist/cjs/tracing/EimerTraceSubscriber.js +23 -0
- package/dist/cjs/tracing/EimerTraceSubscriber.js.map +1 -0
- package/dist/cjs/tracing/EimerTracer.d.ts +21 -0
- package/dist/cjs/tracing/EimerTracer.d.ts.map +1 -0
- package/dist/cjs/tracing/EimerTracer.js +59 -0
- package/dist/cjs/tracing/EimerTracer.js.map +1 -0
- package/dist/cjs/tracing/MemoryTracerBackend.d.ts +14 -0
- package/dist/cjs/tracing/MemoryTracerBackend.d.ts.map +1 -0
- package/dist/cjs/tracing/MemoryTracerBackend.js +24 -0
- package/dist/cjs/tracing/MemoryTracerBackend.js.map +1 -0
- package/dist/cjs/tracing/NoopTracer.d.ts +16 -0
- package/dist/cjs/tracing/NoopTracer.d.ts.map +1 -0
- package/dist/cjs/tracing/NoopTracer.js +27 -0
- package/dist/cjs/tracing/NoopTracer.js.map +1 -0
- package/dist/cjs/tracing/index.d.ts +9 -0
- package/dist/cjs/tracing/index.d.ts.map +1 -0
- package/dist/cjs/tracing/index.js +25 -0
- package/dist/cjs/tracing/index.js.map +1 -0
- package/dist/cjs/tracing/now.d.ts +9 -0
- package/dist/cjs/tracing/now.d.ts.map +1 -0
- package/dist/cjs/tracing/now.js +14 -0
- package/dist/cjs/tracing/now.js.map +1 -0
- package/dist/esm/eimer/Eimer.js +28 -10
- package/dist/esm/eimer/Eimer.js.map +1 -1
- package/dist/esm/eimer/EimerDependencies.js.map +1 -1
- package/dist/esm/eimer/EimerMessage.js +3 -1
- package/dist/esm/eimer/EimerMessage.js.map +1 -1
- package/dist/esm/eimer/EimerMessageMeta.js +2 -0
- package/dist/esm/eimer/EimerMessageMeta.js.map +1 -0
- package/dist/esm/eimer/TraceContext.js +2 -0
- package/dist/esm/eimer/TraceContext.js.map +1 -0
- package/dist/esm/eimer/TraceSpan.js +2 -0
- package/dist/esm/eimer/TraceSpan.js.map +1 -0
- package/dist/esm/eimer/Tracer.js +2 -0
- package/dist/esm/eimer/Tracer.js.map +1 -0
- package/dist/esm/eimer/TracerBackend.js +2 -0
- package/dist/esm/eimer/TracerBackend.js.map +1 -0
- package/dist/esm/eimer/index.js +5 -0
- package/dist/esm/eimer/index.js.map +1 -1
- package/dist/esm/eimer/now.js +14 -0
- package/dist/esm/eimer/now.js.map +1 -0
- package/dist/esm/message-bus/EimerMessageBus.js +21 -3
- package/dist/esm/message-bus/EimerMessageBus.js.map +1 -1
- package/dist/esm/rpc/EimerRpcManager.js +31 -9
- package/dist/esm/rpc/EimerRpcManager.js.map +1 -1
- package/dist/esm/rpc/EimerRpcRequestMessage.js +2 -2
- package/dist/esm/rpc/EimerRpcRequestMessage.js.map +1 -1
- package/dist/esm/rpc/EimerRpcResponseMessage.js +2 -2
- package/dist/esm/rpc/EimerRpcResponseMessage.js.map +1 -1
- package/dist/esm/tracing/ConsoleLoggingTracerBackend.js +109 -0
- package/dist/esm/tracing/ConsoleLoggingTracerBackend.js.map +1 -0
- package/dist/esm/tracing/EimerLoggerTracerBackend.js +14 -0
- package/dist/esm/tracing/EimerLoggerTracerBackend.js.map +1 -0
- package/dist/esm/tracing/EimerNoopTracer.js +23 -0
- package/dist/esm/tracing/EimerNoopTracer.js.map +1 -0
- package/dist/esm/tracing/EimerPublishingTracerBackend.js +16 -0
- package/dist/esm/tracing/EimerPublishingTracerBackend.js.map +1 -0
- package/dist/esm/tracing/EimerTraceSubscriber.js +19 -0
- package/dist/esm/tracing/EimerTraceSubscriber.js.map +1 -0
- package/dist/esm/tracing/EimerTracer.js +55 -0
- package/dist/esm/tracing/EimerTracer.js.map +1 -0
- package/dist/esm/tracing/MemoryTracerBackend.js +20 -0
- package/dist/esm/tracing/MemoryTracerBackend.js.map +1 -0
- package/dist/esm/tracing/NoopTracer.js +30 -0
- package/dist/esm/tracing/NoopTracer.js.map +1 -0
- package/dist/esm/tracing/index.js +9 -0
- package/dist/esm/tracing/index.js.map +1 -0
- package/dist/esm/tracing/now.js +11 -0
- package/dist/esm/tracing/now.js.map +1 -0
- package/package.json +15 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TraceContext.js","sourceRoot":"","sources":["../../../src/eimer/TraceContext.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TraceSpan.js","sourceRoot":"","sources":["../../../src/eimer/TraceSpan.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Tracer.js","sourceRoot":"","sources":["../../../src/eimer/Tracer.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TracerBackend.js","sourceRoot":"","sources":["../../../src/eimer/TracerBackend.ts"],"names":[],"mappings":""}
|
package/dist/esm/eimer/index.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
export * from './Eimer';
|
|
2
2
|
export * from './EimerDependencies';
|
|
3
3
|
export * from './EimerMessage';
|
|
4
|
+
export * from './EimerMessageMeta';
|
|
4
5
|
export * from './EimerOptions';
|
|
5
6
|
export * from './IdGenerator';
|
|
6
7
|
export * from './Logger';
|
|
@@ -16,5 +17,9 @@ export * from './RpcManager';
|
|
|
16
17
|
export * from './RpcMethod';
|
|
17
18
|
export * from './StructuredCloneable';
|
|
18
19
|
export * from './Topic';
|
|
20
|
+
export * from './TraceContext';
|
|
21
|
+
export * from './Tracer';
|
|
22
|
+
export * from './TracerBackend';
|
|
23
|
+
export * from './TraceSpan';
|
|
19
24
|
export * from './Transport';
|
|
20
25
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/eimer/index.ts"],"names":[],"mappings":"AAAA,cAAc,SAAS,CAAC;AACxB,cAAc,qBAAqB,CAAC;AACpC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,eAAe,CAAC;AAC9B,cAAc,UAAU,CAAC;AACzB,cAAc,YAAY,CAAC;AAC3B,cAAc,sBAAsB,CAAC;AACrC,cAAc,cAAc,CAAC;AAC7B,cAAc,kBAAkB,CAAC;AACjC,cAAc,aAAa,CAAC;AAC5B,cAAc,UAAU,CAAC;AACzB,cAAc,kBAAkB,CAAC;AACjC,cAAc,cAAc,CAAC;AAC7B,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC;AAC5B,cAAc,uBAAuB,CAAC;AACtC,cAAc,SAAS,CAAC;AACxB,cAAc,aAAa,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/eimer/index.ts"],"names":[],"mappings":"AAAA,cAAc,SAAS,CAAC;AACxB,cAAc,qBAAqB,CAAC;AACpC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,oBAAoB,CAAC;AACnC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,eAAe,CAAC;AAC9B,cAAc,UAAU,CAAC;AACzB,cAAc,YAAY,CAAC;AAC3B,cAAc,sBAAsB,CAAC;AACrC,cAAc,cAAc,CAAC;AAC7B,cAAc,kBAAkB,CAAC;AACjC,cAAc,aAAa,CAAC;AAC5B,cAAc,UAAU,CAAC;AACzB,cAAc,kBAAkB,CAAC;AACjC,cAAc,cAAc,CAAC;AAC7B,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC;AAC5B,cAAc,uBAAuB,CAAC;AACtC,cAAc,SAAS,CAAC;AACxB,cAAc,gBAAgB,CAAC;AAC/B,cAAc,UAAU,CAAC;AACzB,cAAc,iBAAiB,CAAC;AAChC,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A timestamp (milliseconds since the Unix epoch) suitable for hop/span
|
|
3
|
+
* timing: `performance.now()` is monotonic and higher-resolution than
|
|
4
|
+
* `Date.now()` (important for sub-millisecond IPC hops), and unaffected by
|
|
5
|
+
* wall-clock adjustments (NTP sync, sleep/resume) that can otherwise produce
|
|
6
|
+
* negative durations - but it's relative to each process's own start, so
|
|
7
|
+
* `performance.timeOrigin` is added back in to make it comparable across
|
|
8
|
+
* processes. `performance` is available as a global in the browser, and in
|
|
9
|
+
* Node (backed by `node:perf_hooks`) since Node 16 - no import needed.
|
|
10
|
+
*/
|
|
11
|
+
export function now() {
|
|
12
|
+
return performance.timeOrigin + performance.now();
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=now.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"now.js","sourceRoot":"","sources":["../../../src/eimer/now.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,MAAM,UAAU,GAAG;IACf,OAAO,WAAW,CAAC,UAAU,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;AACtD,CAAC"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { LogLevel } from '../eimer/LogLevel';
|
|
2
2
|
import { EimerLogger } from '../logger/EimerLogger';
|
|
3
|
+
import { EimerNoopTracer } from '../tracing/EimerNoopTracer';
|
|
3
4
|
export class EimerMessageBus {
|
|
4
5
|
constructor(nodeId, options, dependencies) {
|
|
5
6
|
this.handlers = new Map();
|
|
@@ -7,6 +8,7 @@ export class EimerMessageBus {
|
|
|
7
8
|
this.seenMessages = new Set(); // @todo: only store the last X message ids and purge the rest
|
|
8
9
|
this.nodeId = nodeId;
|
|
9
10
|
this.logger = dependencies?.logger ?? new EimerLogger(options?.logLevel ?? LogLevel.DEBUG, options?.logModuleName ?? 'MessageBus', this.nodeId);
|
|
11
|
+
this.tracer = dependencies?.tracer ?? new EimerNoopTracer();
|
|
10
12
|
}
|
|
11
13
|
connectTransport(transport) {
|
|
12
14
|
this.logger.debug('Connecting transport', { transport });
|
|
@@ -29,7 +31,7 @@ export class EimerMessageBus {
|
|
|
29
31
|
});
|
|
30
32
|
// Handle locally first
|
|
31
33
|
this.handleMessage(message);
|
|
32
|
-
// Forward to all transports
|
|
34
|
+
// Forward to all transports
|
|
33
35
|
this.transports.forEach(transport => {
|
|
34
36
|
try {
|
|
35
37
|
transport.send(message);
|
|
@@ -103,14 +105,30 @@ export class EimerMessageBus {
|
|
|
103
105
|
// Handle locally first (handleMessage will add to seenMessages)
|
|
104
106
|
this.handleMessage(message);
|
|
105
107
|
// Forward to all other transports (excluding the source transport to prevent loops)
|
|
106
|
-
Array.from(this.transports).filter(otherTransport => otherTransport !== sourceTransport)
|
|
108
|
+
const otherTransports = Array.from(this.transports).filter(otherTransport => otherTransport !== sourceTransport);
|
|
109
|
+
if (otherTransports.length === 0) {
|
|
110
|
+
return;
|
|
111
|
+
}
|
|
112
|
+
let forwardMessage = message;
|
|
113
|
+
if (message.meta?.collectEimerTraces && message.meta?.trace) {
|
|
114
|
+
const relayTrace = this.tracer.startSpan(message.topic, { isEimerTrace: true, node: this.nodeId, component: 'Eimer', op: 'forward' }, message.meta.trace);
|
|
115
|
+
// clone message before forwarding so trace data is kept independent
|
|
116
|
+
forwardMessage = {
|
|
117
|
+
...message,
|
|
118
|
+
meta: { ...message.meta, trace: relayTrace }
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
otherTransports.forEach(otherTransport => {
|
|
107
122
|
try {
|
|
108
|
-
otherTransport.send(
|
|
123
|
+
otherTransport.send(forwardMessage);
|
|
109
124
|
}
|
|
110
125
|
catch (error) {
|
|
111
126
|
this.logger.error('Error forwarding message through transport', { error });
|
|
112
127
|
}
|
|
113
128
|
});
|
|
129
|
+
if (message.meta?.collectEimerTraces && message.meta?.trace) {
|
|
130
|
+
this.tracer.endSpan(forwardMessage.meta?.trace?.spanId);
|
|
131
|
+
}
|
|
114
132
|
}
|
|
115
133
|
}
|
|
116
134
|
//# sourceMappingURL=EimerMessageBus.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EimerMessageBus.js","sourceRoot":"","sources":["../../../src/message-bus/EimerMessageBus.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"EimerMessageBus.js","sourceRoot":"","sources":["../../../src/message-bus/EimerMessageBus.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,6 +5,7 @@ import { EimerRpcResponsePayload } from './EimerRpcResponsePayload';
|
|
|
5
5
|
import { LogLevel } from '../eimer/LogLevel';
|
|
6
6
|
import { EimerIdGenerator } from '../id-generator/EimerIdGenerator';
|
|
7
7
|
import { EimerLogger } from '../logger/EimerLogger';
|
|
8
|
+
import { EimerNoopTracer } from '../tracing/EimerNoopTracer';
|
|
8
9
|
/**
|
|
9
10
|
* Reference Implementation of `RpcManager`
|
|
10
11
|
*/
|
|
@@ -22,13 +23,14 @@ export class EimerRpcManager {
|
|
|
22
23
|
// Stores unsubscriber functions of RPC Handlers, indexed by RPC method name
|
|
23
24
|
this.unsubscriberFunctions = new Map();
|
|
24
25
|
// Timeout for RPC calls, in milliseconds
|
|
25
|
-
this.
|
|
26
|
+
this.timeoutMs = 1000;
|
|
26
27
|
this.isSubscribedToResponses = false;
|
|
27
28
|
this.nodeId = nodeId;
|
|
28
29
|
this.messageBus = messageBus;
|
|
29
|
-
this.
|
|
30
|
+
this.timeoutMs = (options?.timeoutMs !== null && options?.timeoutMs !== undefined) ? options?.timeoutMs : 1000;
|
|
30
31
|
this.idGenerator = dependencies?.idGenerator ?? new EimerIdGenerator();
|
|
31
32
|
this.logger = dependencies?.logger ?? new EimerLogger(options?.logLevel ?? LogLevel.DEBUG, options?.logModuleName ?? 'RpcManager', this.nodeId);
|
|
33
|
+
this.tracer = dependencies?.tracer ?? new EimerNoopTracer();
|
|
32
34
|
}
|
|
33
35
|
/**
|
|
34
36
|
* Register a handler for an RPC method call
|
|
@@ -45,26 +47,33 @@ export class EimerRpcManager {
|
|
|
45
47
|
* Call a remote method and await the response (or error)
|
|
46
48
|
* @param method method name
|
|
47
49
|
* @param params parameters for call
|
|
48
|
-
* @param
|
|
50
|
+
* @param timeoutMs timeout for call, in milliseconds
|
|
51
|
+
* @param meta optional metadata
|
|
49
52
|
* @returns
|
|
50
53
|
*/
|
|
51
|
-
async call(method, params,
|
|
54
|
+
async call(method, params, timeoutMs, meta) {
|
|
52
55
|
if (!this.isSubscribedToResponses) {
|
|
53
56
|
this.messageBus.subscribe(EimerRpcResponseMessage.TOPIC_PREFIX, this.handleResponseMessage.bind(this));
|
|
54
57
|
this.isSubscribedToResponses = true;
|
|
55
58
|
}
|
|
56
59
|
return new Promise((resolve, reject) => {
|
|
57
60
|
const requestId = method + ':' + this.idGenerator.generateId();
|
|
61
|
+
if (meta?.collectEimerTraces && meta?.trace) {
|
|
62
|
+
meta.trace = this.tracer.startSpan(method, { isEimerTrace: true, node: this.nodeId, component: 'EimerRpcManager', op: 'call' }, meta.trace);
|
|
63
|
+
}
|
|
58
64
|
const timeoutId = setTimeout(() => {
|
|
59
65
|
this.pendingRequests.delete(requestId);
|
|
66
|
+
this.tracer.endSpan(meta?.trace?.spanId, { eimerRpcTimeout: true });
|
|
60
67
|
reject(new Error(`RPC call of ${method} timed out`));
|
|
61
|
-
},
|
|
68
|
+
}, timeoutMs || this.timeoutMs);
|
|
62
69
|
this.pendingRequests.set(requestId, {
|
|
63
70
|
resolve: resolve,
|
|
64
71
|
reject,
|
|
65
|
-
timeout: timeoutId
|
|
72
|
+
timeout: timeoutId,
|
|
73
|
+
method,
|
|
74
|
+
meta
|
|
66
75
|
});
|
|
67
|
-
const requestMessage = new EimerRpcRequestMessage(this.idGenerator.generateId(), this.nodeId, `${EimerRpcRequestMessage.TOPIC_PREFIX}.${method}`, new EimerRpcRequestPayload(requestId, method, params));
|
|
76
|
+
const requestMessage = new EimerRpcRequestMessage(this.idGenerator.generateId(), this.nodeId, `${EimerRpcRequestMessage.TOPIC_PREFIX}.${method}`, new EimerRpcRequestPayload(requestId, method, params), meta);
|
|
68
77
|
this.logger.debug('Publishing RPC request', { requestId, method, params, requestMessage });
|
|
69
78
|
this.messageBus.publish(requestMessage);
|
|
70
79
|
});
|
|
@@ -93,6 +102,9 @@ export class EimerRpcManager {
|
|
|
93
102
|
}
|
|
94
103
|
for (const request of this.pendingRequests.values()) {
|
|
95
104
|
request.reject('RPC Manager shutdown');
|
|
105
|
+
if (request?.meta?.collectEimerTraces && request?.meta?.trace) {
|
|
106
|
+
this.tracer.endSpan(request.meta?.trace?.spanId, { eimerRpcShutdown: true });
|
|
107
|
+
}
|
|
96
108
|
}
|
|
97
109
|
this.messageBus.shutdown();
|
|
98
110
|
}
|
|
@@ -115,6 +127,7 @@ export class EimerRpcManager {
|
|
|
115
127
|
}
|
|
116
128
|
clearTimeout(pendingRequest.timeout);
|
|
117
129
|
this.pendingRequests.delete(payload.requestId);
|
|
130
|
+
this.tracer.endSpan(pendingRequest.meta?.trace?.spanId);
|
|
118
131
|
if (payload.error) {
|
|
119
132
|
this.logger.debug('Rejecting RPC response', { payload });
|
|
120
133
|
pendingRequest.reject(payload.error);
|
|
@@ -140,17 +153,26 @@ export class EimerRpcManager {
|
|
|
140
153
|
this.logger.warn('RPC Callback was called for non-existing handler', { requestId: requestPayload.requestId, method: requestPayload.method });
|
|
141
154
|
return;
|
|
142
155
|
}
|
|
156
|
+
let trace = requestMessage.meta?.trace;
|
|
157
|
+
if (requestMessage.meta?.collectEimerTraces && trace) {
|
|
158
|
+
trace = this.tracer.startSpan(requestPayload.method, { isEimerTrace: true, node: this.nodeId, component: 'EimerRpcManager', op: 'handleRequestMessage' }, trace);
|
|
159
|
+
}
|
|
143
160
|
let responsePayload;
|
|
144
161
|
try {
|
|
145
162
|
this.logger.debug('Calling RPC Handler', { requestId: requestPayload.requestId, method: requestPayload.method, params: requestPayload.params });
|
|
146
|
-
const result = await handler(requestPayload.params);
|
|
163
|
+
const result = await handler(requestPayload.params, trace ? { ...requestMessage.meta, trace } : requestMessage.meta);
|
|
147
164
|
responsePayload = new EimerRpcResponsePayload(requestPayload.requestId, undefined, result);
|
|
148
165
|
}
|
|
149
166
|
catch (error) {
|
|
150
167
|
this.logger.warn('RPC Handler threw error', { requestId: requestPayload.requestId, method: requestPayload.method, error });
|
|
151
168
|
responsePayload = new EimerRpcResponsePayload(requestPayload.requestId, error, undefined);
|
|
152
169
|
}
|
|
153
|
-
|
|
170
|
+
finally {
|
|
171
|
+
if (requestMessage.meta?.collectEimerTraces && trace) {
|
|
172
|
+
this.tracer.endSpan(trace?.spanId);
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
const responseMessage = new EimerRpcResponseMessage(this.idGenerator.generateId(), this.nodeId, EimerRpcResponseMessage.TOPIC_PREFIX, responsePayload, trace ? { ...requestMessage.meta, trace } : requestMessage.meta);
|
|
154
176
|
this.logger.debug('Publishing RPC Response', { requestId: requestPayload.requestId, method: requestPayload.method, responseMessage });
|
|
155
177
|
this.messageBus.publish(responseMessage);
|
|
156
178
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EimerRpcManager.js","sourceRoot":"","sources":["../../../src/rpc/EimerRpcManager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAClE,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAClE,OAAO,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAC;AACpE,OAAO,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAC;
|
|
1
|
+
{"version":3,"file":"EimerRpcManager.js","sourceRoot":"","sources":["../../../src/rpc/EimerRpcManager.ts"],"names":[],"mappings":"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"}
|
|
@@ -7,8 +7,8 @@ import { EimerMessage } from '../eimer/EimerMessage';
|
|
|
7
7
|
* with its parameters/arguments.
|
|
8
8
|
*/
|
|
9
9
|
export class EimerRpcRequestMessage extends EimerMessage {
|
|
10
|
-
constructor(id, from, topic, payload) {
|
|
11
|
-
super(id, from, topic, payload);
|
|
10
|
+
constructor(id, from, topic, payload, meta) {
|
|
11
|
+
super(id, from, topic, payload, meta);
|
|
12
12
|
}
|
|
13
13
|
/**
|
|
14
14
|
* User-defined Type Guard to ensure the message is an RPC Request
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EimerRpcRequestMessage.js","sourceRoot":"","sources":["../../../src/rpc/EimerRpcRequestMessage.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAElE,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"EimerRpcRequestMessage.js","sourceRoot":"","sources":["../../../src/rpc/EimerRpcRequestMessage.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAElE,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAOrD;;;;;GAKG;AACH,MAAM,OAAO,sBAAuB,SAAQ,YAAY;IASpD,YACI,EAAa,EACb,IAAY,EACZ,KAAY,EACZ,OAA+B,EAC/B,IAAuB;QAEvB,KAAK,CAAC,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;IAC1C,CAAC;IAED;;;;;OAKG;IACH,MAAM,CAAC,wBAAwB,CAAC,OAAqB;QACjD,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,sBAAsB,CAAC,YAAY,CAAC,EAAE,CAAC;YACjE,OAAO,KAAK,CAAC;QACjB,CAAC;QACD,IAAI,CAAC,CAAC,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC,sBAAsB,CAAC,wBAAwB,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;YAC/F,OAAO,KAAK,CAAC;QACjB,CAAC;QACD,OAAO,IAAI,CAAC;IAChB,CAAC;;AAhCD;;;GAGG;AACI,mCAAY,GAAS,mBAAmB,CAAC"}
|
|
@@ -8,8 +8,8 @@ import { EimerMessage } from "../eimer/EimerMessage";
|
|
|
8
8
|
* there was one.
|
|
9
9
|
*/
|
|
10
10
|
export class EimerRpcResponseMessage extends EimerMessage {
|
|
11
|
-
constructor(id, from, topic, payload) {
|
|
12
|
-
super(id, from, topic, payload);
|
|
11
|
+
constructor(id, from, topic, payload, meta) {
|
|
12
|
+
super(id, from, topic, payload, meta);
|
|
13
13
|
}
|
|
14
14
|
/**
|
|
15
15
|
* User-defined Type Guard to ensure the message is an RPC Response
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EimerRpcResponseMessage.js","sourceRoot":"","sources":["../../../src/rpc/EimerRpcResponseMessage.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAC;AAEpE,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"EimerRpcResponseMessage.js","sourceRoot":"","sources":["../../../src/rpc/EimerRpcResponseMessage.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAC;AAEpE,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAOrD;;;;;;GAMG;AACH,MAAM,OAAO,uBAAwB,SAAQ,YAAY;IAUrD,YACI,EAAa,EACb,IAAY,EACZ,KAAY,EACZ,OAAgC,EAChC,IAAmC;QAEnC,KAAK,CAAC,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;IAC1C,CAAC;IAED;;;;;OAKG;IACH,MAAM,CAAC,yBAAyB,CAAC,OAAqB;QAClD,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,uBAAuB,CAAC,YAAY,CAAC,EAAE,CAAC;YAClE,OAAO,KAAK,CAAC;QACjB,CAAC;QACD,IAAI,CAAC,CAAC,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC,uBAAuB,CAAC,yBAAyB,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;YACjG,OAAO,KAAK,CAAC;QACjB,CAAC;QACD,OAAO,IAAI,CAAC;IAChB,CAAC;;AAjCD;;;;GAIG;AACI,oCAAY,GAAG,oBAAoB,CAAC"}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `TracerBackend` that accumulates spans per `traceId` and prints each trace
|
|
3
|
+
* as a nested `console.group()` tree once it goes quiet, rather than logging
|
|
4
|
+
* every span as it arrives. "Quiet" means no new span has been recorded for
|
|
5
|
+
* that `traceId` for `ttlMs`, measured against the `startedAt` of the most
|
|
6
|
+
* recently received span (not wall-clock arrival time), checked on a
|
|
7
|
+
* `sweepIntervalMs` interval.
|
|
8
|
+
*
|
|
9
|
+
* This is a heuristic: a trace that may not be complete but has not received
|
|
10
|
+
* new spans for longer than `ttlMs` will be printed.
|
|
11
|
+
* Any span for it that arrives afterwards is treated as the start of a new trace
|
|
12
|
+
* and printed as its own, separate group once it too goes quiet.
|
|
13
|
+
*/
|
|
14
|
+
export class ConsoleLoggingTracerBackend {
|
|
15
|
+
constructor(options, consoleLike) {
|
|
16
|
+
this.pendingSpans = new Map();
|
|
17
|
+
this.lastStartedAt = new Map();
|
|
18
|
+
this.ttlMs = options?.ttlMs ?? 5000;
|
|
19
|
+
this.sweepIntervalMs = options?.sweepIntervalMs ?? 1000;
|
|
20
|
+
this.console = consoleLike ?? console;
|
|
21
|
+
}
|
|
22
|
+
handleSpan(span) {
|
|
23
|
+
const spans = this.pendingSpans.get(span.traceId) ?? [];
|
|
24
|
+
spans.push(span);
|
|
25
|
+
this.pendingSpans.set(span.traceId, spans);
|
|
26
|
+
this.lastStartedAt.set(span.traceId, span.startedAt);
|
|
27
|
+
this.ensureSweeping();
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Immediately prints any accumulated traces and stops the sweep timer.
|
|
31
|
+
* Called via `Eimer.shutdown()` -> `Tracer.shutdown()` if this backend is
|
|
32
|
+
* plugged into that node's `Tracer`, so no accumulated spans are
|
|
33
|
+
* silently lost and no timer lingers past shutdown.
|
|
34
|
+
*/
|
|
35
|
+
shutdown() {
|
|
36
|
+
this.stopSweeping();
|
|
37
|
+
for (const traceId of [...this.pendingSpans.keys()]) {
|
|
38
|
+
this.flush(traceId);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
ensureSweeping() {
|
|
42
|
+
if (this.sweepTimer) {
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
this.sweepTimer = setInterval(() => this.sweep(), this.sweepIntervalMs);
|
|
46
|
+
// Don't let an idle sweep timer keep a Node process alive.
|
|
47
|
+
this.sweepTimer.unref?.();
|
|
48
|
+
}
|
|
49
|
+
stopSweeping() {
|
|
50
|
+
if (this.sweepTimer) {
|
|
51
|
+
clearInterval(this.sweepTimer);
|
|
52
|
+
this.sweepTimer = undefined;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
sweep() {
|
|
56
|
+
const now = Date.now();
|
|
57
|
+
for (const [traceId, startedAt] of this.lastStartedAt) {
|
|
58
|
+
if (now - startedAt >= this.ttlMs) {
|
|
59
|
+
this.flush(traceId);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
if (this.pendingSpans.size === 0) {
|
|
63
|
+
this.stopSweeping();
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
flush(traceId) {
|
|
67
|
+
const spans = this.pendingSpans.get(traceId);
|
|
68
|
+
if (!spans) {
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
this.pendingSpans.delete(traceId);
|
|
72
|
+
this.lastStartedAt.delete(traceId);
|
|
73
|
+
this.printTrace(traceId, spans);
|
|
74
|
+
}
|
|
75
|
+
printTrace(traceId, spans) {
|
|
76
|
+
const byParentSpanId = new Map();
|
|
77
|
+
const spanIds = new Set(spans.map(span => span.spanId));
|
|
78
|
+
for (const span of spans) {
|
|
79
|
+
// Parent spans recorded on other nodes may never reach this
|
|
80
|
+
// backend, so fall back to treating such spans as roots rather
|
|
81
|
+
// than dropping them.
|
|
82
|
+
const parentKey = span.parentSpanId && spanIds.has(span.parentSpanId) ? span.parentSpanId : undefined;
|
|
83
|
+
const siblings = byParentSpanId.get(parentKey) ?? [];
|
|
84
|
+
siblings.push(span);
|
|
85
|
+
byParentSpanId.set(parentKey, siblings);
|
|
86
|
+
}
|
|
87
|
+
const byStartedAt = (a, b) => a.startedAt - b.startedAt;
|
|
88
|
+
const printSpan = (span) => {
|
|
89
|
+
const children = (byParentSpanId.get(span.spanId) ?? []).sort(byStartedAt);
|
|
90
|
+
const label = `${span.name} (${span.durationMs.toFixed(2)}ms)`;
|
|
91
|
+
if (children.length === 0) {
|
|
92
|
+
this.console.log(label, span);
|
|
93
|
+
return;
|
|
94
|
+
}
|
|
95
|
+
this.console.group(label, span);
|
|
96
|
+
for (const child of children) {
|
|
97
|
+
printSpan(child);
|
|
98
|
+
}
|
|
99
|
+
this.console.groupEnd();
|
|
100
|
+
};
|
|
101
|
+
const roots = (byParentSpanId.get(undefined) ?? []).sort(byStartedAt);
|
|
102
|
+
this.console.group(`trace ${traceId} (${spans.length} span${spans.length === 1 ? '' : 's'})`);
|
|
103
|
+
for (const root of roots) {
|
|
104
|
+
printSpan(root);
|
|
105
|
+
}
|
|
106
|
+
this.console.groupEnd();
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
//# sourceMappingURL=ConsoleLoggingTracerBackend.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ConsoleLoggingTracerBackend.js","sourceRoot":"","sources":["../../../src/tracing/ConsoleLoggingTracerBackend.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { LogLevel } from '../eimer/LogLevel';
|
|
2
|
+
import { EimerLogger } from '../logger/EimerLogger';
|
|
3
|
+
/**
|
|
4
|
+
* A `TracerBackend` that logs every recorded span via `Logger`
|
|
5
|
+
*/
|
|
6
|
+
export class EimerLoggerTracerBackend {
|
|
7
|
+
constructor(logger) {
|
|
8
|
+
this.logger = logger ?? new EimerLogger(LogLevel.INFO, 'EimerLoggerTracerBackend');
|
|
9
|
+
}
|
|
10
|
+
handleSpan(span) {
|
|
11
|
+
this.logger.info(`${span.name} (${span.durationMs.toFixed(2)}ms)`, span);
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=EimerLoggerTracerBackend.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EimerLoggerTracerBackend.js","sourceRoot":"","sources":["../../../src/tracing/EimerLoggerTracerBackend.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC7C,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAMpD;;GAEG;AACH,MAAM,OAAO,wBAAwB;IAGjC,YAAY,MAAe;QACvB,IAAI,CAAC,MAAM,GAAG,MAAM,IAAI,IAAI,WAAW,CAAC,QAAQ,CAAC,IAAI,EAAE,0BAA0B,CAAC,CAAC;IACvF,CAAC;IAED,UAAU,CAAC,IAAe;QACtB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IAC7E,CAAC;CACJ"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { EimerIdGenerator } from '../id-generator/EimerIdGenerator';
|
|
2
|
+
/**
|
|
3
|
+
* `Tracer` that does nothing (except id generation)
|
|
4
|
+
* Saves a bunch of if-statements wherever a tracer is optional
|
|
5
|
+
*/
|
|
6
|
+
export class EimerNoopTracer {
|
|
7
|
+
constructor(idGenerator) {
|
|
8
|
+
this.idGenerator = idGenerator ?? new EimerIdGenerator();
|
|
9
|
+
}
|
|
10
|
+
setBackend(_backend) {
|
|
11
|
+
// no-op
|
|
12
|
+
}
|
|
13
|
+
startSpan(_name, _metadata, parent) {
|
|
14
|
+
return { traceId: parent?.traceId ?? this.idGenerator.generateId(), spanId: this.idGenerator.generateId() };
|
|
15
|
+
}
|
|
16
|
+
endSpan(_tracedId, _metadata) {
|
|
17
|
+
// no-op
|
|
18
|
+
}
|
|
19
|
+
shutdown() {
|
|
20
|
+
// no-op
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=EimerNoopTracer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EimerNoopTracer.js","sourceRoot":"","sources":["../../../src/tracing/EimerNoopTracer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;AAQpE;;;GAGG;AACH,MAAM,OAAO,eAAe;IAGxB,YAAY,WAAyB;QACjC,IAAI,CAAC,WAAW,GAAG,WAAW,IAAI,IAAI,gBAAgB,EAAE,CAAC;IAC7D,CAAC;IAED,UAAU,CAAC,QAAwB;QAC/B,QAAQ;IACZ,CAAC;IAED,SAAS,CAAC,KAAa,EAAE,SAAmC,EAAE,MAAqB;QAC/E,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,IAAI,IAAI,CAAC,WAAW,CAAC,UAAU,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,WAAW,CAAC,UAAU,EAAE,EAAE,CAAC;IAChH,CAAC;IAED,OAAO,CAAC,SAAkB,EAAE,SAAmC;QAC3D,QAAQ;IACZ,CAAC;IAED,QAAQ;QACJ,QAAQ;IACZ,CAAC;CACJ"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A `TracerBackend` that sends forwards spans through through an Eimer instance
|
|
3
|
+
*
|
|
4
|
+
* This backend only *sends* spans - it should be paired with `EimerTraceSubscriber`
|
|
5
|
+
* elsewhere on the Eimer mesh to *receive* and process the spans.
|
|
6
|
+
*/
|
|
7
|
+
export class EimerPublishingTracerBackend {
|
|
8
|
+
constructor(eimer, topic = 'eimer.traces') {
|
|
9
|
+
this.eimer = eimer;
|
|
10
|
+
this.topic = topic;
|
|
11
|
+
}
|
|
12
|
+
handleSpan(span) {
|
|
13
|
+
this.eimer.publish(this.topic, span);
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=EimerPublishingTracerBackend.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EimerPublishingTracerBackend.js","sourceRoot":"","sources":["../../../src/tracing/EimerPublishingTracerBackend.ts"],"names":[],"mappings":"AAKA;;;;;GAKG;AACH,MAAM,OAAO,4BAA4B;IAIrC,YAAY,KAAY,EAAE,QAAe,cAAc;QACnD,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACvB,CAAC;IAED,UAAU,CAAC,IAAe;QACtB,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IACzC,CAAC;CACJ"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The companion to `EimerPublishingTracerBackend`.
|
|
3
|
+
*
|
|
4
|
+
* Subscribes to the Eimer traces on `topic` and forwards every received
|
|
5
|
+
* `TraceSpan` into its configured `backend`
|
|
6
|
+
*/
|
|
7
|
+
export class EimerTraceSubscriber {
|
|
8
|
+
constructor(eimer, backend, topic = 'eimer.traces') {
|
|
9
|
+
this.backend = backend;
|
|
10
|
+
this.unsubscribe = eimer.subscribe(topic, (payload) => {
|
|
11
|
+
this.backend.handleSpan(payload);
|
|
12
|
+
});
|
|
13
|
+
}
|
|
14
|
+
/** Stop receiving spans and unsubscribe from `topic`. */
|
|
15
|
+
stop() {
|
|
16
|
+
this.unsubscribe();
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=EimerTraceSubscriber.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EimerTraceSubscriber.js","sourceRoot":"","sources":["../../../src/tracing/EimerTraceSubscriber.ts"],"names":[],"mappings":"AAKA;;;;;GAKG;AACH,MAAM,OAAO,oBAAoB;IAI7B,YAAY,KAAY,EAAE,OAAsB,EAAE,QAAe,cAAc;QAC3E,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC,OAAO,EAAE,EAAE;YAClD,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,OAAoB,CAAC,CAAC;QAClD,CAAC,CAAC,CAAC;IACP,CAAC;IAED,yDAAyD;IACzD,IAAI;QACA,IAAI,CAAC,WAAW,EAAE,CAAC;IACvB,CAAC;CACJ"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { now } from './now';
|
|
2
|
+
import { MemoryTracerBackend } from './MemoryTracerBackend';
|
|
3
|
+
import { EimerIdGenerator } from '../id-generator/EimerIdGenerator';
|
|
4
|
+
/**
|
|
5
|
+
* A reference `Tracer` implementation.
|
|
6
|
+
*
|
|
7
|
+
* Keeps open spans in memory until they are "end"-ed and then
|
|
8
|
+
* forwards them to its `TracerBackend`
|
|
9
|
+
*/
|
|
10
|
+
export class EimerTracer {
|
|
11
|
+
constructor(backend, idGenerator) {
|
|
12
|
+
this.openSpans = new Map();
|
|
13
|
+
this.backend = backend ?? new MemoryTracerBackend();
|
|
14
|
+
this.idGenerator = idGenerator ?? new EimerIdGenerator();
|
|
15
|
+
}
|
|
16
|
+
setBackend(backend) {
|
|
17
|
+
this.backend = backend;
|
|
18
|
+
}
|
|
19
|
+
startSpan(name, metadata, parent) {
|
|
20
|
+
const traceId = parent?.traceId ?? this.idGenerator.generateId();
|
|
21
|
+
const spanId = this.idGenerator.generateId();
|
|
22
|
+
this.openSpans.set(spanId, {
|
|
23
|
+
traceId,
|
|
24
|
+
spanId,
|
|
25
|
+
...(parent?.spanId ? { parentSpanId: parent?.spanId } : {}),
|
|
26
|
+
name,
|
|
27
|
+
...(metadata ? { metadata } : {}),
|
|
28
|
+
startedAt: now(),
|
|
29
|
+
durationMs: 0,
|
|
30
|
+
});
|
|
31
|
+
return { traceId, spanId };
|
|
32
|
+
}
|
|
33
|
+
endSpan(spanId, metadata) {
|
|
34
|
+
const openSpan = this.openSpans.get(spanId);
|
|
35
|
+
if (!openSpan) {
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
this.openSpans.delete(spanId);
|
|
39
|
+
const mergedMetadata = (openSpan.metadata || metadata) ? { ...openSpan.metadata, ...metadata } : undefined;
|
|
40
|
+
const span = {
|
|
41
|
+
traceId: openSpan.traceId,
|
|
42
|
+
spanId,
|
|
43
|
+
...(openSpan.parentSpanId ? { parentSpanId: openSpan.parentSpanId } : {}),
|
|
44
|
+
name: openSpan.name,
|
|
45
|
+
...(mergedMetadata ? { metadata: mergedMetadata } : {}),
|
|
46
|
+
startedAt: openSpan.startedAt,
|
|
47
|
+
durationMs: now() - openSpan.startedAt,
|
|
48
|
+
};
|
|
49
|
+
this.backend.handleSpan(span);
|
|
50
|
+
}
|
|
51
|
+
shutdown() {
|
|
52
|
+
this.backend.shutdown?.();
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=EimerTracer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EimerTracer.js","sourceRoot":"","sources":["../../../src/tracing/EimerTracer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,OAAO,CAAC;AAC5B,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAE5D,OAAO,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;AAQpE;;;;;GAKG;AACH,MAAM,OAAO,WAAW;IAKpB,YAAY,OAAuB,EAAE,WAAyB;QAF7C,cAAS,GAA2B,IAAI,GAAG,EAAE,CAAC;QAG3D,IAAI,CAAC,OAAO,GAAG,OAAO,IAAI,IAAI,mBAAmB,EAAE,CAAC;QACpD,IAAI,CAAC,WAAW,GAAG,WAAW,IAAI,IAAI,gBAAgB,EAAE,CAAC;IAC7D,CAAC;IAED,UAAU,CAAC,OAAsB;QAC7B,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IAC3B,CAAC;IAED,SAAS,CAAC,IAAY,EAAE,QAAkC,EAAE,MAAqB;QAC7E,MAAM,OAAO,GAAG,MAAM,EAAE,OAAO,IAAI,IAAI,CAAC,WAAW,CAAC,UAAU,EAAE,CAAC;QACjE,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,UAAU,EAAE,CAAC;QAC7C,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,EAAE;YACvB,OAAO;YACP,MAAM;YACN,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC3D,IAAI;YACJ,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACjC,SAAS,EAAE,GAAG,EAAE;YAChB,UAAU,EAAE,CAAC;SAChB,CAAC,CAAC;QACH,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;IAC/B,CAAC;IAED,OAAO,CAAC,MAAc,EAAE,QAAkC;QACtD,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAC5C,IAAI,CAAC,QAAQ,EAAE,CAAC;YACZ,OAAO;QACX,CAAC;QACD,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAE9B,MAAM,cAAc,GAAG,CAAC,QAAQ,CAAC,QAAQ,IAAI,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,QAAQ,CAAC,QAAQ,EAAE,GAAG,QAAQ,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;QAE3G,MAAM,IAAI,GAAc;YACpB,OAAO,EAAE,QAAQ,CAAC,OAAO;YACzB,MAAM;YACN,GAAG,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,QAAQ,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACzE,IAAI,EAAE,QAAQ,CAAC,IAAI;YACnB,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,cAAc,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACvD,SAAS,EAAE,QAAQ,CAAC,SAAS;YAC7B,UAAU,EAAE,GAAG,EAAE,GAAG,QAAQ,CAAC,SAAS;SACzC,CAAC;QACF,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;IAClC,CAAC;IAED,QAAQ;QACJ,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC;IAC9B,CAAC;CACJ"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A `TracerBackend` that stores spans in Memory
|
|
3
|
+
*
|
|
4
|
+
* You can extract them with `getRecords`
|
|
5
|
+
*/
|
|
6
|
+
export class MemoryTracerBackend {
|
|
7
|
+
constructor() {
|
|
8
|
+
this.spans = [];
|
|
9
|
+
}
|
|
10
|
+
handleSpan(span) {
|
|
11
|
+
this.spans.push(span);
|
|
12
|
+
}
|
|
13
|
+
getRecords() {
|
|
14
|
+
return [...this.spans];
|
|
15
|
+
}
|
|
16
|
+
clear() {
|
|
17
|
+
this.spans.length = 0;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=MemoryTracerBackend.js.map
|