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,765 @@
1
+ {
2
+ "annotations": {
3
+ "list": [
4
+ {
5
+ "builtIn": 1,
6
+ "datasource": {
7
+ "type": "grafana",
8
+ "uid": "-- Grafana --"
9
+ },
10
+ "enable": true,
11
+ "hide": true,
12
+ "iconColor": "rgba(0, 211, 255, 1)",
13
+ "name": "Annotations & Alerts",
14
+ "type": "dashboard"
15
+ }
16
+ ]
17
+ },
18
+ "editable": true,
19
+ "fiscalYearStartMonth": 0,
20
+ "graphTooltip": 0,
21
+ "id": null,
22
+ "links": [],
23
+ "liveNow": false,
24
+ "panels": [
25
+ {
26
+ "collapsed": false,
27
+ "gridPos": {
28
+ "h": 1,
29
+ "w": 24,
30
+ "x": 0,
31
+ "y": 0
32
+ },
33
+ "id": 10,
34
+ "panels": [],
35
+ "title": "System Health & KPIs",
36
+ "type": "row"
37
+ },
38
+ {
39
+ "datasource": {
40
+ "type": "prometheus",
41
+ "uid": "prometheus"
42
+ },
43
+ "description": "Percentage of tasks completed successfully vs failed.",
44
+ "gridPos": {
45
+ "h": 6,
46
+ "w": 4,
47
+ "x": 0,
48
+ "y": 1
49
+ },
50
+ "id": 1,
51
+ "options": {
52
+ "colorMode": "value",
53
+ "graphMode": "none",
54
+ "justifyMode": "auto",
55
+ "orientation": "auto",
56
+ "reduceOptions": {
57
+ "calcs": [
58
+ "lastNotNull"
59
+ ],
60
+ "fields": "",
61
+ "values": false
62
+ },
63
+ "textMode": "auto",
64
+ "wideLayout": true
65
+ },
66
+ "pluginVersion": "10.0.0",
67
+ "targets": [
68
+ {
69
+ "datasource": {
70
+ "type": "prometheus",
71
+ "uid": "prometheus"
72
+ },
73
+ "editorMode": "code",
74
+ "expr": "sum(rate(reactive_tasks_duration_seconds_count{status=\"success\"}[5m])) / sum(rate(reactive_tasks_duration_seconds_count[5m])) * 100",
75
+ "legendFormat": "Health Score",
76
+ "range": true,
77
+ "refId": "A"
78
+ }
79
+ ],
80
+ "title": "Health Score",
81
+ "type": "stat",
82
+ "fieldConfig": {
83
+ "defaults": {
84
+ "max": 100,
85
+ "min": 0,
86
+ "thresholds": {
87
+ "mode": "absolute",
88
+ "steps": [
89
+ {
90
+ "color": "red",
91
+ "value": null
92
+ },
93
+ {
94
+ "color": "yellow",
95
+ "value": 95
96
+ },
97
+ {
98
+ "color": "green",
99
+ "value": 99
100
+ }
101
+ ]
102
+ },
103
+ "unit": "percent"
104
+ }
105
+ }
106
+ },
107
+ {
108
+ "datasource": {
109
+ "type": "prometheus",
110
+ "uid": "prometheus"
111
+ },
112
+ "description": "Max age of any pending task in the system.",
113
+ "gridPos": {
114
+ "h": 6,
115
+ "w": 4,
116
+ "x": 4,
117
+ "y": 1
118
+ },
119
+ "id": 2,
120
+ "options": {
121
+ "colorMode": "background",
122
+ "graphMode": "none",
123
+ "justifyMode": "auto",
124
+ "orientation": "auto",
125
+ "reduceOptions": {
126
+ "calcs": [
127
+ "lastNotNull"
128
+ ],
129
+ "fields": "",
130
+ "values": false
131
+ },
132
+ "textMode": "auto",
133
+ "wideLayout": true
134
+ },
135
+ "targets": [
136
+ {
137
+ "datasource": {
138
+ "type": "prometheus",
139
+ "uid": "prometheus"
140
+ },
141
+ "editorMode": "code",
142
+ "expr": "max(reactive_tasks_global_lag_seconds)",
143
+ "legendFormat": "Global Lag",
144
+ "range": true,
145
+ "refId": "A"
146
+ }
147
+ ],
148
+ "title": "Global Max Lag",
149
+ "type": "stat",
150
+ "fieldConfig": {
151
+ "defaults": {
152
+ "thresholds": {
153
+ "mode": "absolute",
154
+ "steps": [
155
+ {
156
+ "color": "green",
157
+ "value": null
158
+ },
159
+ {
160
+ "color": "yellow",
161
+ "value": 10
162
+ },
163
+ {
164
+ "color": "red",
165
+ "value": 60
166
+ }
167
+ ]
168
+ },
169
+ "unit": "s"
170
+ }
171
+ }
172
+ },
173
+ {
174
+ "datasource": {
175
+ "type": "prometheus",
176
+ "uid": "prometheus"
177
+ },
178
+ "description": "Total operations per second across all tasks.",
179
+ "gridPos": {
180
+ "h": 6,
181
+ "w": 6,
182
+ "x": 8,
183
+ "y": 1
184
+ },
185
+ "id": 9,
186
+ "options": {
187
+ "colorMode": "value",
188
+ "graphMode": "area",
189
+ "justifyMode": "auto",
190
+ "orientation": "auto",
191
+ "reduceOptions": {
192
+ "calcs": [
193
+ "lastNotNull"
194
+ ],
195
+ "fields": "",
196
+ "values": false
197
+ },
198
+ "textMode": "auto",
199
+ "wideLayout": true
200
+ },
201
+ "targets": [
202
+ {
203
+ "datasource": {
204
+ "type": "prometheus",
205
+ "uid": "prometheus"
206
+ },
207
+ "editorMode": "code",
208
+ "expr": "sum(rate(reactive_tasks_duration_seconds_count[1m]))",
209
+ "legendFormat": "Ops/sec",
210
+ "range": true,
211
+ "refId": "A"
212
+ }
213
+ ],
214
+ "title": "Total Throughput",
215
+ "type": "stat",
216
+ "fieldConfig": {
217
+ "defaults": {
218
+ "unit": "ops"
219
+ }
220
+ }
221
+ },
222
+ {
223
+ "datasource": {
224
+ "type": "prometheus",
225
+ "uid": "prometheus"
226
+ },
227
+ "description": "Number of tasks currently being processed (status=processing).",
228
+ "gridPos": {
229
+ "h": 6,
230
+ "w": 5,
231
+ "x": 14,
232
+ "y": 1
233
+ },
234
+ "id": 11,
235
+ "options": {
236
+ "colorMode": "value",
237
+ "graphMode": "none",
238
+ "justifyMode": "auto",
239
+ "orientation": "auto",
240
+ "reduceOptions": {
241
+ "calcs": [
242
+ "lastNotNull"
243
+ ],
244
+ "fields": "",
245
+ "values": false
246
+ },
247
+ "textMode": "auto",
248
+ "wideLayout": true
249
+ },
250
+ "targets": [
251
+ {
252
+ "datasource": {
253
+ "type": "prometheus",
254
+ "uid": "prometheus"
255
+ },
256
+ "editorMode": "code",
257
+ "expr": "sum(reactive_tasks_queue_depth{status=\"processing\"})",
258
+ "legendFormat": "Active Workers",
259
+ "range": true,
260
+ "refId": "A"
261
+ }
262
+ ],
263
+ "title": "Active Workers",
264
+ "type": "stat",
265
+ "fieldConfig": {
266
+ "defaults": {
267
+ "color": {
268
+ "mode": "palette-classic"
269
+ }
270
+ }
271
+ }
272
+ },
273
+ {
274
+ "datasource": {
275
+ "type": "prometheus",
276
+ "uid": "prometheus"
277
+ },
278
+ "description": "Total number of tasks waiting to be picked up (status=pending).",
279
+ "gridPos": {
280
+ "h": 6,
281
+ "w": 5,
282
+ "x": 19,
283
+ "y": 1
284
+ },
285
+ "id": 12,
286
+ "options": {
287
+ "colorMode": "value",
288
+ "graphMode": "none",
289
+ "justifyMode": "auto",
290
+ "orientation": "auto",
291
+ "reduceOptions": {
292
+ "calcs": [
293
+ "lastNotNull"
294
+ ],
295
+ "fields": "",
296
+ "values": false
297
+ },
298
+ "textMode": "auto",
299
+ "wideLayout": true
300
+ },
301
+ "targets": [
302
+ {
303
+ "datasource": {
304
+ "type": "prometheus",
305
+ "uid": "prometheus"
306
+ },
307
+ "editorMode": "code",
308
+ "expr": "sum(reactive_tasks_queue_depth{status=\"pending\"})",
309
+ "legendFormat": "Pending Tasks",
310
+ "range": true,
311
+ "refId": "A"
312
+ }
313
+ ],
314
+ "title": "Pending Queue",
315
+ "type": "stat",
316
+ "fieldConfig": {
317
+ "defaults": {
318
+ "color": {
319
+ "mode": "palette-classic"
320
+ },
321
+ "thresholds": {
322
+ "mode": "absolute",
323
+ "steps": [
324
+ {
325
+ "color": "green",
326
+ "value": null
327
+ },
328
+ {
329
+ "color": "orange",
330
+ "value": 100
331
+ },
332
+ {
333
+ "color": "red",
334
+ "value": 1000
335
+ }
336
+ ]
337
+ }
338
+ }
339
+ }
340
+ },
341
+ {
342
+ "collapsed": false,
343
+ "gridPos": {
344
+ "h": 1,
345
+ "w": 24,
346
+ "x": 0,
347
+ "y": 7
348
+ },
349
+ "id": 13,
350
+ "panels": [],
351
+ "title": "Performance Analysis",
352
+ "type": "row"
353
+ },
354
+ {
355
+ "datasource": {
356
+ "type": "prometheus",
357
+ "uid": "prometheus"
358
+ },
359
+ "gridPos": {
360
+ "h": 8,
361
+ "w": 12,
362
+ "x": 0,
363
+ "y": 8
364
+ },
365
+ "id": 3,
366
+ "options": {
367
+ "calculate": false,
368
+ "cellGap": 1,
369
+ "color": {
370
+ "mode": "scheme",
371
+ "scheme": "Spectral",
372
+ "exponent": 0.5,
373
+ "steps": 64
374
+ },
375
+ "exemplars": {
376
+ "color": "rgba(255,0,255,0.7)"
377
+ },
378
+ "filterValues": {
379
+ "le": 1e-9
380
+ },
381
+ "legend": {
382
+ "show": true
383
+ },
384
+ "tooltip": {
385
+ "show": true,
386
+ "yHistogram": false
387
+ },
388
+ "yAxis": {
389
+ "axisPlacement": "left",
390
+ "reverse": false,
391
+ "unit": "s"
392
+ }
393
+ },
394
+ "targets": [
395
+ {
396
+ "datasource": {
397
+ "type": "prometheus",
398
+ "uid": "prometheus"
399
+ },
400
+ "editorMode": "code",
401
+ "expr": "sum(rate(reactive_tasks_duration_seconds_bucket[$__rate_interval])) by (le)",
402
+ "format": "heatmap",
403
+ "legendFormat": "{{le}}",
404
+ "range": true,
405
+ "refId": "A"
406
+ }
407
+ ],
408
+ "title": "Task Duration Heatmap",
409
+ "type": "heatmap"
410
+ },
411
+ {
412
+ "datasource": {
413
+ "type": "prometheus",
414
+ "uid": "prometheus"
415
+ },
416
+ "gridPos": {
417
+ "h": 8,
418
+ "w": 12,
419
+ "x": 12,
420
+ "y": 8
421
+ },
422
+ "id": 4,
423
+ "options": {
424
+ "legend": {
425
+ "calcs": [
426
+ "mean",
427
+ "max"
428
+ ],
429
+ "displayMode": "table",
430
+ "placement": "right",
431
+ "showLegend": true
432
+ },
433
+ "tooltip": {
434
+ "mode": "multi",
435
+ "sort": "desc"
436
+ }
437
+ },
438
+ "targets": [
439
+ {
440
+ "datasource": {
441
+ "type": "prometheus",
442
+ "uid": "prometheus"
443
+ },
444
+ "editorMode": "code",
445
+ "expr": "sum(rate(reactive_tasks_duration_seconds_count[1m])) by (task_name)",
446
+ "legendFormat": "{{task_name}}",
447
+ "range": true,
448
+ "refId": "A"
449
+ }
450
+ ],
451
+ "title": "Throughput by Task",
452
+ "type": "timeseries",
453
+ "fieldConfig": {
454
+ "defaults": {
455
+ "unit": "ops"
456
+ }
457
+ }
458
+ },
459
+ {
460
+ "collapsed": false,
461
+ "gridPos": {
462
+ "h": 1,
463
+ "w": 24,
464
+ "x": 0,
465
+ "y": 16
466
+ },
467
+ "id": 14,
468
+ "panels": [],
469
+ "title": "Reliability & Errors",
470
+ "type": "row"
471
+ },
472
+ {
473
+ "datasource": {
474
+ "type": "prometheus",
475
+ "uid": "prometheus"
476
+ },
477
+ "gridPos": {
478
+ "h": 8,
479
+ "w": 12,
480
+ "x": 0,
481
+ "y": 17
482
+ },
483
+ "id": 5,
484
+ "options": {
485
+ "legend": {
486
+ "calcs": [],
487
+ "displayMode": "list",
488
+ "placement": "bottom",
489
+ "showLegend": true
490
+ },
491
+ "tooltip": {
492
+ "mode": "single",
493
+ "sort": "none"
494
+ }
495
+ },
496
+ "targets": [
497
+ {
498
+ "datasource": {
499
+ "type": "prometheus",
500
+ "uid": "prometheus"
501
+ },
502
+ "editorMode": "code",
503
+ "expr": "sum(rate(reactive_tasks_duration_seconds_count{status=\"failed\"}[1m])) by (task_name)",
504
+ "legendFormat": "{{task_name}} Failures",
505
+ "range": true,
506
+ "refId": "A"
507
+ }
508
+ ],
509
+ "title": "Error Rate (Failures/sec)",
510
+ "type": "timeseries",
511
+ "fieldConfig": {
512
+ "defaults": {
513
+ "unit": "ops",
514
+ "color": {
515
+ "mode": "fixed",
516
+ "fixedColor": "red"
517
+ }
518
+ }
519
+ }
520
+ },
521
+ {
522
+ "datasource": {
523
+ "type": "prometheus",
524
+ "uid": "prometheus"
525
+ },
526
+ "gridPos": {
527
+ "h": 8,
528
+ "w": 12,
529
+ "x": 12,
530
+ "y": 17
531
+ },
532
+ "id": 6,
533
+ "options": {
534
+ "legend": {
535
+ "calcs": [
536
+ "lastNotNull"
537
+ ],
538
+ "displayMode": "list",
539
+ "placement": "right",
540
+ "showLegend": true
541
+ },
542
+ "tooltip": {
543
+ "mode": "single",
544
+ "sort": "none"
545
+ }
546
+ },
547
+ "targets": [
548
+ {
549
+ "datasource": {
550
+ "type": "prometheus",
551
+ "uid": "prometheus"
552
+ },
553
+ "editorMode": "code",
554
+ "expr": "increase(reactive_tasks_retries_total[5m])",
555
+ "legendFormat": "{{task_name}} Retries",
556
+ "range": true,
557
+ "refId": "A"
558
+ }
559
+ ],
560
+ "title": "Recent Retries (Last 5m)",
561
+ "type": "barchart"
562
+ },
563
+ {
564
+ "collapsed": false,
565
+ "gridPos": {
566
+ "h": 1,
567
+ "w": 24,
568
+ "x": 0,
569
+ "y": 25
570
+ },
571
+ "id": 15,
572
+ "panels": [],
573
+ "title": "Queues & Lag Deep Dive",
574
+ "type": "row"
575
+ },
576
+ {
577
+ "datasource": {
578
+ "type": "prometheus",
579
+ "uid": "prometheus"
580
+ },
581
+ "type": "barchart",
582
+ "title": "Queue Composition by Task",
583
+ "gridPos": {
584
+ "x": 0,
585
+ "y": 26,
586
+ "w": 12,
587
+ "h": 8
588
+ },
589
+ "options": {
590
+ "stacking": "normal",
591
+ "legend": {
592
+ "displayMode": "table",
593
+ "placement": "right",
594
+ "calcs": [
595
+ "lastNotNull",
596
+ "max"
597
+ ]
598
+ }
599
+ },
600
+ "fieldConfig": {
601
+ "defaults": {
602
+ "decimals": 0
603
+ },
604
+ "overrides": [
605
+ {
606
+ "matcher": {
607
+ "id": "byRegexp",
608
+ "options": ".* - failed"
609
+ },
610
+ "properties": [
611
+ {
612
+ "id": "color",
613
+ "value": {
614
+ "fixedColor": "red",
615
+ "mode": "fixed"
616
+ }
617
+ }
618
+ ]
619
+ },
620
+ {
621
+ "matcher": {
622
+ "id": "byRegexp",
623
+ "options": ".* - completed"
624
+ },
625
+ "properties": [
626
+ {
627
+ "id": "color",
628
+ "value": {
629
+ "fixedColor": "green",
630
+ "mode": "fixed"
631
+ }
632
+ }
633
+ ]
634
+ },
635
+ {
636
+ "matcher": {
637
+ "id": "byRegexp",
638
+ "options": ".* - processing"
639
+ },
640
+ "properties": [
641
+ {
642
+ "id": "color",
643
+ "value": {
644
+ "fixedColor": "blue",
645
+ "mode": "fixed"
646
+ }
647
+ }
648
+ ]
649
+ },
650
+ {
651
+ "matcher": {
652
+ "id": "byRegexp",
653
+ "options": ".* - pending"
654
+ },
655
+ "properties": [
656
+ {
657
+ "id": "color",
658
+ "value": {
659
+ "fixedColor": "orange",
660
+ "mode": "fixed"
661
+ }
662
+ }
663
+ ]
664
+ }
665
+ ]
666
+ },
667
+ "targets": [
668
+ {
669
+ "refId": "A",
670
+ "expr": "sum(reactive_tasks_queue_depth) by (task_name, status)",
671
+ "legendFormat": "{{task_name}} - {{status}}"
672
+ }
673
+ ]
674
+ },
675
+ {
676
+ "datasource": {
677
+ "type": "prometheus",
678
+ "uid": "prometheus"
679
+ },
680
+ "gridPos": {
681
+ "h": 8,
682
+ "w": 12,
683
+ "x": 12,
684
+ "y": 26
685
+ },
686
+ "id": 8,
687
+ "type": "table",
688
+ "title": "Top Lagging Tasks",
689
+ "targets": [
690
+ {
691
+ "datasource": {
692
+ "type": "prometheus",
693
+ "uid": "prometheus"
694
+ },
695
+ "editorMode": "code",
696
+ "expr": "topk(10, reactive_tasks_global_lag_seconds)",
697
+ "legendFormat": "{{task_name}}",
698
+ "range": true,
699
+ "format": "table",
700
+ "instant": true,
701
+ "refId": "A"
702
+ }
703
+ ],
704
+ "transformations": [
705
+ {
706
+ "id": "organize",
707
+ "options": {
708
+ "excludeByName": {
709
+ "Time": true
710
+ },
711
+ "renameByName": {
712
+ "Value": "Lag (seconds)"
713
+ }
714
+ }
715
+ }
716
+ ],
717
+ "fieldConfig": {
718
+ "defaults": {
719
+ "unit": "s",
720
+ "custom": {
721
+ "align": "auto",
722
+ "displayMode": "color-background-solid"
723
+ },
724
+ "thresholds": {
725
+ "mode": "absolute",
726
+ "steps": [
727
+ {
728
+ "color": "green",
729
+ "value": null
730
+ },
731
+ {
732
+ "color": "yellow",
733
+ "value": 10
734
+ },
735
+ {
736
+ "color": "red",
737
+ "value": 60
738
+ }
739
+ ]
740
+ }
741
+ }
742
+ }
743
+ }
744
+ ],
745
+ "refresh": "5s",
746
+ "schemaVersion": 38,
747
+ "style": "dark",
748
+ "tags": [
749
+ "mongodash",
750
+ "reactive-tasks"
751
+ ],
752
+ "templating": {
753
+ "list": []
754
+ },
755
+ "time": {
756
+ "from": "now-15m",
757
+ "to": "now"
758
+ },
759
+ "timepicker": {},
760
+ "timezone": "",
761
+ "title": "Reactive Tasks - System Overview",
762
+ "uid": "reactive-tasks-overview",
763
+ "version": 2,
764
+ "weekStart": ""
765
+ }