Node Exporterとは何か、なぜ必要なのか?
PrometheusはメトリクスのCollectionと時系列保存が得意ですが、LinuxのハードウェアやOSの情報を自ら読み取ることはできません。そこでNode Exporterが登場します。各サーバー上で動作し、システムデータを読み取り、PrometheusがスクレイプするHTTPエンドポイントとして公開します。
簡単に言えば、Node Exporterは各マシンに常駐する「エージェント」であり、Linuxの/procや/sysを読み取り、Prometheusが理解できる形式に変換します。
私の環境ではPrometheus + Grafanaで15台のサーバーを監視していますが、このセットアップのおかげで、ユーザーから報告される前に障害を検知できています。たとえば、あるステージングサーバーのディスク使用率が午前2時に94%に達した際、AlertmanagerがすぐにTelegramへ通知を送り、業務開始前に対処できました。これはすべてNode Exporterを正しくインストールしたことから始まっています。
この記事ではNode Exporterに絞って解説します。インストール方法、有効にすべきcollector、正常動作の確認方法について説明します。Prometheus/Grafanaとの接続については別記事で解説しています。
Node Exporterのインストール
方法1: バイナリから手動インストール(推奨)
この方法はバージョンを管理でき、どのディストリビューションでも使用できます。Node ExporterのReleasesページで最新版のリンクを確認してください。
# Node Exporterをダウンロード(必要に応じてバージョンを変更)
wget https://github.com/prometheus/node_exporter/releases/download/v1.8.2/node_exporter-1.8.2.linux-amd64.tar.gz
# 解凍
tar xvf node_exporter-1.8.2.linux-amd64.tar.gz
# バイナリを /usr/local/bin にコピー
sudo cp node_exporter-1.8.2.linux-amd64/node_exporter /usr/local/bin/
sudo chmod +x /usr/local/bin/node_exporter
サービス実行用の専用ユーザーを作成する
rootでNode Exporterを実行するのは好ましくありません。シェルなし・ホームディレクトリなしのシステムユーザーを作成します。
sudo useradd --no-create-home --shell /bin/false node_exporter
systemdサービスを作成する
サービスを設定することで、Node Exporterが再起動後に自動起動し、systemctlで管理しやすくなります。
sudo nano /etc/systemd/system/node_exporter.service
ファイルの内容:
[Unit]
Description=Node Exporter
After=network.target
[Service]
User=node_exporter
Group=node_exporter
Type=simple
ExecStart=/usr/local/bin/node_exporter \
--collector.systemd \
--collector.processes
Restart=on-failure
RestartSec=5s
[Install]
WantedBy=multi-user.target
# サービスをリロードして有効化
sudo systemctl daemon-reload
sudo systemctl enable node_exporter
sudo systemctl start node_exporter
# 状態を確認
sudo systemctl status node_exporter
方法2: パッケージマネージャー経由でインストール(Ubuntu/Debian)
一部のディストリビューションにはパッケージが用意されていますが、バージョンがアップストリームよりかなり古いことが多いです。
# Ubuntu 22.04以降
sudo apt install prometheus-node-exporter -y
# サービスが自動作成・起動される
sudo systemctl status prometheus-node-exporter
問題は、バイナリが/usr/local/bin/node_exporterではなく/usr/bin/prometheus-node-exporterに配置され、サービス名も異なる点です。チームが複数のディストリビューションを使っている場合、デバッグ時に混乱しがちです。私は通常、すべてのサーバーで統一するために手動インストールを選択しています。
Collectorの設定
Node Exporterには50以上のcollectorがあり、デフォルトで最重要なものが有効になっています。有用なcollectorの中には手動で有効化が必要なものもあります。
デフォルトのcollector(常時有効)
- cpu — CPU使用率、iowait、steal time
- meminfo — RAM合計、使用量、バッファ、キャッシュ
- diskstats — ディスクI/O(読み書き操作数、スループット)
- filesystem — マウントポイント別のディスク使用量
- netdev — ネットワークインターフェースの統計情報
- loadavg — 1/5/15分のロードアベレージ
- stat — カーネル統計(コンテキストスイッチ、割り込み)
追加で有効にすべきcollector
systemdファイルのExecStartセクションに追加します。
ExecStart=/usr/local/bin/node_exporter \
--collector.systemd \
--collector.processes \
--collector.interrupts \
--collector.tcpstat \
--collector.cpu.info
各オプションの説明:
--collector.systemd— systemdサービスの状態(active/failed)を監視。これがないとサービスクラッシュ時のアラートが出せません。--collector.processes— 実行中プロセス数、ゾンビプロセス--collector.tcpstat— TCPコネクションの状態(ESTABLISHED、TIME_WAITなど)--collector.cpu.info— CPUモデル、周波数の情報
不要なcollectorを無効にする
Prometheusが処理するメトリクス量を削減するために、使用頻度の低いcollectorを無効化できます。
ExecStart=/usr/local/bin/node_exporter \
--no-collector.infiniband \
--no-collector.ipvs \
--collector.systemd
ネットワークバインディングの設定
デフォルトでNode Exporterはすべてのインターフェースのポート9100でリッスンします。本番環境では内部インターフェースのみにバインドしてください。
ExecStart=/usr/local/bin/node_exporter \
--web.listen-address="10.0.0.5:9100" \
--collector.systemd
10.0.0.5をサーバーの内部IPに置き換えてリロードします。
sudo systemctl daemon-reload
sudo systemctl restart node_exporter
確認とモニタリング
Node Exporterが動作していることを確認する
# リッスン中のポートを確認
ss -tlnp | grep 9100
# または curl でメトリクスを直接確認
curl http://localhost:9100/metrics | head -50
以下のような出力が表示されれば正常です。
# HELP node_cpu_seconds_total Seconds the CPUs spent in each mode.
# TYPE node_cpu_seconds_total counter
node_cpu_seconds_total{cpu="0",mode="idle"} 12345.67
node_cpu_seconds_total{cpu="0",mode="iowait"} 23.45
主要なメトリクスを確認する
# CPUメトリクスを確認
curl -s http://localhost:9100/metrics | grep "^node_cpu"
# ディスク使用量を確認
curl -s http://localhost:9100/metrics | grep "node_filesystem_avail_bytes"
# RAM残量を確認
curl -s http://localhost:9100/metrics | grep "node_memory_MemAvailable_bytes"
必要に応じてファイアウォールを開放する
PrometheusサーバーからノードのPort 9100への接続を許可します。
# UFW(Ubuntu)
sudo ufw allow from <prometheus-server-ip> to any port 9100
# Firewalld(CentOS/RHEL)
sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="<prometheus-server-ip>" port protocol="tcp" port="9100" accept'
sudo firewall-cmd --reload
Prometheusの設定に追加する
Prometheusサーバーでprometheus.ymlファイルを編集します。
scrape_configs:
- job_name: 'node'
static_configs:
- targets:
- '10.0.0.5:9100' # サーバー1
- '10.0.0.6:9100' # サーバー2
- '10.0.0.7:9100' # サーバー3
# Grafanaでのフィルタリングを容易にするためにラベルを追加
relabel_configs:
- source_labels: [__address__]
target_label: instance
Prometheusをリロードします。
curl -X POST http://localhost:9090/-/reload
Prometheus UIで確認する
ブラウザでhttp://<prometheus-server>:9090/targetsを開き、各ノードが緑色のUP状態であれば接続成功です。DOWNが表示される場合は、ファイアウォールとIPアドレスを再確認してください。
いくつかのPromQLクエリでデータが取得できているか確認しましょう。
# CPU使用率の合計(idle除く)
100 - (avg by(instance) (rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100)
# 空きRAM(GB)
node_memory_MemAvailable_bytes / 1024 / 1024 / 1024
# ディスク残量(%)
(node_filesystem_avail_bytes{mountpoint="/"} / node_filesystem_size_bytes{mountpoint="/"}) * 100
よくあるトラブルシューティング
複数のサーバーをセットアップする際によく遭遇するエラーをまとめます。
- サービスが起動しない:
journalctl -u node_exporter -n 20でログを確認してください。多くの場合、バイナリのパスが間違っているか、ファイルのパーミッションが不足しています。 - ポートが使用中:
ss -tlnp | grep 9100で、そのポートを使用しているプロセスを確認します。 - PrometheusがスクレイプできないCan’t scrape: PrometheusサーバーからNode ExporterへのURLに対して
curl http://<node-ip>:9100/metricsを試してください。接続できない場合はネットワーク/ファイアウォールの問題であり、Node Exporter自体の問題ではありません。 - systemdのメトリクスが取得できない:
node_exporterユーザーにD-Busの読み取り権限が必要です。一部のディストリビューションではsystemd-journalグループへの追加が必要です。

