ponder 0.14.13 → 0.15.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 (237) hide show
  1. package/CHANGELOG.md +16 -0
  2. package/dist/esm/bin/commands/createViews.js +28 -11
  3. package/dist/esm/bin/commands/createViews.js.map +1 -1
  4. package/dist/esm/bin/commands/dev.js +42 -22
  5. package/dist/esm/bin/commands/dev.js.map +1 -1
  6. package/dist/esm/bin/commands/prune.js +3 -0
  7. package/dist/esm/bin/commands/prune.js.map +1 -1
  8. package/dist/esm/bin/commands/serve.js +4 -1
  9. package/dist/esm/bin/commands/serve.js.map +1 -1
  10. package/dist/esm/bin/commands/start.js +18 -6
  11. package/dist/esm/bin/commands/start.js.map +1 -1
  12. package/dist/esm/bin/isolatedController.js +200 -0
  13. package/dist/esm/bin/isolatedController.js.map +1 -0
  14. package/dist/esm/bin/isolatedWorker.js +146 -0
  15. package/dist/esm/bin/isolatedWorker.js.map +1 -0
  16. package/dist/esm/build/config.js +322 -402
  17. package/dist/esm/build/config.js.map +1 -1
  18. package/dist/esm/build/index.js +8 -11
  19. package/dist/esm/build/index.js.map +1 -1
  20. package/dist/esm/build/pre.js +1 -4
  21. package/dist/esm/build/pre.js.map +1 -1
  22. package/dist/esm/build/schema.js +25 -3
  23. package/dist/esm/build/schema.js.map +1 -1
  24. package/dist/esm/client/index.js +306 -42
  25. package/dist/esm/client/index.js.map +1 -1
  26. package/dist/esm/database/actions.js +264 -104
  27. package/dist/esm/database/actions.js.map +1 -1
  28. package/dist/esm/database/index.js +39 -33
  29. package/dist/esm/database/index.js.map +1 -1
  30. package/dist/esm/database/queryBuilder.js +1 -0
  31. package/dist/esm/database/queryBuilder.js.map +1 -1
  32. package/dist/esm/drizzle/index.js +11 -7
  33. package/dist/esm/drizzle/index.js.map +1 -1
  34. package/dist/esm/drizzle/onchain.js +18 -0
  35. package/dist/esm/drizzle/onchain.js.map +1 -1
  36. package/dist/esm/indexing/client.js +32 -25
  37. package/dist/esm/indexing/client.js.map +1 -1
  38. package/dist/esm/indexing/index.js +110 -178
  39. package/dist/esm/indexing/index.js.map +1 -1
  40. package/dist/esm/indexing/profile.js +1 -1
  41. package/dist/esm/indexing/profile.js.map +1 -1
  42. package/dist/esm/indexing-store/cache.js +196 -274
  43. package/dist/esm/indexing-store/cache.js.map +1 -1
  44. package/dist/esm/indexing-store/historical.js +17 -13
  45. package/dist/esm/indexing-store/historical.js.map +1 -1
  46. package/dist/esm/indexing-store/index.js +10 -1
  47. package/dist/esm/indexing-store/index.js.map +1 -1
  48. package/dist/esm/indexing-store/profile.js +3 -3
  49. package/dist/esm/indexing-store/profile.js.map +1 -1
  50. package/dist/esm/indexing-store/realtime.js +27 -2
  51. package/dist/esm/indexing-store/realtime.js.map +1 -1
  52. package/dist/esm/internal/errors.js +28 -0
  53. package/dist/esm/internal/errors.js.map +1 -1
  54. package/dist/esm/internal/metrics.js +279 -82
  55. package/dist/esm/internal/metrics.js.map +1 -1
  56. package/dist/esm/internal/options.js +1 -0
  57. package/dist/esm/internal/options.js.map +1 -1
  58. package/dist/esm/internal/telemetry.js +1 -1
  59. package/dist/esm/internal/telemetry.js.map +1 -1
  60. package/dist/esm/rpc/http.js +130 -0
  61. package/dist/esm/rpc/http.js.map +1 -0
  62. package/dist/esm/rpc/index.js +38 -7
  63. package/dist/esm/rpc/index.js.map +1 -1
  64. package/dist/esm/runtime/events.js +179 -212
  65. package/dist/esm/runtime/events.js.map +1 -1
  66. package/dist/esm/runtime/filter.js +71 -0
  67. package/dist/esm/runtime/filter.js.map +1 -1
  68. package/dist/esm/runtime/fragments.js +78 -73
  69. package/dist/esm/runtime/fragments.js.map +1 -1
  70. package/dist/esm/runtime/historical.js +306 -130
  71. package/dist/esm/runtime/historical.js.map +1 -1
  72. package/dist/esm/runtime/index.js +183 -58
  73. package/dist/esm/runtime/index.js.map +1 -1
  74. package/dist/esm/runtime/isolated.js +462 -0
  75. package/dist/esm/runtime/isolated.js.map +1 -0
  76. package/dist/esm/runtime/multichain.js +80 -73
  77. package/dist/esm/runtime/multichain.js.map +1 -1
  78. package/dist/esm/runtime/omnichain.js +82 -75
  79. package/dist/esm/runtime/omnichain.js.map +1 -1
  80. package/dist/esm/runtime/realtime.js +198 -66
  81. package/dist/esm/runtime/realtime.js.map +1 -1
  82. package/dist/esm/sync-historical/index.js +416 -457
  83. package/dist/esm/sync-historical/index.js.map +1 -1
  84. package/dist/esm/sync-realtime/bloom.js +3 -3
  85. package/dist/esm/sync-realtime/bloom.js.map +1 -1
  86. package/dist/esm/sync-realtime/index.js +27 -46
  87. package/dist/esm/sync-realtime/index.js.map +1 -1
  88. package/dist/esm/sync-store/index.js +112 -63
  89. package/dist/esm/sync-store/index.js.map +1 -1
  90. package/dist/esm/utils/abi.js +20 -32
  91. package/dist/esm/utils/abi.js.map +1 -1
  92. package/dist/esm/utils/chunk.js +8 -0
  93. package/dist/esm/utils/chunk.js.map +1 -0
  94. package/dist/esm/utils/promiseAllSettledWithThrow.js +19 -0
  95. package/dist/esm/utils/promiseAllSettledWithThrow.js.map +1 -0
  96. package/dist/esm/{client/parse.js → utils/sql-parse.js} +94 -80
  97. package/dist/esm/utils/sql-parse.js.map +1 -0
  98. package/dist/types/bin/commands/createViews.d.ts.map +1 -1
  99. package/dist/types/bin/commands/dev.d.ts.map +1 -1
  100. package/dist/types/bin/commands/prune.d.ts.map +1 -1
  101. package/dist/types/bin/commands/serve.d.ts.map +1 -1
  102. package/dist/types/bin/commands/start.d.ts.map +1 -1
  103. package/dist/types/bin/isolatedController.d.ts +13 -0
  104. package/dist/types/bin/isolatedController.d.ts.map +1 -0
  105. package/dist/types/bin/isolatedWorker.d.ts +9 -0
  106. package/dist/types/bin/isolatedWorker.d.ts.map +1 -0
  107. package/dist/types/build/config.d.ts +29 -11
  108. package/dist/types/build/config.d.ts.map +1 -1
  109. package/dist/types/build/index.d.ts +3 -2
  110. package/dist/types/build/index.d.ts.map +1 -1
  111. package/dist/types/build/pre.d.ts +1 -1
  112. package/dist/types/build/pre.d.ts.map +1 -1
  113. package/dist/types/build/schema.d.ts +5 -3
  114. package/dist/types/build/schema.d.ts.map +1 -1
  115. package/dist/types/client/index.d.ts +1 -1
  116. package/dist/types/client/index.d.ts.map +1 -1
  117. package/dist/types/config/index.d.ts +3 -3
  118. package/dist/types/config/index.d.ts.map +1 -1
  119. package/dist/types/database/actions.d.ts +53 -7
  120. package/dist/types/database/actions.d.ts.map +1 -1
  121. package/dist/types/database/index.d.ts +21 -21
  122. package/dist/types/database/index.d.ts.map +1 -1
  123. package/dist/types/database/queryBuilder.d.ts.map +1 -1
  124. package/dist/types/drizzle/index.d.ts +4 -5
  125. package/dist/types/drizzle/index.d.ts.map +1 -1
  126. package/dist/types/drizzle/onchain.d.ts +6 -0
  127. package/dist/types/drizzle/onchain.d.ts.map +1 -1
  128. package/dist/types/indexing/client.d.ts.map +1 -1
  129. package/dist/types/indexing/index.d.ts +2 -5
  130. package/dist/types/indexing/index.d.ts.map +1 -1
  131. package/dist/types/indexing-store/cache.d.ts +3 -2
  132. package/dist/types/indexing-store/cache.d.ts.map +1 -1
  133. package/dist/types/indexing-store/historical.d.ts +2 -1
  134. package/dist/types/indexing-store/historical.d.ts.map +1 -1
  135. package/dist/types/indexing-store/index.d.ts +1 -0
  136. package/dist/types/indexing-store/index.d.ts.map +1 -1
  137. package/dist/types/indexing-store/realtime.d.ts +2 -1
  138. package/dist/types/indexing-store/realtime.d.ts.map +1 -1
  139. package/dist/types/internal/errors.d.ts +5 -0
  140. package/dist/types/internal/errors.d.ts.map +1 -1
  141. package/dist/types/internal/metrics.d.ts +21 -0
  142. package/dist/types/internal/metrics.d.ts.map +1 -1
  143. package/dist/types/internal/options.d.ts +2 -0
  144. package/dist/types/internal/options.d.ts.map +1 -1
  145. package/dist/types/internal/types.d.ts +66 -58
  146. package/dist/types/internal/types.d.ts.map +1 -1
  147. package/dist/types/rpc/http.d.ts +17 -0
  148. package/dist/types/rpc/http.d.ts.map +1 -0
  149. package/dist/types/rpc/index.d.ts.map +1 -1
  150. package/dist/types/runtime/events.d.ts +4 -4
  151. package/dist/types/runtime/events.d.ts.map +1 -1
  152. package/dist/types/runtime/filter.d.ts +5 -1
  153. package/dist/types/runtime/filter.d.ts.map +1 -1
  154. package/dist/types/runtime/fragments.d.ts +4 -3
  155. package/dist/types/runtime/fragments.d.ts.map +1 -1
  156. package/dist/types/runtime/historical.d.ts +29 -13
  157. package/dist/types/runtime/historical.d.ts.map +1 -1
  158. package/dist/types/runtime/index.d.ts +49 -6
  159. package/dist/types/runtime/index.d.ts.map +1 -1
  160. package/dist/types/runtime/init.d.ts +5 -5
  161. package/dist/types/runtime/init.d.ts.map +1 -1
  162. package/dist/types/runtime/isolated.d.ts +14 -0
  163. package/dist/types/runtime/isolated.d.ts.map +1 -0
  164. package/dist/types/runtime/multichain.d.ts.map +1 -1
  165. package/dist/types/runtime/omnichain.d.ts.map +1 -1
  166. package/dist/types/runtime/realtime.d.ts +21 -10
  167. package/dist/types/runtime/realtime.d.ts.map +1 -1
  168. package/dist/types/sync-historical/index.d.ts +18 -8
  169. package/dist/types/sync-historical/index.d.ts.map +1 -1
  170. package/dist/types/sync-realtime/bloom.d.ts.map +1 -1
  171. package/dist/types/sync-realtime/index.d.ts +2 -2
  172. package/dist/types/sync-realtime/index.d.ts.map +1 -1
  173. package/dist/types/sync-store/index.d.ts +9 -9
  174. package/dist/types/sync-store/index.d.ts.map +1 -1
  175. package/dist/types/utils/abi.d.ts +3 -34
  176. package/dist/types/utils/abi.d.ts.map +1 -1
  177. package/dist/types/utils/chunk.d.ts +2 -0
  178. package/dist/types/utils/chunk.d.ts.map +1 -0
  179. package/dist/types/utils/promiseAllSettledWithThrow.d.ts +8 -0
  180. package/dist/types/utils/promiseAllSettledWithThrow.d.ts.map +1 -0
  181. package/dist/types/utils/sql-parse.d.ts +21 -0
  182. package/dist/types/utils/sql-parse.d.ts.map +1 -0
  183. package/package.json +2 -2
  184. package/src/bin/commands/createViews.ts +35 -15
  185. package/src/bin/commands/dev.ts +43 -21
  186. package/src/bin/commands/prune.ts +6 -0
  187. package/src/bin/commands/serve.ts +4 -1
  188. package/src/bin/commands/start.ts +20 -5
  189. package/src/bin/isolatedController.ts +300 -0
  190. package/src/bin/isolatedWorker.ts +192 -0
  191. package/src/build/config.ts +570 -632
  192. package/src/build/index.ts +14 -14
  193. package/src/build/pre.ts +1 -4
  194. package/src/build/schema.ts +49 -4
  195. package/src/client/index.ts +386 -48
  196. package/src/config/index.ts +3 -3
  197. package/src/database/actions.ts +469 -120
  198. package/src/database/index.ts +85 -58
  199. package/src/database/queryBuilder.ts +1 -0
  200. package/src/drizzle/index.ts +15 -7
  201. package/src/drizzle/onchain.ts +19 -0
  202. package/src/indexing/client.ts +38 -25
  203. package/src/indexing/index.ts +137 -230
  204. package/src/indexing/profile.ts +1 -1
  205. package/src/indexing-store/cache.ts +285 -414
  206. package/src/indexing-store/historical.ts +20 -10
  207. package/src/indexing-store/index.ts +16 -0
  208. package/src/indexing-store/profile.ts +3 -3
  209. package/src/indexing-store/realtime.ts +28 -0
  210. package/src/internal/errors.ts +26 -0
  211. package/src/internal/metrics.ts +341 -111
  212. package/src/internal/options.ts +4 -0
  213. package/src/internal/telemetry.ts +1 -1
  214. package/src/internal/types.ts +70 -87
  215. package/src/rpc/http.ts +164 -0
  216. package/src/rpc/index.ts +39 -7
  217. package/src/runtime/events.ts +195 -240
  218. package/src/runtime/filter.ts +85 -1
  219. package/src/runtime/fragments.ts +109 -113
  220. package/src/runtime/historical.ts +467 -189
  221. package/src/runtime/index.ts +337 -69
  222. package/src/runtime/init.ts +5 -5
  223. package/src/runtime/isolated.ts +768 -0
  224. package/src/runtime/multichain.ts +137 -102
  225. package/src/runtime/omnichain.ts +138 -106
  226. package/src/runtime/realtime.ts +322 -123
  227. package/src/sync-historical/index.ts +556 -692
  228. package/src/sync-realtime/bloom.ts +7 -3
  229. package/src/sync-realtime/index.ts +31 -46
  230. package/src/sync-store/index.ts +189 -95
  231. package/src/utils/abi.ts +33 -90
  232. package/src/utils/chunk.ts +7 -0
  233. package/src/utils/promiseAllSettledWithThrow.ts +27 -0
  234. package/src/{client/parse.ts → utils/sql-parse.ts} +100 -90
  235. package/dist/esm/client/parse.js.map +0 -1
  236. package/dist/types/client/parse.d.ts +0 -14
  237. package/dist/types/client/parse.d.ts.map +0 -1
