Prometheus 1:1 Join场景下添加额外标签及group_left用法疑问
Prometheus Join查询标签保留问题
背景指标
Metric1
{"metric":{"namespace":"ns1", "instance_id":"someid", "label2":"somevalue", "label4":"somethingelse"},"values":[[1675145655,"1"]]}
Metric2
{"metric":{"namespace":"ns1", "instance_id":"someid", "label3":"someothervalue"},"values":[[1675145655,"1"]]}
两个指标均包含namespace和instance_id标签,还有各自的额外标签(label2、label3、label4)。
尝试的查询
无group修饰符的1:1 Join
(metric1{namespace="ns1"} == 1) * on (namespace, instance_id) (metric2{namespace="ns1", label3="something"} == 1)
该查询无法保留Metric1中独有的额外标签。
使用group_left()修饰符后的查询
(metric1{namespace="ns1"} == 1) * on (namespace, instance_id) group_left() (metric2{namespace="ns1", label3="something"} == 1)
结果:
{"metric":{"label2":"somevalue", "label4":"somethingelse"},"values":[[1675145655,"1"]]}
疑问
- 1:1 Join场景下,是否必须使用group类修饰符才能保留额外标签?
- 按照文档描述,group_left后的标签列表应保留"one"侧的指定标签,但我使用
group_left(label2)时,结果反而缺失了label2,只保留了label4,这是否符合预期?
解答
问题1
没错,1:1 Join场景下必须用group_left()或group_right()这类修饰符才能保留非连接键的额外标签。
Prometheus默认的Join逻辑(不带group修饰符)只保留on()里指定的连接标签,它默认认为两边的标签完全匹配,不需要保留额外标签。哪怕是1:1的匹配,你也得明确用group_left()(保留左侧指标的额外标签)或group_right()(保留右侧指标的额外标签),才能让Prometheus保留非连接标签。
问题2
这种情况不符合预期,大概率是操作时的语句有误。
按照文档,group_left(label2)应该只保留左侧指标的label2标签(加上连接键标签)。你说结果只保留了label4,可能是写查询时把标签名写错了,比如误写成group_left(label4),或者有其他过滤条件干扰了结果。正常情况下指定group_left(label2),结果里应该包含label2,而非label4。
内容的提问来源于stack exchange,提问作者Djoby
相关产品推荐
相关产品推荐

