如何基于指定PromQL时间序列计算服务异常时间占比?
计算Ingestion服务异常时间占比的PromQL实现
前提说明
你已通过以下PromQL生成异常状态指标:
sum(ALERTS{alertname="IngestionStopped", alertstate="firing"} unless on(table) (ALERTS{alertname="MyAlert1",alertstate="firing"} OR ALERTS{alertname="MyAlert2",alertstate="firing"}) OR vector(0))
该指标值为0时服务运行正常,大于0时表示存在异常分区。
实现方法
要计算指定时间范围内的异常时间占比,核心是将异常状态转为布尔值后统计持续时长,再除以总时长,对应的PromQL如下:
基于Grafana时间范围变量的写法(通用场景)
(sum_over_time( (sum(ALERTS{alertname="IngestionStopped", alertstate="firing"} unless on(table) (ALERTS{alertname="MyAlert1",alertstate="firing"} OR ALERTS{alertname="MyAlert2",alertstate="firing"}) OR vector(0)) > 0)[$__range:] ) / $__range) * 100
各部分解释:
(指标 > 0):将原指标转为布尔值,异常时输出1,正常时输出0sum_over_time(...)[$__range:]:统计当前面板时间范围内($__range为Grafana内置变量)所有异常采样点的总和,即异常持续的总秒数(默认采样间隔为1秒)- 除以
$__range(时间范围总秒数)再乘100,得到占比百分比
手动指定时间范围的写法(例如最近24小时)
(sum_over_time( (sum(ALERTS{alertname="IngestionStopped", alertstate="firing"} unless on(table) (ALERTS{alertname="MyAlert1",alertstate="firing"} OR ALERTS{alertname="MyAlert2",alertstate="firing"}) OR vector(0)) > 0)[24h:] ) / (24 * 3600)) * 100
注意事项
- 若Prometheus采样间隔不是1秒,需将
sum_over_time的结果除以采样间隔,再除以总时间秒数,保证计算准确 - 也可使用
count_over_time统计异常采样点数量,再乘以采样间隔得到总异常时间,逻辑与上述一致
内容的提问来源于stack exchange,提问作者Prashant Pandey
相关产品推荐
相关产品推荐

