mongodash 2.0.0 → 2.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (163) hide show
  1. package/README.md +40 -22
  2. package/dist/dashboard/index.html +40 -0
  3. package/dist/lib/playground/server.js +131 -0
  4. package/dist/lib/playground/server.js.map +1 -0
  5. package/dist/lib/src/ConcurrentRunner.js +148 -0
  6. package/dist/lib/src/ConcurrentRunner.js.map +1 -0
  7. package/dist/lib/{OnError.js → src/OnError.js} +3 -3
  8. package/dist/lib/src/OnError.js.map +1 -0
  9. package/dist/lib/{OnInfo.js → src/OnInfo.js} +6 -3
  10. package/dist/lib/src/OnInfo.js.map +1 -0
  11. package/dist/lib/{createContinuousLock.js → src/createContinuousLock.js} +5 -3
  12. package/dist/lib/src/createContinuousLock.js.map +1 -0
  13. package/dist/lib/{cronTasks.js → src/cronTasks.js} +129 -73
  14. package/dist/lib/src/cronTasks.js.map +1 -0
  15. package/dist/lib/{getCollection.js → src/getCollection.js} +2 -2
  16. package/dist/lib/src/getCollection.js.map +1 -0
  17. package/dist/lib/{getMongoClient.js → src/getMongoClient.js} +2 -2
  18. package/dist/lib/src/getMongoClient.js.map +1 -0
  19. package/dist/lib/src/globalsCollection.js +10 -0
  20. package/dist/lib/src/globalsCollection.js.map +1 -0
  21. package/dist/lib/src/index.js +101 -0
  22. package/dist/lib/src/index.js.map +1 -0
  23. package/dist/lib/{initPromise.js → src/initPromise.js} +2 -3
  24. package/dist/lib/src/initPromise.js.map +1 -0
  25. package/dist/lib/src/mongoCompatibility.js +10 -0
  26. package/dist/lib/src/mongoCompatibility.js.map +1 -0
  27. package/dist/lib/src/parseInterval.js +60 -0
  28. package/dist/lib/src/parseInterval.js.map +1 -0
  29. package/dist/lib/src/prefixFilterKeys.js +69 -0
  30. package/dist/lib/src/prefixFilterKeys.js.map +1 -0
  31. package/dist/lib/src/processInBatches.js +46 -0
  32. package/dist/lib/src/processInBatches.js.map +1 -0
  33. package/dist/lib/src/reactiveTasks/LeaderElector.js +155 -0
  34. package/dist/lib/src/reactiveTasks/LeaderElector.js.map +1 -0
  35. package/dist/lib/src/reactiveTasks/MetricsCollector.js +410 -0
  36. package/dist/lib/src/reactiveTasks/MetricsCollector.js.map +1 -0
  37. package/dist/lib/src/reactiveTasks/ReactiveTaskManager.js +288 -0
  38. package/dist/lib/src/reactiveTasks/ReactiveTaskManager.js.map +1 -0
  39. package/dist/lib/src/reactiveTasks/ReactiveTaskOps.js +185 -0
  40. package/dist/lib/src/reactiveTasks/ReactiveTaskOps.js.map +1 -0
  41. package/dist/lib/src/reactiveTasks/ReactiveTaskPlanner.js +443 -0
  42. package/dist/lib/src/reactiveTasks/ReactiveTaskPlanner.js.map +1 -0
  43. package/dist/lib/src/reactiveTasks/ReactiveTaskReconciler.js +218 -0
  44. package/dist/lib/src/reactiveTasks/ReactiveTaskReconciler.js.map +1 -0
  45. package/dist/lib/src/reactiveTasks/ReactiveTaskRegistry.js +184 -0
  46. package/dist/lib/src/reactiveTasks/ReactiveTaskRegistry.js.map +1 -0
  47. package/dist/lib/src/reactiveTasks/ReactiveTaskRepository.js +355 -0
  48. package/dist/lib/src/reactiveTasks/ReactiveTaskRepository.js.map +1 -0
  49. package/dist/lib/src/reactiveTasks/ReactiveTaskRetryStrategy.js +153 -0
  50. package/dist/lib/src/reactiveTasks/ReactiveTaskRetryStrategy.js.map +1 -0
  51. package/dist/lib/src/reactiveTasks/ReactiveTaskTypes.js +34 -0
  52. package/dist/lib/src/reactiveTasks/ReactiveTaskTypes.js.map +1 -0
  53. package/dist/lib/src/reactiveTasks/ReactiveTaskWorker.js +186 -0
  54. package/dist/lib/src/reactiveTasks/ReactiveTaskWorker.js.map +1 -0
  55. package/dist/lib/src/reactiveTasks/compileWatchProjection.js +65 -0
  56. package/dist/lib/src/reactiveTasks/compileWatchProjection.js.map +1 -0
  57. package/dist/lib/src/reactiveTasks/index.js +298 -0
  58. package/dist/lib/src/reactiveTasks/index.js.map +1 -0
  59. package/dist/lib/src/reactiveTasks/queryToExpression.js +160 -0
  60. package/dist/lib/src/reactiveTasks/queryToExpression.js.map +1 -0
  61. package/dist/lib/src/reactiveTasks/validateTaskFilter.js +88 -0
  62. package/dist/lib/src/reactiveTasks/validateTaskFilter.js.map +1 -0
  63. package/dist/lib/src/task-management/OperationalTaskController.js +162 -0
  64. package/dist/lib/src/task-management/OperationalTaskController.js.map +1 -0
  65. package/dist/lib/src/task-management/index.js +27 -0
  66. package/dist/lib/src/task-management/index.js.map +1 -0
  67. package/dist/lib/src/task-management/serveDashboard.js +149 -0
  68. package/dist/lib/src/task-management/serveDashboard.js.map +1 -0
  69. package/dist/lib/src/task-management/types.js +10 -0
  70. package/dist/lib/src/task-management/types.js.map +1 -0
  71. package/dist/lib/{withLock.js → src/withLock.js} +3 -4
  72. package/dist/lib/src/withLock.js.map +1 -0
  73. package/dist/lib/{withTransaction.js → src/withTransaction.js} +4 -4
  74. package/dist/lib/src/withTransaction.js.map +1 -0
  75. package/dist/lib/tools/check-db-connection.js +28 -0
  76. package/dist/lib/tools/check-db-connection.js.map +1 -0
  77. package/dist/lib/tools/clean-testing-databases.js +12 -0
  78. package/dist/lib/tools/clean-testing-databases.js.map +1 -0
  79. package/dist/lib/tools/prepare-republish.js +27 -0
  80. package/dist/lib/tools/prepare-republish.js.map +1 -0
  81. package/dist/lib/tools/test-matrix-local.js +212 -0
  82. package/dist/lib/tools/test-matrix-local.js.map +1 -0
  83. package/dist/lib/tools/testingDatabase.js +55 -0
  84. package/dist/lib/tools/testingDatabase.js.map +1 -0
  85. package/dist/types/playground/server.d.ts +1 -0
  86. package/dist/types/src/ConcurrentRunner.d.ts +30 -0
  87. package/dist/types/{OnInfo.d.ts → src/OnInfo.d.ts} +1 -1
  88. package/dist/types/{cronTasks.d.ts → src/cronTasks.d.ts} +44 -1
  89. package/dist/types/src/globalsCollection.d.ts +4 -0
  90. package/dist/types/src/index.d.ts +28 -0
  91. package/dist/types/src/mongoCompatibility.d.ts +29 -0
  92. package/dist/types/src/parseInterval.d.ts +12 -0
  93. package/dist/types/src/prefixFilterKeys.d.ts +11 -0
  94. package/dist/types/src/processInBatches.d.ts +10 -0
  95. package/dist/types/src/reactiveTasks/LeaderElector.d.ts +42 -0
  96. package/dist/types/src/reactiveTasks/MetricsCollector.d.ts +73 -0
  97. package/dist/types/src/reactiveTasks/ReactiveTaskManager.d.ts +18 -0
  98. package/dist/types/src/reactiveTasks/ReactiveTaskOps.d.ts +17 -0
  99. package/dist/types/src/reactiveTasks/ReactiveTaskPlanner.d.ts +62 -0
  100. package/dist/types/src/reactiveTasks/ReactiveTaskReconciler.d.ts +29 -0
  101. package/dist/types/src/reactiveTasks/ReactiveTaskRegistry.d.ts +34 -0
  102. package/dist/types/src/reactiveTasks/ReactiveTaskRepository.d.ts +59 -0
  103. package/dist/types/src/reactiveTasks/ReactiveTaskRetryStrategy.d.ts +21 -0
  104. package/dist/types/src/reactiveTasks/ReactiveTaskTypes.d.ts +389 -0
  105. package/dist/types/src/reactiveTasks/ReactiveTaskWorker.d.ts +36 -0
  106. package/dist/types/src/reactiveTasks/compileWatchProjection.d.ts +12 -0
  107. package/dist/types/src/reactiveTasks/index.d.ts +82 -0
  108. package/dist/types/src/reactiveTasks/queryToExpression.d.ts +13 -0
  109. package/dist/types/src/reactiveTasks/validateTaskFilter.d.ts +10 -0
  110. package/dist/types/src/task-management/OperationalTaskController.d.ts +59 -0
  111. package/dist/types/src/task-management/index.d.ts +3 -0
  112. package/dist/types/src/task-management/serveDashboard.d.ts +12 -0
  113. package/dist/types/src/task-management/types.d.ts +95 -0
  114. package/dist/types/tools/check-db-connection.d.ts +2 -0
  115. package/dist/types/tools/clean-testing-databases.d.ts +1 -0
  116. package/dist/types/tools/prepare-republish.d.ts +2 -0
  117. package/dist/types/tools/test-matrix-local.d.ts +1 -0
  118. package/dist/types/tools/testingDatabase.d.ts +2 -0
  119. package/docs/.vitepress/cache/deps/_metadata.json +31 -0
  120. package/docs/.vitepress/cache/deps/chunk-LE5NDSFD.js +12824 -0
  121. package/docs/.vitepress/cache/deps/chunk-LE5NDSFD.js.map +7 -0
  122. package/docs/.vitepress/cache/deps/package.json +3 -0
  123. package/docs/.vitepress/cache/deps/vitepress___@vue_devtools-api.js +4505 -0
  124. package/docs/.vitepress/cache/deps/vitepress___@vue_devtools-api.js.map +7 -0
  125. package/docs/.vitepress/cache/deps/vitepress___@vueuse_core.js +9731 -0
  126. package/docs/.vitepress/cache/deps/vitepress___@vueuse_core.js.map +7 -0
  127. package/docs/.vitepress/cache/deps/vue.js +347 -0
  128. package/docs/.vitepress/cache/deps/vue.js.map +7 -0
  129. package/docs/.vitepress/config.mts +48 -0
  130. package/docs/.vitepress/theme/index.ts +4 -0
  131. package/docs/.vitepress/theme/style.css +16 -0
  132. package/docs/assets/dashboard.png +0 -0
  133. package/docs/cron-tasks.md +172 -0
  134. package/docs/dashboard.md +117 -0
  135. package/docs/getters.md +31 -0
  136. package/docs/getting-started.md +120 -0
  137. package/docs/index.md +29 -0
  138. package/docs/initialization.md +59 -0
  139. package/docs/process-in-batches.md +73 -0
  140. package/docs/reactive-tasks.md +914 -0
  141. package/docs/with-lock.md +45 -0
  142. package/docs/with-transaction.md +65 -0
  143. package/grafana/reactive_tasks.json +765 -0
  144. package/package.json +127 -116
  145. package/dist/lib/OnError.js.map +0 -1
  146. package/dist/lib/OnInfo.js.map +0 -1
  147. package/dist/lib/createContinuousLock.js.map +0 -1
  148. package/dist/lib/cronTasks.js.map +0 -1
  149. package/dist/lib/getCollection.js.map +0 -1
  150. package/dist/lib/getMongoClient.js.map +0 -1
  151. package/dist/lib/index.js +0 -64
  152. package/dist/lib/index.js.map +0 -1
  153. package/dist/lib/initPromise.js.map +0 -1
  154. package/dist/lib/withLock.js.map +0 -1
  155. package/dist/lib/withTransaction.js.map +0 -1
  156. package/dist/types/index.d.ts +0 -17
  157. /package/dist/types/{OnError.d.ts → src/OnError.d.ts} +0 -0
  158. /package/dist/types/{createContinuousLock.d.ts → src/createContinuousLock.d.ts} +0 -0
  159. /package/dist/types/{getCollection.d.ts → src/getCollection.d.ts} +0 -0
  160. /package/dist/types/{getMongoClient.d.ts → src/getMongoClient.d.ts} +0 -0
  161. /package/dist/types/{initPromise.d.ts → src/initPromise.d.ts} +0 -0
  162. /package/dist/types/{withLock.d.ts → src/withLock.d.ts} +0 -0
  163. /package/dist/types/{withTransaction.d.ts → src/withTransaction.d.ts} +0 -0
