深夜2時の悪夢
電話が激しく震えます。Alertmanagerが本番サーバーのストレージ枯渇を通知しています。飛び起きてサーバーにSSHし、お決まりのコマンド df -h を打ち込みます。結果は、パーティション / の使用率が98%。問題は、このパーティションにシステムログ、Dockerボリューム、ユーザーデータなど、あらゆるものが混在していることです。
通常であれば、du -sh /* を実行して、どのディレクトリがリソースを占有しているか特定するまで延々と待つことになります。サーバーに数百万もの小さなファイルがある場合、このコマンドの完了に10分以上かかることもあります。以前の私は、ループして肥大化したログファイルを見つけるためだけに1時間を費やすことも珍しくありませんでした。しかし現在は、Grafanaのダッシュボードを一目見るだけで、どのフォルダがディスクを「食っている」か即座に把握し、すぐに対処できています。
Node Exporter はパーティションの監視には非常に優れていますが、各フォルダの内部で何が起きているかまでは把握できません。そこで Prometheus Folder Exporter を追加で導入することをお勧めします。
なぜNode Exporterだけでは不十分なのか?
Node Exporterは node_filesystem_avail_bytes メトリクスを提供し、残りの空き容量を教えてくれます。しかし、マイクロサービスやDockerを運用している場合、「どのディレクトリが」増加しているのかを正確に把握することが、障害対応のスピードを左右します。
- ログの監視: アプリケーションのデバッグエラーにより、1時間で数GBも急増するログファイルを即座に特定します。
- データベースの監視: データディレクトリを監視し、データベースがハングアップする前にストレージの拡張が必要なタイミングを把握します。
- バックアップ管理: 定期的なバックアップファイルが十分な容量で作成されているか確認し、バックアップファイルが空(0バイト)になる事態を防ぎます。
Prometheus Folder Exporterのインストール
いくつかのExporterが存在しますが、非常に軽量で安定している pavelly 氏によるGo言語版をお勧めします。以下はLinuxへの直接インストールの手順です。
ステップ1:バイナリのダウンロードとインストール
まず、システムの安全性を確保するために、Exporter実行用の専用ユーザーを作成します。
# ログイン権限のないユーザーを作成
sudo useradd --no-create-home --shell /bin/false folder_exporter
# GitHubからバイナリをダウンロード
wget https://github.com/pavelly/prometheus-folder-exporter/releases/download/v1.1.0/prometheus-folder-exporter-linux-amd64 -O folder-exporter
# 権限を付与し、実行ディレクトリに移動
chmod +x folder-exporter
sudo mv folder-exporter /usr/local/bin/
ステップ2:監視対象ディレクトリの設定
このExporterはYAMLファイルを使用して、監視したいパスを定義します。/etc/folder-exporter.yaml を以下の内容で作成します。
folders:
- mount_point: "/var/log"
name: "system_logs"
- mount_point: "/var/lib/docker/volumes"
name: "docker_volumes"
- mount_point: "/data/database"
name: "db_storage"
ステップ3:Systemdによるサービス実行

