SubQuery服务健康检查:自定义区块链索引健康指标
为什么需要健康检查?
区块链索引服务面临两大核心健康挑战:数据同步停滞和处理性能下降。SubQuery通过内置的健康检查机制(HealthService)持续监控索引器状态,确保数据处理流程正常运行。默认配置下,系统会每60秒执行一次健康评估(CHECK_HEALTH_INTERVAL常量定义),并通过Prometheus暴露关键指标。
核心健康指标解析
1. 区块同步状态
健康检查的核心逻辑位于HealthService.getHealth()方法,主要监控两个关键参数:
- 区块时间阈值:默认6秒(DEFAULT_BLOCK_TIME),可通过
blockTime配置项调整 - 健康超时阈值:默认15分钟(DEFAULT_TIMEOUT),基于
timeout配置项计算
当节点超过10倍区块时间未同步新块,或处理单个区块耗时超过健康超时阈值时,系统会标记索引器为不健康状态。
2. 健康状态存储
健康状态通过StoreService持久化到元数据存储:
await this.storeService.modelProvider.metadata.model.upsert({
key: 'indexerHealthy',
value: healthy
});
这种设计确保服务重启后仍能恢复历史健康状态记录,便于长期监控分析。
自定义健康检查配置
配置参数说明
在项目配置文件中,可通过以下参数调整健康检查行为:
| 参数名 | 说明 | 默认值 |
|---|---|---|
timeout | 单个区块处理超时(秒) | 15分钟 |
blockTime | 预期区块间隔时间(毫秒) | 6秒 |
配置示例
# project.yaml
network:
endpoint: wss://polkadot.api.onfinality.io/public-ws
timeout: 120 # 超时设为2分钟
blockTime: 12000 # 适用于12秒出块的网络
监控指标集成
SubQuery通过Prometheus模块(MetaModule)提供标准化指标导出:
import {PrometheusModule} from '@willsoto/nestjs-prometheus';
@Module({
imports: [PrometheusModule.register(), CoreModule],
controllers: [HealthController, MetaController],
providers: [...gaugeProviders, HealthService]
})
export class MetaModule {}
默认集成的指标包括区块处理延迟、索引进度和数据库连接状态等,可通过/metrics端点访问。
关键指标列表
subql_indexer_healthy:布尔型指标,表示当前索引器健康状态subql_block_height:当前已处理的区块高度subql_block_processing_time:区块处理耗时分布
可视化与告警配置
Grafana监控面板
结合Prometheus收集的指标,可构建自定义Grafana面板监控索引器健康状态。典型监控面板应包含:
- 实时区块同步状态
- 健康状态历史变化曲线
- 处理延迟分布热力图
- 不健康状态告警阈值线
告警规则示例
推荐配置以下Prometheus告警规则:
groups:
- name: subql_health
rules:
- alert: IndexerUnhealthy
expr: subql_indexer_healthy == 0
for: 5m
labels:
severity: critical
annotations:
summary: "索引器健康状态异常"
description: "索引器已持续5分钟处于不健康状态"
健康检查扩展点
高级用户可通过以下方式扩展健康检查功能:
- 自定义健康指标:通过gaugeProviders添加新的Prometheus指标
- 健康事件监听:实现MetricEventListener处理健康状态变化事件
- 自定义健康控制器:扩展HealthController添加自定义健康检查端点
最佳实践建议
-
网络适配:根据目标区块链特性调整
blockTime参数,例如:- 类似网络:15秒
- 波卡网络:6秒
- Cosmos网络:7秒
-
资源监控:结合服务器级监控(CPU/内存/磁盘IO)综合判断健康状态,避免仅依赖链上指标
-
告警分级:建立多级告警机制,区分警告(轻微延迟)和严重(完全停滞)状态
-
定期审计:通过
indexerHealthy元数据键查询历史健康状态:
SELECT * FROM metadata WHERE key = 'indexerHealthy';
通过以上配置和实践,SubQuery索引服务可以保持高可用性,及时发现并响应潜在的健康问题,确保区块链数据处理的连续性和准确性。
转载自 CSDN-专业IT技术社区
原文链接:https://blog.csdn.net/gitblog_00605/article/details/152774908



