PrometheusとGrafanaでサーバーをリアルタイム監視するセットアップ

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

サーバーに問題が起きていることをいつ気づくか?

以前は、サーバーが遅くなっていることに気づくのは…ユーザーからクレームが届いてからだった。そこでようやくSSHして、topdf -hfree -mを一個ずつ確認する。3〜4台ならまだ何とかなるが、10台を超えると、どこから手をつければいいか分からなくなってしまう。

Prometheus + Grafanaを構築してからは、すべてが変わった。ダッシュボードを開けば一目瞭然:何時にCPUスパイクが発生したか、RAMの使用率はどの程度か、ディスクの残量はどれくらいか — これらがすべて1画面に収まっている。もう各サーバーにSSHで入る必要はない。

この記事では、Ubuntu 22.04での実際のインストール手順を解説する。Node Exporterでメトリクスを収集し、Grafanaで可視化する。

動作アーキテクチャ — 30秒で理解する

Prometheusは時系列データベース兼スクレイパーだ。15秒ごとに各exporterへHTTPリクエストを送り、メトリクスを取得して専用ストレージに保存する。クエリにはPromQLを使う — Prometheus独自の言語で、数時間で使いこなせる。

Node Exporterは監視対象の各サーバーで動作し、/metricsエンドポイントで700以上の指標を公開する:コアごとのCPU、RAM、ディスクI/O、ネットワークトラフィック、オープン中のファイルディスクリプタ数など。

Grafanaはフロントエンドを担う。Prometheusに接続してデータをクエリし、ダッシュボードとして可視化する。アラートはメール、Slack、またはTelegram webhookで送信できる。

データの流れ:

Node Exporter (port 9100) ← Prometheusが15秒ごとにスクレイプ → TSDBに保存 → Grafanaがクエリ → Dashboard

監視対象サーバーにNode Exporterをインストール

専用のシステムユーザーを作成する — rootでexporterを実行するのはバッドプラクティスだ:

# システムユーザーを作成
sudo useradd --no-create-home --shell /bin/false node_exporter

# Node Exporterをダウンロード(最新バージョンはgithub.com/prometheus/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
sudo cp node_exporter-1.8.2.linux-amd64/node_exporter /usr/local/bin/
sudo chown node_exporter:node_exporter /usr/local/bin/node_exporter

次に、再起動時にNode Exporterが自動起動するようsystemdサービスを作成する

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

[Install]
WantedBy=multi-user.target
sudo systemctl daemon-reload
sudo systemctl enable --now node_exporter

# 確認
curl http://localhost:9100/metrics | head -20

node_cpu_seconds_total{...}のような出力が表示されれば、Node Exporterは正常に動作している。

監視サーバーにPrometheusをインストール

構成を分離することを推奨する:Prometheus + Grafana専用のサーバーを1台用意し、他のサーバーにはNode Exporterのみをインストールする。データのバックアップが容易になり、本番ワークロードと混在しないため管理が明確になる。

sudo useradd --no-create-home --shell /bin/false prometheus
sudo mkdir -p /etc/prometheus /var/lib/prometheus
sudo chown prometheus:prometheus /var/lib/prometheus

wget https://github.com/prometheus/prometheus/releases/download/v2.52.0/prometheus-2.52.0.linux-amd64.tar.gz
tar xvf prometheus-2.52.0.linux-amd64.tar.gz
sudo cp prometheus-2.52.0.linux-amd64/{prometheus,promtool} /usr/local/bin/
sudo cp -r prometheus-2.52.0.linux-amd64/{consoles,console_libraries} /etc/prometheus/
sudo chown -R prometheus:prometheus /etc/prometheus

スクレイプターゲットの設定

最も重要な部分だ — Prometheusがメトリクスを収集するサーバーを定義する:

sudo nano /etc/prometheus/prometheus.yml
global:
  scrape_interval: 15s
  evaluation_interval: 15s

scrape_configs:
  - job_name: 'prometheus'
    static_configs:
      - targets: ['localhost:9090']

  - job_name: 'node_exporter'
    static_configs:
      - targets:
          - '192.168.1.10:9100'   # Webサーバー
          - '192.168.1.11:9100'   # DBサーバー
          - '192.168.1.12:9100'   # アプリサーバー

