envio 3.3.0 → 3.3.1
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/package.json +6 -7
- package/src/ChainFetching.res +4 -32
- package/src/ChainFetching.res.mjs +2 -12
- package/src/ChainState.res +73 -53
- package/src/ChainState.res.mjs +61 -30
- package/src/ChainState.resi +13 -17
- package/src/Config.res +5 -0
- package/src/Config.res.mjs +1 -0
- package/src/CrossChainState.res +2 -8
- package/src/CrossChainState.res.mjs +6 -8
- package/src/CrossChainState.resi +1 -0
- package/src/EffectState.res +183 -44
- package/src/EffectState.res.mjs +134 -26
- package/src/EffectState.resi +26 -3
- package/src/EventProcessing.res +14 -9
- package/src/EventProcessing.res.mjs +7 -7
- package/src/FetchState.res +18 -29
- package/src/FetchState.res.mjs +20 -37
- package/src/IndexerState.res +280 -31
- package/src/IndexerState.res.mjs +234 -25
- package/src/IndexerState.resi +22 -0
- package/src/LoadLayer.res +19 -65
- package/src/LoadLayer.res.mjs +13 -55
- package/src/Main.res +42 -23
- package/src/Main.res.mjs +32 -35
- package/src/Metrics.res +943 -66
- package/src/Metrics.res.mjs +367 -50
- package/src/Persistence.res +3 -0
- package/src/PgStorage.res +3 -8
- package/src/PgStorage.res.mjs +3 -4
- package/src/PruneStaleHistory.res +1 -1
- package/src/PruneStaleHistory.res.mjs +1 -2
- package/src/Rollback.res +4 -5
- package/src/Rollback.res.mjs +2 -3
- package/src/SimulateItems.res.mjs +3 -21
- package/src/TestIndexer.res.mjs +4 -23
- package/src/TestIndexerProxyStorage.res +1 -0
- package/src/TestIndexerProxyStorage.res.mjs +1 -1
- package/src/Writing.res +3 -5
- package/src/Writing.res.mjs +3 -6
- package/src/bindings/ClickHouse.res +101 -17
- package/src/bindings/ClickHouse.res.mjs +58 -19
- package/src/bindings/NodeJs.res +64 -0
- package/src/bindings/NodeJs.res.mjs +6 -0
- package/src/sources/HyperSyncClient.res +5 -11
- package/src/sources/SourceManager.res +72 -27
- package/src/sources/SourceManager.res.mjs +81 -11
- package/src/sources/SourceManager.resi +14 -0
- package/src/tui/Tui.res +1 -1
- package/src/tui/Tui.res.mjs +2 -2
- package/src/Prometheus.res +0 -789
- package/src/Prometheus.res.mjs +0 -847
- package/src/bindings/PromClient.res +0 -72
- package/src/bindings/PromClient.res.mjs +0 -38
package/src/Main.res
CHANGED
|
@@ -1,4 +1,22 @@
|
|
|
1
|
-
|
|
1
|
+
// The public console/state chain shape. Kept to exactly this field set for
|
|
2
|
+
// backward compatibility with consumers like RACE — new metric fields stay off
|
|
3
|
+
// the HTTP response.
|
|
4
|
+
type chainData = {
|
|
5
|
+
chainId: float,
|
|
6
|
+
poweredByHyperSync: bool,
|
|
7
|
+
firstEventBlockNumber: option<int>,
|
|
8
|
+
latestProcessedBlock: option<int>,
|
|
9
|
+
timestampCaughtUpToHeadOrEndblock: option<Date.t>,
|
|
10
|
+
numEventsProcessed: float,
|
|
11
|
+
latestFetchedBlockNumber: int,
|
|
12
|
+
// Need this for API backwards compatibility
|
|
13
|
+
@as("currentBlockHeight")
|
|
14
|
+
knownHeight: int,
|
|
15
|
+
numBatchesFetched: int,
|
|
16
|
+
startBlock: int,
|
|
17
|
+
endBlock: option<int>,
|
|
18
|
+
numAddresses: int,
|
|
19
|
+
}
|
|
2
20
|
@tag("status")
|
|
3
21
|
type state =
|
|
4
22
|
| @as("disabled") Disabled({})
|
|
@@ -12,6 +30,21 @@ type state =
|
|
|
12
30
|
rollbackOnReorg: bool,
|
|
13
31
|
})
|
|
14
32
|
|
|
33
|
+
let toChainData = (m: Metrics.chainMetrics): chainData => {
|
|
34
|
+
chainId: m.chainId,
|
|
35
|
+
poweredByHyperSync: m.poweredByHyperSync,
|
|
36
|
+
firstEventBlockNumber: m.firstEventBlockNumber,
|
|
37
|
+
latestProcessedBlock: m.latestProcessedBlock,
|
|
38
|
+
timestampCaughtUpToHeadOrEndblock: m.timestampCaughtUpToHeadOrEndblock,
|
|
39
|
+
numEventsProcessed: m.numEventsProcessed,
|
|
40
|
+
latestFetchedBlockNumber: m.latestFetchedBlockNumber,
|
|
41
|
+
knownHeight: m.knownHeight,
|
|
42
|
+
numBatchesFetched: m.numBatchesFetched,
|
|
43
|
+
startBlock: m.startBlock,
|
|
44
|
+
endBlock: m.endBlock,
|
|
45
|
+
numAddresses: m.numAddresses,
|
|
46
|
+
}
|
|
47
|
+
|
|
15
48
|
let chainDataSchema = S.schema((s): chainData => {
|
|
16
49
|
chainId: s.matches(S.float),
|
|
17
50
|
poweredByHyperSync: s.matches(S.bool),
|
|
@@ -331,13 +364,7 @@ let getGlobalIndexer = (): 'indexer => {
|
|
|
331
364
|
|
|
332
365
|
let onBlockFn = (rawOptions: 'a, handler: 'b) => {
|
|
333
366
|
HandlerRegister.throwIfFinishedRegistration(~methodName="onBlock")
|
|
334
|
-
let raw =
|
|
335
|
-
rawOptions->(
|
|
336
|
-
Utils.magic: 'a => {
|
|
337
|
-
"name": string,
|
|
338
|
-
"where": unknown,
|
|
339
|
-
}
|
|
340
|
-
)
|
|
367
|
+
let raw = rawOptions->(Utils.magic: 'a => {"name": string, "where": unknown})
|
|
341
368
|
HandlerRegister.registerOnBlock(
|
|
342
369
|
~name=raw["name"],
|
|
343
370
|
~where=raw["where"],
|
|
@@ -496,23 +523,19 @@ let startServer = (~getState, ~persistence: Persistence.t, ~isDevelopmentMode: b
|
|
|
496
523
|
}
|
|
497
524
|
})
|
|
498
525
|
|
|
499
|
-
|
|
500
|
-
PromClient.collectDefaultMetrics({"register": runtimeRegistry})
|
|
526
|
+
Metrics.startRuntimeCollectors()
|
|
501
527
|
|
|
502
528
|
app->get("/metrics", (_req, res) => {
|
|
503
|
-
res->set("Content-Type",
|
|
529
|
+
res->set("Content-Type", Metrics.contentType)
|
|
504
530
|
let _ =
|
|
505
|
-
|
|
506
|
-
|
|
531
|
+
res->endWithData(
|
|
532
|
+
Metrics.collect(~metrics=getIndexerState()->Option.map(IndexerState.toMetrics)),
|
|
507
533
|
)
|
|
508
534
|
})
|
|
509
535
|
|
|
510
536
|
app->get("/metrics/runtime", (_req, res) => {
|
|
511
|
-
res->set("Content-Type",
|
|
512
|
-
let _ =
|
|
513
|
-
runtimeRegistry
|
|
514
|
-
->PromClient.metrics
|
|
515
|
-
->Promise.thenResolve(metrics => res->endWithData(metrics))
|
|
537
|
+
res->set("Content-Type", Metrics.contentType)
|
|
538
|
+
let _ = res->endWithData(Metrics.collectRuntime())
|
|
516
539
|
})
|
|
517
540
|
|
|
518
541
|
let server = app->listen(Env.serverPort)
|
|
@@ -636,17 +659,13 @@ let start = async (
|
|
|
636
659
|
(onErrorReject.contents->Option.getUnsafe)(FatalError(errHandler.exn->Utils.prettifyExn))
|
|
637
660
|
}
|
|
638
661
|
let envioVersion = Utils.EnvioPackage.value.version
|
|
639
|
-
Prometheus.Info.set(~version=envioVersion)
|
|
640
|
-
Prometheus.ProcessStartTimeSeconds.set()
|
|
641
|
-
Prometheus.RollbackEnabled.set(~enabled=config.shouldRollbackOnReorg)
|
|
642
662
|
|
|
643
663
|
if !isTest {
|
|
644
664
|
startServer(~persistence, ~isDevelopmentMode, ~getState=() =>
|
|
645
665
|
switch getIndexerState() {
|
|
646
666
|
| None => Initializing({})
|
|
647
667
|
| Some(state) => {
|
|
648
|
-
let chains =
|
|
649
|
-
state->IndexerState.chainStates->Dict.valuesToArray->Array.map(ChainState.toChainData)
|
|
668
|
+
let chains = (state->IndexerState.toMetrics).chains->Array.map(toChainData)
|
|
650
669
|
Active({
|
|
651
670
|
envioVersion,
|
|
652
671
|
chains,
|
package/src/Main.res.mjs
CHANGED
|
@@ -12,11 +12,9 @@ import * as Process from "process";
|
|
|
12
12
|
import * as ChainMap from "./ChainMap.res.mjs";
|
|
13
13
|
import * as PgStorage from "./PgStorage.res.mjs";
|
|
14
14
|
import * as ChainState from "./ChainState.res.mjs";
|
|
15
|
-
import * as Prometheus from "./Prometheus.res.mjs";
|
|
16
15
|
import * as EnvioGlobal from "./EnvioGlobal.res.mjs";
|
|
17
16
|
import * as IndexerLoop from "./IndexerLoop.res.mjs";
|
|
18
17
|
import * as Persistence from "./Persistence.res.mjs";
|
|
19
|
-
import * as PromClient from "prom-client";
|
|
20
18
|
import Yargs from "yargs/yargs";
|
|
21
19
|
import * as IndexerState from "./IndexerState.res.mjs";
|
|
22
20
|
import * as ErrorHandling from "./ErrorHandling.res.mjs";
|
|
@@ -30,6 +28,23 @@ import * as Primitive_option from "@rescript/runtime/lib/es6/Primitive_option.js
|
|
|
30
28
|
import * as S$RescriptSchema from "rescript-schema/src/S.res.mjs";
|
|
31
29
|
import * as Primitive_exceptions from "@rescript/runtime/lib/es6/Primitive_exceptions.js";
|
|
32
30
|
|
|
31
|
+
function toChainData(m) {
|
|
32
|
+
return {
|
|
33
|
+
chainId: m.chainId,
|
|
34
|
+
poweredByHyperSync: m.poweredByHyperSync,
|
|
35
|
+
firstEventBlockNumber: m.firstEventBlockNumber,
|
|
36
|
+
latestProcessedBlock: m.latestProcessedBlock,
|
|
37
|
+
timestampCaughtUpToHeadOrEndblock: m.timestampCaughtUpToHeadOrEndblock,
|
|
38
|
+
numEventsProcessed: m.numEventsProcessed,
|
|
39
|
+
latestFetchedBlockNumber: m.latestFetchedBlockNumber,
|
|
40
|
+
currentBlockHeight: m.knownHeight,
|
|
41
|
+
numBatchesFetched: m.numBatchesFetched,
|
|
42
|
+
startBlock: m.startBlock,
|
|
43
|
+
endBlock: m.endBlock,
|
|
44
|
+
numAddresses: m.numAddresses
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
|
|
33
48
|
let chainDataSchema = S$RescriptSchema.schema(s => ({
|
|
34
49
|
chainId: s.m(S$RescriptSchema.float),
|
|
35
50
|
poweredByHyperSync: s.m(S$RescriptSchema.bool),
|
|
@@ -409,17 +424,14 @@ function startServer(getState, persistence, isDevelopmentMode) {
|
|
|
409
424
|
res.json(false);
|
|
410
425
|
}
|
|
411
426
|
});
|
|
412
|
-
|
|
413
|
-
PromClient.collectDefaultMetrics({
|
|
414
|
-
register: runtimeRegistry
|
|
415
|
-
});
|
|
427
|
+
Metrics.startRuntimeCollectors();
|
|
416
428
|
app.get("/metrics", (_req, res) => {
|
|
417
|
-
res.set("Content-Type",
|
|
418
|
-
Metrics.collect(EnvioGlobal.value.indexerState
|
|
429
|
+
res.set("Content-Type", Metrics.contentType);
|
|
430
|
+
res.end(Metrics.collect(Stdlib_Option.map(EnvioGlobal.value.indexerState, IndexerState.toMetrics)));
|
|
419
431
|
});
|
|
420
432
|
app.get("/metrics/runtime", (_req, res) => {
|
|
421
|
-
res.set("Content-Type",
|
|
422
|
-
|
|
433
|
+
res.set("Content-Type", Metrics.contentType);
|
|
434
|
+
res.end(Metrics.collectRuntime());
|
|
423
435
|
});
|
|
424
436
|
let server = app.listen(Env.serverPort);
|
|
425
437
|
server.on("error", err => {
|
|
@@ -469,27 +481,14 @@ async function start(persistence, resetOpt, isTestOpt, exitAfterFirstEventBlockO
|
|
|
469
481
|
EnvioGlobal.value.persistence = Primitive_option.some(persistence$1);
|
|
470
482
|
await Persistence.init(persistence$1, ChainMap.values(config.chainMap), Config.stripSensitiveData(Config.getPublicConfigJson()), isDevelopmentMode ? "envio dev -r" : "envio start -r", isDevelopmentMode ? "envio dev" : "envio start", reset);
|
|
471
483
|
let registrationsByChainId = await HandlerLoader.registerAllHandlers(config);
|
|
472
|
-
let config$1
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
chainMap: config.chainMap,
|
|
481
|
-
defaultChain: config.defaultChain,
|
|
482
|
-
ecosystem: config.ecosystem,
|
|
483
|
-
enableRawEvents: config.enableRawEvents,
|
|
484
|
-
maxAddrInPartition: config.maxAddrInPartition,
|
|
485
|
-
batchSize: config.batchSize,
|
|
486
|
-
lowercaseAddresses: config.lowercaseAddresses,
|
|
487
|
-
isDev: config.isDev,
|
|
488
|
-
userEntitiesByName: config.userEntitiesByName,
|
|
489
|
-
userEntities: config.userEntities,
|
|
490
|
-
allEntities: config.allEntities,
|
|
491
|
-
allEnums: config.allEnums
|
|
492
|
-
}) : config;
|
|
484
|
+
let config$1;
|
|
485
|
+
if (isTest) {
|
|
486
|
+
let newrecord = {...config};
|
|
487
|
+
newrecord.shouldRollbackOnReorg = false;
|
|
488
|
+
config$1 = newrecord;
|
|
489
|
+
} else {
|
|
490
|
+
config$1 = config;
|
|
491
|
+
}
|
|
493
492
|
let config$2 = patchConfig !== undefined ? patchConfig(config$1, registrationsByChainId) : config$1;
|
|
494
493
|
let onErrorReject = {
|
|
495
494
|
contents: undefined
|
|
@@ -505,9 +504,6 @@ async function start(persistence, resetOpt, isTestOpt, exitAfterFirstEventBlockO
|
|
|
505
504
|
});
|
|
506
505
|
};
|
|
507
506
|
let envioVersion = Utils.EnvioPackage.value.version;
|
|
508
|
-
Prometheus.Info.set(envioVersion);
|
|
509
|
-
Prometheus.ProcessStartTimeSeconds.set();
|
|
510
|
-
Prometheus.RollbackEnabled.set(config$2.shouldRollbackOnReorg);
|
|
511
507
|
if (!isTest) {
|
|
512
508
|
startServer(() => {
|
|
513
509
|
let state = EnvioGlobal.value.indexerState;
|
|
@@ -517,7 +513,7 @@ async function start(persistence, resetOpt, isTestOpt, exitAfterFirstEventBlockO
|
|
|
517
513
|
};
|
|
518
514
|
}
|
|
519
515
|
let state$1 = Primitive_option.valFromOption(state);
|
|
520
|
-
let chains =
|
|
516
|
+
let chains = IndexerState.toMetrics(state$1).chains.map(toChainData);
|
|
521
517
|
return {
|
|
522
518
|
status: "active",
|
|
523
519
|
envioVersion: envioVersion,
|
|
@@ -538,6 +534,7 @@ async function start(persistence, resetOpt, isTestOpt, exitAfterFirstEventBlockO
|
|
|
538
534
|
}
|
|
539
535
|
|
|
540
536
|
export {
|
|
537
|
+
toChainData,
|
|
541
538
|
chainDataSchema,
|
|
542
539
|
stateSchema,
|
|
543
540
|
getIndexerState,
|