添加度量时Prometheus空查询结果



我有一个奇怪的设置,需要将服务器中多个磁盘的读取速率相加。

这些查询中的每一个本身都很好,但当我用加号将它们相加时,我得到"0";空查询结果";

irate(node_disk_read_bytes_total{instance="10.0.0.10:9100", device="sdc"}[1m]) + irate(node_disk_read_bytes_total{instance="10.0.0.10:9100", device="sdd"}[1m])

需要注意的是,我不能只对所有设备求和,我只需要添加特定的设备。我对此很陌生,但不幸的是,这似乎是因为常见的单词而无法正确搜索的事情之一。或者我只是不知道该问什么问题。

也许指标没有及时排列?我尝试了这个:avg(metric1)-avg(metric2)而不是metric1-metric2,它似乎可以

Prometheus以以下方式执行算术运算,如q1 + q2

  1. 它执行q1q2
  2. 它从步骤1中获得的时间序列结果中剥离度量名称。例如,在该步骤之后,时间序列结果只有没有度量名称的标签
  3. 对于+左侧的每个时间序列,它搜索具有相同label="value"对集合的+右侧的相应时间序列。如果找不到匹配的对,则跳过左侧的系列
  4. 如果找到了+右侧的匹配序列,则Prometheus将每个点时间戳的序列对的点值相加
  5. 如果+左侧存在未处理的序列,则转到3
  6. 返回生成的序列

有关详细信息,请参阅这些文档。

在您的情况下,查询返回空结果,因为+左侧的序列包含标签device="sdc",而+右侧的序列包含标记device="sdd"。这意味着普罗米修斯无法定位具有相同标签集的+左侧和右侧的序列对。请参阅上面算法中的步骤3。

这个问题有以下几种解决方法:

  1. 要使用单个系列选择器选择所需的系列,并将其包装到sum()中:
sum(

rate(node_disk_read_bytes_total{instance="10.0.0.10:9100", device=~"sdc|sdd"}[1m])
)
  1. 要将ignoring修饰符与+运算符一起使用,以指示Prometgeus在搜索具有相同标签集的匹配序列对时忽略device标签:
rate(node_disk_read_bytes_total{instance="10.0.0.10:9100", device="sdc"}[1m])
+ ignoring(device)
rate(node_disk_read_bytes_total{instance="10.0.0.10:9100", device="sdd"}[1m])

有关详细信息,请参阅这些文档。

附言:不建议使用irate()功能,因为它不会捕获尖峰。它只是返回在原始样本的跳跃子集上计算的结果,因此它可能在每次图形刷新时返回完全不同的结果。有关详细信息,请参阅本文。

最新更新