如何在Prometheus中复用查询实例展示需关注磁盘的预测与实际指标?
问题描述
我正在制作磁盘空间预测监控仪表盘,现有如下Prometheus查询:
predict_linear( (1-(disk_volume_available_bytes{instance=~"$server"} / disk_volume_total_bytes{instance=~"$server"}))[32d:1d], 864000 ) > 0.95
该查询能筛选出需要关注的磁盘——也就是预测10天后使用率超过95%的磁盘。我想通过另一个查询复用这些磁盘实例,获取它们的实际使用指标,只展示预测使用率超95%的磁盘的预测线和实际数据,低于95%的就不显示。请问这能做到吗?
解决方案
当然可行,用PromQL的标签匹配和关联逻辑就能实现,核心就是用你筛选出的高风险磁盘实例作为条件,关联实际使用率和预测指标。
方法1:用and直接筛选
最简单的方式是把原筛选查询和实际指标做逻辑与操作,自动保留标签匹配的实例:
查符合条件磁盘的实际使用率
(1 - disk_volume_available_bytes{instance=~"$server"} / disk_volume_total_bytes{instance=~"$server"}) and predict_linear( (1-(disk_volume_available_bytes{instance=~"$server"} / disk_volume_total_bytes{instance=~"$server"}))[32d:1d], 864000 ) > 0.95
查符合条件磁盘的预测使用率
predict_linear( (1-(disk_volume_available_bytes{instance=~"$server"} / disk_volume_total_bytes{instance=~"$server"}))[32d:1d], 864000 ) and predict_linear( (1-(disk_volume_available_bytes{instance=~"$server"} / disk_volume_total_bytes{instance=~"$server"}))[32d:1d], 864000 ) > 0.95
这种写法会自动匹配所有标签(比如instance、mountpoint)一致的时间序列,只展示达标的磁盘数据。
方法2:用group_left减少重复计算
如果不想重复写predict_linear的逻辑,可以先把预测结果存成临时序列,再关联实际指标:
# 先得到筛选后的预测结果 predict_result = predict_linear( (1-(disk_volume_available_bytes{instance=~"$server"} / disk_volume_total_bytes{instance=~"$server"}))[32d:1d], 864000 ) > 0.95 # 关联实际使用率,只保留符合条件的实例 (1 - disk_volume_available_bytes{instance=~"$server"} / disk_volume_total_bytes{instance=~"$server"}) group_left() predict_result
这种写法更简洁,避免重复计算,适合在Grafana这类工具里用(大部分支持PromQL的变量定义)。
注意点
- 确保两个查询的标签完全匹配,比如
instance、mountpoint、device这些标签都得一致,不然关联会失败; - 如果你的磁盘指标有额外标签,不用额外处理,PromQL会自动匹配所有相同标签的序列;
- 在Grafana里还可以把筛选后的预测查询做成变量,其他面板直接引用这个变量的实例列表,进一步复用筛选逻辑。
内容的提问来源于stack exchange,提问作者Ben Thul
相关产品推荐
相关产品推荐

