如何通过多对一匹配为Prometheus向量关联标签并保留原有标签?
解决PromQL标签关联问题:将metric_2的label_3关联到metric_1
你的需求完全可行,问题出在之前的PromQL语句写法上。以下是正确的实现方式和解释:
正确语句
metric_1 * on(label_1) group_left(label_3) metric_2
为什么之前的语句报错?
你之前的语句metric_1 * on(label_1) group_left metric_2报错是因为未明确指定从右侧指标获取的标签,Prometheus需要明确知道你要保留哪些右侧标签。另外,虽然你的metric_2中label_1是唯一的(一对一匹配),但未指定group_left的目标标签时,Prometheus会默认尝试合并所有标签,可能触发误判的多对多匹配检查。
语句说明
on(label_1):指定仅通过label_1进行标签匹配group_left(label_3):表示保留左侧metric_1的所有标签(包括label_2),同时将右侧metric_2中匹配的label_3添加到结果中。这里group_left专门处理左侧一对多、右侧一对一的匹配场景(一个label_1对应多个metric_1序列,但仅对应一个metric_2序列),完全符合你的数据结构。
保留metric_1原始数值的优化
如果metric_2的数值对你无关紧要,只想保留metric_1的原始数值,可以用以下语句:
metric_1 * on(label_1) group_left(label_3) (metric_2 / metric_2)
通过metric_2 / metric_2将右侧数值转为1,相乘后不会改变metric_1的原始值。
结果验证
执行上述语句后,会得到你预期的结果:
metric_1{label_1="aaa",label_2="bba",label_3="cca"} metric_1{label_1="aaa",label_2="bbb",label_3="cca"} metric_1{label_1="aab",label_2="bba",label_3="ccb"} metric_1{label_1="aab",label_2="bbb",label_3="ccb"}
内容的提问来源于stack exchange,提问作者Боздомир Конфьюжен
相关产品推荐
相关产品推荐

