Prometheus:按label分组双指标并统计符合条件的集合数
统计满足所有实例值与预期值一致的集合数量(PromQL实现)
实现思路
要统计符合条件的set_id数量,需分三步完成:
- 关联指标并计算差值:将每个
levels时间序列与对应set_id的levels_expected关联,计算两者差值的绝对值,统一捕捉大于/小于预期的情况。 - 按集合分组校验:对每个
set_id,取该集合下所有实例差值绝对值的最大值——若最大值为0,说明该集合下所有实例的levels值都等于对应预期值。 - 统计符合条件的集合数:筛选出最大值为0的
set_id,统计其总数量。
最终PromQL查询语句
count by() ( max by(set_id) ( abs(levels - on(set_id) group_left() levels_expected) ) == 0 )
语句拆解
levels - on(set_id) group_left() levels_expected:通过on(set_id)匹配两个指标,group_left()确保每个带instance_id的levels序列都能关联到对应set_id的levels_expected,计算两者差值。abs(...):将差值转为绝对值,消除正负差异的影响。max by(set_id):按set_id分组,取每组内所有实例差值绝对值的最大值——只要有一个实例不符合条件,最大值就会大于0。... == 0:筛选出所有差值最大值为0的set_id,即所有实例均符合条件的集合。count by():统计这些符合条件的set_id的总数量。
示例验证
针对你提供的示例数据:
- set_id=1:存在实例值不等于预期,差值最大值为1 → 不符合
- set_id=2:所有实例值等于预期,差值最大值为0 → 符合
- set_id=3:存在实例值不等于预期,差值最大值为1 → 不符合
- set_id=4:所有实例值等于预期,差值最大值为0 → 符合
最终查询返回结果为2,与预期一致。
内容的提问来源于stack exchange,提问作者frenzy
相关产品推荐
相关产品推荐

