PromQL查询异常:仅当B超阈值时累加A指标值却返回0
问题分析与解决方法
原查询的错误点
- 运算符逻辑误用:你用的
and是PromQL的逻辑与运算符,它要求左右两边的时间序列在同一时刻同时满足条件才会返回结果。sum_over_time(homeassistant_sensor_power_w{entity="sensor.sonoff_1001691285_power"}[24h])是计算A指标过去24小时的总求和(一个瞬时值),而homeassistant_sensor_power_w{entity="sensor.sunsynk_grid_power"} > 20是判断当前时刻B指标是否超过20,两者结合后只会在当前B满足条件时返回A的总求和,否则返回0——这完全不符合你“仅当B超过20的时间段内对A求和”的需求。 - 实体标识错误:你提供的A指标实体是
sensor.sonoff_power,但查询里写的是sensor.sonoff_1001691285_power,这会导致查询不到正确的A指标数据,也是返回0的可能原因之一。
正确的PromQL查询
要实现“24小时内,仅当B超过20时对A的数值求和”,需要先过滤出A中对应时刻B满足条件的样本,再对这些样本求和:
sum_over_time( homeassistant_sensor_power_w{entity="sensor.sonoff_power"} * on(instance, job) group_left() (homeassistant_sensor_power_w{entity="sensor.sunsynk_grid_power"} > bool 20) [24h] )
逻辑说明
homeassistant_sensor_power_w{entity="sensor.sunsynk_grid_power"} > bool 20:将B指标转换为布尔时间序列——当B>20时,序列值为1;否则为0(bool关键字显式返回布尔值)。* on(instance, job) group_left():将A指标和上述布尔序列按instance和job标签关联相乘,这样A中只有对应时刻B>20的样本会保留原数值,其余时刻的数值被置为0。sum_over_time(...[24h]):对相乘后的序列做24小时的时间范围求和,最终结果就是A在B超过20的时间段内的总数值。
内容的提问来源于stack exchange,提问作者TheKamakaZi
相关产品推荐
相关产品推荐

