如何检测指定时段内单调递增的Prometheus Gauge指标
针对Gauge指标持续单调递增的检测方案
完全可以通过PromQL原生函数实现该检测能力,无需额外部署组件,可直接对接Grafana告警,识别空调停机这类温度持续上涨的异常场景。
核心判定逻辑
不需要追求数学定义上的绝对严格单调,工程落地只要满足三个条件即可覆盖绝大多数真实场景,同时压低误报率:
- 指定时间窗口内,指标没有出现超过传感器误差范围的下跌
- 窗口整体涨幅超过日常正常波动阈值,避免平值、浮点计算误差误报
- 窗口内最小值出现在窗口前期、最大值出现在窗口后期,排除先涨后跌、V型波动的非单调场景
不同时间窗口的PromQL实现
短窗口场景(数分钟级,比如5分钟检测)
用idelta函数逐点计算相邻采样点的差值,精准识别每一次下跌,适合短时间快速告警的场景,示例配置(以温度指标room_temperature_celsius为例,判定5分钟内持续上涨):
( # 统计5分钟窗口内,温度出现超过0.1℃下跌的采样点数量,结果为0代表无有效下跌 count_over_time(idelta(room_temperature_celsius[1m]) < -0.1[5m:]) == 0 ) and ( # 校验5分钟内累计涨幅超过0.5℃,过滤无实际变化的平值场景 room_temperature_celsius - room_temperature_celsius offset 5m > 0.5 )
参数调整说明:
idelta后的[1m]需要根据实际抓取间隔调整,保证覆盖至少2个采样周期即可,比如抓取间隔是30s就设为1m,抓取间隔是1m就设为2m- 下跌判定阈值
-0.1、累计涨幅阈值0.5可以根据传感器精度、日常温度波动范围调整,比如工业级传感器精度高可以把下跌阈值设为-0.05
长窗口场景(数小时级,比如2小时检测)
逐点计算差值会增加Prometheus查询负载,长窗口场景可以结合线性回归斜率、最值位置判断,性能更好,示例配置:
( # 2小时窗口内温度线性回归斜率大于0.1℃/小时,代表整体呈明确上涨趋势 deriv(room_temperature_celsius[2h]) > 0.1/3600 ) and ( # 2小时内最低温度出现在窗口最初10分钟,排除中途下跌的场景 min_over_time(room_temperature_celsius[2h]) == min_over_time(room_temperature_celsius[10m] offset 1h50m) ) and ( # 2小时内最高温度出现在窗口最后10分钟,排除中途涨完回落的场景 max_over_time(room_temperature_celsius[2h]) == max_over_time(room_temperature_celsius[10m]) ) and ( # 2小时累计涨幅超过2℃,过滤微小波动 room_temperature_celsius - room_temperature_celsius offset 2h > 2 )
Grafana告警配置注意事项
- 直接将上述调试好的PromQL填入告警查询面板,触发条件设置为查询结果
>0即可 - 建议给告警规则加1-2分钟的
for等待时长,过滤单次采样异常导致的误报 - 如果部署了多台温度传感器,可以在指标后加对应聚合逻辑,比如按机房维度
avg by (room_id)统计平均温度,避免单传感器故障误报
内容的提问来源于stack exchange,提问作者Vlad
相关产品推荐
相关产品推荐

