You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于指定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,正常时输出0
  • sum_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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 04:32:24