@@ -1,3 +1,5 @@
1
+ import { parentPort } from "node:worker_threads";
2
+ import { promiseWithResolvers, } from '../utils/promiseWithResolvers.js';
1
3
  import { truncate } from '../utils/truncate.js';
2
4
  import { getTableName, isTable } from "drizzle-orm";
3
5
  import prometheus from "prom-client";
@@ -12,6 +14,8 @@ const httpRequestSizeBytes = [
12
14
  10, 100, 1000, 5000, 10000, 50000, 100000, 500000, 1000000, 5000000,
13
15
  10000000,
14
16
  ];
17
+ const GET_METRICS_REQ = "prom-client:getMetricsReq";
18
+ const GET_METRICS_RES = "prom-client:getMetricsRes";
15
19
  export class MetricsService {
16
20
  constructor() {
17
21
  Object.defineProperty(this, "registry", {
@@ -314,72 +318,84 @@ export class MetricsService {
314
318
  help: "Ponder version information",
315
319
  labelNames: ["version", "major", "minor", "patch"],
316
320
  registers: [this.registry],
321
+ aggregator: "first",
317
322
  });
318
323
  this.ponder_settings_info = new prometheus.Gauge({
319
324
  name: "ponder_settings_info",
320
325
  help: "Ponder settings information",
321
326
  labelNames: ["ordering", "database", "command"],
322
327
  registers: [this.registry],
328
+ aggregator: "first",
323
329
  });
324
330
  this.ponder_historical_concurrency_group_duration = new prometheus.Gauge({
325
331
  name: "ponder_historical_concurrency_group_duration",
326
332
  help: "Duration of historical concurrency groups",
327
333
  labelNames: ["group"],
328
334
  registers: [this.registry],
335
+ aggregator: "sum",
329
336
  });
330
337
  this.ponder_historical_extract_duration = new prometheus.Gauge({
331
338
  name: "ponder_historical_extract_duration",
332
339
  help: "Duration of historical extract phase",
333
340
  labelNames: ["step"],
334
341
  registers: [this.registry],
342
+ aggregator: "sum",
335
343
  });
336
344
  this.ponder_historical_transform_duration = new prometheus.Gauge({
337
345
  name: "ponder_historical_transform_duration",
338
346
  help: "Duration of historical transform phase",
339
347
  labelNames: ["step"],
340
348
  registers: [this.registry],
349
+ aggregator: "sum",
341
350
  });
342
351
  this.ponder_historical_start_timestamp_seconds = new prometheus.Gauge({
343
352
  name: "ponder_historical_start_timestamp_seconds",
344
353
  help: "Timestamp at which historical indexing started",
345
354
  labelNames: ["chain"],
346
355
  registers: [this.registry],
356
+ aggregator: "min",
347
357
  });
348
358
  this.ponder_historical_end_timestamp_seconds = new prometheus.Gauge({
349
359
  name: "ponder_historical_end_timestamp_seconds",
350
360
  help: "Timestamp at which historical indexing ended",
351
361
  labelNames: ["chain"],
352
362
  registers: [this.registry],
363
+ aggregator: "max",
353
364
  });
354
365
  this.ponder_historical_total_indexing_seconds = new prometheus.Gauge({
355
366
  name: "ponder_historical_total_indexing_seconds",
356
367
  help: "Total number of seconds that are required",
357
368
  labelNames: ["chain"],
358
369
  registers: [this.registry],
370
+ aggregator: "sum",
359
371
  });
360
372
  this.ponder_historical_cached_indexing_seconds = new prometheus.Gauge({
361
373
  name: "ponder_historical_cached_indexing_seconds",
362
374
  help: "Number of seconds that have been cached",
363
375
  labelNames: ["chain"],
364
376
  registers: [this.registry],
377
+ aggregator: "sum",
365
378
  });
366
379
  this.ponder_historical_completed_indexing_seconds = new prometheus.Gauge({
367
380
  name: "ponder_historical_completed_indexing_seconds",
368
381
  help: "Number of seconds that have been completed",
369
382
  labelNames: ["chain"],
370
383
  registers: [this.registry],
384
+ aggregator: "sum",
371
385
  });
372
386
  this.ponder_indexing_completed_events = new prometheus.Gauge({
373
387
  name: "ponder_indexing_completed_events",
374
388
  help: "Number of events that have been processed",
375
389
  labelNames: ["chain", "event"],
376
390
  registers: [this.registry],
391
+ aggregator: "sum",
377
392
  });
378
393
  this.ponder_indexing_timestamp = new prometheus.Gauge({
379
394
  name: "ponder_indexing_timestamp",
380
395
  help: "Timestamp through which all events have been completed",
381
396
  labelNames: ["chain"],
382
397
  registers: [this.registry],
398
+ aggregator: "first",
383
399
  });
384
400
  this.ponder_indexing_function_duration = new prometheus.Histogram({
385
401
  name: "ponder_indexing_function_duration",
@@ -387,6 +403,7 @@ export class MetricsService {
387
403
  labelNames: ["chain", "event"],
388
404
  buckets: sometimesIODurationMs,
389
405
  registers: [this.registry],
406
+ aggregator: "sum",
390
407
  });
391
408
  this.ponder_indexing_cache_query_duration = new prometheus.Histogram({
392
409
  name: "ponder_indexing_cache_query_duration",
@@ -394,6 +411,7 @@ export class MetricsService {
394
411
  labelNames: ["table", "method"],
395
412
  buckets: alwaysIODurationMs,
396
413
  registers: [this.registry],
414
+ aggregator: "sum",
397
415
  });
398
416
  this.ponder_indexing_rpc_action_duration = new prometheus.Histogram({
399
417
  name: "ponder_indexing_rpc_action_duration",
@@ -401,84 +419,98 @@ export class MetricsService {
401
419
  labelNames: ["action"],
402
420
  buckets: sometimesIODurationMs,
403
421
  registers: [this.registry],
422
+ aggregator: "sum",
404
423
  });
405
424
  this.ponder_indexing_rpc_prefetch_total = new prometheus.Counter({
406
425
  name: "ponder_indexing_rpc_prefetch_total",
407
426
  help: "Number of RPC prefetches",
408
427
  labelNames: ["chain", "method", "type"],
409
428
  registers: [this.registry],
429
+ aggregator: "sum",
410
430
  });
411
431
  this.ponder_indexing_rpc_requests_total = new prometheus.Counter({
412
432
  name: "ponder_indexing_rpc_requests_total",
413
433
  help: "Number of RPC requests",
414
434
  labelNames: ["chain", "method", "type"],
415
435
  registers: [this.registry],
436
+ aggregator: "sum",
416
437
  });
417
438
  this.ponder_indexing_cache_requests_total = new prometheus.Counter({
418
439
  name: "ponder_indexing_cache_requests_total",
419
440
  help: "Number of cache accesses",
420
441
  labelNames: ["table", "type"],
421
442
  registers: [this.registry],
443
+ aggregator: "sum",
422
444
  });
423
445
  this.ponder_indexing_store_queries_total = new prometheus.Counter({
424
446
  name: "ponder_indexing_store_queries_total",
425
447
  help: "Number of indexing store operations",
426
448
  labelNames: ["table", "method"],
427
449
  registers: [this.registry],
450
+ aggregator: "sum",
428
451
  });
429
452
  this.ponder_indexing_store_raw_sql_duration = new prometheus.Histogram({
430
453
  name: "ponder_indexing_store_raw_sql_duration",
431
454
  help: "Duration of raw SQL store operations",
432
455
  buckets: alwaysIODurationMs,
433
456
  registers: [this.registry],
457
+ aggregator: "sum",
434
458
  });
435
459
  this.ponder_sync_block = new prometheus.Gauge({
436
460
  name: "ponder_sync_block",
437
461
  help: "Closest-to-tip synced block number",
438
462
  labelNames: ["chain"],
439
463
  registers: [this.registry],
464
+ aggregator: "max",
440
465
  });
441
466
  this.ponder_sync_block_timestamp = new prometheus.Gauge({
442
467
  name: "ponder_sync_block_timestamp",
443
468
  help: "Closest-to-tip synced block timestamp",
444
469
  labelNames: ["chain"],
445
470
  registers: [this.registry],
471
+ aggregator: "max",
446
472
  });
447
473
  this.ponder_sync_is_realtime = new prometheus.Gauge({
448
474
  name: "ponder_sync_is_realtime",
449
475
  help: "Boolean (0 or 1) indicating if the sync is realtime mode",
450
476
  labelNames: ["chain"],
451
477
  registers: [this.registry],
478
+ aggregator: "max",
452
479
  });
453
480
  this.ponder_sync_is_complete = new prometheus.Gauge({
454
481
  name: "ponder_sync_is_complete",
455
482
  help: "Boolean (0 or 1) indicating if the sync has synced all blocks",
456
483
  labelNames: ["chain"],
457
484
  registers: [this.registry],
485
+ aggregator: "max",
458
486
  });
459
487
  this.ponder_historical_total_blocks = new prometheus.Gauge({
460
488
  name: "ponder_historical_total_blocks",
461
489
  help: "Number of blocks required for the historical sync",
462
490
  labelNames: ["chain"],
463
491
  registers: [this.registry],
492
+ aggregator: "max",
464
493
  });
465
494
  this.ponder_historical_cached_blocks = new prometheus.Gauge({
466
495
  name: "ponder_historical_cached_blocks",
467
496
  help: "Number of blocks that were found in the cache for the historical sync",
468
497
  labelNames: ["chain"],
469
498
  registers: [this.registry],
499
+ aggregator: "max",
470
500
  });
471
501
  this.ponder_historical_completed_blocks = new prometheus.Gauge({
472
502
  name: "ponder_historical_completed_blocks",
473
503
  help: "Number of blocks that have been processed for the historical sync",
474
504
  labelNames: ["chain", "source", "type"],
475
505
  registers: [this.registry],
506
+ aggregator: "max",
476
507
  });
477
508
  this.ponder_realtime_reorg_total = new prometheus.Counter({
478
509
  name: "ponder_realtime_reorg_total",
479
510
  help: "Count of how many re-orgs have occurred",
480
511
  labelNames: ["chain"],
481
512
  registers: [this.registry],
513
+ aggregator: "sum",
482
514
  });
483
515
  this.ponder_realtime_latency = new prometheus.Histogram({
484
516
  name: "ponder_realtime_latency",
@@ -489,6 +521,7 @@ export class MetricsService {
489
521
  1000000,
490
522
  ],
491
523
  registers: [this.registry],
524
+ aggregator: "sum",
492
525
  });
493
526
  this.ponder_realtime_block_arrival_latency = new prometheus.Histogram({
494
527
  name: "ponder_realtime_block_arrival_latency",
@@ -499,6 +532,7 @@ export class MetricsService {
499
532
  1000000,
500
533
  ],
501
534
  registers: [this.registry],
535
+ aggregator: "sum",
502
536
  });
503
537
  this.ponder_database_method_duration = new prometheus.Histogram({
504
538
  name: "ponder_database_method_duration",
@@ -506,18 +540,21 @@ export class MetricsService {
506
540
  labelNames: ["service", "method"],
507
541
  buckets: alwaysIODurationMs,
508
542
  registers: [this.registry],
543
+ aggregator: "sum",
509
544
  });
510
545
  this.ponder_database_method_error_total = new prometheus.Counter({
511
546
  name: "ponder_database_method_error_total",
512
547
  help: "Total number of errors encountered during database operations",
513
548
  labelNames: ["service", "method"],
514
549
  registers: [this.registry],
550
+ aggregator: "sum",
515
551
  });
516
552
  this.ponder_http_server_active_requests = new prometheus.Gauge({
517
553
  name: "ponder_http_server_active_requests",
518
554
  help: "Number of active HTTP server requests",
519
555
  labelNames: ["method", "path"],
520
556
  registers: [this.registry],
557
+ aggregator: "sum",
521
558
  });
522
559
  this.ponder_http_server_request_duration_ms = new prometheus.Histogram({
523
560
  name: "ponder_http_server_request_duration_ms",
@@ -525,6 +562,7 @@ export class MetricsService {
525
562
  labelNames: ["method", "path", "status"],
526
563
  buckets: alwaysIODurationMs,
527
564
  registers: [this.registry],
565
+ aggregator: "sum",
528
566
  });
529
567
  this.ponder_http_server_request_size_bytes = new prometheus.Histogram({
530
568
  name: "ponder_http_server_request_size_bytes",
@@ -532,6 +570,7 @@ export class MetricsService {
532
570
  labelNames: ["method", "path", "status"],
533
571
  buckets: httpRequestSizeBytes,
534
572
  registers: [this.registry],
573
+ aggregator: "sum",
535
574
  });
536
575
  this.ponder_http_server_response_size_bytes = new prometheus.Histogram({
537
576
  name: "ponder_http_server_response_size_bytes",
@@ -539,6 +578,7 @@ export class MetricsService {
539
578
  labelNames: ["method", "path", "status"],
540
579
  buckets: httpRequestSizeBytes,
541
580
  registers: [this.registry],
581
+ aggregator: "sum",
542
582
  });
543
583
  this.ponder_rpc_request_duration = new prometheus.Histogram({
544
584
  name: "ponder_rpc_request_duration",
@@ -546,18 +586,21 @@ export class MetricsService {
546
586
  labelNames: ["chain", "method"],
547
587
  buckets: alwaysIODurationMs,
548
588
  registers: [this.registry],
589
+ aggregator: "sum",
549
590
  });
550
591
  this.ponder_rpc_request_error_total = new prometheus.Counter({
551
592
  name: "ponder_rpc_request_error_total",
552
593
  help: "Total count of failed RPC requests",
553
594
  labelNames: ["chain", "method"],
554
595
  registers: [this.registry],
596
+ aggregator: "sum",
555
597
  });
556
598
  this.ponder_postgres_query_total = new prometheus.Counter({
557
599
  name: "ponder_postgres_query_total",
558
600
  help: "Total number of queries submitted to the database",
559
601
  labelNames: ["pool"],
560
602
  registers: [this.registry],
603
+ aggregator: "sum",
561
604
  });
562
605
  prometheus.collectDefaultMetrics({
563
606
  register: this.registry,
@@ -569,13 +612,16 @@ export class MetricsService {
569
612
  * Get string representation for all metrics.
570
613
  * @returns Metrics encoded using Prometheus v0.0.4 format.
571
614
  */
572
- async getMetrics() {
573
- return await this.registry.metrics();
615
+ getMetrics() {
616
+ return this.registry.metrics();
617
+ }
618
+ async getRegistry() {
619
+ return this.registry;
574
620
  }
575
621
  initializeIndexingMetrics({ indexingBuild, schemaBuild, }) {
576
622
  const tables = Object.values(schemaBuild.schema).filter(isTable);
577
- for (const event of Object.keys(indexingBuild.indexingFunctions)) {
578
- this.ponder_indexing_completed_events.inc({ event }, 0);
623
+ for (const { name: eventName } of indexingBuild.indexingFunctions) {
624
+ this.ponder_indexing_completed_events.inc({ event: eventName }, 0);
579
625
  }
580
626
  for (const table of tables) {
581
627
  for (const type of ["complete", "hit", "miss"]) {
@@ -634,6 +680,143 @@ export class MetricsService {
634
680
  this.ponder_http_server_response_size_bytes.reset();
635
681
  }
636
682
  }
683
+ export class AggregateMetricsService extends MetricsService {
684
+ constructor(mainThreadMetrics, workers) {
685
+ super();
686
+ Object.defineProperty(this, "workers", {
687
+ enumerable: true,
688
+ configurable: true,
689
+ writable: true,
690
+ value: void 0
691
+ });
692
+ Object.defineProperty(this, "requests", {
693
+ enumerable: true,
694
+ configurable: true,
695
+ writable: true,
696
+ value: void 0
697
+ });
698
+ Object.defineProperty(this, "requestId", {
699
+ enumerable: true,
700
+ configurable: true,
701
+ writable: true,
702
+ value: void 0
703
+ });
704
+ Object.defineProperty(this, "mainThreadMetrics", {
705
+ enumerable: true,
706
+ configurable: true,
707
+ writable: true,
708
+ value: void 0
709
+ });
710
+ this.mainThreadMetrics = mainThreadMetrics;
711
+ this.workers = workers;
712
+ this.requests = new Map();
713
+ this.requestId = 0;
714
+ for (const worker of workers) {
715
+ worker.on("message", (message) => {
716
+ if (message.type === GET_METRICS_RES) {
717
+ const request = this.requests.get(message.requestId);
718
+ if (request === undefined)
719
+ return;
720
+ if (message.error) {
721
+ request.pwr.reject(new Error(message.error));
722
+ return;
723
+ }
724
+ request.responses.push(message.metrics);
725
+ request.workerIds.push(worker.threadId);
726
+ request.pending--;
727
+ if (request.pending === 0) {
728
+ request.pwr.resolve();
729
+ }
730
+ }
731
+ });
732
+ }
733
+ }
734
+ async getMetrics() {
735
+ const requestId = this.requestId++;
736
+ const pwr = promiseWithResolvers();
737
+ this.requests.set(requestId, {
738
+ responses: [],
739
+ workerIds: [],
740
+ pending: this.workers.length,
741
+ pwr,
742
+ });
743
+ for (const worker of this.workers) {
744
+ worker.postMessage({
745
+ type: GET_METRICS_REQ,
746
+ requestId,
747
+ });
748
+ }
749
+ await pwr.promise;
750
+ const request = this.requests.get(requestId);
751
+ this.requests.delete(requestId);
752
+ // Sort response by worker id for consistent metrics
753
+ const responseIndexSort = new Array(this.workers.length)
754
+ .fill(0)
755
+ .map((_, index) => index)
756
+ .sort((a, b) => request.workerIds[a] - request.workerIds[b]);
757
+ return prometheus.AggregatorRegistry.aggregate([
758
+ ...responseIndexSort.map((index) => request.responses[index]),
759
+ await this.registry.getMetricsAsJSON(),
760
+ await this.mainThreadMetrics.registry.getMetricsAsJSON(),
761
+ ]).metrics();
762
+ }
763
+ async getRegistry() {
764
+ const requestId = this.requestId++;
765
+ const pwr = promiseWithResolvers();
766
+ this.requests.set(requestId, {
767
+ responses: [],
768
+ workerIds: [],
769
+ pending: this.workers.length,
770
+ pwr,
771
+ });
772
+ for (const worker of this.workers) {
773
+ worker.postMessage({
774
+ type: GET_METRICS_REQ,
775
+ requestId,
776
+ });
777
+ }
778
+ await pwr.promise;
779
+ const request = this.requests.get(requestId);
780
+ this.requests.delete(requestId);
781
+ // Sort response by worker id for consistent metrics
782
+ const responseIndexSort = new Array(this.workers.length)
783
+ .fill(0)
784
+ .map((_, index) => index)
785
+ .sort((a, b) => request.workerIds[a] - request.workerIds[b]);
786
+ return prometheus.AggregatorRegistry.aggregate([
787
+ ...responseIndexSort.map((index) => request.responses[index]),
788
+ await this.registry.getMetricsAsJSON(),
789
+ await this.mainThreadMetrics.registry.getMetricsAsJSON(),
790
+ ]);
791
+ }
792
+ }
793
+ export class IsolatedMetricsService extends MetricsService {
794
+ constructor() {
795
+ super();
796
+ if (parentPort) {
797
+ parentPort.on("message", (message) => {
798
+ if (message.type === GET_METRICS_REQ) {
799
+ this.registry
800
+ .getMetricsAsJSON()
801
+ .then((metrics) => {
802
+ parentPort.postMessage({
803
+ type: GET_METRICS_RES,
804
+ requestId: message.requestId,
805
+ metrics,
806
+ });
807
+ })
808
+ .catch((error) => {
809
+ parentPort.postMessage({
810
+ type: GET_METRICS_RES,
811
+ requestId: message.requestId,
812
+ error: error.message,
813
+ });
814
+ });
815
+ }
816
+ });
817
+ }
818
+ }
819
+ }
637
820
  const extractMetric = (metric, chain) => {
638
821
  return metric.values.find((m) => m.labels.chain === chain)?.value;
639
822
  };
@@ -714,92 +897,106 @@ export async function getIndexingProgress(metrics) {
714
897
  };
715
898
  }
716
899
  export async function getAppProgress(metrics) {
717
- const totalSecondsMetric = await metrics.ponder_historical_total_indexing_seconds.get();
718
- const cachedSecondsMetric = await metrics.ponder_historical_cached_indexing_seconds.get();
719
- const completedSecondsMetric = await metrics.ponder_historical_completed_indexing_seconds.get();
720
- const timestampMetric = await metrics.ponder_indexing_timestamp.get();
721
- const ordering = await metrics.ponder_settings_info
722
- .get()
723
- .then((metric) => metric.values[0]?.labels.ordering);
724
- if (ordering === undefined) {
725
- return {
726
- mode: "backfill",
727
- progress: undefined,
728
- eta: undefined,
729
- };
730
- }
731
- else if (ordering === "multichain") {
732
- const perChainAppProgress = [];
733
- for (const chainName of totalSecondsMetric.values.map(({ labels }) => labels.chain)) {
734
- const totalSeconds = extractMetric(totalSecondsMetric, chainName);
735
- const cachedSeconds = extractMetric(cachedSecondsMetric, chainName);
736
- const completedSeconds = extractMetric(completedSecondsMetric, chainName);
737
- const timestamp = extractMetric(timestampMetric, chainName);
738
- if (totalSeconds === undefined ||
739
- cachedSeconds === undefined ||
740
- completedSeconds === undefined ||
741
- timestamp === undefined) {
742
- continue;
743
- }
900
+ // Note: `getRegistry` must be used because this function is used with "experimental_isolated" ordering.
901
+ const registry = await metrics.getRegistry();
902
+ const totalSecondsMetric = await registry
903
+ .getSingleMetric("ponder_historical_total_indexing_seconds")
904
+ .get();
905
+ const cachedSecondsMetric = await registry
906
+ .getSingleMetric("ponder_historical_cached_indexing_seconds")
907
+ .get();
908
+ const completedSecondsMetric = await registry
909
+ .getSingleMetric("ponder_historical_completed_indexing_seconds")
910
+ .get();
911
+ const timestampMetric = await registry
912
+ .getSingleMetric("ponder_indexing_timestamp")
913
+ .get();
914
+ const settingsMetric = await registry
915
+ .getSingleMetric("ponder_settings_info")
916
+ .get();
917
+ const ordering = settingsMetric?.values[0]
918
+ ?.labels.ordering;
919
+ switch (ordering) {
920
+ case undefined:
921
+ return {
922
+ mode: "backfill",
923
+ progress: undefined,
924
+ eta: undefined,
925
+ };
926
+ case "omnichain": {
927
+ const totalSeconds = totalSecondsMetric?.values
928
+ .map(({ value }) => value)
929
+ .reduce((prev, curr) => prev + curr, 0);
930
+ const cachedSeconds = cachedSecondsMetric?.values
931
+ .map(({ value }) => value)
932
+ .reduce((prev, curr) => prev + curr, 0);
933
+ const completedSeconds = completedSecondsMetric?.values
934
+ .map(({ value }) => value)
935
+ .reduce((prev, curr) => prev + curr, 0);
936
+ const timestamp = timestampMetric?.values
937
+ .map(({ value }) => value)
938
+ .reduce((prev, curr) => Math.max(prev, curr), 0);
744
939
  const progress = timestamp === 0
745
940
  ? 0
746
941
  : totalSeconds === 0
747
942
  ? 1
748
943
  : (completedSeconds + cachedSeconds) / totalSeconds;
749
- if (!metrics.progressMetadata[chainName]) {
750
- metrics.progressMetadata[chainName] = {
751
- batches: [{ elapsedSeconds: 0, completedSeconds: 0 }],
752
- previousTimestamp: Date.now(),
753
- previousCompletedSeconds: 0,
754
- rate: 0,
755
- };
756
- }
757
- const eta = calculateEta(metrics.progressMetadata[chainName], totalSeconds, cachedSeconds, completedSeconds);
758
- perChainAppProgress.push({
944
+ return {
759
945
  mode: progress === 1 ? "live" : "backfill",
760
- progress,
761
- eta,
762
- });
946
+ progress: progress,
947
+ eta: calculateEta(metrics.progressMetadata.general, totalSeconds, cachedSeconds, completedSeconds),
948
+ };
763
949
  }
764
- return perChainAppProgress.reduce((prev, curr) => ({
765
- mode: curr.mode === "backfill" ? curr.mode : prev.mode,
766
- progress: prev.progress === undefined || curr.progress === undefined
767
- ? undefined
768
- : Math.min(prev.progress, curr.progress),
769
- eta: curr.progress === 1
770
- ? prev.eta
771
- : prev.eta === undefined || curr.eta === undefined
950
+ case "multichain":
951
+ case "experimental_isolated": {
952
+ const perChainAppProgress = [];
953
+ for (const chainName of totalSecondsMetric?.values.map(({ labels }) => labels.chain) ?? []) {
954
+ const totalSeconds = extractMetric(totalSecondsMetric, chainName);
955
+ const cachedSeconds = extractMetric(cachedSecondsMetric, chainName);
956
+ const completedSeconds = extractMetric(completedSecondsMetric, chainName);
957
+ const timestamp = extractMetric(timestampMetric, chainName);
958
+ if (totalSeconds === undefined ||
959
+ cachedSeconds === undefined ||
960
+ completedSeconds === undefined ||
961
+ timestamp === undefined) {
962
+ continue;
963
+ }
964
+ const progress = timestamp === 0
965
+ ? 0
966
+ : totalSeconds === 0
967
+ ? 1
968
+ : (completedSeconds + cachedSeconds) / totalSeconds;
969
+ if (!metrics.progressMetadata[chainName]) {
970
+ metrics.progressMetadata[chainName] = {
971
+ batches: [{ elapsedSeconds: 0, completedSeconds: 0 }],
972
+ previousTimestamp: Date.now(),
973
+ previousCompletedSeconds: 0,
974
+ rate: 0,
975
+ };
976
+ }
977
+ const eta = calculateEta(metrics.progressMetadata[chainName], totalSeconds, cachedSeconds, completedSeconds);
978
+ perChainAppProgress.push({
979
+ mode: progress === 1 ? "live" : "backfill",
980
+ progress,
981
+ eta,
982
+ });
983
+ }
984
+ return perChainAppProgress.reduce((prev, curr) => ({
985
+ mode: curr.mode === "backfill" ? curr.mode : prev.mode,
986
+ progress: prev.progress === undefined || curr.progress === undefined
772
987
  ? undefined
773
- : Math.max(prev.eta, curr.eta),
774
- }), {
775
- mode: "live",
776
- progress: 1,
777
- eta: 0,
778
- });
779
- }
780
- else {
781
- const totalSeconds = totalSecondsMetric.values
782
- .map(({ value }) => value)
783
- .reduce((prev, curr) => prev + curr, 0);
784
- const cachedSeconds = cachedSecondsMetric.values
785
- .map(({ value }) => value)
786
- .reduce((prev, curr) => prev + curr, 0);
787
- const completedSeconds = completedSecondsMetric.values
788
- .map(({ value }) => value)
789
- .reduce((prev, curr) => prev + curr, 0);
790
- const timestamp = timestampMetric.values
791
- .map(({ value }) => value)
792
- .reduce((prev, curr) => Math.max(prev, curr), 0);
793
- const progress = timestamp === 0
794
- ? 0
795
- : totalSeconds === 0
796
- ? 1
797
- : (completedSeconds + cachedSeconds) / totalSeconds;
798
- return {
799
- mode: progress === 1 ? "live" : "backfill",
800
- progress: progress,
801
- eta: calculateEta(metrics.progressMetadata.general, totalSeconds, cachedSeconds, completedSeconds),
802
- };
988
+ : Math.min(prev.progress, curr.progress),
989
+ eta: curr.progress === 1
990
+ ? prev.eta
991
+ : prev.eta === undefined || curr.eta === undefined
992
+ ? undefined
993
+ : Math.max(prev.eta, curr.eta),
994
+ }), {
995
+ mode: "live",
996
+ progress: 1,
997
+ eta: 0,
998
+ });
999
+ }
803
1000
  }
804
1001
  }
805
1002
  function calculateEta(progressMetadata, totalSeconds, cachedSeconds, completedSeconds) {