如何通过Prometheus Node Exporter获取单个目录的磁盘空间信息?
关于Prometheus获取目录级磁盘空间的解决方案
原生Prometheus+Node Exporter无法直接查询目录级消耗
Node Exporter默认只提供挂载点维度的磁盘指标(比如你用到的node_filesystem_avail_bytes、node_filesystem_size_bytes),没有内置统计单个目录空间的能力,所以没法直接用PromQL拿到某个挂载点下顶级目录的具体消耗。
可行的替代方案
1. 自定义脚本+Node Exporter的textfile采集器
这是最通用的实现方式,步骤很直接:
- 写个Shell脚本,遍历目标挂载点的顶级目录,用
du -sb统计每个目录的字节数(方便Prometheus处理),输出成Prometheus格式的文本:# 示例脚本(以/data挂载点为例) #!/bin/bash MOUNT_POINT="/data" OUTPUT_FILE="/var/lib/node_exporter/textfile_collector/directory_size.prom" echo "# HELP directory_size_bytes Disk usage of top-level directories under $MOUNT_POINT" > $OUTPUT_FILE echo "# TYPE directory_size_bytes gauge" >> $OUTPUT_FILE for dir in $(ls -d $MOUNT_POINT/*/); do dir_name=$(basename $dir) dir_size=$(du -sb $dir | awk '{print $1}') echo "directory_size_bytes{mountpoint=\"$MOUNT_POINT\",directory=\"$dir_name\"} $dir_size" >> $OUTPUT_FILE done - 给Node Exporter加启动参数
--collector.textfile.directory=/var/lib/node_exporter/textfile_collector,指向存放上述脚本输出文件的目录 - 用Crontab定时跑脚本(比如每5分钟一次),更新统计数据
- 之后就能用PromQL查询并转成GB:
directory_size_bytes{mountpoint="/data"} / 1024 / 1024 / 1024
2. 用第三方目录专属Exporter
比如node-dir-exporter,专门用来收集目录级磁盘使用数据,配置好要监控的目录路径后,它会自动暴露directory_size_bytes这类指标,直接用PromQL查询即可,转GB的方式和上面一样。
3. Grafana可视化树形展示
如果只是需要直观的树形目录空间视图,在Grafana里可以装Tree Panel插件,结合上面自定义的指标,把字节数转成GB后,配置成树形结构展示,就能清晰看到每个目录的空间占用层级。
注意点
- 自定义脚本要保证有足够权限遍历目标目录的所有内容
- 不要太频繁运行脚本(比如1分钟一次),避免加重系统IO负担
- 如果目录数量多,建议过滤掉临时目录、缓存目录这类不需要监控的项,减少指标数量
内容的提问来源于stack exchange,提问作者vinWin
相关产品推荐
相关产品推荐

