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

如何编写Prometheus查询实现指标持续超阈值告警

Prometheus 指标持续高于阈值的判断方法

告警场景优先使用原生for配置

Prometheus 告警规则原生提供了持续状态判断能力,不需要在查询语句中做复杂的时间窗口计算,是最稳定可靠的实现方式:

  • 告警表达式仅需判断指标当前值满足阈值要求
  • 规则中添加for: 10m配置,代表只有当表达式结果连续10分钟均为真时,才会触发告警
    示例告警规则:
groups:
- name: custom_metric_alerts
  rules:
  - alert: MetricAboveZeroFor10Mins
    expr: name_of_metric{job="name_of_release"} > 0
    for: 10m
    labels:
      severity: warning
    annotations:
      description: "指标已连续10分钟持续大于0"

Prometheus 会按照规则评估周期(默认15秒)执行表达式查询,只要对应时间序列在连续10分钟的所有评估中都满足>0的条件,才会触发告警,完全匹配持续阈值判断的需求。

纯查询场景使用min_over_time实现

如果需要在临时查询、可视化面板中直接得到「过去10分钟全程大于0」的结果,不需要依赖告警规则的for逻辑,可以使用min_over_time函数:只要指定时间窗口内指标的最小值大于0,就证明窗口内所有采样点都满足大于0的要求。
基础查询语句:

min_over_time(name_of_metric{job="name_of_release"}[10m]) > 0

如果需要先对指标做聚合,再判断聚合后的值是否持续满足阈值,需要搭配子查询语法使用:

min_over_time(sum by (job) (name_of_metric{job="name_of_release"})[10m:]) > 0

子查询语法中[10m:]代表取过去10分钟的聚合结果,步长留空时会使用全局默认的评估步长。

原平均值方案的问题

之前使用sum_over_time / count_over_time计算窗口平均值的逻辑存在天然缺陷:只要10分钟窗口内任意一个采样点的值大于0,哪怕其余所有点的值都为0,最终计算出的平均值都会大于0,根本无法识别「整个时间段内指标全程高于阈值」的场景。判断整个时间窗口的取值是否都满足阈值要求,必须取窗口内的极值做判断:判断下限阈值用min_over_time,判断上限阈值用max_over_time。

内容的提问来源于stack exchange,提问作者MattArgo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 16:36:26