如何在 Prometheus 查询中组合单独的时间序列标签?

jmr*_*cha 5 prometheus promql

我有以下时间序列条目。

ifDescr{ifDescr="GigabitEthernet1/1",ifIndex="1",instance="x.x.x.x",job="snmp"} 1
ifDescr{ifDescr="GigabitEthernet1/2",ifIndex="2",instance="x.x.x.x",job="snmp"} 1
ifDescr{ifDescr="GigabitEthernet5/3",ifIndex="3",instance="x.x.x.x",job="snmp"}
ifHCInOctets{ifIndex="1",instance="x.x.x.x",job="snmp"}
ifHCInOctets{ifIndex="2",instance="x.x.x.x",job="snmp"}
ifHCInOctets{ifIndex="2",instance="x.x.x.x",job="snmp"}
Run Code Online (Sandbox Code Playgroud)

照原样,我无法判断哪个索引与哪个描述匹配,这让事情变得混乱。

有没有办法基本上将上述标签ifIndex与 ifDesc 标签关联起来?或者该工作可用于将两个时间序列联系在一起?

我已经查看了该group_left功能,但无法弄清楚如何使其工作以组合/聚合标签。

bri*_*zil 7

在这种情况下,您需要类似的东西 rate(ifHCInOctets[5m]) * ignoring(ifDescr) group_left(ifDescr) ifDescr

解释:

Prometheus 只会让您对系列之间的操作使用分组。的值ifDescr始终为“1”,因此乘法是安全的。

ignoring子句意味着不要使用ifDescr标签进行匹配(因为它仅在系列之一上)。ifIndexinstance并且job将被使用。

group_left正在指定您想要的系列标签ifDescr。在这种情况下,它们具有相同的名称。

<vector expr> <bin-op> ignoring(<label list>) group_left(<label list>) <vector expr>
Run Code Online (Sandbox Code Playgroud)

参考:https : //prometheus.io/docs/prometheus/latest/querying/operators/#many-to-one-and-one-to-many-vector-matches

  • 这有效,但我不知道如何。你愿意经历一些吗? (3认同)