Skip to content

Commit e7bb3f1

Browse files
committed
Merge branch 'main' of github.com:enviodev/hyperindex into dz/track-blocks
2 parents bb6ecdb + b2bd922 commit e7bb3f1

File tree

5 files changed

+106
-29
lines changed

5 files changed

+106
-29
lines changed

codegenerator/cli/npm/envio/src/Batch.res

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ open Belt
33
type chainAfterBatch = {
44
batchSize: int,
55
progressBlockNumber: int,
6+
isProgressAtHead: bool,
67
totalEventsProcessed: int,
78
fetchState: FetchState.t,
89
dcsToStore: option<array<FetchState.indexingContract>>,

codegenerator/cli/npm/envio/src/bindings/PromClient.res

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,14 @@ type registry
1111
@send external metrics: registry => Promise.t<string> = "metrics"
1212
@get external getContentType: registry => string = "contentType"
1313

14+
type metricValue = {
15+
value: int,
16+
labels: dict<string>,
17+
}
18+
type metricInstance = {get: unit => promise<{"values": array<metricValue>}>}
19+
@send external getSingleMetric: (registry, string) => option<metricInstance> = "getSingleMetric"
20+
@send external resetMetrics: registry => unit = "resetMetrics"
21+
1422
module Counter = {
1523
type counter
1624
@new @module("prom-client") external makeCounter: customMetric<'a> => counter = "Counter"
@@ -36,6 +44,8 @@ module Gauge = {
3644
@send external setFloat: (gauge, float) => unit = "set"
3745

3846
@send external labels: (gauge, 'labelsObject) => gauge = "labels"
47+
48+
@send external get: gauge => promise<{"values": array<dict<string>>}> = "get"
3949
}
4050

4151
module Histogram = {

scenarios/test_codegen/test/E2E_test.res

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,4 +37,49 @@ describe("E2E tests", () => {
3737
~message="Should request items from start block to reorg threshold",
3838
)
3939
})
40+
41+
Async.it("Correctly sets Prom metrics", async () => {
42+
let sourceMock = Mock.Source.make(
43+
[#getHeightOrThrow, #getItemsOrThrow, #getBlockHashes],
44+
~chain=#1337,
45+
)
46+
let indexerMock = await Mock.Indexer.make(
47+
~chains=[
48+
{
49+
chain: #1337,
50+
sources: [sourceMock.source],
51+
},
52+
],
53+
)
54+
await Utils.delay(0)
55+
56+
Assert.deepEqual(
57+
await indexerMock.metric("envio_reorg_threshold"),
58+
[{value: "0", labels: Js.Dict.empty()}],
59+
)
60+
Assert.deepEqual(
61+
await indexerMock.metric("hyperindex_synced_to_head"),
62+
[{value: "0", labels: Js.Dict.empty()}],
63+
)
64+
65+
await Mock.Helper.initialEnterReorgThreshold(~sourceMock)
66+
67+
Assert.deepEqual(
68+
await indexerMock.metric("envio_reorg_threshold"),
69+
[{value: "1", labels: Js.Dict.empty()}],
70+
)
71+
Assert.deepEqual(
72+
await indexerMock.metric("hyperindex_synced_to_head"),
73+
[{value: "0", labels: Js.Dict.empty()}],
74+
)
75+
76+
sourceMock.resolveGetItemsOrThrow([], ~latestFetchedBlockNumber=300)
77+
await indexerMock.getBatchWritePromise()
78+
79+
Assert.deepEqual(
80+
await indexerMock.metric("hyperindex_synced_to_head"),
81+
[{value: "1", labels: Js.Dict.empty()}],
82+
~message="should have set hyperindex_synced_to_head metric to 1",
83+
)
84+
})
4085
})

scenarios/test_codegen/test/helpers/Mock.res

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -207,19 +207,26 @@ module Storage = {
207207
}
208208

209209
module Indexer = {
210+
type metric = {
211+
value: string,
212+
labels: dict<string>,
213+
}
210214
type t = {
211215
getBatchWritePromise: unit => promise<unit>,
212216
getRollbackReadyPromise: unit => promise<unit>,
213217
query: 'entity. module(Entities.Entity with type t = 'entity) => promise<array<'entity>>,
214218
queryHistory: 'entity. module(Entities.Entity with type t = 'entity) => promise<
215219
array<EntityHistory.historyRow<'entity>>,
216220
>,
221+
metric: string => promise<array<metric>>,
217222
}
218223

219224
type chainConfig = {chain: Types.chain, sources: array<Source.t>, startBlock?: int}
220225

221226
let make = async (~chains: array<chainConfig>, ~multichain=InternalConfig.Unordered) => {
222227
DbHelpers.resetPostgresClient()
228+
// TODO: Should stop using global client
229+
PromClient.defaultRegister->PromClient.resetMetrics
223230

224231
let config = RegisterHandlers.registerAllHandlers()
225232

@@ -344,6 +351,16 @@ module Indexer = {
344351
>
345352
)
346353
},
354+
metric: async name => {
355+
switch PromClient.defaultRegister->PromClient.getSingleMetric(name) {
356+
| Some(m) =>
357+
(await m.get())["values"]->Js.Array2.map(v => {
358+
value: v.value->Belt.Int.toString,
359+
labels: v.labels,
360+
})
361+
| None => []
362+
}
363+
},
347364
}
348365
}
349366
}
@@ -573,6 +590,33 @@ module Source = {
573590
}
574591
}
575592

