如何在Prometheus中基于阈值统计高功耗设备用电量并实现单调计数?
PromQL查询修改方案
原查询背景
当前用来获取本年度电网耗电量(单位:kWh)的PromQL查询:
sum_over_time( (sum_over_time(wattage_v1[1m])*360/1000/count_over_time(wattage_v1[1m]))[1y:1h] )
补充:下面这个查询结果和上面基本一致:
sum_over_time(wattage_v1[1y:1h])*360/1000
指标wattage_v1每15秒到1分钟上报一次功率读数(实际对应1/360瓦),现有查询运行正常。
需求1:只统计超过阈值的功率耗电量
要估算某台间歇大功率设备的年度耗电量,仅对超过4000瓦的功率值求和,有两种可行方案:
方案一:用clamp_min过滤低阈值数值
把低于4000瓦的数值直接置为0,再进行累计求和:
sum_over_time(clamp_min(wattage_v1, 4000)[1y:1h])*360/1000
方案二:布尔过滤后映射有效数值
先筛选出超过阈值的样本,再将这些样本保留原数值,其余设为0:
sum_over_time((wattage_v1 > 4000) * wattage_v1[1y:1h])*360/1000
注意:如果wattage_v1的原始值是1/360瓦,那实际4000瓦对应的原始指标值是4000*360,需要根据实际情况调整阈值。
需求2:实现时段内单调递增的耗电量计数器
当设置的时间范围(比如把1y改成1d)小于已有数据范围时,图表不单调递增,这是因为sum_over_time的窗口计算存在边界问题。要实现单调递增的累计计数器,可参考以下方案:
方案一:用increase结合累计求和
increase计算指标在小时窗口内的增量,再用sum_over_time累计所有增量:
sum_over_time(increase(wattage_v1[1h])[1y:1h])*360/1000
方案二:用running_sum(部分兼容系统支持)
像VictoriaMetrics这类Prometheus兼容系统支持running_sum函数,可直接计算累计值:
running_sum(sum_over_time(wattage_v1[1h]))*360/1000
方案三:基于时段起始点的累计计算
如果是在Grafana中展示,可利用变量设置从时段起始到每个时间点的累计:
sum_over_time(wattage_v1[$__range_start:$__interval])*360/1000
这样每个数据点都是从时段开始到当前时刻的累计耗电量,自然保持单调递增。
内容的提问来源于stack exchange,提问作者kellerkindt
相关产品推荐
相关产品推荐

