我有一个奇怪的设置,需要将服务器中多个磁盘的读取速率相加。
这些查询中的每一个本身都很好,但当我用加号将它们相加时,我得到"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
:
- 它执行
q1
和q2
- 它从步骤1中获得的时间序列结果中剥离度量名称。例如,在该步骤之后,时间序列结果只有没有度量名称的标签
- 对于
+
左侧的每个时间序列,它搜索具有相同label="value"
对集合的+
右侧的相应时间序列。如果找不到匹配的对,则跳过左侧的系列 - 如果找到了
+
右侧的匹配序列,则Prometheus将每个点时间戳的序列对的点值相加 - 如果
+
左侧存在未处理的序列,则转到3 - 返回生成的序列
有关详细信息,请参阅这些文档。
在您的情况下,查询返回空结果,因为+
左侧的序列包含标签device="sdc"
,而+
右侧的序列包含标记device="sdd"
。这意味着普罗米修斯无法定位具有相同标签集的+
左侧和右侧的序列对。请参阅上面算法中的步骤3。
这个问题有以下几种解决方法:
- 要使用单个系列选择器选择所需的系列,并将其包装到
sum()
中:
sum(
rate(node_disk_read_bytes_total{instance="10.0.0.10:9100", device=~"sdc|sdd"}[1m])
)
- 要将
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()
功能,因为它不会捕获尖峰。它只是返回在原始样本的跳跃子集上计算的结果,因此它可能在每次图形刷新时返回完全不同的结果。有关详细信息,请参阅本文。