Skip to content

Commit 79d26be

Browse files
mo4islonaclaude
andcommitted
add prometheus metrics for query types and worker threads
New metrics: - sqd_hotblocks_cache_queries_total: queries served from cache - sqd_hotblocks_below_queries_total: queries below cache (spawn worker) - sqd_hotblocks_active_workers: currently active worker threads Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
1 parent 43bdfd2 commit 79d26be

4 files changed

Lines changed: 47 additions & 2 deletions

File tree

evm/evm-data-service/src/main.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,7 @@ runProgram(async () => {
8282
}
8383

8484
let mainWorker = new WorkerClient(dataSourceOptions)
85+
let service: Awaited<ReturnType<typeof runDataService>> | undefined
8586
let dataSource: DataSource<Block> = {
8687
getHead() {
8788
return mainWorker.getHead()
@@ -91,9 +92,11 @@ runProgram(async () => {
9192
},
9293
async *getFinalizedStream(req: StreamRequest): BlockStream<Block> {
9394
let worker = new WorkerClient(dataSourceOptions)
95+
service?.metrics.incActiveWorkers()
9496
try {
9597
yield* worker.getFinalizedStream(req)
9698
} finally {
99+
service?.metrics.decActiveWorkers()
97100
worker.close()
98101
}
99102
},
@@ -102,7 +105,7 @@ runProgram(async () => {
102105
}
103106
}
104107

105-
let service = await runDataService({
108+
service = await runDataService({
106109
source: dataSource,
107110
blockCacheSize: args.blockCacheSize,
108111
port: args.port

util/util-internal-data-service/src/data-service.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,8 +54,10 @@ export class DataService {
5454

5555
async query(from: number, parentHash?: string): Promise<DataResponse | InvalidBaseBlock> {
5656
if (from <= this.chain.firstBlock().parentNumber) {
57+
this.metrics.incBelowQueries()
5758
return this.belowQuery(from, parentHash)
5859
} else {
60+
this.metrics.incCacheQueries()
5961
let res = this.chain.query(from, parentHash)
6062
if (res instanceof InvalidBaseBlock) return res
6163
if (res.tail) return res

util/util-internal-data-service/src/index.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import {BlockBatch, BlockStream, DataSource, StreamRequest} from '@subsquid/util
22
import {ListeningServer} from '@subsquid/util-internal-http-server'
33
import {DataService} from './data-service'
44
import {createHttpApp} from './http-app'
5+
import {Metrics} from './metrics'
56
import {Block, BlockHeader, BlockRef} from './types'
67

78

@@ -12,6 +13,7 @@ export {
1213
BlockRef,
1314
BlockStream,
1415
DataSource,
16+
Metrics,
1517
StreamRequest
1618
}
1719

@@ -23,7 +25,7 @@ export interface DataServiceOptions {
2325
}
2426

2527

26-
export async function runDataService(args: DataServiceOptions): Promise<ListeningServer & {started: Promise<void>}> {
28+
export async function runDataService(args: DataServiceOptions): Promise<ListeningServer & {started: Promise<void>, metrics: Metrics}> {
2729
let service = new DataService(args.source, args.blockCacheSize ?? 1000)
2830
let app = createHttpApp(service)
2931

@@ -34,6 +36,7 @@ export async function runDataService(args: DataServiceOptions): Promise<Listenin
3436

3537
return {
3638
started: service.started(),
39+
metrics: service.metrics,
3740
port: server.port,
3841
close(): Promise<void> {
3942
service.stop()

util/util-internal-data-service/src/metrics.ts

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,9 @@ export class Metrics {
1111
private hotBlocksStoredBlocksGauge: Gauge
1212
private blockLagHistogram: Histogram
1313
private blockProcessingTimeHistogram: Histogram
14+
private cacheQueriesCounter: Counter
15+
private belowQueriesCounter: Counter
16+
private activeWorkersGauge: Gauge
1417

1518
constructor() {
1619
this.hotBlocksLastBlockGauge = new Gauge({
@@ -57,6 +60,24 @@ export class Metrics {
5760
registers: [this.registry]
5861
});
5962

63+
this.cacheQueriesCounter = new Counter({
64+
name: 'sqd_hotblocks_cache_queries_total',
65+
help: 'Total number of queries served from cache',
66+
registers: [this.registry],
67+
})
68+
69+
this.belowQueriesCounter = new Counter({
70+
name: 'sqd_hotblocks_below_queries_total',
71+
help: 'Total number of below-cache queries (require worker thread)',
72+
registers: [this.registry],
73+
})
74+
75+
this.activeWorkersGauge = new Gauge({
76+
name: 'sqd_hotblocks_active_workers',
77+
help: 'Number of currently active worker threads',
78+
registers: [this.registry],
79+
})
80+
6081
collectDefaultMetrics({register: this.registry})
6182
}
6283

@@ -95,6 +116,22 @@ export class Metrics {
95116
const duration = Date.now() - startTime;
96117
this.blockProcessingTimeHistogram.observe(duration);
97118
}
119+
120+
incCacheQueries() {
121+
this.cacheQueriesCounter.inc()
122+
}
123+
124+
incBelowQueries() {
125+
this.belowQueriesCounter.inc()
126+
}
127+
128+
incActiveWorkers() {
129+
this.activeWorkersGauge.inc()
130+
}
131+
132+
decActiveWorkers() {
133+
this.activeWorkersGauge.dec()
134+
}
98135
}
99136

100137
class BlockTimestampCache {

0 commit comments

Comments
 (0)