如何用PromQL计算储罐液位下降速率并忽略填充上升阶段
解决储罐液位下降速率计算问题(忽略填充阶段)
核心思路
要精准计算液位下降速率并排除填充时的正向干扰,核心是先过滤掉液位上升的时间段,仅保留下降阶段的样本数据,再针对不同时间窗口计算速率。
具体PromQL实现
1. 过滤液位上升的样本
利用delta()函数识别液位上升的区间,再通过unless操作符排除这些区间的样本,只保留下降阶段的数据(假设你的液位指标名为tank_level_percent):
tank_level_percent unless delta(tank_level_percent[1m]) > 0
- 说明:
delta(tank_level_percent[1m]) > 0会标记出液位上升的时间段,unless会剔除这些时段的样本,仅保留液位下降或平稳的区间。
2. 计算不同时间窗口的下降速率
基于过滤后的数据集,使用deriv()函数计算线性回归斜率(即下降速率),针对不同时间窗口配置如下:
- 3天窗口的下降速率:
deriv((tank_level_percent unless delta(tank_level_percent[1m]) > 0)[3d:1h])
- 10天窗口的下降速率:
deriv((tank_level_percent unless delta(tank_level_percent[1m]) > 0)[10d:1h])
- 30天窗口的下降速率:
deriv((tank_level_percent unless delta(tank_level_percent[1m]) > 0)[30d:1h])
- 60天窗口的下降速率:
deriv((tank_level_percent unless delta(tank_level_percent[1m]) > 0)[60d:1h])
- 说明:
[3d:1h]表示取过去3天的数据,步长设为1小时(可根据你的指标采集频率调整步长);deriv()会计算这段时间内的线性下降速率,数值为负代表液位下降。
3. 可选:排除填充后的平稳期
如果填充后有一段液位稳定的时期,不想将这段的“0速率”纳入统计,可以再加一层过滤,只保留负向速率:
deriv((tank_level_percent unless delta(tank_level_percent[1m]) > 0)[3d:1h]) < 0
Grafana配置建议
- 面板配置:选择Prometheus数据源,直接填入上述PromQL查询,可创建多个面板分别展示不同时间窗口的速率,或通过Grafana变量(比如设置
window变量,可选值为3d、10d等)实现窗口切换。 - 告警配置:基于计算出的速率设置阈值,比如当3天窗口的下降速率突然超过正常范围时触发告警,提前预警系统异常。
注意事项
delta()的时间窗口(如[1m])需与你的指标采集频率匹配,若填充是瞬间完成的,可缩小窗口至[30s],避免漏过填充事件。- 若液位下降是非线性的,可替换
deriv()为rate()结合反向计算,但deriv()在大多数储罐排空场景下已足够准确。
内容的提问来源于stack exchange,提问作者smokinjim
相关产品推荐
相关产品推荐

