Prometheus向量运算报错:求各durable_name序列差值咨询
PromQL多对多匹配的差值计算解决方案
需求
针对每个durable_name,计算指标nss_chan_last_seq的max值与nss_chan_subs_last_sent的min值的差值。
原查询与报错
原last_seq查询
max(nss_chan_last_seq{channel="some-channel", instance=~"some-cluster-cl.*"}) by (channel)
原last_sent查询
min(nss_chan_subs_last_sent{channel="some-channel", durable_name=~"durable-name-s.*", durable_name!~".*test"}) by (channel, durable_name)
原运算语句
max(nss_chan_last_seq{channel="some-channel", instance=~"some-cluster-cl.*"}) by (channel) - on (channel) min(nss_chan_subs_last_sent{channel="some-channel", durable_name=~"durable-name-s-.*", durable_name!~".*test"}) by (channel, durable_name)
报错信息
execution: found duplicate series for the match group {channel="some-channel"} on the right hand-side of the operation: [{channel="some-channel", durable_name="durable-name-s16"}, {channel="some-channel", durable_name="durable-name-s14"}];many-to-many matching not allowed: matching labels must be unique on one side
解决方案
报错原因是PromQL默认禁止多对多匹配,此处左边单个channel对应一个聚合结果,右边单个channel对应多个durable_name的聚合结果,属于一对多匹配场景,需要用group_left显式声明匹配规则,并保留右侧独有的durable_name标签。
正确查询语句:
max(nss_chan_last_seq{channel="some-channel", instance=~"some-cluster-cl.*"}) by (channel) - on (channel) group_left(durable_name) min(nss_chan_subs_last_sent{channel="some-channel", durable_name=~"durable-name-s-.*", durable_name!~".*test"}) by (channel, durable_name)
说明
group_left(durable_name):指定以左侧的channel聚合结果为基准,匹配右侧所有同channel的durable_name聚合结果,同时保留右侧的durable_name标签。- 最终结果会包含
channel和durable_name两个标签,每个durable_name对应一条差值数据,完全满足需求。
内容的提问来源于stack exchange,提问作者Desa
相关产品推荐
相关产品推荐