593+
module Helper = {
594+
let initialEnterReorgThreshold = async (~sourceMock: Source.t) => {
595+
open RescriptMocha
596+
597+
Assert.deepEqual(
598+
sourceMock.getHeightOrThrowCalls->Array.length,
599+
1,
600+
~message="should have called getHeightOrThrow to get initial height",
601+
)
602+
sourceMock.resolveGetHeightOrThrow(300)
603+
await Utils.delay(0)
604+
await Utils.delay(0)
605+
606+
let expectedGetItemsCall1 = {"fromBlock": 0, "toBlock": Some(100), "retry": 0}
607+
608+
Assert.deepEqual(
609+
sourceMock.getItemsOrThrowCalls,
610+
[expectedGetItemsCall1],
611+
~message="Should request items until reorg threshold",
612+
)
613+
sourceMock.resolveGetItemsOrThrow([])
614+
await Utils.delay(0)
615+
await Utils.delay(0)
616+
await Utils.delay(0)
617+
}
618+
}
619+
576620
@genType
577621
let mockRawEventRow: InternalTable.RawEvents.t = {
578622
chainId: 1,

scenarios/test_codegen/test/rollback/Rollback_test.res

Lines changed: 6 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -417,29 +417,6 @@ describe("Single Chain Simple Rollback", () => {
417417
let undefined = (%raw(`undefined`): option<'a>)
418418

419419
describe("E2E rollback tests", () => {
420-
let initialEnterReorgThreshold = async (~sourceMock: M.Source.t) => {
421-
Assert.deepEqual(
422-
sourceMock.getHeightOrThrowCalls->Array.length,
423-
1,
424-
~message="should have called getHeightOrThrow to get initial height",
425-
)
426-
sourceMock.resolveGetHeightOrThrow(300)
427-
await Utils.delay(0)
428-
await Utils.delay(0)
429-
430-
let expectedGetItemsCall1 = {"fromBlock": 0, "toBlock": Some(100), "retry": 0}
431-
432-
Assert.deepEqual(
433-
sourceMock.getItemsOrThrowCalls,
434-
[expectedGetItemsCall1],
435-
~message="Should request items until reorg threshold",
436-
)
437-
sourceMock.resolveGetItemsOrThrow([])
438-
await Utils.delay(0)
439-
await Utils.delay(0)
440-
await Utils.delay(0)
441-
}
442-
443420
let testSingleChainRollback = async (~sourceMock: M.Source.t, ~indexerMock: M.Indexer.t) => {
444421
Assert.deepEqual(
445422
sourceMock.getItemsOrThrowCalls->Utils.Array.last,
@@ -736,7 +713,7 @@ describe("E2E rollback tests", () => {
736713
)
737714
await Utils.delay(0)
738715

739-
await initialEnterReorgThreshold(~sourceMock)
716+
await M.Helper.initialEnterReorgThreshold(~sourceMock)
740717
await testSingleChainRollback(~sourceMock, ~indexerMock)
741718
})
742719

@@ -766,8 +743,8 @@ describe("E2E rollback tests", () => {
766743
await Utils.delay(0)
767744

768745
let _ = await Promise.all2((
769-
initialEnterReorgThreshold(~sourceMock=sourceMock1),
770-
initialEnterReorgThreshold(~sourceMock=sourceMock2),
746+
M.Helper.initialEnterReorgThreshold(~sourceMock=sourceMock1),
747+
M.Helper.initialEnterReorgThreshold(~sourceMock=sourceMock2),
771748
))
772749

773750
await testSingleChainRollback(~sourceMock=sourceMock1, ~indexerMock)
@@ -789,7 +766,7 @@ describe("E2E rollback tests", () => {
789766
)
790767
await Utils.delay(0)
791768

792-
await initialEnterReorgThreshold(~sourceMock)
769+
await M.Helper.initialEnterReorgThreshold(~sourceMock)
793770

794771
let calls = []
795772
let handler: Types.HandlerTypes.loader<unit, unit> = async ({event}) => {
@@ -1050,8 +1027,8 @@ This might be wrong after we start exposing a block hash for progress block.`,
10501027
await Utils.delay(0)
10511028

10521029
let _ = await Promise.all2((
1053-
initialEnterReorgThreshold(~sourceMock=sourceMock1337),
1054-
initialEnterReorgThreshold(~sourceMock=sourceMock100),
1030+
M.Helper.initialEnterReorgThreshold(~sourceMock=sourceMock1337),
1031+
M.Helper.initialEnterReorgThreshold(~sourceMock=sourceMock100),
10551032
))
10561033

10571034
let callCount = ref(0)

0 commit comments

Comments
 (0)