Node Exporter: LinuxシステムのメトリクスをPrometheusに収集する

Monitoring tutorial - IT technology blog
Monitoring tutorial - IT technology blog

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グループへの追加が必要です。

Share: