Ubuntu ServerにおけるPrometheusとGrafanaのインストール・設定手順ガイド

Ubuntu tutorial - IT technology blog
Ubuntu tutorial - IT technology blog

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の連携と標準ダッシュボードのインポート

  1. Grafanaの管理画面で、Connections > Data sources を選択し、Add data source をクリックします。
  2. Prometheus を選択します。
  3. Prometheus server URL フィールドに http://localhost:9090 と入力します。
  4. ページ下部までスクロールし、Save & test をクリックして接続を確認します。
  5. 各グラフを手動で作成することなく監視画面を構築するため、Dashboards > New > Import に進みます。
  6. Node Exporter向けに広く使われているコミュニティ製ダッシュボードID 1860(Node Exporter Full)を入力し、Load をクリックします。
  7. 先ほど接続したPrometheusのData sourceを選択し、Import をクリックします。

これでサーバーのリソース全体が直感的に可視化されます。各コアごとのCPU使用率、実際のRAMキャッシュ/空き容量、ディスクI/Oの読み書きレイテンシ、ネットワークスループットなどをリアルタイムで把握できるようになります。

Share: