Prometheus向量能否添加标签?如何在状态查询中保留指标标签
PromQL查询保留标签的解决方案
问题描述
使用以下PromQL查询时,预期实现:当receiver_audio_track_bitrate速率为0且sender_audio_track_bitrate速率大于0时,输出值为1的向量;否则输出值为0的向量。但当前生成的向量不包含两个指标的标签,需要保留这些标签或找到替代实现方案。
原查询:
(vector(1) and on() rate(receiver_audio_track_bitrate{pod_name=~"$pod",session_id=~"$session"}[$__rate_interval]) == 0) and on() (rate(sender_audio_track_bitrate{session_id=~"$session"}[$__rate_interval]) > 0)) or on() vector(0)
问题原因
原查询中使用on()进行无标签匹配,这会丢弃所有时间序列的标签信息,最终返回一个无标签的标量向量,这就是结果没有标签的核心原因。要保留标签,需要基于共同标签(比如session_id)进行匹配,让结果继承原指标的标签。
替代实现方案
方案1:布尔比较+标签匹配(兼容所有Prometheus版本)
通过bool修饰比较运算符,返回带标签的0/1向量,再基于共同标签关联两个指标,最后补充不满足条件时的0值并保留标签:
( # 接收端速率为0时返回带标签的1,否则返回0 rate(receiver_audio_track_bitrate{pod_name=~"$pod",session_id=~"$session"}[$__rate_interval]) == bool 0 ) and on(session_id) ( # 发送端速率大于0时返回带标签的1,否则返回0 rate(sender_audio_track_bitrate{session_id=~"$session"}[$__rate_interval]) > bool 0 ) or on(session_id,pod_name) ( # 不满足条件时返回带原接收端标签的0 ( rate(receiver_audio_track_bitrate{pod_name=~"$pod",session_id=~"$session"}[$__rate_interval]) != bool 0 or on(session_id) rate(sender_audio_track_bitrate{session_id=~"$session"}[$__rate_interval]) <= bool 0 ) * 0 )
说明:
== bool和> bool会保留原指标的标签,返回值为1(满足条件)或0(不满足)and on(session_id)确保只有session_id匹配的接收端和发送端记录才会被关联,结果继承接收端的pod_name和session_id标签- 最后一段
or处理所有不满足条件的情况,返回带相同标签的0值
方案2:使用if表达式(Prometheus v2.42+支持)
如果你的Prometheus版本在v2.42及以上,可以直接使用if...then...else表达式,语法更简洁,且自动保留原指标的标签:
if ( rate(receiver_audio_track_bitrate{pod_name=~"$pod",session_id=~"$session"}[$__rate_interval]) == 0 and on(session_id) rate(sender_audio_track_bitrate{session_id=~"$session"}[$__rate_interval]) > 0 ) then 1 else 0
说明:
- 条件中的第一个指标是
receiver_audio_track_bitrate,结果会自动继承它的pod_name和session_id标签 - 满足条件时返回1,否则返回0,所有标签都会被保留
内容的提问来源于stack exchange,提问作者tab1293
相关产品推荐
相关产品推荐

