@powerhousedao/opentelemetry-instrumentation-reactor 6.1.0-dev.2 → 6.1.0-dev.20

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 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>;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","names":[],"sources":["../src/instrumentation.ts","../src/metrics.ts"],"mappings":";;;;cAkBa,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;EAaA,IAAA,CAAA;EAAA,QAeQ,mBAAA;EAAA,QAgBA,mBAAA;EAAA,QAgBA,sBAAA;EAAA,QA2BA,qBAAA;EAAA,QA6BA,kBAAA;EAAA,QA0BA,wBAAA;EAAA,QAiBA,wBAAA;EAAA,QAyDA,OAAA;AAAA;;;iBCrPM,aAAA,CAAA;iDAAa,mBAAA,CAAA,UAAA;;;;;;;;;;;;;;;KA4FjB,cAAA,GAAiB,UAAA,QAAkB,aAAA"}
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.registerObservableGauges(queue, executorManager, syncModule);
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":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@powerhousedao/opentelemetry-instrumentation-reactor",
3
- "version": "6.1.0-dev.2",
3
+ "version": "6.1.0-dev.20",
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.2"
40
+ "@powerhousedao/reactor": "6.1.0-dev.20"
41
41
  },
42
42
  "scripts": {
43
43
  "tsc": "tsc",