如何在Prometheus告警规则中动态展示挂载点剩余磁盘GB值
解决AlertManager告警模板中关联对应挂载点磁盘可用GB值的问题
你遇到的核心问题是:当前的query调用没有过滤出与告警绑定的特定挂载点,导致返回所有挂载点的node_filesystem_avail_bytes数据,无法匹配到当前告警的目标挂载点。
要精准关联到对应挂载点的磁盘可用空间,只需要在query执行的PromQL中加入mountpoint标签的过滤条件,利用告警自带的$labels.mountpoint来锁定对应的指标即可。
修改后的完整告警规则
alert: OutOfDiskSpace expr: node_filesystem_free_bytes / node_filesystem_size_bytes * 100 < 10 for: 1m labels: severity: Critical annotations: description: |- Disk is almost full (< 10% left) Instance: {{ $labels.instance_short }} Mountpoint: {{ $labels.mountpoint }} Available Space: {{ printf "node_filesystem_avail_bytes{mountpoint=\"%s\"} / 1024 / 1024 / 1024" $labels.mountpoint | query | first | value | humanize }} GB
关键修改细节
- 挂载点精准过滤:在
printf生成的PromQL中,通过{mountpoint=\"%s\"}将当前告警的$labels.mountpoint作为过滤条件,确保query只拉取该挂载点对应的磁盘可用字节数,完美匹配当前告警的上下文。 - 友好化数值展示:
humanize函数会把原始字节计算后的数值转换成易读格式(比如将1288490188转为1.2),最后手动加上GB单位让告警信息更直观。 - 排版优化:用
|-定义多行的description,让告警内容的层级更清晰,可读性更强。
额外注意事项
- 确认你的
node_exporter确实暴露了mountpoint标签,且标签值与告警规则中$labels.mountpoint完全一致(注意路径格式、大小写,比如/和/data的区别)。 - 如果环境中有多台实例,还可以追加
instance标签过滤,比如{instance="{{ $labels.instance }}", mountpoint="{{ $labels.mountpoint }}"},避免跨实例的指标混淆。
内容的提问来源于stack exchange,提问作者a1dude