@@ -0,0 +1,410 @@
1
+ /**!
2
+ * mongodash v2.1.0
3
+ * git+https://github.com/VaclavObornik/mongodash.git
4
+ *
5
+ * Copyright (c) 2025 Václav Oborník
6
+ * Released under the MIT license
7
+ */
8
+ "use strict";
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.MetricsCollector = void 0;
11
+ const debug_1 = require("debug");
12
+ const OnError_1 = require("../OnError");
13
+ const OnInfo_1 = require("../OnInfo");
14
+ const ReactiveTaskTypes_1 = require("./ReactiveTaskTypes");
15
+ const _debugLogger = (0, debug_1.default)('mongodash:reactiveTasks:metrics');
16
+ // ============================================================================
17
+ // Constants
18
+ // ============================================================================
19
+ const METRIC_NAMES = {
20
+ DURATION: 'reactive_tasks_duration_seconds',
21
+ RETRIES: 'reactive_tasks_retries_total',
22
+ QUEUE_DEPTH: 'reactive_tasks_queue_depth',
23
+ GLOBAL_LAG: 'reactive_tasks_global_lag_seconds',
24
+ CHANGE_STREAM_LAG: 'reactive_tasks_change_stream_lag_seconds',
25
+ LAST_RECONCILIATION: 'reactive_tasks_last_reconciliation_timestamp_seconds',
26
+ };
27
+ const REGISTRY_DOC_ID = 'reactive_tasks_metrics_registry';
28
+ const STALE_THRESHOLD_MULTIPLIER = 20;
29
+ const DEFAULT_PUSH_INTERVAL = 60000;
30
+ const DEFAULT_OPTIONS = {
31
+ enabled: true,
32
+ scrapeMode: 'cluster',
33
+ readPreference: 'secondaryPreferred',
34
+ pushIntervalMs: DEFAULT_PUSH_INTERVAL,
35
+ };
36
+ // ============================================================================
37
+ // MetricsCollector
38
+ // ============================================================================
39
+ /**
40
+ * Collects and aggregates metrics for Reactive Tasks.
41
+ *
42
+ * Supports two scrape modes:
43
+ * - **cluster**: Returns aggregated metrics from ALL instances (via DB registry).
44
+ * Use when Prometheus scrapes a single endpoint (e.g., behind a load balancer).
45
+ * - **local**: Returns metrics from THIS instance only.
46
+ * Use when Prometheus scrapes each pod individually (K8s Pod Monitors).
47
+ *
48
+ * Global stats (queue depth, lag) are computed on-the-fly by the **Leader only**.
49
+ */
50
+ class MetricsCollector {
51
+ // ========================================================================
52
+ // Constructor
53
+ // ========================================================================
54
+ constructor(instanceId, registry, globalsCollection, leaderElector, options, onInfo = OnInfo_1.defaultOnInfo, onError = OnError_1.defaultOnError) {
55
+ this.queueMetricsPromise = null;
56
+ this.instanceId = instanceId;
57
+ this.registry = registry;
58
+ this.globalsCollection = globalsCollection;
59
+ this.leaderElector = leaderElector;
60
+ this.options = Object.assign(Object.assign({}, DEFAULT_OPTIONS), options);
61
+ this.enabled = this.options.enabled;
62
+ this.onInfo = onInfo;
63
+ this.onError = onError;
64
+ if (this.enabled) {
65
+ this.initPrometheus();
66
+ }
67
+ }
68
+ // ========================================================================
69
+ // Initialization
70
+ // ========================================================================
71
+ initPrometheus() {
72
+ try {
73
+ this.promClientModule = require('prom-client');
74
+ }
75
+ catch (_a) {
76
+ this.enabled = false;
77
+ this.onError(new Error('ReactiveTasks Monitoring is enabled but "prom-client" is not installed. Monitoring disabled.'));
78
+ return;
79
+ }
80
+ this.localPromRegistry = new this.promClientModule.Registry();
81
+ this.globalStatsRegistry = new this.promClientModule.Registry();
82
+ this.initLocalMetrics();
83
+ this.initGlobalStatsMetrics();
84
+ }
85
+ initLocalMetrics() {
86
+ this.metricDuration = this.getOrCreateMetric(METRIC_NAMES.DURATION, this.promClientModule.Histogram, { help: 'Distribution of task execution durations.', labelNames: ['task_name', 'status'] }, this.localPromRegistry);
87
+ this.metricRetries = this.getOrCreateMetric(METRIC_NAMES.RETRIES, this.promClientModule.Counter, { help: 'Total number of retries attempted.', labelNames: ['task_name'] }, this.localPromRegistry);
88
+ }
89
+ initGlobalStatsMetrics() {
90
+ const registry = this.globalStatsRegistry;
91
+ const promClient = this.promClientModule;
92
+ // Queue Depth gauge (triggers collectQueueMetrics)
93
+ new promClient.Gauge({
94
+ name: METRIC_NAMES.QUEUE_DEPTH,
95
+ help: 'Count of tasks in each state.',
96
+ labelNames: ['task_name', 'status'],
97
+ registers: [registry],
98
+ collect: () => this.collectIfLeader(() => this.triggerQueueMetricsCollection()),
99
+ });
100
+ // Global Lag gauge (shares collection with Queue Depth via deduplication)
101
+ new promClient.Gauge({
102
+ name: METRIC_NAMES.GLOBAL_LAG,
103
+ help: 'Age of oldest pending task.',
104
+ labelNames: ['task_name'],
105
+ registers: [registry],
106
+ collect: () => this.collectIfLeader(() => this.triggerQueueMetricsCollection()),
107
+ });
108
+ // Reconciliation timestamp gauge
109
+ const reconciliationGauge = new promClient.Gauge({
110
+ name: METRIC_NAMES.LAST_RECONCILIATION,
111
+ help: 'Timestamp of last successful reconciliation.',
112
+ registers: [registry],
113
+ collect: () => this.collectIfLeader(() => this.collectReconciliationMetrics((v) => reconciliationGauge.set(v))),
114
+ });
115
+ // Change Stream Lag gauge
116
+ const changeStreamLagGauge = new promClient.Gauge({
117
+ name: METRIC_NAMES.CHANGE_STREAM_LAG,
118
+ help: 'Now - ResumeToken.ClusterTime.',
119
+ registers: [registry],
120
+ collect: () => this.collectIfLeader(() => this.collectChangeStreamLag((v) => changeStreamLagGauge.set(v))),
121
+ });
122
+ }
123
+ // ========================================================================
124
+ // Lifecycle
125
+ // ========================================================================
126
+ start() {
127
+ if (!this.enabled || this.options.scrapeMode === 'local')
128
+ return;
129
+ this.pushInterval = setInterval(() => this.pushLocalMetrics(), this.options.pushIntervalMs);
130
+ // Push immediately to register presence
131
+ this.pushLocalMetrics().catch((err) => this.onError(err));
132
+ }
133
+ stop() {
134
+ var _a, _b;
135
+ if (this.pushInterval) {
136
+ clearInterval(this.pushInterval);
137
+ this.pushInterval = undefined;
138
+ }
139
+ // Extra safety: Clear registries to release references to Metric objects
140
+ (_a = this.localPromRegistry) === null || _a === void 0 ? void 0 : _a.clear();
141
+ (_b = this.globalStatsRegistry) === null || _b === void 0 ? void 0 : _b.clear();
142
+ }
143
+ // ========================================================================
144
+ // Public API: Recording Metrics
145
+ // ========================================================================
146
+ recordTaskExecution(task, status, durationMs) {
147
+ if (!this.enabled || !this.metricDuration)
148
+ return;
149
+ this.metricDuration.observe({ task_name: task, status }, durationMs / 1000);
150
+ }
151
+ recordRetry(task) {
152
+ if (!this.enabled || !this.metricRetries)
153
+ return;
154
+ this.metricRetries.inc({ task_name: task });
155
+ }
156
+ // ========================================================================
157
+ // Public API: Scraping Metrics
158
+ // ========================================================================
159
+ async getPrometheusMetrics() {
160
+ if (!this.enabled || !this.promClientModule)
161
+ return null;
162
+ return this.options.scrapeMode === 'cluster' ? this.getClusterMetrics() : this.getLocalMetrics();
163
+ }
164
+ // ========================================================================
165
+ // Scrape Mode Implementations
166
+ // ========================================================================
167
+ /**
168
+ * Returns aggregated metrics from ALL instances.
169
+ * Fetches other instances' metrics from DB and merges with fresh local metrics.
170
+ * Leader also includes global stats.
171
+ */
172
+ async getClusterMetrics() {
173
+ const allMetrics = [];
174
+ // 1. Fetch other instances' metrics from DB
175
+ const otherInstanceMetrics = await this.fetchOtherInstancesMetrics();
176
+ allMetrics.push(...otherInstanceMetrics);
177
+ // 2. Add fresh local metrics
178
+ const localMetrics = await this.getLocalMetricsAsJson();
179
+ if (localMetrics)
180
+ allMetrics.push(localMetrics);
181
+ // 3. If leader, add global stats
182
+ const globalStats = await this.getGlobalStatsAsJson();
183
+ if (globalStats)
184
+ allMetrics.push(globalStats);
185
+ // 4. Aggregate all
186
+ if (allMetrics.length === 0)
187
+ return null;
188
+ try {
189
+ return await this.promClientModule.AggregatorRegistry.aggregate(allMetrics);
190
+ }
191
+ catch (e) {
192
+ this.onError(e);
193
+ return null;
194
+ }
195
+ }
196
+ /**
197
+ * Returns metrics from THIS instance only.
198
+ * Leader also includes global stats.
199
+ */
200
+ async getLocalMetrics() {
201
+ const registries = [];
202
+ if (this.localPromRegistry) {
203
+ registries.push(this.localPromRegistry);
204
+ }
205
+ // Leader adds global stats
206
+ if (this.leaderElector.isLeader && this.globalStatsRegistry) {
207
+ await this.triggerGlobalStatsCollection();
208
+ registries.push(this.globalStatsRegistry);
209
+ }
210
+ // The following line was added as per instruction, but 'stats' is not defined in this scope.
211
+ // It also has a syntax error (missing closing brace).
212
+ // Assuming it was meant to be a placeholder or part of a different context,
213
+ // it's commented out to maintain syntactical correctness of the file.
214
+ // if (stats.statuses.find((s) => s._id === 'failed')) {return null;
215
+ if (registries.length === 0)
216
+ return null;
217
+ if (registries.length === 1)
218
+ return registries[0];
219
+ return this.promClientModule.Registry.merge(registries);
220
+ }
221
+ // ========================================================================
222
+ // Metrics Data Fetching
223
+ // ========================================================================
224
+ async fetchOtherInstancesMetrics() {
225
+ try {
226
+ const registryDoc = (await this.globalsCollection.findOne({ _id: REGISTRY_DOC_ID }, { readPreference: this.options.readPreference }));
227
+ if (!(registryDoc === null || registryDoc === void 0 ? void 0 : registryDoc.instances) || !Array.isArray(registryDoc.instances)) {
228
+ return [];
229
+ }
230
+ const now = Date.now();
231
+ const staleThreshold = STALE_THRESHOLD_MULTIPLIER * this.options.pushIntervalMs;
232
+ return registryDoc.instances
233
+ .filter((inst) => {
234
+ const age = now - new Date(inst.lastSeen).getTime();
235
+ const isStale = age > staleThreshold;
236
+ const isSelf = inst.id === this.instanceId;
237
+ return !isStale && !isSelf && Array.isArray(inst.metrics);
238
+ })
239
+ .map((inst) => inst.metrics);
240
+ }
241
+ catch (e) {
242
+ this.onError(e);
243
+ return [];
244
+ }
245
+ }
246
+ async getLocalMetricsAsJson() {
247
+ if (!this.localPromRegistry)
248
+ return null;
249
+ try {
250
+ return await this.localPromRegistry.getMetricsAsJSON();
251
+ }
252
+ catch (e) {
253
+ this.onError(e);
254
+ return null;
255
+ }
256
+ }
257
+ async getGlobalStatsAsJson() {
258
+ if (!this.leaderElector.isLeader || !this.globalStatsRegistry)
259
+ return null;
260
+ try {
261
+ return await this.globalStatsRegistry.getMetricsAsJSON();
262
+ }
263
+ catch (e) {
264
+ this.onError(e);
265
+ return null;
266
+ }
267
+ }
268
+ async triggerGlobalStatsCollection() {
269
+ if (!this.globalStatsRegistry)
270
+ return;
271
+ try {
272
+ await this.globalStatsRegistry.getMetricsAsJSON();
273
+ }
274
+ catch (e) {
275
+ this.onError(e);
276
+ }
277
+ }
278
+ // ========================================================================
279
+ // Push to Global Registry (Cluster Mode)
280
+ // ========================================================================
281
+ async pushLocalMetrics() {
282
+ if (!this.localPromRegistry)
283
+ return;
284
+ try {
285
+ const metricsJson = await this.localPromRegistry.getMetricsAsJSON();
286
+ await this.publishMetricsToGlobalRegistry(metricsJson);
287
+ }
288
+ catch (e) {
289
+ this.onError(e);
290
+ }
291
+ }
292
+ async publishMetricsToGlobalRegistry(metrics) {
293
+ try {
294
+ const threshold = STALE_THRESHOLD_MULTIPLIER * this.options.pushIntervalMs;
295
+ // Leader cleans up stale instances; followers only update self
296
+ const keepCondition = this.leaderElector.isLeader
297
+ ? { $and: [{ $ne: ['$$inst.id', this.instanceId] }, { $lt: [{ $subtract: ['$$NOW', '$$inst.lastSeen'] }, threshold] }] }
298
+ : { $ne: ['$$inst.id', this.instanceId] };
299
+ await this.globalsCollection.updateOne({ _id: REGISTRY_DOC_ID }, [
300
+ {
301
+ $set: {
302
+ instances: {
303
+ $concatArrays: [
304
+ { $filter: { input: { $ifNull: ['$instances', []] }, as: 'inst', cond: keepCondition } },
305
+ [{ id: this.instanceId, lastSeen: '$$NOW', metrics }],
306
+ ],
307
+ },
308
+ },
309
+ },
310
+ ], { upsert: true });
311
+ }
312
+ catch (e) {
313
+ this.onError(e);
314
+ }
315
+ }
316
+ // ========================================================================
317
+ // Global Stats Collection (Leader Only)
318
+ // ========================================================================
319
+ async collectIfLeader(collectFn) {
320
+ if (!this.leaderElector.isLeader)
321
+ return;
322
+ try {
323
+ await collectFn();
324
+ }
325
+ catch (e) {
326
+ this.onError(e);
327
+ }
328
+ }
329
+ /**
330
+ * Triggers queue metrics collection with deduplication.
331
+ * Both QUEUE_DEPTH and GLOBAL_LAG share the same aggregation query.
332
+ */
333
+ async triggerQueueMetricsCollection() {
334
+ if (!this.globalStatsRegistry)
335
+ return;
336
+ if (!this.queueMetricsPromise) {
337
+ this.queueMetricsPromise = this.collectQueueMetrics((name, labels, val) => {
338
+ const gauge = this.globalStatsRegistry.getSingleMetric(name);
339
+ if (gauge)
340
+ gauge.set(labels, val);
341
+ }).finally(() => {
342
+ this.queueMetricsPromise = null;
343
+ });
344
+ }
345
+ await this.queueMetricsPromise;
346
+ }
347
+ async collectQueueMetrics(setGauge) {
348
+ const entries = this.registry.getAllEntries();
349
+ await Promise.all(entries.map(async ({ repository }) => {
350
+ try {
351
+ const stats = await repository.getStatistics({}, {
352
+ readPreference: this.options.readPreference,
353
+ includeStatusCounts: true,
354
+ includeGlobalLag: true,
355
+ groupByTask: true,
356
+ });
357
+ for (const d of stats.statuses) {
358
+ // When groupByTask is true, _id is { task, status }
359
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
360
+ const id = d._id;
361
+ setGauge(METRIC_NAMES.QUEUE_DEPTH, { task_name: id.task, status: id.status }, d.count);
362
+ }
363
+ const now = Date.now();
364
+ const globalLag = stats.globalLag || [];
365
+ for (const o of globalLag) {
366
+ const lagSeconds = o.minScheduledAt ? Math.max(0, (now - new Date(o.minScheduledAt).getTime()) / 1000) : 0;
367
+ setGauge(METRIC_NAMES.GLOBAL_LAG, { task_name: o._id }, lagSeconds);
368
+ }
369
+ }
370
+ catch (e) {
371
+ this.onError(e);
372
+ }
373
+ }));
374
+ }
375
+ async collectReconciliationMetrics(setValue) {
376
+ try {
377
+ const metaDoc = (await this.globalsCollection.findOne({ _id: ReactiveTaskTypes_1.REACTIVE_TASK_META_DOC_ID }, { readPreference: this.options.readPreference }));
378
+ if (metaDoc === null || metaDoc === void 0 ? void 0 : metaDoc.lastReconciledAt) {
379
+ setValue(new Date(metaDoc.lastReconciledAt).getTime() / 1000);
380
+ }
381
+ }
382
+ catch (e) {
383
+ this.onError(e);
384
+ }
385
+ }
386
+ async collectChangeStreamLag(setValue) {
387
+ var _a;
388
+ try {
389
+ const metaDoc = (await this.globalsCollection.findOne({ _id: ReactiveTaskTypes_1.REACTIVE_TASK_META_DOC_ID }, { readPreference: this.options.readPreference }));
390
+ if ((_a = metaDoc === null || metaDoc === void 0 ? void 0 : metaDoc.streamState) === null || _a === void 0 ? void 0 : _a.lastClusterTime) {
391
+ const lagSeconds = Math.max(0, (Date.now() - new Date(metaDoc.streamState.lastClusterTime).getTime()) / 1000);
392
+ setValue(lagSeconds);
393
+ }
394
+ }
395
+ catch (e) {
396
+ this.onError(e);
397
+ }
398
+ }
399
+ // ========================================================================
400
+ // Helpers
401
+ // ========================================================================
402
+ getOrCreateMetric(name, MetricClass, config, registry) {
403
+ const existing = registry.getSingleMetric(name);
404
+ if (existing)
405
+ return existing;
406
+ return new MetricClass(Object.assign(Object.assign({ name }, config), { registers: [registry] }));
407
+ }
408
+ }
409
+ exports.MetricsCollector = MetricsCollector;
410
+ //# sourceMappingURL=MetricsCollector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MetricsCollector.js","sourceRoot":"","sources":["../../../../src/reactiveTasks/MetricsCollector.ts"],"names":[],"mappings":"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"}