@powerhousedao/opentelemetry-instrumentation-reactor 6.2.2-dev.83 → 6.2.2-dev.84

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
@@ -56,5 +56,28 @@ declare function createMetrics(): {
56
56
  };
57
57
  type ReactorMetrics = ReturnType<typeof createMetrics>;
58
58
  //#endregion
59
- export { ReactorInstrumentation, type ReactorMetrics };
59
+ //#region src/event-loop-instrumentation.d.ts
60
+ /**
61
+ * Handle returned by registerEventLoopInstrumentation. Calling stop()
62
+ * disables the underlying monitorEventLoopDelay histogram and removes
63
+ * the batch observable callback from the meter.
64
+ */
65
+ type EventLoopInstrumentation = {
66
+ stop(): void;
67
+ };
68
+ /**
69
+ * Registers six observable gauges on the host meter:
70
+ *
71
+ * reactor.host.eventloop.delay.{p50,p95,p99,max} (ms)
72
+ * reactor.host.eventloop.utilization (ratio 0..1)
73
+ * reactor.host.cpu.utilization (ratio, >1 if multi-core)
74
+ *
75
+ * The monitorEventLoopDelay histogram is reset on each scrape so each sample
76
+ * represents the delay distribution over the prior scrape window rather than
77
+ * process-lifetime cumulative. ELU and CPU deltas are computed against a
78
+ * cached previous snapshot, also windowed to the prior scrape interval.
79
+ */
80
+ declare function registerEventLoopInstrumentation(): EventLoopInstrumentation;
81
+ //#endregion
82
+ export { type EventLoopInstrumentation, ReactorInstrumentation, type ReactorMetrics, registerEventLoopInstrumentation };
60
83
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
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,sBAAA;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"}
1
+ {"version":3,"file":"index.d.ts","names":[],"sources":["../src/instrumentation.ts","../src/metrics.ts","../src/event-loop-instrumentation.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,sBAAA;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;;;;;;;ADlI/C;KEDY,wBAAA;EACV,IAAA;AAAA;;;;;;;;;;;;;iBAec,gCAAA,CAAA,GAAoC,wBAAA"}
package/dist/index.js CHANGED
@@ -1,9 +1,10 @@
1
1
  import { JobExecutorEventTypes, ReactorEventTypes, SyncEventTypes } from "@powerhousedao/reactor";
2
2
  import { metrics } from "@opentelemetry/api";
3
+ import { monitorEventLoopDelay, performance as performance$1 } from "node:perf_hooks";
3
4
  //#region src/metrics.ts
4
- const METER_NAME = "@powerhousedao/reactor";
5
+ const METER_NAME$1 = "@powerhousedao/reactor";
5
6
  function createMetrics() {
6
- const meter = metrics.getMeter(METER_NAME);
7
+ const meter = metrics.getMeter(METER_NAME$1);
7
8
  return {
8
9
  queueJobsEnqueued: meter.createCounter("reactor.queue.jobs.enqueued", {
9
10
  description: "Jobs enqueued",
@@ -338,6 +339,92 @@ var ReactorInstrumentation = class {
338
339
  }
339
340
  };
340
341
  //#endregion
341
- export { ReactorInstrumentation };
342
+ //#region src/event-loop-instrumentation.ts
343
+ const METER_NAME = "@powerhousedao/reactor-host";
344
+ const DELAY_RESOLUTION_MS = 10;
345
+ const NS_PER_MS = 1e6;
346
+ const NS_PER_US = 1e3;
347
+ /**
348
+ * Registers six observable gauges on the host meter:
349
+ *
350
+ * reactor.host.eventloop.delay.{p50,p95,p99,max} (ms)
351
+ * reactor.host.eventloop.utilization (ratio 0..1)
352
+ * reactor.host.cpu.utilization (ratio, >1 if multi-core)
353
+ *
354
+ * The monitorEventLoopDelay histogram is reset on each scrape so each sample
355
+ * represents the delay distribution over the prior scrape window rather than
356
+ * process-lifetime cumulative. ELU and CPU deltas are computed against a
357
+ * cached previous snapshot, also windowed to the prior scrape interval.
358
+ */
359
+ function registerEventLoopInstrumentation() {
360
+ const meter = metrics.getMeter(METER_NAME);
361
+ const histogram = monitorEventLoopDelay({ resolution: DELAY_RESOLUTION_MS });
362
+ histogram.enable();
363
+ const delayP50 = meter.createObservableGauge("reactor.host.eventloop.delay.p50", {
364
+ description: "Event-loop callback delay p50 over the prior scrape window",
365
+ unit: "ms"
366
+ });
367
+ const delayP95 = meter.createObservableGauge("reactor.host.eventloop.delay.p95", {
368
+ description: "Event-loop callback delay p95 over the prior scrape window",
369
+ unit: "ms"
370
+ });
371
+ const delayP99 = meter.createObservableGauge("reactor.host.eventloop.delay.p99", {
372
+ description: "Event-loop callback delay p99 over the prior scrape window",
373
+ unit: "ms"
374
+ });
375
+ const delayMax = meter.createObservableGauge("reactor.host.eventloop.delay.max", {
376
+ description: "Event-loop callback delay max over the prior scrape window",
377
+ unit: "ms"
378
+ });
379
+ const utilization = meter.createObservableGauge("reactor.host.eventloop.utilization", {
380
+ description: "Event-loop utilization ratio (active / (active + idle)) over the prior scrape window",
381
+ unit: "1"
382
+ });
383
+ const cpuUtilization = meter.createObservableGauge("reactor.host.cpu.utilization", {
384
+ description: "Process CPU utilization over the prior scrape window. 1.0 = one core saturated.",
385
+ unit: "1"
386
+ });
387
+ let prevElu = performance$1.eventLoopUtilization();
388
+ let prevCpu = process.cpuUsage();
389
+ let prevHrtime = process.hrtime.bigint();
390
+ const callback = (result) => {
391
+ const p50ms = histogram.percentile(50) / NS_PER_MS;
392
+ const p95ms = histogram.percentile(95) / NS_PER_MS;
393
+ const p99ms = histogram.percentile(99) / NS_PER_MS;
394
+ const maxMs = histogram.max / NS_PER_MS;
395
+ histogram.reset();
396
+ const eluNow = performance$1.eventLoopUtilization();
397
+ const eluDelta = performance$1.eventLoopUtilization(eluNow, prevElu);
398
+ prevElu = eluNow;
399
+ const cpuNow = process.cpuUsage();
400
+ const hrtimeNow = process.hrtime.bigint();
401
+ const cpuDeltaUs = cpuNow.user - prevCpu.user + (cpuNow.system - prevCpu.system);
402
+ const elapsedUs = Number(hrtimeNow - prevHrtime) / NS_PER_US;
403
+ const cpuRatio = elapsedUs > 0 ? cpuDeltaUs / elapsedUs : 0;
404
+ prevCpu = cpuNow;
405
+ prevHrtime = hrtimeNow;
406
+ result.observe(delayP50, p50ms);
407
+ result.observe(delayP95, p95ms);
408
+ result.observe(delayP99, p99ms);
409
+ result.observe(delayMax, maxMs);
410
+ result.observe(utilization, eluDelta.utilization);
411
+ result.observe(cpuUtilization, cpuRatio);
412
+ };
413
+ const observables = [
414
+ delayP50,
415
+ delayP95,
416
+ delayP99,
417
+ delayMax,
418
+ utilization,
419
+ cpuUtilization
420
+ ];
421
+ meter.addBatchObservableCallback(callback, observables);
422
+ return { stop() {
423
+ meter.removeBatchObservableCallback(callback, observables);
424
+ histogram.disable();
425
+ } };
426
+ }
427
+ //#endregion
428
+ export { ReactorInstrumentation, registerEventLoopInstrumentation };
342
429
 
343
430
  //# sourceMappingURL=index.js.map
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 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 InProcessReactorModule,\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: InProcessReactorModule;\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: InProcessReactorModule) {\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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"}
1
+ {"version":3,"file":"index.js","names":["METER_NAME","performance"],"sources":["../src/metrics.ts","../src/instrumentation.ts","../src/event-loop-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 InProcessReactorModule,\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: InProcessReactorModule;\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: InProcessReactorModule) {\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","// Host event-loop and CPU instrumentation. Registers OTel observable\n// gauges on the global meter provider for monitorEventLoopDelay percentiles,\n// performance.eventLoopUtilization, and process.cpuUsage. Pure observation;\n// does not touch the reactor package. Started by the host process once its\n// meter provider is registered (switchboard: observability.mts; bench: main.ts).\nimport {\n metrics,\n type BatchObservableCallback,\n type BatchObservableResult,\n type Observable,\n} from \"@opentelemetry/api\";\nimport {\n monitorEventLoopDelay,\n performance,\n type EventLoopUtilization,\n} from \"node:perf_hooks\";\n\nconst METER_NAME = \"@powerhousedao/reactor-host\";\nconst DELAY_RESOLUTION_MS = 10;\nconst NS_PER_MS = 1_000_000;\nconst NS_PER_US = 1_000;\n\n/**\n * Handle returned by registerEventLoopInstrumentation. Calling stop()\n * disables the underlying monitorEventLoopDelay histogram and removes\n * the batch observable callback from the meter.\n */\nexport type EventLoopInstrumentation = {\n stop(): void;\n};\n\n/**\n * Registers six observable gauges on the host meter:\n *\n * reactor.host.eventloop.delay.{p50,p95,p99,max} (ms)\n * reactor.host.eventloop.utilization (ratio 0..1)\n * reactor.host.cpu.utilization (ratio, >1 if multi-core)\n *\n * The monitorEventLoopDelay histogram is reset on each scrape so each sample\n * represents the delay distribution over the prior scrape window rather than\n * process-lifetime cumulative. ELU and CPU deltas are computed against a\n * cached previous snapshot, also windowed to the prior scrape interval.\n */\nexport function registerEventLoopInstrumentation(): EventLoopInstrumentation {\n const meter = metrics.getMeter(METER_NAME);\n\n const histogram = monitorEventLoopDelay({ resolution: DELAY_RESOLUTION_MS });\n histogram.enable();\n\n const delayP50 = meter.createObservableGauge(\n \"reactor.host.eventloop.delay.p50\",\n {\n description: \"Event-loop callback delay p50 over the prior scrape window\",\n unit: \"ms\",\n },\n );\n const delayP95 = meter.createObservableGauge(\n \"reactor.host.eventloop.delay.p95\",\n {\n description: \"Event-loop callback delay p95 over the prior scrape window\",\n unit: \"ms\",\n },\n );\n const delayP99 = meter.createObservableGauge(\n \"reactor.host.eventloop.delay.p99\",\n {\n description: \"Event-loop callback delay p99 over the prior scrape window\",\n unit: \"ms\",\n },\n );\n const delayMax = meter.createObservableGauge(\n \"reactor.host.eventloop.delay.max\",\n {\n description: \"Event-loop callback delay max over the prior scrape window\",\n unit: \"ms\",\n },\n );\n const utilization = meter.createObservableGauge(\n \"reactor.host.eventloop.utilization\",\n {\n description:\n \"Event-loop utilization ratio (active / (active + idle)) over the prior scrape window\",\n unit: \"1\",\n },\n );\n const cpuUtilization = meter.createObservableGauge(\n \"reactor.host.cpu.utilization\",\n {\n description:\n \"Process CPU utilization over the prior scrape window. 1.0 = one core saturated.\",\n unit: \"1\",\n },\n );\n\n let prevElu: EventLoopUtilization = performance.eventLoopUtilization();\n let prevCpu: NodeJS.CpuUsage = process.cpuUsage();\n let prevHrtime: bigint = process.hrtime.bigint();\n\n const callback: BatchObservableCallback = (result: BatchObservableResult) => {\n const p50ms = histogram.percentile(50) / NS_PER_MS;\n const p95ms = histogram.percentile(95) / NS_PER_MS;\n const p99ms = histogram.percentile(99) / NS_PER_MS;\n const maxMs = histogram.max / NS_PER_MS;\n histogram.reset();\n\n const eluNow = performance.eventLoopUtilization();\n const eluDelta = performance.eventLoopUtilization(eluNow, prevElu);\n prevElu = eluNow;\n\n const cpuNow = process.cpuUsage();\n const hrtimeNow = process.hrtime.bigint();\n const cpuDeltaUs =\n cpuNow.user - prevCpu.user + (cpuNow.system - prevCpu.system);\n const elapsedUs = Number(hrtimeNow - prevHrtime) / NS_PER_US;\n const cpuRatio = elapsedUs > 0 ? cpuDeltaUs / elapsedUs : 0;\n prevCpu = cpuNow;\n prevHrtime = hrtimeNow;\n\n result.observe(delayP50, p50ms);\n result.observe(delayP95, p95ms);\n result.observe(delayP99, p99ms);\n result.observe(delayMax, maxMs);\n result.observe(utilization, eluDelta.utilization);\n result.observe(cpuUtilization, cpuRatio);\n };\n\n const observables: Observable[] = [\n delayP50,\n delayP95,\n delayP99,\n delayMax,\n utilization,\n cpuUtilization,\n ];\n\n meter.addBatchObservableCallback(callback, observables);\n\n return {\n stop(): void {\n meter.removeBatchObservableCallback(callback, observables);\n histogram.disable();\n },\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.2.2-dev.83",
3
+ "version": "6.2.2-dev.84",
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.2.2-dev.83"
40
+ "@powerhousedao/reactor": "6.2.2-dev.84"
41
41
  },
42
42
  "scripts": {
43
43
  "tsc": "tsc",