减去利率和利率之和

Subtract rate and a sum of rates

具有网络传输指标,例如node_network_transmit_bytes_total 来自 nodeexporter 我想得到一个接口的传输速率(在我的例子中是 enp3s0)和所有桥接接口传输速率的总和之间的差异。

我有这样的东西:

irate(node_network_transmit_bytes_total{device="enp3s0"}[1m]) -  irate(node_network_transmit_bytes_total{device=~"br.*"}[1m])

但这没有给我任何数据点。

编辑

我已经尝试了 的建议,但我的情况有点不同,因为在右侧我有不止 1 个系列。

所以这个:

node_network_transmit_bytes_total{device="enp3s0"} - ignoring(device) node_network_transmit_bytes_total{device=~"br.*"}

产量:

Error executing query: found duplicate series for the match group {instance="192.168.X.Z:9100", job="nodeexporter"} on the right hand-side of the operation: [{name="node_network_transmit_bytes_total", device="br-XXXX", instance="192.168.X.Z:9100", job="nodeexporter"}, {name="node_network_transmit_bytes_total", device="br-5d6dce95c2b0", instance="192.168.X.Z:9100", job="nodeexporter"}];many-to-many matching not allowed: matching labels must be unique on one side

我试过使用 sum():

node_network_transmit_bytes_total{device="enp3s0"} - ignoring(device) sum(node_network_transmit_bytes_total{device=~"br.*"})

但这又没有结果。

EDIT2

我已经设法弄清楚如何通过

sum(node_network_transmit_bytes_total{device="enp3s0"}) by (instance) - sum (node_network_transmit_bytes_total{device=~"br.*"}) by (instance)

但我不能在上面使用 irate:

irate(sum(node_network_transmit_bytes_total{device="enp3s0"}) by (instance) - sum (node_network_transmit_bytes_total{device=~"br.*"}) by (instance))[5m]

Error executing query: 1:149: parse error: ranges only allowed for vector selectors

好的,这似乎是解决方案:

(sum(irate(node_network_receive_bytes_total{device="enp3s0"}[1m])) by (instance))
 -
(sum(irate(node_network_receive_bytes_total{device=~"br.*"}[1m])) by (instance))

首先推荐使用rate() instead of irate(), since irate() tends to return jumpy results - see this article详细

如果要计算名称以 br 开头的设备的每 instance 个网络传输速率总和,则必须使用以下查询:

sum(rate(node_network_transmit_bytes_total{device=~"br.*"}[1m])) by (instance)

有关详细信息,请参阅 sum() 文档。

enp3s0 设备的 rate(node_network_transmit_bytes_total{device="enp3s0"}[1m]) returns 每个 instance 网络传输速率。返回的时间序列可能包含 instance 标签以外的其他标签。因此以下查询 returns 为空结果,因为 time series matching rules for binary operators in Prometheus:

rate(node_network_transmit_bytes_total{device="enp3s0"}[1m])
  -
sum(rate(node_network_transmit_bytes_total{device=~"br.*"}[1m])) by (instance)

这可以通过两种方式解决:

  1. rate(node_network_transmit_bytes_total{device="enp3s0"}[1m])换成sum(...) by (instance)。这有效地从结果中删除了 instance 以外的所有标签,并允许在 -:
  2. 的左侧和右侧找到具有相同标签集的时间序列对
sum(rate(node_network_transmit_bytes_total{device="enp3s0"}[1m])) by (instance)
  -
sum(rate(node_network_transmit_bytes_total{device=~"br.*"}[1m])) by (instance)
  1. -运算符后添加on (instance)修饰符:
rate(node_network_transmit_bytes_total{device="enp3s0"}[1m])
  - on (instance)
sum(rate(node_network_transmit_bytes_total{device=~"br.*"}[1m])) by (instance)

这将保留 node_network_transmit_bytes_total 时间序列的所有原始标签。有关 on() 修饰符的详细信息,请参阅 these docs