如何编写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
相关产品推荐
相关产品推荐