Prometheus用のsystemdサービスを作成する:

sudo nano /etc/systemd/system/prometheus.service
[Unit]
Description=Prometheus
After=network.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.listen-address=0.0.0.0:9090

[Install]
WantedBy=multi-user.target
sudo systemctl daemon-reload
sudo systemctl enable --now prometheus

# ターゲットの稼働状況を確認
curl http://localhost:9090/api/v1/targets | python3 -m json.tool | grep health

http://<monitoring-server>:9090/targetsにアクセスして状態を確認しよう — 緑色のターゲットはスクレイプに成功している。余談だが、3台のサーバーで30日間の保持期間を設定すると約2〜4GBのディスクを消費する。ディスクに余裕がない場合は--storage.tsdb.retention.timeを調整すること。

Grafanaのインストール

Grafanaには公式APTリポジトリがあり、手動でファイルをダウンロードするよりクリーンにインストールできる:

sudo apt-get 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-get update
sudo apt-get install grafana
sudo systemctl enable --now grafana-server

デフォルトポートは3000だ。http://<server-ip>:3000にアクセスし、admin/adminでログイン — 初回ログイン時は必ずパスワードを変更すること。本番環境ではCertbot SSL証明書でHTTPS化することも強く推奨する。

GrafanaとPrometheusの接続

  1. Connections → Data Sources → Add data sourceへ移動
  2. Prometheusを選択
  3. URL:http://localhost:9090(同じサーバーの場合)またはPrometheusサーバーのIPアドレス
  4. Save & Testをクリック — 「Successfully queried the Prometheus API」と表示されれば完了

2分でダッシュボードをインポート

ゼロから作成する必要はない。Grafanaにはgrafana.com/grafana/dashboardsにコミュニティダッシュボードが豊富に揃っている。ID 1860(Node Exporter Full)は最もダウンロードされているダッシュボードで、数百万回以上ダウンロードされており、必要なほぼすべての情報をカバーしている:

  1. Dashboards → Import
  2. ID 1860を入力し、Loadをクリック
  3. 先ほど作成したPrometheusデータソースを選択
  4. Importをクリック — CPU、RAM、ディスク、ネットワークがコアごと・ディスクごとの詳細も含めてすぐに表示される

よく使うPromQLクエリ

カスタムパネルを作成する際に、日常的に使用するクエリを紹介する:

# CPU使用率(5分間の平均)
100 - (avg by(instance) (rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100)

# RAM使用率
100 - ((node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes) * 100)

# マウントポイント別ディスク使用率
100 - ((node_filesystem_avail_bytes{fstype!~"tmpfs|overlay"} / node_filesystem_size_bytes) * 100)

# 受信ネットワークトラフィック(バイト/秒)
rate(node_network_receive_bytes_total{device!="lo"}[5m])

CPU使用率がしきい値を超えた際のアラート設定

シンプルなケースでは、GrafanaはAlertmanagerなしでパネルから直接アラートを作成できる。例:CPU使用率が80%を超えて5分間継続した場合にアラートを発行する:

  1. CPU Usageパネルを開き → Edit
  2. Alertタブ → New alert rule
  3. Condition:WHEN avg() OF query IS ABOVE 80
  4. For:5m — 5分間継続して初めてトリガーする。一時的なCPUスパイクによる誤検知を防ぐためだ
  5. Notification:contact pointを選択(メール、Slack、Telegram webhook)

まとめ

このセットアップは本番環境で稼働している。Linuxに慣れていれば、作業開始からフル機能のダッシュボードが完成するまで30〜45分ほどだ。

Prometheusの最大の利点は、データが時系列で保存されている点だ。障害が発生した際、昨夜2時37分の時点でRAMがどの程度使用されていたか、CPUがいつから上昇し始めたかを正確に振り返ることができる。推測不要、証拠は残る。

さらに発展させるなら:Alertmanagerでより高度なアラート管理が可能になる — グルーピング、サイレンシング、チームごとのルーティングなど。またDockerを使用している場合は、cAdvisorを追加することで各コンテナのリソース使用状況も監視できる。

Share: