如何基于Prometheus多低阶指标生成可扩展的高阶主机健康指标?
在Prometheus中模块化构建主机健康高阶指标
host_healthy 要实现模块化的主机健康指标,最佳方式是利用Prometheus的Recording Rules,将每个健康维度的判定逻辑拆分为独立模块,最后合并为最终的host_healthy指标。这种方式既方便修改规则,也便于后续扩展新的健康维度。
一、整体思路
将每个健康判定条件拆分为单独的中间得分指标(如disk_health_score、service_health_score),每个指标对应一个维度的健康状态得分(0.0-1.0),最后通过聚合逻辑合并所有维度得分,得到最终的host_healthy指标。
二、Recording Rules配置实现
在Prometheus的配置文件(如prometheus.yml)中添加以下规则组,每个模块独立定义,便于维护:
groups: - name: host_health_rules interval: 1m # 规则计算间隔,可根据监控需求调整 rules: # 模块1:磁盘空间健康得分 - record: disk_health_score expr: | # 先计算剩余磁盘空间:1 - 已用磁盘比例 (1 - disk_space_used) < 0.9 ? 1.0 : (1 - disk_space_used) > 0.99 ? 0.0 : 0.7 labels: module: disk # 模块2:服务在线状态健康得分 - record: service_health_score expr: | # 所有服务在线时,sum等于count(每个service_online值为1) sum by (host) (service_online) == count by (host) (service_online) ? 1.0 : 0.0 labels: module: service # 模块3:失败登录次数健康得分 - record: login_health_score expr: | # 统计最近15分钟内的失败登录增量,少于3次得1.0,否则0.0 increase(failed_login_attempts[15m]) < 3 ? 1.0 : 0.0 labels: module: login # 模块4:合并所有维度得分得到最终健康指标 - record: host_healthy expr: | # 取所有维度得分的最小值,确保任一维度不健康时整体健康状态降级 min by (host) ( disk_health_score, service_health_score, login_health_score ) labels: module: combined
三、各模块说明
磁盘空间模块:
- 通过
1 - disk_space_used计算剩余磁盘空间比例 - 按规则映射为对应得分:剩余<0.9得1.0,剩余>0.99得0.0,中间值得0.7
- 通过
服务在线模块:
- 对每个主机,统计所有
service_online指标的总和与数量,若相等则所有服务在线(得1.0),否则存在离线服务(得0.0)
- 对每个主机,统计所有
失败登录模块:
- 使用
increase()函数计算Counter类型指标的增量(最近15分钟),增量<3得1.0,否则得0.0 - 可根据需求调整时间范围(如
[5m]或[30m])
- 使用
合并模块:
- 使用
min by (host)取所有维度得分的最小值,确保只要有一个维度不健康(得分0),整体健康状态直接变为0.0;若磁盘状态为欠佳(0.7),其他维度正常,则整体得0.7,符合规则要求
- 使用
四、扩展与维护
- 修改规则:只需修改对应模块的
expr内容即可,例如调整磁盘剩余空间的阈值、失败登录的次数或时间范围 - 新增维度:添加新的中间得分模块(如内存使用率、CPU负载),然后在合并模块的
min()函数中加入新的得分指标 - Grafana展示:直接查询
host_healthy指标,使用时间线组件展示,无需在Grafana中编写复杂PromQL
内容的提问来源于stack exchange,提问作者MOnsDaR
相关产品推荐
相关产品推荐

