@powerhousedao/opentelemetry-instrumentation-reactor 6.1.0-dev.4 → 6.1.0-dev.6
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/index.d.ts +14 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +151 -9
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
package/dist/index.d.ts
CHANGED
|
@@ -18,8 +18,13 @@ declare class ReactorInstrumentation {
|
|
|
18
18
|
private subscribeJobWriteReady;
|
|
19
19
|
private subscribeJobReadReady;
|
|
20
20
|
private subscribeJobFailed;
|
|
21
|
+
private subscribeExecutorJobCompleted;
|
|
22
|
+
private subscribeExecutorJobFailed;
|
|
23
|
+
private subscribeReadModelBatchCompleted;
|
|
24
|
+
private subscribeReadModelIndexed;
|
|
21
25
|
private subscribeDeadLetterAdded;
|
|
22
26
|
private registerObservableGauges;
|
|
27
|
+
private registerPoolInstrumentation;
|
|
23
28
|
private cleanup;
|
|
24
29
|
}
|
|
25
30
|
//#endregion
|
|
@@ -36,6 +41,15 @@ declare function createMetrics(): {
|
|
|
36
41
|
executorOperationsGenerated: _opentelemetry_api0.Counter<_opentelemetry_api0.Attributes>;
|
|
37
42
|
jobTotalDuration: _opentelemetry_api0.Histogram<_opentelemetry_api0.Attributes>;
|
|
38
43
|
readmodelIndexDuration: _opentelemetry_api0.Histogram<_opentelemetry_api0.Attributes>;
|
|
44
|
+
readmodelCoordinatorChainDepth: _opentelemetry_api0.ObservableGauge<_opentelemetry_api0.Attributes>;
|
|
45
|
+
readmodelCoordinatorStageDuration: _opentelemetry_api0.Histogram<_opentelemetry_api0.Attributes>;
|
|
46
|
+
readmodelIndexingDuration: _opentelemetry_api0.Histogram<_opentelemetry_api0.Attributes>;
|
|
47
|
+
readmodelCoordinatorBatchSize: _opentelemetry_api0.Histogram<_opentelemetry_api0.Attributes>;
|
|
48
|
+
readmodelCoordinatorChainWaitDuration: _opentelemetry_api0.Histogram<_opentelemetry_api0.Attributes>;
|
|
49
|
+
dbPoolAcquireWaitDuration: _opentelemetry_api0.Histogram<_opentelemetry_api0.Attributes>;
|
|
50
|
+
dbPoolSize: _opentelemetry_api0.ObservableGauge<_opentelemetry_api0.Attributes>;
|
|
51
|
+
dbPoolIdle: _opentelemetry_api0.ObservableGauge<_opentelemetry_api0.Attributes>;
|
|
52
|
+
dbPoolWaiting: _opentelemetry_api0.ObservableGauge<_opentelemetry_api0.Attributes>;
|
|
39
53
|
eventbusEventsEmitted: _opentelemetry_api0.Counter<_opentelemetry_api0.Attributes>;
|
|
40
54
|
syncRemotes: _opentelemetry_api0.ObservableGauge<_opentelemetry_api0.Attributes>;
|
|
41
55
|
syncDeadLettersAdded: _opentelemetry_api0.Counter<_opentelemetry_api0.Attributes>;
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","names":[],"sources":["../src/instrumentation.ts","../src/metrics.ts"],"mappings":";;;;
|
|
1
|
+
{"version":3,"file":"index.d.ts","names":[],"sources":["../src/instrumentation.ts","../src/metrics.ts"],"mappings":";;;;cA4Ba,sBAAA;EAAA,iBACM,MAAA;EAAA,QACT,OAAA;EAAA,QACA,YAAA;EAAA,QACA,mBAAA;EAAA,QAGA,iBAAA;EAAA,QACA,iBAAA;EAAA,QACA,oBAAA;cAEI,MAAA,EAAQ,aAAA;EAIpB,KAAA,CAAA;EAuBA,IAAA,CAAA;EAAA,QAeQ,mBAAA;EAAA,QAgBA,mBAAA;EAAA,QAgBA,sBAAA;EAAA,QAgBA,qBAAA;EAAA,QA6BA,kBAAA;EAAA,QAuBA,6BAAA;EAAA,QA4BA,0BAAA;EAAA,QA4BA,gCAAA;EAAA,QA8BA,yBAAA;EAAA,QAmBA,wBAAA;EAAA,QAiBA,wBAAA;EAAA,QAoEA,2BAAA;EAAA,QA2CA,OAAA;AAAA;;;iBC1ZM,aAAA,CAAA;iDAAa,mBAAA,CAAA,UAAA;;;;;;;;;;;;;;;;;;;;;;;;KA0JjB,cAAA,GAAiB,UAAA,QAAkB,aAAA"}
|
package/dist/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { ReactorEventTypes, SyncEventTypes } from "@powerhousedao/reactor";
|
|
1
|
+
import { JobExecutorEventTypes, ReactorEventTypes, SyncEventTypes } from "@powerhousedao/reactor";
|
|
2
2
|
import { metrics } from "@opentelemetry/api";
|
|
3
3
|
//#region src/metrics.ts
|
|
4
4
|
const METER_NAME = "@powerhousedao/reactor";
|
|
@@ -49,6 +49,42 @@ function createMetrics() {
|
|
|
49
49
|
description: "Read model indexing time (WRITE_READY to READ_READY)",
|
|
50
50
|
unit: "ms"
|
|
51
51
|
}),
|
|
52
|
+
readmodelCoordinatorChainDepth: meter.createObservableGauge("reactor.readmodel.coordinator.chain_depth", {
|
|
53
|
+
description: "In-flight per-queueKey projection chains in the coordinator",
|
|
54
|
+
unit: "{chain}"
|
|
55
|
+
}),
|
|
56
|
+
readmodelCoordinatorStageDuration: meter.createHistogram("reactor.readmodel.coordinator.stage.duration", {
|
|
57
|
+
description: "Wall time per stage in ReadModelCoordinator.runChain (pre_ready, emit, post_ready)",
|
|
58
|
+
unit: "ms"
|
|
59
|
+
}),
|
|
60
|
+
readmodelIndexingDuration: meter.createHistogram("reactor.readmodel.indexing.duration", {
|
|
61
|
+
description: "Per-read-model indexing duration within a coordinator chain",
|
|
62
|
+
unit: "ms"
|
|
63
|
+
}),
|
|
64
|
+
readmodelCoordinatorBatchSize: meter.createHistogram("reactor.readmodel.coordinator.batch.size", {
|
|
65
|
+
description: "Operations per batch processed by the coordinator chain",
|
|
66
|
+
unit: "{operation}"
|
|
67
|
+
}),
|
|
68
|
+
readmodelCoordinatorChainWaitDuration: meter.createHistogram("reactor.readmodel.coordinator.chain.wait_duration", {
|
|
69
|
+
description: "Time a batch sat in the per-queueKey chain before runChain started",
|
|
70
|
+
unit: "ms"
|
|
71
|
+
}),
|
|
72
|
+
dbPoolAcquireWaitDuration: meter.createHistogram("reactor.db.pool.acquire.wait_duration", {
|
|
73
|
+
description: "Time spent waiting for a pg.Pool to hand out a client (pool.connect resolve latency)",
|
|
74
|
+
unit: "ms"
|
|
75
|
+
}),
|
|
76
|
+
dbPoolSize: meter.createObservableGauge("reactor.db.pool.size", {
|
|
77
|
+
description: "pg.Pool totalCount — connections currently open",
|
|
78
|
+
unit: "{connection}"
|
|
79
|
+
}),
|
|
80
|
+
dbPoolIdle: meter.createObservableGauge("reactor.db.pool.idle", {
|
|
81
|
+
description: "pg.Pool idleCount — open connections not currently in use",
|
|
82
|
+
unit: "{connection}"
|
|
83
|
+
}),
|
|
84
|
+
dbPoolWaiting: meter.createObservableGauge("reactor.db.pool.waiting", {
|
|
85
|
+
description: "pg.Pool waitingCount — callers queued waiting to acquire a connection",
|
|
86
|
+
unit: "{request}"
|
|
87
|
+
}),
|
|
52
88
|
eventbusEventsEmitted: meter.createCounter("reactor.eventbus.events.emitted", {
|
|
53
89
|
description: "Events emitted",
|
|
54
90
|
unit: "{event}"
|
|
@@ -78,14 +114,19 @@ var ReactorInstrumentation = class {
|
|
|
78
114
|
}
|
|
79
115
|
start() {
|
|
80
116
|
this.metrics = createMetrics();
|
|
81
|
-
const { eventBus, queue, executorManager, syncModule } = this.module;
|
|
117
|
+
const { eventBus, queue, executorManager, syncModule, pools } = this.module;
|
|
82
118
|
this.subscribeJobPending(eventBus);
|
|
83
119
|
this.subscribeJobRunning(eventBus);
|
|
84
120
|
this.subscribeJobWriteReady(eventBus);
|
|
85
121
|
this.subscribeJobReadReady(eventBus);
|
|
86
122
|
this.subscribeJobFailed(eventBus);
|
|
123
|
+
this.subscribeExecutorJobCompleted(eventBus);
|
|
124
|
+
this.subscribeExecutorJobFailed(eventBus);
|
|
87
125
|
this.subscribeDeadLetterAdded(eventBus);
|
|
88
|
-
this.
|
|
126
|
+
this.subscribeReadModelBatchCompleted(eventBus);
|
|
127
|
+
this.subscribeReadModelIndexed(eventBus);
|
|
128
|
+
this.registerObservableGauges(queue, executorManager, this.module.readModelCoordinator, syncModule);
|
|
129
|
+
this.registerPoolInstrumentation(pools);
|
|
89
130
|
}
|
|
90
131
|
stop() {
|
|
91
132
|
for (const unsub of this.unsubscribes) unsub();
|
|
@@ -116,13 +157,9 @@ var ReactorInstrumentation = class {
|
|
|
116
157
|
subscribeJobWriteReady(eventBus) {
|
|
117
158
|
this.unsubscribes.push(eventBus.subscribe(ReactorEventTypes.JOB_WRITE_READY, (_type, event) => {
|
|
118
159
|
if (!this.metrics) return;
|
|
119
|
-
const runningTs = this.runningTimestamps.get(event.jobId);
|
|
120
|
-
if (runningTs !== void 0) this.metrics.executorJobDuration.record(performance.now() - runningTs, { "job.success": "true" });
|
|
121
|
-
this.metrics.executorTotalProcessed.add(1, { "job.success": "true" });
|
|
122
160
|
this.metrics.executorOperationsGenerated.add(event.operations.length);
|
|
123
161
|
this.metrics.eventbusEventsEmitted.add(1, { "event.type": "JOB_WRITE_READY" });
|
|
124
162
|
this.writeReadyTimestamps.set(event.jobId, performance.now());
|
|
125
|
-
this.runningTimestamps.delete(event.jobId);
|
|
126
163
|
}));
|
|
127
164
|
}
|
|
128
165
|
subscribeJobReadReady(eventBus) {
|
|
@@ -141,13 +178,74 @@ var ReactorInstrumentation = class {
|
|
|
141
178
|
this.unsubscribes.push(eventBus.subscribe(ReactorEventTypes.JOB_FAILED, (_type, event) => {
|
|
142
179
|
if (!this.metrics) return;
|
|
143
180
|
this.metrics.queueJobsFailed.add(1);
|
|
144
|
-
this.metrics.executorTotalProcessed.add(1, { "job.success": "false" });
|
|
145
181
|
const pendingTs = this.pendingTimestamps.get(event.jobId);
|
|
146
182
|
if (pendingTs !== void 0) this.metrics.jobTotalDuration.record(performance.now() - pendingTs, { "job.success": "false" });
|
|
147
183
|
this.metrics.eventbusEventsEmitted.add(1, { "event.type": "JOB_FAILED" });
|
|
148
184
|
this.cleanup(event.jobId);
|
|
149
185
|
}));
|
|
150
186
|
}
|
|
187
|
+
subscribeExecutorJobCompleted(eventBus) {
|
|
188
|
+
this.unsubscribes.push(eventBus.subscribe(JobExecutorEventTypes.JOB_COMPLETED, (_type, event) => {
|
|
189
|
+
if (!this.metrics) return;
|
|
190
|
+
const workerId = event.workerId ?? "unknown";
|
|
191
|
+
const jobId = event.job.id;
|
|
192
|
+
const runningTs = this.runningTimestamps.get(jobId);
|
|
193
|
+
if (runningTs !== void 0) {
|
|
194
|
+
this.metrics.executorJobDuration.record(performance.now() - runningTs, {
|
|
195
|
+
"job.success": "true",
|
|
196
|
+
"worker.id": workerId
|
|
197
|
+
});
|
|
198
|
+
this.runningTimestamps.delete(jobId);
|
|
199
|
+
}
|
|
200
|
+
this.metrics.executorTotalProcessed.add(1, {
|
|
201
|
+
"job.success": "true",
|
|
202
|
+
"worker.id": workerId
|
|
203
|
+
});
|
|
204
|
+
this.metrics.eventbusEventsEmitted.add(1, { "event.type": "EXECUTOR_JOB_COMPLETED" });
|
|
205
|
+
}));
|
|
206
|
+
}
|
|
207
|
+
subscribeExecutorJobFailed(eventBus) {
|
|
208
|
+
this.unsubscribes.push(eventBus.subscribe(JobExecutorEventTypes.JOB_FAILED, (_type, event) => {
|
|
209
|
+
if (!this.metrics) return;
|
|
210
|
+
const workerId = event.workerId ?? "unknown";
|
|
211
|
+
const jobId = event.job.id;
|
|
212
|
+
const runningTs = this.runningTimestamps.get(jobId);
|
|
213
|
+
if (runningTs !== void 0) {
|
|
214
|
+
this.metrics.executorJobDuration.record(performance.now() - runningTs, {
|
|
215
|
+
"job.success": "false",
|
|
216
|
+
"worker.id": workerId
|
|
217
|
+
});
|
|
218
|
+
this.runningTimestamps.delete(jobId);
|
|
219
|
+
}
|
|
220
|
+
this.metrics.executorTotalProcessed.add(1, {
|
|
221
|
+
"job.success": "false",
|
|
222
|
+
"worker.id": workerId
|
|
223
|
+
});
|
|
224
|
+
this.metrics.eventbusEventsEmitted.add(1, { "event.type": "EXECUTOR_JOB_FAILED" });
|
|
225
|
+
}));
|
|
226
|
+
}
|
|
227
|
+
subscribeReadModelBatchCompleted(eventBus) {
|
|
228
|
+
this.unsubscribes.push(eventBus.subscribe(ReactorEventTypes.READMODEL_BATCH_COMPLETED, (_type, event) => {
|
|
229
|
+
if (!this.metrics) return;
|
|
230
|
+
this.metrics.readmodelCoordinatorChainWaitDuration.record(event.chainWaitDurationMs);
|
|
231
|
+
this.metrics.readmodelCoordinatorBatchSize.record(event.batchSize);
|
|
232
|
+
this.metrics.readmodelCoordinatorStageDuration.record(event.preReadyDurationMs, { stage: "pre_ready" });
|
|
233
|
+
this.metrics.readmodelCoordinatorStageDuration.record(event.emitDurationMs, { stage: "emit" });
|
|
234
|
+
this.metrics.readmodelCoordinatorStageDuration.record(event.postReadyDurationMs, { stage: "post_ready" });
|
|
235
|
+
this.metrics.eventbusEventsEmitted.add(1, { "event.type": "READMODEL_BATCH_COMPLETED" });
|
|
236
|
+
}));
|
|
237
|
+
}
|
|
238
|
+
subscribeReadModelIndexed(eventBus) {
|
|
239
|
+
this.unsubscribes.push(eventBus.subscribe(ReactorEventTypes.READMODEL_INDEXED, (_type, event) => {
|
|
240
|
+
if (!this.metrics) return;
|
|
241
|
+
this.metrics.readmodelIndexingDuration.record(event.durationMs, {
|
|
242
|
+
"read_model.name": event.readModelName,
|
|
243
|
+
stage: event.stage,
|
|
244
|
+
"indexing.success": event.success ? "true" : "false"
|
|
245
|
+
});
|
|
246
|
+
this.metrics.eventbusEventsEmitted.add(1, { "event.type": "READMODEL_INDEXED" });
|
|
247
|
+
}));
|
|
248
|
+
}
|
|
151
249
|
subscribeDeadLetterAdded(eventBus) {
|
|
152
250
|
this.unsubscribes.push(eventBus.subscribe(SyncEventTypes.DEAD_LETTER_ADDED, (_type, event) => {
|
|
153
251
|
if (!this.metrics) return;
|
|
@@ -155,7 +253,7 @@ var ReactorInstrumentation = class {
|
|
|
155
253
|
this.metrics.eventbusEventsEmitted.add(1, { "event.type": "DEAD_LETTER_ADDED" });
|
|
156
254
|
}));
|
|
157
255
|
}
|
|
158
|
-
registerObservableGauges(queue, executorManager, syncModule) {
|
|
256
|
+
registerObservableGauges(queue, executorManager, readModelCoordinator, syncModule) {
|
|
159
257
|
if (!this.metrics) return;
|
|
160
258
|
const depthCb = async (result) => {
|
|
161
259
|
if (!this.metrics) return;
|
|
@@ -181,6 +279,12 @@ var ReactorInstrumentation = class {
|
|
|
181
279
|
};
|
|
182
280
|
this.metrics.executorActiveJobs.addCallback(activeJobsCb);
|
|
183
281
|
this.observableCallbacks.push([this.metrics.executorActiveJobs, activeJobsCb]);
|
|
282
|
+
const chainDepthCb = (result) => {
|
|
283
|
+
if (!this.metrics) return;
|
|
284
|
+
result.observe(readModelCoordinator.getChainDepth());
|
|
285
|
+
};
|
|
286
|
+
this.metrics.readmodelCoordinatorChainDepth.addCallback(chainDepthCb);
|
|
287
|
+
this.observableCallbacks.push([this.metrics.readmodelCoordinatorChainDepth, chainDepthCb]);
|
|
184
288
|
const remotesCb = (result) => {
|
|
185
289
|
if (!this.metrics) return;
|
|
186
290
|
const count = syncModule?.syncManager.list().length ?? 0;
|
|
@@ -189,6 +293,44 @@ var ReactorInstrumentation = class {
|
|
|
189
293
|
this.metrics.syncRemotes.addCallback(remotesCb);
|
|
190
294
|
this.observableCallbacks.push([this.metrics.syncRemotes, remotesCb]);
|
|
191
295
|
}
|
|
296
|
+
registerPoolInstrumentation(pools) {
|
|
297
|
+
if (!this.metrics || pools.length === 0) return;
|
|
298
|
+
for (const pool of pools) {
|
|
299
|
+
const attrs = { pool: pool.name };
|
|
300
|
+
const unsub = pool.onAcquire((durationMs) => {
|
|
301
|
+
if (!this.metrics) return;
|
|
302
|
+
this.metrics.dbPoolAcquireWaitDuration.record(durationMs, attrs);
|
|
303
|
+
});
|
|
304
|
+
this.unsubscribes.push(unsub);
|
|
305
|
+
}
|
|
306
|
+
const sizeCb = (result) => {
|
|
307
|
+
if (!this.metrics) return;
|
|
308
|
+
for (const pool of pools) {
|
|
309
|
+
const stats = pool.getStats();
|
|
310
|
+
result.observe(stats.size, { pool: pool.name });
|
|
311
|
+
}
|
|
312
|
+
};
|
|
313
|
+
this.metrics.dbPoolSize.addCallback(sizeCb);
|
|
314
|
+
this.observableCallbacks.push([this.metrics.dbPoolSize, sizeCb]);
|
|
315
|
+
const idleCb = (result) => {
|
|
316
|
+
if (!this.metrics) return;
|
|
317
|
+
for (const pool of pools) {
|
|
318
|
+
const stats = pool.getStats();
|
|
319
|
+
result.observe(stats.idle, { pool: pool.name });
|
|
320
|
+
}
|
|
321
|
+
};
|
|
322
|
+
this.metrics.dbPoolIdle.addCallback(idleCb);
|
|
323
|
+
this.observableCallbacks.push([this.metrics.dbPoolIdle, idleCb]);
|
|
324
|
+
const waitingCb = (result) => {
|
|
325
|
+
if (!this.metrics) return;
|
|
326
|
+
for (const pool of pools) {
|
|
327
|
+
const stats = pool.getStats();
|
|
328
|
+
result.observe(stats.waiting, { pool: pool.name });
|
|
329
|
+
}
|
|
330
|
+
};
|
|
331
|
+
this.metrics.dbPoolWaiting.addCallback(waitingCb);
|
|
332
|
+
this.observableCallbacks.push([this.metrics.dbPoolWaiting, waitingCb]);
|
|
333
|
+
}
|
|
192
334
|
cleanup(jobId) {
|
|
193
335
|
this.pendingTimestamps.delete(jobId);
|
|
194
336
|
this.runningTimestamps.delete(jobId);
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":[],"sources":["../src/metrics.ts","../src/instrumentation.ts"],"sourcesContent":["import { metrics } from \"@opentelemetry/api\";\n\nconst METER_NAME = \"@powerhousedao/reactor\";\n\nexport function createMetrics() {\n const meter = metrics.getMeter(METER_NAME);\n\n return {\n // Queue metrics\n queueJobsEnqueued: meter.createCounter(\"reactor.queue.jobs.enqueued\", {\n description: \"Jobs enqueued\",\n unit: \"{job}\",\n }),\n queueJobsDequeued: meter.createCounter(\"reactor.queue.jobs.dequeued\", {\n description: \"Jobs dequeued for execution\",\n unit: \"{job}\",\n }),\n queueJobsCompleted: meter.createCounter(\"reactor.queue.jobs.completed\", {\n description: \"Jobs completed (READ_READY)\",\n unit: \"{job}\",\n }),\n queueJobsFailed: meter.createCounter(\"reactor.queue.jobs.failed\", {\n description: \"Jobs permanently failed\",\n unit: \"{job}\",\n }),\n queueDepth: meter.createObservableGauge(\"reactor.queue.depth\", {\n description: \"Pending jobs across all queues\",\n unit: \"{job}\",\n }),\n\n // Executor metrics\n executorJobDuration: meter.createHistogram(\n \"reactor.executor.job.duration\",\n {\n description: \"Job execution time (RUNNING to WRITE_READY)\",\n unit: \"ms\",\n },\n ),\n executorActiveJobs: meter.createObservableGauge(\n \"reactor.executor.active_jobs\",\n {\n description: \"Currently executing jobs\",\n unit: \"{job}\",\n },\n ),\n executorTotalProcessed: meter.createCounter(\"reactor.executor.processed\", {\n description: \"Total jobs processed\",\n unit: \"{job}\",\n }),\n executorOperationsGenerated: meter.createCounter(\n \"reactor.executor.operations_generated\",\n {\n description: \"Operations produced by executors\",\n unit: \"{operation}\",\n },\n ),\n\n // Job lifecycle metrics\n jobTotalDuration: meter.createHistogram(\"reactor.job.total.duration\", {\n description: \"Full job lifecycle (PENDING to READ_READY/FAILED)\",\n unit: \"ms\",\n }),\n\n // Read model metrics\n readmodelIndexDuration: meter.createHistogram(\n \"reactor.readmodel.index.duration\",\n {\n description: \"Read model indexing time (WRITE_READY to READ_READY)\",\n unit: \"ms\",\n },\n ),\n\n // Event bus metrics\n eventbusEventsEmitted: meter.createCounter(\n \"reactor.eventbus.events.emitted\",\n {\n description: \"Events emitted\",\n unit: \"{event}\",\n },\n ),\n\n // Sync metrics\n syncRemotes: meter.createObservableGauge(\"reactor.sync.remotes\", {\n description: \"Active remote count\",\n unit: \"{remote}\",\n }),\n syncDeadLettersAdded: meter.createCounter(\n \"reactor.sync.dead_letters.added\",\n {\n description: \"Sync operations moved to dead letter storage\",\n unit: \"{operation}\",\n },\n ),\n };\n}\n\nexport type ReactorMetrics = ReturnType<typeof createMetrics>;\n","import { ReactorEventTypes, SyncEventTypes } from \"@powerhousedao/reactor\";\nimport type {\n DeadLetterAddedEvent,\n IEventBus,\n IJobExecutorManager,\n IQueue,\n JobPendingEvent,\n JobReadReadyEvent,\n JobRunningEvent,\n JobWriteReadyEvent,\n ReactorJobFailedEvent,\n ReactorModule,\n SyncModule,\n Unsubscribe,\n} from \"@powerhousedao/reactor\";\nimport type { ObservableCallback, ObservableGauge } from \"@opentelemetry/api\";\nimport { createMetrics, type ReactorMetrics } from \"./metrics.js\";\n\nexport class ReactorInstrumentation {\n private readonly module: ReactorModule;\n private metrics: ReactorMetrics | undefined;\n private unsubscribes: Unsubscribe[] = [];\n private observableCallbacks: Array<[ObservableGauge, ObservableCallback]> =\n [];\n\n private pendingTimestamps = new Map<string, number>();\n private runningTimestamps = new Map<string, number>();\n private writeReadyTimestamps = new Map<string, number>();\n\n constructor(module: ReactorModule) {\n this.module = module;\n }\n\n start(): void {\n this.metrics = createMetrics();\n const { eventBus, queue, executorManager, syncModule } = this.module;\n\n this.subscribeJobPending(eventBus);\n this.subscribeJobRunning(eventBus);\n this.subscribeJobWriteReady(eventBus);\n this.subscribeJobReadReady(eventBus);\n this.subscribeJobFailed(eventBus);\n this.subscribeDeadLetterAdded(eventBus);\n this.registerObservableGauges(queue, executorManager, syncModule);\n }\n\n stop(): void {\n for (const unsub of this.unsubscribes) {\n unsub();\n }\n this.unsubscribes = [];\n for (const [gauge, cb] of this.observableCallbacks) {\n gauge.removeCallback(cb);\n }\n this.observableCallbacks = [];\n this.pendingTimestamps.clear();\n this.runningTimestamps.clear();\n this.writeReadyTimestamps.clear();\n this.metrics = undefined;\n }\n\n private subscribeJobPending(eventBus: IEventBus): void {\n this.unsubscribes.push(\n eventBus.subscribe<JobPendingEvent>(\n ReactorEventTypes.JOB_PENDING,\n (_type, event) => {\n if (!this.metrics) return;\n this.metrics.queueJobsEnqueued.add(1);\n this.metrics.eventbusEventsEmitted.add(1, {\n \"event.type\": \"JOB_PENDING\",\n });\n this.pendingTimestamps.set(event.jobId, performance.now());\n },\n ),\n );\n }\n\n private subscribeJobRunning(eventBus: IEventBus): void {\n this.unsubscribes.push(\n eventBus.subscribe<JobRunningEvent>(\n ReactorEventTypes.JOB_RUNNING,\n (_type, event) => {\n if (!this.metrics) return;\n this.metrics.queueJobsDequeued.add(1);\n this.metrics.eventbusEventsEmitted.add(1, {\n \"event.type\": \"JOB_RUNNING\",\n });\n this.runningTimestamps.set(event.jobId, performance.now());\n },\n ),\n );\n }\n\n private subscribeJobWriteReady(eventBus: IEventBus): void {\n this.unsubscribes.push(\n eventBus.subscribe<JobWriteReadyEvent>(\n ReactorEventTypes.JOB_WRITE_READY,\n (_type, event) => {\n if (!this.metrics) return;\n const runningTs = this.runningTimestamps.get(event.jobId);\n if (runningTs !== undefined) {\n this.metrics.executorJobDuration.record(\n performance.now() - runningTs,\n { \"job.success\": \"true\" },\n );\n }\n this.metrics.executorTotalProcessed.add(1, {\n \"job.success\": \"true\",\n });\n this.metrics.executorOperationsGenerated.add(event.operations.length);\n this.metrics.eventbusEventsEmitted.add(1, {\n \"event.type\": \"JOB_WRITE_READY\",\n });\n this.writeReadyTimestamps.set(event.jobId, performance.now());\n this.runningTimestamps.delete(event.jobId);\n },\n ),\n );\n }\n\n private subscribeJobReadReady(eventBus: IEventBus): void {\n this.unsubscribes.push(\n eventBus.subscribe<JobReadReadyEvent>(\n ReactorEventTypes.JOB_READ_READY,\n (_type, event) => {\n if (!this.metrics) return;\n const writeReadyTs = this.writeReadyTimestamps.get(event.jobId);\n if (writeReadyTs !== undefined) {\n this.metrics.readmodelIndexDuration.record(\n performance.now() - writeReadyTs,\n );\n }\n const pendingTs = this.pendingTimestamps.get(event.jobId);\n if (pendingTs !== undefined) {\n this.metrics.jobTotalDuration.record(\n performance.now() - pendingTs,\n { \"job.success\": \"true\" },\n );\n }\n this.metrics.queueJobsCompleted.add(1);\n this.metrics.eventbusEventsEmitted.add(1, {\n \"event.type\": \"JOB_READ_READY\",\n });\n this.cleanup(event.jobId);\n },\n ),\n );\n }\n\n private subscribeJobFailed(eventBus: IEventBus): void {\n this.unsubscribes.push(\n eventBus.subscribe<ReactorJobFailedEvent>(\n ReactorEventTypes.JOB_FAILED,\n (_type, event) => {\n if (!this.metrics) return;\n this.metrics.queueJobsFailed.add(1);\n this.metrics.executorTotalProcessed.add(1, {\n \"job.success\": \"false\",\n });\n const pendingTs = this.pendingTimestamps.get(event.jobId);\n if (pendingTs !== undefined) {\n this.metrics.jobTotalDuration.record(\n performance.now() - pendingTs,\n { \"job.success\": \"false\" },\n );\n }\n this.metrics.eventbusEventsEmitted.add(1, {\n \"event.type\": \"JOB_FAILED\",\n });\n this.cleanup(event.jobId);\n },\n ),\n );\n }\n\n private subscribeDeadLetterAdded(eventBus: IEventBus): void {\n this.unsubscribes.push(\n eventBus.subscribe<DeadLetterAddedEvent>(\n SyncEventTypes.DEAD_LETTER_ADDED,\n (_type, event) => {\n if (!this.metrics) return;\n this.metrics.syncDeadLettersAdded.add(1, {\n \"remote.name\": event.remoteName,\n });\n this.metrics.eventbusEventsEmitted.add(1, {\n \"event.type\": \"DEAD_LETTER_ADDED\",\n });\n },\n ),\n );\n }\n\n private registerObservableGauges(\n queue: IQueue,\n executorManager: IJobExecutorManager,\n syncModule: SyncModule | undefined,\n ): void {\n if (!this.metrics) return;\n\n const depthCb: ObservableCallback = async (result) => {\n if (!this.metrics) return;\n // queue.totalSize() is a DB query. If it exceeds the OTel collection\n // window the observation is silently dropped, making the gauge appear\n // to drop to zero under load. The timeout makes the failure explicit.\n const TIMEOUT_MS = 2_000;\n let timeoutId: ReturnType<typeof setTimeout> | undefined;\n try {\n const depth = await Promise.race([\n queue.totalSize(),\n new Promise<never>((_, reject) => {\n timeoutId = setTimeout(\n () => reject(new Error(\"queue.totalSize() timed out\")),\n TIMEOUT_MS,\n );\n }),\n ]);\n result.observe(depth);\n } catch (err) {\n console.warn(\n \"[ReactorInstrumentation] queueDepth observation failed:\",\n err,\n );\n } finally {\n clearTimeout(timeoutId);\n }\n };\n this.metrics.queueDepth.addCallback(depthCb);\n this.observableCallbacks.push([this.metrics.queueDepth, depthCb]);\n\n const activeJobsCb: ObservableCallback = (result) => {\n if (!this.metrics) return;\n const status = executorManager.getStatus();\n result.observe(status.activeJobs);\n };\n this.metrics.executorActiveJobs.addCallback(activeJobsCb);\n this.observableCallbacks.push([\n this.metrics.executorActiveJobs,\n activeJobsCb,\n ]);\n\n const remotesCb: ObservableCallback = (result) => {\n if (!this.metrics) return;\n const count = syncModule?.syncManager.list().length ?? 0;\n result.observe(count);\n };\n this.metrics.syncRemotes.addCallback(remotesCb);\n this.observableCallbacks.push([this.metrics.syncRemotes, remotesCb]);\n }\n\n private cleanup(jobId: string): void {\n this.pendingTimestamps.delete(jobId);\n this.runningTimestamps.delete(jobId);\n this.writeReadyTimestamps.delete(jobId);\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../src/metrics.ts","../src/instrumentation.ts"],"sourcesContent":["import { metrics } from \"@opentelemetry/api\";\n\nconst METER_NAME = \"@powerhousedao/reactor\";\n\nexport function createMetrics() {\n const meter = metrics.getMeter(METER_NAME);\n\n return {\n // Queue metrics\n queueJobsEnqueued: meter.createCounter(\"reactor.queue.jobs.enqueued\", {\n description: \"Jobs enqueued\",\n unit: \"{job}\",\n }),\n queueJobsDequeued: meter.createCounter(\"reactor.queue.jobs.dequeued\", {\n description: \"Jobs dequeued for execution\",\n unit: \"{job}\",\n }),\n queueJobsCompleted: meter.createCounter(\"reactor.queue.jobs.completed\", {\n description: \"Jobs completed (READ_READY)\",\n unit: \"{job}\",\n }),\n queueJobsFailed: meter.createCounter(\"reactor.queue.jobs.failed\", {\n description: \"Jobs permanently failed\",\n unit: \"{job}\",\n }),\n queueDepth: meter.createObservableGauge(\"reactor.queue.depth\", {\n description: \"Pending jobs across all queues\",\n unit: \"{job}\",\n }),\n\n // Executor metrics\n executorJobDuration: meter.createHistogram(\n \"reactor.executor.job.duration\",\n {\n description: \"Job execution time (RUNNING to WRITE_READY)\",\n unit: \"ms\",\n },\n ),\n executorActiveJobs: meter.createObservableGauge(\n \"reactor.executor.active_jobs\",\n {\n description: \"Currently executing jobs\",\n unit: \"{job}\",\n },\n ),\n executorTotalProcessed: meter.createCounter(\"reactor.executor.processed\", {\n description: \"Total jobs processed\",\n unit: \"{job}\",\n }),\n executorOperationsGenerated: meter.createCounter(\n \"reactor.executor.operations_generated\",\n {\n description: \"Operations produced by executors\",\n unit: \"{operation}\",\n },\n ),\n\n // Job lifecycle metrics\n jobTotalDuration: meter.createHistogram(\"reactor.job.total.duration\", {\n description: \"Full job lifecycle (PENDING to READ_READY/FAILED)\",\n unit: \"ms\",\n }),\n\n // Read model metrics\n readmodelIndexDuration: meter.createHistogram(\n \"reactor.readmodel.index.duration\",\n {\n description: \"Read model indexing time (WRITE_READY to READ_READY)\",\n unit: \"ms\",\n },\n ),\n readmodelCoordinatorChainDepth: meter.createObservableGauge(\n \"reactor.readmodel.coordinator.chain_depth\",\n {\n description:\n \"In-flight per-queueKey projection chains in the coordinator\",\n unit: \"{chain}\",\n },\n ),\n readmodelCoordinatorStageDuration: meter.createHistogram(\n \"reactor.readmodel.coordinator.stage.duration\",\n {\n description:\n \"Wall time per stage in ReadModelCoordinator.runChain (pre_ready, emit, post_ready)\",\n unit: \"ms\",\n },\n ),\n readmodelIndexingDuration: meter.createHistogram(\n \"reactor.readmodel.indexing.duration\",\n {\n description:\n \"Per-read-model indexing duration within a coordinator chain\",\n unit: \"ms\",\n },\n ),\n readmodelCoordinatorBatchSize: meter.createHistogram(\n \"reactor.readmodel.coordinator.batch.size\",\n {\n description: \"Operations per batch processed by the coordinator chain\",\n unit: \"{operation}\",\n },\n ),\n readmodelCoordinatorChainWaitDuration: meter.createHistogram(\n \"reactor.readmodel.coordinator.chain.wait_duration\",\n {\n description:\n \"Time a batch sat in the per-queueKey chain before runChain started\",\n unit: \"ms\",\n },\n ),\n\n // Postgres pool metrics\n dbPoolAcquireWaitDuration: meter.createHistogram(\n \"reactor.db.pool.acquire.wait_duration\",\n {\n description:\n \"Time spent waiting for a pg.Pool to hand out a client (pool.connect resolve latency)\",\n unit: \"ms\",\n },\n ),\n dbPoolSize: meter.createObservableGauge(\"reactor.db.pool.size\", {\n description: \"pg.Pool totalCount — connections currently open\",\n unit: \"{connection}\",\n }),\n dbPoolIdle: meter.createObservableGauge(\"reactor.db.pool.idle\", {\n description: \"pg.Pool idleCount — open connections not currently in use\",\n unit: \"{connection}\",\n }),\n dbPoolWaiting: meter.createObservableGauge(\"reactor.db.pool.waiting\", {\n description:\n \"pg.Pool waitingCount — callers queued waiting to acquire a connection\",\n unit: \"{request}\",\n }),\n\n // Event bus metrics\n eventbusEventsEmitted: meter.createCounter(\n \"reactor.eventbus.events.emitted\",\n {\n description: \"Events emitted\",\n unit: \"{event}\",\n },\n ),\n\n // Sync metrics\n syncRemotes: meter.createObservableGauge(\"reactor.sync.remotes\", {\n description: \"Active remote count\",\n unit: \"{remote}\",\n }),\n syncDeadLettersAdded: meter.createCounter(\n \"reactor.sync.dead_letters.added\",\n {\n description: \"Sync operations moved to dead letter storage\",\n unit: \"{operation}\",\n },\n ),\n };\n}\n\nexport type ReactorMetrics = ReturnType<typeof createMetrics>;\n","import {\n JobExecutorEventTypes,\n ReactorEventTypes,\n SyncEventTypes,\n} from \"@powerhousedao/reactor\";\nimport type {\n DeadLetterAddedEvent,\n IEventBus,\n IJobExecutorManager,\n IQueue,\n JobCompletedEvent,\n JobFailedEvent as ExecutorJobFailedEvent,\n JobPendingEvent,\n JobReadReadyEvent,\n JobRunningEvent,\n JobWriteReadyEvent,\n PoolInstrumentation,\n ReactorJobFailedEvent,\n ReadModelBatchCompletedEvent,\n ReadModelIndexedEvent,\n IReadModelCoordinator,\n ReactorModule,\n SyncModule,\n Unsubscribe,\n} from \"@powerhousedao/reactor\";\nimport type { ObservableCallback, ObservableGauge } from \"@opentelemetry/api\";\nimport { createMetrics, type ReactorMetrics } from \"./metrics.js\";\n\nexport class ReactorInstrumentation {\n private readonly module: ReactorModule;\n private metrics: ReactorMetrics | undefined;\n private unsubscribes: Unsubscribe[] = [];\n private observableCallbacks: Array<[ObservableGauge, ObservableCallback]> =\n [];\n\n private pendingTimestamps = new Map<string, number>();\n private runningTimestamps = new Map<string, number>();\n private writeReadyTimestamps = new Map<string, number>();\n\n constructor(module: ReactorModule) {\n this.module = module;\n }\n\n start(): void {\n this.metrics = createMetrics();\n const { eventBus, queue, executorManager, syncModule, pools } = this.module;\n\n this.subscribeJobPending(eventBus);\n this.subscribeJobRunning(eventBus);\n this.subscribeJobWriteReady(eventBus);\n this.subscribeJobReadReady(eventBus);\n this.subscribeJobFailed(eventBus);\n this.subscribeExecutorJobCompleted(eventBus);\n this.subscribeExecutorJobFailed(eventBus);\n this.subscribeDeadLetterAdded(eventBus);\n this.subscribeReadModelBatchCompleted(eventBus);\n this.subscribeReadModelIndexed(eventBus);\n this.registerObservableGauges(\n queue,\n executorManager,\n this.module.readModelCoordinator,\n syncModule,\n );\n this.registerPoolInstrumentation(pools);\n }\n\n stop(): void {\n for (const unsub of this.unsubscribes) {\n unsub();\n }\n this.unsubscribes = [];\n for (const [gauge, cb] of this.observableCallbacks) {\n gauge.removeCallback(cb);\n }\n this.observableCallbacks = [];\n this.pendingTimestamps.clear();\n this.runningTimestamps.clear();\n this.writeReadyTimestamps.clear();\n this.metrics = undefined;\n }\n\n private subscribeJobPending(eventBus: IEventBus): void {\n this.unsubscribes.push(\n eventBus.subscribe<JobPendingEvent>(\n ReactorEventTypes.JOB_PENDING,\n (_type, event) => {\n if (!this.metrics) return;\n this.metrics.queueJobsEnqueued.add(1);\n this.metrics.eventbusEventsEmitted.add(1, {\n \"event.type\": \"JOB_PENDING\",\n });\n this.pendingTimestamps.set(event.jobId, performance.now());\n },\n ),\n );\n }\n\n private subscribeJobRunning(eventBus: IEventBus): void {\n this.unsubscribes.push(\n eventBus.subscribe<JobRunningEvent>(\n ReactorEventTypes.JOB_RUNNING,\n (_type, event) => {\n if (!this.metrics) return;\n this.metrics.queueJobsDequeued.add(1);\n this.metrics.eventbusEventsEmitted.add(1, {\n \"event.type\": \"JOB_RUNNING\",\n });\n this.runningTimestamps.set(event.jobId, performance.now());\n },\n ),\n );\n }\n\n private subscribeJobWriteReady(eventBus: IEventBus): void {\n this.unsubscribes.push(\n eventBus.subscribe<JobWriteReadyEvent>(\n ReactorEventTypes.JOB_WRITE_READY,\n (_type, event) => {\n if (!this.metrics) return;\n this.metrics.executorOperationsGenerated.add(event.operations.length);\n this.metrics.eventbusEventsEmitted.add(1, {\n \"event.type\": \"JOB_WRITE_READY\",\n });\n this.writeReadyTimestamps.set(event.jobId, performance.now());\n },\n ),\n );\n }\n\n private subscribeJobReadReady(eventBus: IEventBus): void {\n this.unsubscribes.push(\n eventBus.subscribe<JobReadReadyEvent>(\n ReactorEventTypes.JOB_READ_READY,\n (_type, event) => {\n if (!this.metrics) return;\n const writeReadyTs = this.writeReadyTimestamps.get(event.jobId);\n if (writeReadyTs !== undefined) {\n this.metrics.readmodelIndexDuration.record(\n performance.now() - writeReadyTs,\n );\n }\n const pendingTs = this.pendingTimestamps.get(event.jobId);\n if (pendingTs !== undefined) {\n this.metrics.jobTotalDuration.record(\n performance.now() - pendingTs,\n { \"job.success\": \"true\" },\n );\n }\n this.metrics.queueJobsCompleted.add(1);\n this.metrics.eventbusEventsEmitted.add(1, {\n \"event.type\": \"JOB_READ_READY\",\n });\n this.cleanup(event.jobId);\n },\n ),\n );\n }\n\n private subscribeJobFailed(eventBus: IEventBus): void {\n this.unsubscribes.push(\n eventBus.subscribe<ReactorJobFailedEvent>(\n ReactorEventTypes.JOB_FAILED,\n (_type, event) => {\n if (!this.metrics) return;\n this.metrics.queueJobsFailed.add(1);\n const pendingTs = this.pendingTimestamps.get(event.jobId);\n if (pendingTs !== undefined) {\n this.metrics.jobTotalDuration.record(\n performance.now() - pendingTs,\n { \"job.success\": \"false\" },\n );\n }\n this.metrics.eventbusEventsEmitted.add(1, {\n \"event.type\": \"JOB_FAILED\",\n });\n this.cleanup(event.jobId);\n },\n ),\n );\n }\n\n private subscribeExecutorJobCompleted(eventBus: IEventBus): void {\n this.unsubscribes.push(\n eventBus.subscribe<JobCompletedEvent>(\n JobExecutorEventTypes.JOB_COMPLETED,\n (_type, event) => {\n if (!this.metrics) return;\n const workerId = event.workerId ?? \"unknown\";\n const jobId = event.job.id;\n const runningTs = this.runningTimestamps.get(jobId);\n if (runningTs !== undefined) {\n this.metrics.executorJobDuration.record(\n performance.now() - runningTs,\n { \"job.success\": \"true\", \"worker.id\": workerId },\n );\n this.runningTimestamps.delete(jobId);\n }\n this.metrics.executorTotalProcessed.add(1, {\n \"job.success\": \"true\",\n \"worker.id\": workerId,\n });\n this.metrics.eventbusEventsEmitted.add(1, {\n \"event.type\": \"EXECUTOR_JOB_COMPLETED\",\n });\n },\n ),\n );\n }\n\n private subscribeExecutorJobFailed(eventBus: IEventBus): void {\n this.unsubscribes.push(\n eventBus.subscribe<ExecutorJobFailedEvent>(\n JobExecutorEventTypes.JOB_FAILED,\n (_type, event) => {\n if (!this.metrics) return;\n const workerId = event.workerId ?? \"unknown\";\n const jobId = event.job.id;\n const runningTs = this.runningTimestamps.get(jobId);\n if (runningTs !== undefined) {\n this.metrics.executorJobDuration.record(\n performance.now() - runningTs,\n { \"job.success\": \"false\", \"worker.id\": workerId },\n );\n this.runningTimestamps.delete(jobId);\n }\n this.metrics.executorTotalProcessed.add(1, {\n \"job.success\": \"false\",\n \"worker.id\": workerId,\n });\n this.metrics.eventbusEventsEmitted.add(1, {\n \"event.type\": \"EXECUTOR_JOB_FAILED\",\n });\n },\n ),\n );\n }\n\n private subscribeReadModelBatchCompleted(eventBus: IEventBus): void {\n this.unsubscribes.push(\n eventBus.subscribe<ReadModelBatchCompletedEvent>(\n ReactorEventTypes.READMODEL_BATCH_COMPLETED,\n (_type, event) => {\n if (!this.metrics) return;\n this.metrics.readmodelCoordinatorChainWaitDuration.record(\n event.chainWaitDurationMs,\n );\n this.metrics.readmodelCoordinatorBatchSize.record(event.batchSize);\n this.metrics.readmodelCoordinatorStageDuration.record(\n event.preReadyDurationMs,\n { stage: \"pre_ready\" },\n );\n this.metrics.readmodelCoordinatorStageDuration.record(\n event.emitDurationMs,\n { stage: \"emit\" },\n );\n this.metrics.readmodelCoordinatorStageDuration.record(\n event.postReadyDurationMs,\n { stage: \"post_ready\" },\n );\n this.metrics.eventbusEventsEmitted.add(1, {\n \"event.type\": \"READMODEL_BATCH_COMPLETED\",\n });\n },\n ),\n );\n }\n\n private subscribeReadModelIndexed(eventBus: IEventBus): void {\n this.unsubscribes.push(\n eventBus.subscribe<ReadModelIndexedEvent>(\n ReactorEventTypes.READMODEL_INDEXED,\n (_type, event) => {\n if (!this.metrics) return;\n this.metrics.readmodelIndexingDuration.record(event.durationMs, {\n \"read_model.name\": event.readModelName,\n stage: event.stage,\n \"indexing.success\": event.success ? \"true\" : \"false\",\n });\n this.metrics.eventbusEventsEmitted.add(1, {\n \"event.type\": \"READMODEL_INDEXED\",\n });\n },\n ),\n );\n }\n\n private subscribeDeadLetterAdded(eventBus: IEventBus): void {\n this.unsubscribes.push(\n eventBus.subscribe<DeadLetterAddedEvent>(\n SyncEventTypes.DEAD_LETTER_ADDED,\n (_type, event) => {\n if (!this.metrics) return;\n this.metrics.syncDeadLettersAdded.add(1, {\n \"remote.name\": event.remoteName,\n });\n this.metrics.eventbusEventsEmitted.add(1, {\n \"event.type\": \"DEAD_LETTER_ADDED\",\n });\n },\n ),\n );\n }\n\n private registerObservableGauges(\n queue: IQueue,\n executorManager: IJobExecutorManager,\n readModelCoordinator: IReadModelCoordinator,\n syncModule: SyncModule | undefined,\n ): void {\n if (!this.metrics) return;\n\n const depthCb: ObservableCallback = async (result) => {\n if (!this.metrics) return;\n // queue.totalSize() is a DB query. If it exceeds the OTel collection\n // window the observation is silently dropped, making the gauge appear\n // to drop to zero under load. The timeout makes the failure explicit.\n const TIMEOUT_MS = 2_000;\n let timeoutId: ReturnType<typeof setTimeout> | undefined;\n try {\n const depth = await Promise.race([\n queue.totalSize(),\n new Promise<never>((_, reject) => {\n timeoutId = setTimeout(\n () => reject(new Error(\"queue.totalSize() timed out\")),\n TIMEOUT_MS,\n );\n }),\n ]);\n result.observe(depth);\n } catch (err) {\n console.warn(\n \"[ReactorInstrumentation] queueDepth observation failed:\",\n err,\n );\n } finally {\n clearTimeout(timeoutId);\n }\n };\n this.metrics.queueDepth.addCallback(depthCb);\n this.observableCallbacks.push([this.metrics.queueDepth, depthCb]);\n\n const activeJobsCb: ObservableCallback = (result) => {\n if (!this.metrics) return;\n const status = executorManager.getStatus();\n result.observe(status.activeJobs);\n };\n this.metrics.executorActiveJobs.addCallback(activeJobsCb);\n this.observableCallbacks.push([\n this.metrics.executorActiveJobs,\n activeJobsCb,\n ]);\n\n const chainDepthCb: ObservableCallback = (result) => {\n if (!this.metrics) return;\n result.observe(readModelCoordinator.getChainDepth());\n };\n this.metrics.readmodelCoordinatorChainDepth.addCallback(chainDepthCb);\n this.observableCallbacks.push([\n this.metrics.readmodelCoordinatorChainDepth,\n chainDepthCb,\n ]);\n\n const remotesCb: ObservableCallback = (result) => {\n if (!this.metrics) return;\n const count = syncModule?.syncManager.list().length ?? 0;\n result.observe(count);\n };\n this.metrics.syncRemotes.addCallback(remotesCb);\n this.observableCallbacks.push([this.metrics.syncRemotes, remotesCb]);\n }\n\n private registerPoolInstrumentation(pools: PoolInstrumentation[]): void {\n if (!this.metrics || pools.length === 0) return;\n\n for (const pool of pools) {\n const attrs = { pool: pool.name };\n const unsub = pool.onAcquire((durationMs) => {\n if (!this.metrics) return;\n this.metrics.dbPoolAcquireWaitDuration.record(durationMs, attrs);\n });\n this.unsubscribes.push(unsub);\n }\n\n const sizeCb: ObservableCallback = (result) => {\n if (!this.metrics) return;\n for (const pool of pools) {\n const stats = pool.getStats();\n result.observe(stats.size, { pool: pool.name });\n }\n };\n this.metrics.dbPoolSize.addCallback(sizeCb);\n this.observableCallbacks.push([this.metrics.dbPoolSize, sizeCb]);\n\n const idleCb: ObservableCallback = (result) => {\n if (!this.metrics) return;\n for (const pool of pools) {\n const stats = pool.getStats();\n result.observe(stats.idle, { pool: pool.name });\n }\n };\n this.metrics.dbPoolIdle.addCallback(idleCb);\n this.observableCallbacks.push([this.metrics.dbPoolIdle, idleCb]);\n\n const waitingCb: ObservableCallback = (result) => {\n if (!this.metrics) return;\n for (const pool of pools) {\n const stats = pool.getStats();\n result.observe(stats.waiting, { pool: pool.name });\n }\n };\n this.metrics.dbPoolWaiting.addCallback(waitingCb);\n this.observableCallbacks.push([this.metrics.dbPoolWaiting, waitingCb]);\n }\n\n private cleanup(jobId: string): void {\n this.pendingTimestamps.delete(jobId);\n this.runningTimestamps.delete(jobId);\n this.writeReadyTimestamps.delete(jobId);\n }\n}\n"],"mappings":";;;AAEA,MAAM,aAAa;AAEnB,SAAgB,gBAAgB;CAC9B,MAAM,QAAQ,QAAQ,SAAS,WAAW;AAE1C,QAAO;EAEL,mBAAmB,MAAM,cAAc,+BAA+B;GACpE,aAAa;GACb,MAAM;GACP,CAAC;EACF,mBAAmB,MAAM,cAAc,+BAA+B;GACpE,aAAa;GACb,MAAM;GACP,CAAC;EACF,oBAAoB,MAAM,cAAc,gCAAgC;GACtE,aAAa;GACb,MAAM;GACP,CAAC;EACF,iBAAiB,MAAM,cAAc,6BAA6B;GAChE,aAAa;GACb,MAAM;GACP,CAAC;EACF,YAAY,MAAM,sBAAsB,uBAAuB;GAC7D,aAAa;GACb,MAAM;GACP,CAAC;EAGF,qBAAqB,MAAM,gBACzB,iCACA;GACE,aAAa;GACb,MAAM;GACP,CACF;EACD,oBAAoB,MAAM,sBACxB,gCACA;GACE,aAAa;GACb,MAAM;GACP,CACF;EACD,wBAAwB,MAAM,cAAc,8BAA8B;GACxE,aAAa;GACb,MAAM;GACP,CAAC;EACF,6BAA6B,MAAM,cACjC,yCACA;GACE,aAAa;GACb,MAAM;GACP,CACF;EAGD,kBAAkB,MAAM,gBAAgB,8BAA8B;GACpE,aAAa;GACb,MAAM;GACP,CAAC;EAGF,wBAAwB,MAAM,gBAC5B,oCACA;GACE,aAAa;GACb,MAAM;GACP,CACF;EACD,gCAAgC,MAAM,sBACpC,6CACA;GACE,aACE;GACF,MAAM;GACP,CACF;EACD,mCAAmC,MAAM,gBACvC,gDACA;GACE,aACE;GACF,MAAM;GACP,CACF;EACD,2BAA2B,MAAM,gBAC/B,uCACA;GACE,aACE;GACF,MAAM;GACP,CACF;EACD,+BAA+B,MAAM,gBACnC,4CACA;GACE,aAAa;GACb,MAAM;GACP,CACF;EACD,uCAAuC,MAAM,gBAC3C,qDACA;GACE,aACE;GACF,MAAM;GACP,CACF;EAGD,2BAA2B,MAAM,gBAC/B,yCACA;GACE,aACE;GACF,MAAM;GACP,CACF;EACD,YAAY,MAAM,sBAAsB,wBAAwB;GAC9D,aAAa;GACb,MAAM;GACP,CAAC;EACF,YAAY,MAAM,sBAAsB,wBAAwB;GAC9D,aAAa;GACb,MAAM;GACP,CAAC;EACF,eAAe,MAAM,sBAAsB,2BAA2B;GACpE,aACE;GACF,MAAM;GACP,CAAC;EAGF,uBAAuB,MAAM,cAC3B,mCACA;GACE,aAAa;GACb,MAAM;GACP,CACF;EAGD,aAAa,MAAM,sBAAsB,wBAAwB;GAC/D,aAAa;GACb,MAAM;GACP,CAAC;EACF,sBAAsB,MAAM,cAC1B,mCACA;GACE,aAAa;GACb,MAAM;GACP,CACF;EACF;;;;AC/HH,IAAa,yBAAb,MAAoC;CAClC;CACA;CACA,eAAsC,EAAE;CACxC,sBACE,EAAE;CAEJ,oCAA4B,IAAI,KAAqB;CACrD,oCAA4B,IAAI,KAAqB;CACrD,uCAA+B,IAAI,KAAqB;CAExD,YAAY,QAAuB;AACjC,OAAK,SAAS;;CAGhB,QAAc;AACZ,OAAK,UAAU,eAAe;EAC9B,MAAM,EAAE,UAAU,OAAO,iBAAiB,YAAY,UAAU,KAAK;AAErE,OAAK,oBAAoB,SAAS;AAClC,OAAK,oBAAoB,SAAS;AAClC,OAAK,uBAAuB,SAAS;AACrC,OAAK,sBAAsB,SAAS;AACpC,OAAK,mBAAmB,SAAS;AACjC,OAAK,8BAA8B,SAAS;AAC5C,OAAK,2BAA2B,SAAS;AACzC,OAAK,yBAAyB,SAAS;AACvC,OAAK,iCAAiC,SAAS;AAC/C,OAAK,0BAA0B,SAAS;AACxC,OAAK,yBACH,OACA,iBACA,KAAK,OAAO,sBACZ,WACD;AACD,OAAK,4BAA4B,MAAM;;CAGzC,OAAa;AACX,OAAK,MAAM,SAAS,KAAK,aACvB,QAAO;AAET,OAAK,eAAe,EAAE;AACtB,OAAK,MAAM,CAAC,OAAO,OAAO,KAAK,oBAC7B,OAAM,eAAe,GAAG;AAE1B,OAAK,sBAAsB,EAAE;AAC7B,OAAK,kBAAkB,OAAO;AAC9B,OAAK,kBAAkB,OAAO;AAC9B,OAAK,qBAAqB,OAAO;AACjC,OAAK,UAAU,KAAA;;CAGjB,oBAA4B,UAA2B;AACrD,OAAK,aAAa,KAChB,SAAS,UACP,kBAAkB,cACjB,OAAO,UAAU;AAChB,OAAI,CAAC,KAAK,QAAS;AACnB,QAAK,QAAQ,kBAAkB,IAAI,EAAE;AACrC,QAAK,QAAQ,sBAAsB,IAAI,GAAG,EACxC,cAAc,eACf,CAAC;AACF,QAAK,kBAAkB,IAAI,MAAM,OAAO,YAAY,KAAK,CAAC;IAE7D,CACF;;CAGH,oBAA4B,UAA2B;AACrD,OAAK,aAAa,KAChB,SAAS,UACP,kBAAkB,cACjB,OAAO,UAAU;AAChB,OAAI,CAAC,KAAK,QAAS;AACnB,QAAK,QAAQ,kBAAkB,IAAI,EAAE;AACrC,QAAK,QAAQ,sBAAsB,IAAI,GAAG,EACxC,cAAc,eACf,CAAC;AACF,QAAK,kBAAkB,IAAI,MAAM,OAAO,YAAY,KAAK,CAAC;IAE7D,CACF;;CAGH,uBAA+B,UAA2B;AACxD,OAAK,aAAa,KAChB,SAAS,UACP,kBAAkB,kBACjB,OAAO,UAAU;AAChB,OAAI,CAAC,KAAK,QAAS;AACnB,QAAK,QAAQ,4BAA4B,IAAI,MAAM,WAAW,OAAO;AACrE,QAAK,QAAQ,sBAAsB,IAAI,GAAG,EACxC,cAAc,mBACf,CAAC;AACF,QAAK,qBAAqB,IAAI,MAAM,OAAO,YAAY,KAAK,CAAC;IAEhE,CACF;;CAGH,sBAA8B,UAA2B;AACvD,OAAK,aAAa,KAChB,SAAS,UACP,kBAAkB,iBACjB,OAAO,UAAU;AAChB,OAAI,CAAC,KAAK,QAAS;GACnB,MAAM,eAAe,KAAK,qBAAqB,IAAI,MAAM,MAAM;AAC/D,OAAI,iBAAiB,KAAA,EACnB,MAAK,QAAQ,uBAAuB,OAClC,YAAY,KAAK,GAAG,aACrB;GAEH,MAAM,YAAY,KAAK,kBAAkB,IAAI,MAAM,MAAM;AACzD,OAAI,cAAc,KAAA,EAChB,MAAK,QAAQ,iBAAiB,OAC5B,YAAY,KAAK,GAAG,WACpB,EAAE,eAAe,QAAQ,CAC1B;AAEH,QAAK,QAAQ,mBAAmB,IAAI,EAAE;AACtC,QAAK,QAAQ,sBAAsB,IAAI,GAAG,EACxC,cAAc,kBACf,CAAC;AACF,QAAK,QAAQ,MAAM,MAAM;IAE5B,CACF;;CAGH,mBAA2B,UAA2B;AACpD,OAAK,aAAa,KAChB,SAAS,UACP,kBAAkB,aACjB,OAAO,UAAU;AAChB,OAAI,CAAC,KAAK,QAAS;AACnB,QAAK,QAAQ,gBAAgB,IAAI,EAAE;GACnC,MAAM,YAAY,KAAK,kBAAkB,IAAI,MAAM,MAAM;AACzD,OAAI,cAAc,KAAA,EAChB,MAAK,QAAQ,iBAAiB,OAC5B,YAAY,KAAK,GAAG,WACpB,EAAE,eAAe,SAAS,CAC3B;AAEH,QAAK,QAAQ,sBAAsB,IAAI,GAAG,EACxC,cAAc,cACf,CAAC;AACF,QAAK,QAAQ,MAAM,MAAM;IAE5B,CACF;;CAGH,8BAAsC,UAA2B;AAC/D,OAAK,aAAa,KAChB,SAAS,UACP,sBAAsB,gBACrB,OAAO,UAAU;AAChB,OAAI,CAAC,KAAK,QAAS;GACnB,MAAM,WAAW,MAAM,YAAY;GACnC,MAAM,QAAQ,MAAM,IAAI;GACxB,MAAM,YAAY,KAAK,kBAAkB,IAAI,MAAM;AACnD,OAAI,cAAc,KAAA,GAAW;AAC3B,SAAK,QAAQ,oBAAoB,OAC/B,YAAY,KAAK,GAAG,WACpB;KAAE,eAAe;KAAQ,aAAa;KAAU,CACjD;AACD,SAAK,kBAAkB,OAAO,MAAM;;AAEtC,QAAK,QAAQ,uBAAuB,IAAI,GAAG;IACzC,eAAe;IACf,aAAa;IACd,CAAC;AACF,QAAK,QAAQ,sBAAsB,IAAI,GAAG,EACxC,cAAc,0BACf,CAAC;IAEL,CACF;;CAGH,2BAAmC,UAA2B;AAC5D,OAAK,aAAa,KAChB,SAAS,UACP,sBAAsB,aACrB,OAAO,UAAU;AAChB,OAAI,CAAC,KAAK,QAAS;GACnB,MAAM,WAAW,MAAM,YAAY;GACnC,MAAM,QAAQ,MAAM,IAAI;GACxB,MAAM,YAAY,KAAK,kBAAkB,IAAI,MAAM;AACnD,OAAI,cAAc,KAAA,GAAW;AAC3B,SAAK,QAAQ,oBAAoB,OAC/B,YAAY,KAAK,GAAG,WACpB;KAAE,eAAe;KAAS,aAAa;KAAU,CAClD;AACD,SAAK,kBAAkB,OAAO,MAAM;;AAEtC,QAAK,QAAQ,uBAAuB,IAAI,GAAG;IACzC,eAAe;IACf,aAAa;IACd,CAAC;AACF,QAAK,QAAQ,sBAAsB,IAAI,GAAG,EACxC,cAAc,uBACf,CAAC;IAEL,CACF;;CAGH,iCAAyC,UAA2B;AAClE,OAAK,aAAa,KAChB,SAAS,UACP,kBAAkB,4BACjB,OAAO,UAAU;AAChB,OAAI,CAAC,KAAK,QAAS;AACnB,QAAK,QAAQ,sCAAsC,OACjD,MAAM,oBACP;AACD,QAAK,QAAQ,8BAA8B,OAAO,MAAM,UAAU;AAClE,QAAK,QAAQ,kCAAkC,OAC7C,MAAM,oBACN,EAAE,OAAO,aAAa,CACvB;AACD,QAAK,QAAQ,kCAAkC,OAC7C,MAAM,gBACN,EAAE,OAAO,QAAQ,CAClB;AACD,QAAK,QAAQ,kCAAkC,OAC7C,MAAM,qBACN,EAAE,OAAO,cAAc,CACxB;AACD,QAAK,QAAQ,sBAAsB,IAAI,GAAG,EACxC,cAAc,6BACf,CAAC;IAEL,CACF;;CAGH,0BAAkC,UAA2B;AAC3D,OAAK,aAAa,KAChB,SAAS,UACP,kBAAkB,oBACjB,OAAO,UAAU;AAChB,OAAI,CAAC,KAAK,QAAS;AACnB,QAAK,QAAQ,0BAA0B,OAAO,MAAM,YAAY;IAC9D,mBAAmB,MAAM;IACzB,OAAO,MAAM;IACb,oBAAoB,MAAM,UAAU,SAAS;IAC9C,CAAC;AACF,QAAK,QAAQ,sBAAsB,IAAI,GAAG,EACxC,cAAc,qBACf,CAAC;IAEL,CACF;;CAGH,yBAAiC,UAA2B;AAC1D,OAAK,aAAa,KAChB,SAAS,UACP,eAAe,oBACd,OAAO,UAAU;AAChB,OAAI,CAAC,KAAK,QAAS;AACnB,QAAK,QAAQ,qBAAqB,IAAI,GAAG,EACvC,eAAe,MAAM,YACtB,CAAC;AACF,QAAK,QAAQ,sBAAsB,IAAI,GAAG,EACxC,cAAc,qBACf,CAAC;IAEL,CACF;;CAGH,yBACE,OACA,iBACA,sBACA,YACM;AACN,MAAI,CAAC,KAAK,QAAS;EAEnB,MAAM,UAA8B,OAAO,WAAW;AACpD,OAAI,CAAC,KAAK,QAAS;GAInB,MAAM,aAAa;GACnB,IAAI;AACJ,OAAI;IACF,MAAM,QAAQ,MAAM,QAAQ,KAAK,CAC/B,MAAM,WAAW,EACjB,IAAI,SAAgB,GAAG,WAAW;AAChC,iBAAY,iBACJ,uBAAO,IAAI,MAAM,8BAA8B,CAAC,EACtD,WACD;MACD,CACH,CAAC;AACF,WAAO,QAAQ,MAAM;YACd,KAAK;AACZ,YAAQ,KACN,2DACA,IACD;aACO;AACR,iBAAa,UAAU;;;AAG3B,OAAK,QAAQ,WAAW,YAAY,QAAQ;AAC5C,OAAK,oBAAoB,KAAK,CAAC,KAAK,QAAQ,YAAY,QAAQ,CAAC;EAEjE,MAAM,gBAAoC,WAAW;AACnD,OAAI,CAAC,KAAK,QAAS;GACnB,MAAM,SAAS,gBAAgB,WAAW;AAC1C,UAAO,QAAQ,OAAO,WAAW;;AAEnC,OAAK,QAAQ,mBAAmB,YAAY,aAAa;AACzD,OAAK,oBAAoB,KAAK,CAC5B,KAAK,QAAQ,oBACb,aACD,CAAC;EAEF,MAAM,gBAAoC,WAAW;AACnD,OAAI,CAAC,KAAK,QAAS;AACnB,UAAO,QAAQ,qBAAqB,eAAe,CAAC;;AAEtD,OAAK,QAAQ,+BAA+B,YAAY,aAAa;AACrE,OAAK,oBAAoB,KAAK,CAC5B,KAAK,QAAQ,gCACb,aACD,CAAC;EAEF,MAAM,aAAiC,WAAW;AAChD,OAAI,CAAC,KAAK,QAAS;GACnB,MAAM,QAAQ,YAAY,YAAY,MAAM,CAAC,UAAU;AACvD,UAAO,QAAQ,MAAM;;AAEvB,OAAK,QAAQ,YAAY,YAAY,UAAU;AAC/C,OAAK,oBAAoB,KAAK,CAAC,KAAK,QAAQ,aAAa,UAAU,CAAC;;CAGtE,4BAAoC,OAAoC;AACtE,MAAI,CAAC,KAAK,WAAW,MAAM,WAAW,EAAG;AAEzC,OAAK,MAAM,QAAQ,OAAO;GACxB,MAAM,QAAQ,EAAE,MAAM,KAAK,MAAM;GACjC,MAAM,QAAQ,KAAK,WAAW,eAAe;AAC3C,QAAI,CAAC,KAAK,QAAS;AACnB,SAAK,QAAQ,0BAA0B,OAAO,YAAY,MAAM;KAChE;AACF,QAAK,aAAa,KAAK,MAAM;;EAG/B,MAAM,UAA8B,WAAW;AAC7C,OAAI,CAAC,KAAK,QAAS;AACnB,QAAK,MAAM,QAAQ,OAAO;IACxB,MAAM,QAAQ,KAAK,UAAU;AAC7B,WAAO,QAAQ,MAAM,MAAM,EAAE,MAAM,KAAK,MAAM,CAAC;;;AAGnD,OAAK,QAAQ,WAAW,YAAY,OAAO;AAC3C,OAAK,oBAAoB,KAAK,CAAC,KAAK,QAAQ,YAAY,OAAO,CAAC;EAEhE,MAAM,UAA8B,WAAW;AAC7C,OAAI,CAAC,KAAK,QAAS;AACnB,QAAK,MAAM,QAAQ,OAAO;IACxB,MAAM,QAAQ,KAAK,UAAU;AAC7B,WAAO,QAAQ,MAAM,MAAM,EAAE,MAAM,KAAK,MAAM,CAAC;;;AAGnD,OAAK,QAAQ,WAAW,YAAY,OAAO;AAC3C,OAAK,oBAAoB,KAAK,CAAC,KAAK,QAAQ,YAAY,OAAO,CAAC;EAEhE,MAAM,aAAiC,WAAW;AAChD,OAAI,CAAC,KAAK,QAAS;AACnB,QAAK,MAAM,QAAQ,OAAO;IACxB,MAAM,QAAQ,KAAK,UAAU;AAC7B,WAAO,QAAQ,MAAM,SAAS,EAAE,MAAM,KAAK,MAAM,CAAC;;;AAGtD,OAAK,QAAQ,cAAc,YAAY,UAAU;AACjD,OAAK,oBAAoB,KAAK,CAAC,KAAK,QAAQ,eAAe,UAAU,CAAC;;CAGxE,QAAgB,OAAqB;AACnC,OAAK,kBAAkB,OAAO,MAAM;AACpC,OAAK,kBAAkB,OAAO,MAAM;AACpC,OAAK,qBAAqB,OAAO,MAAM"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@powerhousedao/opentelemetry-instrumentation-reactor",
|
|
3
|
-
"version": "6.1.0-dev.
|
|
3
|
+
"version": "6.1.0-dev.6",
|
|
4
4
|
"description": "OpenTelemetry instrumentation for @powerhousedao/reactor",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"sideEffects": false,
|
|
@@ -37,7 +37,7 @@
|
|
|
37
37
|
"tsdown": "0.21.1"
|
|
38
38
|
},
|
|
39
39
|
"peerDependencies": {
|
|
40
|
-
"@powerhousedao/reactor": "6.1.0-dev.
|
|
40
|
+
"@powerhousedao/reactor": "6.1.0-dev.6"
|
|
41
41
|
},
|
|
42
42
|
"scripts": {
|
|
43
43
|
"tsc": "tsc",
|