1. 実現場の課題:深夜2時のサーバーダウンとメトリクス不足による無力感
土曜日の深夜2時、APIシステムが一斉に504 Gateway Timeoutエラーを吐き出しました。ユーザーからのクレームと上司からの電話に追われ、慌ててノートPCを開いてサーバーへSSH接続し、top、free -m、df -hを叩きました。しかし皮肉なことに、その時点のCPU使用率はわずか3%、メモリ空き容量は10GB以上、ディスク使用率も40%以上の空きがありました。障害は約5分間発生した後に自然復旧し、現場には何も痕跡が残されていませんでした。
過去のメトリクス履歴(Historical Metrics)がないため、原因究明は完全に手探り状態でした。バックグラウンドのCronジョブによるCPUスパイクなのか?メモリリークによるOOM Killerの発動なのか?それともデータベースのフラッシュ処理によるディスクI/Oボトルネックなのか?その答えは誰にもわかりません。
2. 原因の分析:従来のCLIコマンドだけでは不十分な理由
top、vmstat、iostatといった代表的なコマンドは、Enterキーを押したその瞬間の状態しか教えてくれません。これらは単なるスナップショット(Snapshot)に過ぎず、障害が過ぎ去ってしまえば、すべての痕跡が消え去ってしまいます。
また、アプリケーションログはコード層のエラー(DB接続タイムアウトなど)を記録するだけであり、その瞬間にディスクの書き込みレイテンシが500msまで急上昇していたことまでは教えてくれません。さらに、インフラ規模が1台から10台、50台へと拡大すると、各サーバーに個別にSSH接続して手動確認するのは不可能です。定期的にメトリクスを自動収集し、時系列データベース(Time-series DB)に蓄積する仕組みが必要になります。
3. インフラ監視ソリューションの比較
- SaaS(Datadog、New Relicなど): コマンド1行で導入でき、UIも洗練されています。しかし、ホストあたり月額15〜23ドル程度のコストがかかります。サーバー台数が増加し、膨大なカスタムメトリクスを扱うようになると、毎月の請求額が大きな負担になります。
- Zabbix / Nagios: 死活監視(Up/Downチェック)には非常に強力です。ただし、エージェントの設定が複雑でリソース消費が大きく、時系列データの処理能力や柔軟性の面ではPrometheusに劣ります。
- 自作BashスクリプトでMySQL/InfluxDBへ送信: 初期構築は容易ですが、スケーラビリティに乏しく、フォーマットエラーが発生しやすいうえ、ストレージ基盤の保守コストがかさみます。
4. 解決策:Prometheus、Node Exporter、Grafanaの3大ツール連携
軽量性、オープンソース(無料)、そして優れた拡張性により、DevOps領域における事実上の標準(De-facto Standard)となっています。
- Node Exporter: 各サーバー上でハードウェアリソース(CPU、RAM、Disk、Network)のメトリクスを収集し、HTTPエンドポイント
:9100/metricsを公開するエージェント。 - Prometheus: 15秒間隔などの定期的なポーリングによってメトリクスを自律的に取得(Pull)し、時系列データとして保存する中央サーバー。
- Grafana: Prometheusからデータをクエリしてダッシュボードを描画し、アラート(Alerting)を設定する可視化ツール。
ステップ1:システムユーザーの作成とディレクトリ権限の設定
監視プロセスを root ユーザーで実行することはセキュリティ上の不要なリスクとなります。専用のサービスユーザーを作成しましょう。
sudo useradd --no-create-home --shell /bin/false prometheus
sudo useradd --no-create-home --shell /bin/false node_exporter
sudo mkdir -p /etc/prometheus /var/lib/prometheus
sudo chown -R prometheus:prometheus /etc/prometheus /var/lib/prometheus
ステップ2:Node Exporterのインストールと設定
GitHubから安定版リリース(例:v1.8.2)をダウンロードします。
cd /tmp
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
sudo mv node_exporter-1.8.2.linux-amd64/node_exporter /usr/local/bin/
sudo chown node_exporter:node_exporter /usr/local/bin/node_exporter
rm -rf node_exporter-1.8.2.*
プロセスを管理するためのsystemdサービスを作成します。
sudo nano /etc/systemd/system/node_exporter.service
ファイルの内容:
[Unit]
Description=Node Exporter
Wants=network-online.target
After=network-online.target
[Service]
User=node_exporter
Group=node_exporter
Type=simple
ExecStart=/usr/local/bin/node_exporter
Restart=always
RestartSec=5
[Install]
WantedBy=multi-user.target
サービスを起動し、システム起動時の自動起動を有効化します。
sudo systemctl daemon-reload
sudo systemctl enable --now node_exporter
返されるサンプルメトリクスを確認します。
curl -s http://localhost:9100/metrics | head -n 10
ステップ3:Prometheusサーバーのインストールと設定
Prometheusのバイナリパッケージ(バージョン2.54.1)をダウンロードします。
cd /tmp
wget https://github.com/prometheus/prometheus/releases/download/v2.54.1/prometheus-2.54.1.linux-amd64.tar.gz
tar -xvf prometheus-2.54.1.linux-amd64.tar.gz
cd prometheus-2.54.1.linux-amd64
sudo mv prometheus promtool /usr/local/bin/
sudo chown prometheus:prometheus /usr/local/bin/prometheus /usr/local/bin/promtool
sudo mv consoles console_libraries /etc/prometheus/
sudo chown -R prometheus:prometheus /etc/prometheus/consoles /etc/prometheus/console_libraries
メトリクス収集用の設定ファイルを作成します。
sudo nano /etc/prometheus/prometheus.yml
Prometheus自身およびNode Exporterから定期的にメトリクスを取得するように設定します。
global:
scrape_interval: 15s
evaluation_interval: 15s
scrape_configs:
- job_name: 'prometheus'
static_configs:
- targets: ['localhost:9090']
- job_name: 'node_exporter'
static_configs:
- targets: ['localhost:9100']
設定ファイルの所有権と権限を再設定します。
sudo chown prometheus:prometheus /etc/prometheus/prometheus.yml
Prometheus用のsystemdサービスファイルを作成します。
sudo nano /etc/systemd/system/prometheus.service
[Unit]
Description=Prometheus Server
Wants=network-online.target
After=network-online.target
[Service]
User=prometheus
Group=prometheus
Type=simple
ExecStart=/usr/local/bin/prometheus \
--config.file=/etc/prometheus/prometheus.yml \
--storage.tsdb.path=/var/lib/prometheus/ \
--storage.tsdb.retention.time=30d \
--web.console.templates=/etc/prometheus/consoles \
--web.console.libraries=/etc/prometheus/console_libraries
Restart=always
RestartSec=5
[Install]
WantedBy=multi-user.target
サービスを起動します。
sudo systemctl daemon-reload
sudo systemctl enable --now prometheus
ブラウザからポート9090経由でアクセスして確認します(http://サーバーIP:9090)。Status > Targets に移動し、両方のエンドポイントが緑色の UP 状態で表示されていれば設定成功です。
ステップ4:Grafanaのインストール
セキュリティパッチを常に最新に保つため、Grafana Labsの公式リポジトリからGrafanaをインストールします。
sudo apt update
sudo apt install -y apt-transport-https software-properties-common wget
sudo mkdir -p /etc/apt/keyrings/
wget -q -O - https://apt.grafana.com/gpg.key | gpg --dearmor | sudo tee /etc/apt/keyrings/grafana.gpg > /dev/null
echo "deb [signed-by=/etc/apt/keyrings/grafana.gpg] https://apt.grafana.com stable main" | sudo tee /etc/apt/sources.list.d/grafana.list
sudo apt update
sudo apt install -y grafana
sudo systemctl enable --now grafana-server
ブラウザで http://サーバーIP:3000 にアクセスします。初期アカウントは admin / admin です(初回ログイン時に新しいパスワードの設定を求められます)。
ステップ5:Prometheusの連携と標準ダッシュボードのインポート
- Grafanaの管理画面で、Connections > Data sources を選択し、Add data source をクリックします。
- Prometheus を選択します。
- Prometheus server URL フィールドに
http://localhost:9090と入力します。 - ページ下部までスクロールし、Save & test をクリックして接続を確認します。
- 各グラフを手動で作成することなく監視画面を構築するため、Dashboards > New > Import に進みます。
- Node Exporter向けに広く使われているコミュニティ製ダッシュボードID
1860(Node Exporter Full)を入力し、Load をクリックします。 - 先ほど接続したPrometheusのData sourceを選択し、Import をクリックします。
これでサーバーのリソース全体が直感的に可視化されます。各コアごとのCPU使用率、実際のRAMキャッシュ/空き容量、ディスクI/Oの読み書きレイテンシ、ネットワークスループットなどをリアルタイムで把握できるようになります。

