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.
- package/CHANGELOG.md +16 -0
- package/dist/esm/bin/commands/createViews.js +28 -11
- package/dist/esm/bin/commands/createViews.js.map +1 -1
- package/dist/esm/bin/commands/dev.js +42 -22
- package/dist/esm/bin/commands/dev.js.map +1 -1
- package/dist/esm/bin/commands/prune.js +3 -0
- package/dist/esm/bin/commands/prune.js.map +1 -1
- package/dist/esm/bin/commands/serve.js +4 -1
- package/dist/esm/bin/commands/serve.js.map +1 -1
- package/dist/esm/bin/commands/start.js +18 -6
- package/dist/esm/bin/commands/start.js.map +1 -1
- package/dist/esm/bin/isolatedController.js +200 -0
- package/dist/esm/bin/isolatedController.js.map +1 -0
- package/dist/esm/bin/isolatedWorker.js +146 -0
- package/dist/esm/bin/isolatedWorker.js.map +1 -0
- package/dist/esm/build/config.js +322 -402
- package/dist/esm/build/config.js.map +1 -1
- package/dist/esm/build/index.js +8 -11
- package/dist/esm/build/index.js.map +1 -1
- package/dist/esm/build/pre.js +1 -4
- package/dist/esm/build/pre.js.map +1 -1
- package/dist/esm/build/schema.js +25 -3
- package/dist/esm/build/schema.js.map +1 -1
- package/dist/esm/client/index.js +306 -42
- package/dist/esm/client/index.js.map +1 -1
- package/dist/esm/database/actions.js +264 -104
- package/dist/esm/database/actions.js.map +1 -1
- package/dist/esm/database/index.js +39 -33
- package/dist/esm/database/index.js.map +1 -1
- package/dist/esm/database/queryBuilder.js +1 -0
- package/dist/esm/database/queryBuilder.js.map +1 -1
- package/dist/esm/drizzle/index.js +11 -7
- package/dist/esm/drizzle/index.js.map +1 -1
- package/dist/esm/drizzle/onchain.js +18 -0
- package/dist/esm/drizzle/onchain.js.map +1 -1
- package/dist/esm/indexing/client.js +32 -25
- package/dist/esm/indexing/client.js.map +1 -1
- package/dist/esm/indexing/index.js +110 -178
- package/dist/esm/indexing/index.js.map +1 -1
- package/dist/esm/indexing/profile.js +1 -1
- package/dist/esm/indexing/profile.js.map +1 -1
- package/dist/esm/indexing-store/cache.js +196 -274
- package/dist/esm/indexing-store/cache.js.map +1 -1
- package/dist/esm/indexing-store/historical.js +17 -13
- package/dist/esm/indexing-store/historical.js.map +1 -1
- package/dist/esm/indexing-store/index.js +10 -1
- package/dist/esm/indexing-store/index.js.map +1 -1
- package/dist/esm/indexing-store/profile.js +3 -3
- package/dist/esm/indexing-store/profile.js.map +1 -1
- package/dist/esm/indexing-store/realtime.js +27 -2
- package/dist/esm/indexing-store/realtime.js.map +1 -1
- package/dist/esm/internal/errors.js +28 -0
- package/dist/esm/internal/errors.js.map +1 -1
- package/dist/esm/internal/metrics.js +279 -82
- package/dist/esm/internal/metrics.js.map +1 -1
- package/dist/esm/internal/options.js +1 -0
- package/dist/esm/internal/options.js.map +1 -1
- package/dist/esm/internal/telemetry.js +1 -1
- package/dist/esm/internal/telemetry.js.map +1 -1
- package/dist/esm/rpc/http.js +130 -0
- package/dist/esm/rpc/http.js.map +1 -0
- package/dist/esm/rpc/index.js +38 -7
- package/dist/esm/rpc/index.js.map +1 -1
- package/dist/esm/runtime/events.js +179 -212
- package/dist/esm/runtime/events.js.map +1 -1
- package/dist/esm/runtime/filter.js +71 -0
- package/dist/esm/runtime/filter.js.map +1 -1
- package/dist/esm/runtime/fragments.js +78 -73
- package/dist/esm/runtime/fragments.js.map +1 -1
- package/dist/esm/runtime/historical.js +306 -130
- package/dist/esm/runtime/historical.js.map +1 -1
- package/dist/esm/runtime/index.js +183 -58
- package/dist/esm/runtime/index.js.map +1 -1
- package/dist/esm/runtime/isolated.js +462 -0
- package/dist/esm/runtime/isolated.js.map +1 -0
- package/dist/esm/runtime/multichain.js +80 -73
- package/dist/esm/runtime/multichain.js.map +1 -1
- package/dist/esm/runtime/omnichain.js +82 -75
- package/dist/esm/runtime/omnichain.js.map +1 -1
- package/dist/esm/runtime/realtime.js +198 -66
- package/dist/esm/runtime/realtime.js.map +1 -1
- package/dist/esm/sync-historical/index.js +416 -457
- package/dist/esm/sync-historical/index.js.map +1 -1
- package/dist/esm/sync-realtime/bloom.js +3 -3
- package/dist/esm/sync-realtime/bloom.js.map +1 -1
- package/dist/esm/sync-realtime/index.js +27 -46
- package/dist/esm/sync-realtime/index.js.map +1 -1
- package/dist/esm/sync-store/index.js +112 -63
- package/dist/esm/sync-store/index.js.map +1 -1
- package/dist/esm/utils/abi.js +20 -32
- package/dist/esm/utils/abi.js.map +1 -1
- package/dist/esm/utils/chunk.js +8 -0
- package/dist/esm/utils/chunk.js.map +1 -0
- package/dist/esm/utils/promiseAllSettledWithThrow.js +19 -0
- package/dist/esm/utils/promiseAllSettledWithThrow.js.map +1 -0
- package/dist/esm/{client/parse.js → utils/sql-parse.js} +94 -80
- package/dist/esm/utils/sql-parse.js.map +1 -0
- package/dist/types/bin/commands/createViews.d.ts.map +1 -1
- package/dist/types/bin/commands/dev.d.ts.map +1 -1
- package/dist/types/bin/commands/prune.d.ts.map +1 -1
- package/dist/types/bin/commands/serve.d.ts.map +1 -1
- package/dist/types/bin/commands/start.d.ts.map +1 -1
- package/dist/types/bin/isolatedController.d.ts +13 -0
- package/dist/types/bin/isolatedController.d.ts.map +1 -0
- package/dist/types/bin/isolatedWorker.d.ts +9 -0
- package/dist/types/bin/isolatedWorker.d.ts.map +1 -0
- package/dist/types/build/config.d.ts +29 -11
- package/dist/types/build/config.d.ts.map +1 -1
- package/dist/types/build/index.d.ts +3 -2
- package/dist/types/build/index.d.ts.map +1 -1
- package/dist/types/build/pre.d.ts +1 -1
- package/dist/types/build/pre.d.ts.map +1 -1
- package/dist/types/build/schema.d.ts +5 -3
- package/dist/types/build/schema.d.ts.map +1 -1
- package/dist/types/client/index.d.ts +1 -1
- package/dist/types/client/index.d.ts.map +1 -1
- package/dist/types/config/index.d.ts +3 -3
- package/dist/types/config/index.d.ts.map +1 -1
- package/dist/types/database/actions.d.ts +53 -7
- package/dist/types/database/actions.d.ts.map +1 -1
- package/dist/types/database/index.d.ts +21 -21
- package/dist/types/database/index.d.ts.map +1 -1
- package/dist/types/database/queryBuilder.d.ts.map +1 -1
- package/dist/types/drizzle/index.d.ts +4 -5
- package/dist/types/drizzle/index.d.ts.map +1 -1
- package/dist/types/drizzle/onchain.d.ts +6 -0
- package/dist/types/drizzle/onchain.d.ts.map +1 -1
- package/dist/types/indexing/client.d.ts.map +1 -1
- package/dist/types/indexing/index.d.ts +2 -5
- package/dist/types/indexing/index.d.ts.map +1 -1
- package/dist/types/indexing-store/cache.d.ts +3 -2
- package/dist/types/indexing-store/cache.d.ts.map +1 -1
- package/dist/types/indexing-store/historical.d.ts +2 -1
- package/dist/types/indexing-store/historical.d.ts.map +1 -1
- package/dist/types/indexing-store/index.d.ts +1 -0
- package/dist/types/indexing-store/index.d.ts.map +1 -1
- package/dist/types/indexing-store/realtime.d.ts +2 -1
- package/dist/types/indexing-store/realtime.d.ts.map +1 -1
- package/dist/types/internal/errors.d.ts +5 -0
- package/dist/types/internal/errors.d.ts.map +1 -1
- package/dist/types/internal/metrics.d.ts +21 -0
- package/dist/types/internal/metrics.d.ts.map +1 -1
- package/dist/types/internal/options.d.ts +2 -0
- package/dist/types/internal/options.d.ts.map +1 -1
- package/dist/types/internal/types.d.ts +66 -58
- package/dist/types/internal/types.d.ts.map +1 -1
- package/dist/types/rpc/http.d.ts +17 -0
- package/dist/types/rpc/http.d.ts.map +1 -0
- package/dist/types/rpc/index.d.ts.map +1 -1
- package/dist/types/runtime/events.d.ts +4 -4
- package/dist/types/runtime/events.d.ts.map +1 -1
- package/dist/types/runtime/filter.d.ts +5 -1
- package/dist/types/runtime/filter.d.ts.map +1 -1
- package/dist/types/runtime/fragments.d.ts +4 -3
- package/dist/types/runtime/fragments.d.ts.map +1 -1
- package/dist/types/runtime/historical.d.ts +29 -13
- package/dist/types/runtime/historical.d.ts.map +1 -1
- package/dist/types/runtime/index.d.ts +49 -6
- package/dist/types/runtime/index.d.ts.map +1 -1
- package/dist/types/runtime/init.d.ts +5 -5
- package/dist/types/runtime/init.d.ts.map +1 -1
- package/dist/types/runtime/isolated.d.ts +14 -0
- package/dist/types/runtime/isolated.d.ts.map +1 -0
- package/dist/types/runtime/multichain.d.ts.map +1 -1
- package/dist/types/runtime/omnichain.d.ts.map +1 -1
- package/dist/types/runtime/realtime.d.ts +21 -10
- package/dist/types/runtime/realtime.d.ts.map +1 -1
- package/dist/types/sync-historical/index.d.ts +18 -8
- package/dist/types/sync-historical/index.d.ts.map +1 -1
- package/dist/types/sync-realtime/bloom.d.ts.map +1 -1
- package/dist/types/sync-realtime/index.d.ts +2 -2
- package/dist/types/sync-realtime/index.d.ts.map +1 -1
- package/dist/types/sync-store/index.d.ts +9 -9
- package/dist/types/sync-store/index.d.ts.map +1 -1
- package/dist/types/utils/abi.d.ts +3 -34
- package/dist/types/utils/abi.d.ts.map +1 -1
- package/dist/types/utils/chunk.d.ts +2 -0
- package/dist/types/utils/chunk.d.ts.map +1 -0
- package/dist/types/utils/promiseAllSettledWithThrow.d.ts +8 -0
- package/dist/types/utils/promiseAllSettledWithThrow.d.ts.map +1 -0
- package/dist/types/utils/sql-parse.d.ts +21 -0
- package/dist/types/utils/sql-parse.d.ts.map +1 -0
- package/package.json +2 -2
- package/src/bin/commands/createViews.ts +35 -15
- package/src/bin/commands/dev.ts +43 -21
- package/src/bin/commands/prune.ts +6 -0
- package/src/bin/commands/serve.ts +4 -1
- package/src/bin/commands/start.ts +20 -5
- package/src/bin/isolatedController.ts +300 -0
- package/src/bin/isolatedWorker.ts +192 -0
- package/src/build/config.ts +570 -632
- package/src/build/index.ts +14 -14
- package/src/build/pre.ts +1 -4
- package/src/build/schema.ts +49 -4
- package/src/client/index.ts +386 -48
- package/src/config/index.ts +3 -3
- package/src/database/actions.ts +469 -120
- package/src/database/index.ts +85 -58
- package/src/database/queryBuilder.ts +1 -0
- package/src/drizzle/index.ts +15 -7
- package/src/drizzle/onchain.ts +19 -0
- package/src/indexing/client.ts +38 -25
- package/src/indexing/index.ts +137 -230
- package/src/indexing/profile.ts +1 -1
- package/src/indexing-store/cache.ts +285 -414
- package/src/indexing-store/historical.ts +20 -10
- package/src/indexing-store/index.ts +16 -0
- package/src/indexing-store/profile.ts +3 -3
- package/src/indexing-store/realtime.ts +28 -0
- package/src/internal/errors.ts +26 -0
- package/src/internal/metrics.ts +341 -111
- package/src/internal/options.ts +4 -0
- package/src/internal/telemetry.ts +1 -1
- package/src/internal/types.ts +70 -87
- package/src/rpc/http.ts +164 -0
- package/src/rpc/index.ts +39 -7
- package/src/runtime/events.ts +195 -240
- package/src/runtime/filter.ts +85 -1
- package/src/runtime/fragments.ts +109 -113
- package/src/runtime/historical.ts +467 -189
- package/src/runtime/index.ts +337 -69
- package/src/runtime/init.ts +5 -5
- package/src/runtime/isolated.ts +768 -0
- package/src/runtime/multichain.ts +137 -102
- package/src/runtime/omnichain.ts +138 -106
- package/src/runtime/realtime.ts +322 -123
- package/src/sync-historical/index.ts +556 -692
- package/src/sync-realtime/bloom.ts +7 -3
- package/src/sync-realtime/index.ts +31 -46
- package/src/sync-store/index.ts +189 -95
- package/src/utils/abi.ts +33 -90
- package/src/utils/chunk.ts +7 -0
- package/src/utils/promiseAllSettledWithThrow.ts +27 -0
- package/src/{client/parse.ts → utils/sql-parse.ts} +100 -90
- package/dist/esm/client/parse.js.map +0 -1
- package/dist/types/client/parse.d.ts +0 -14
- 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
|
-
|
|
573
|
-
return
|
|
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
|
|
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
|
-
|
|
718
|
-
const
|
|
719
|
-
const
|
|
720
|
-
|
|
721
|
-
|
|
722
|
-
|
|
723
|
-
.
|
|
724
|
-
|
|
725
|
-
|
|
726
|
-
|
|
727
|
-
|
|
728
|
-
|
|
729
|
-
|
|
730
|
-
|
|
731
|
-
|
|
732
|
-
|
|
733
|
-
|
|
734
|
-
|
|
735
|
-
|
|
736
|
-
|
|
737
|
-
|
|
738
|
-
|
|
739
|
-
|
|
740
|
-
|
|
741
|
-
|
|
742
|
-
|
|
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
|
-
|
|
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
|
-
|
|
765
|
-
|
|
766
|
-
|
|
767
|
-
|
|
768
|
-
|
|
769
|
-
|
|
770
|
-
|
|
771
|
-
|
|
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.
|
|
774
|
-
|
|
775
|
-
|
|
776
|
-
|
|
777
|
-
|
|
778
|
-
|
|
779
|
-
|
|
780
|
-
|
|
781
|
-
|
|
782
|
-
|
|
783
|
-
|
|
784
|
-
|
|
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) {
|