Prometheusを活用した包括的なシステム監視ガイド

Prometheusは、SoundCloudで開発され、現在はCloud Native Computing Foundation (CNCF) のプロジェクトとして管理されているオープンソースの監視システムです。このシステムは、サーバー、サービス、アプリケーションなどから時系列データを収集、保存、分析し、異常を検知した際にはアラートを発する機能を提供します。

その主な特徴は以下の通りです。

  • 時系列データベース (TSDB): 収集したメトリクスをタイムスタンプとキー/バリュー形式のラベルとともに保存します。これにより、多次元的なデータ分析が可能です。
  • プル型アーキテクチャ: 監視対象(ターゲット)からHTTP経由でメトリクスを定期的に取得(スクレイピング)します。
  • 強力なクエリ言語 (PromQL): 豊富な関数と演算子を備え、複雑な時系列データ分析を実行できます。
  • アラート機能: 定義されたルールに基づいてアラートを生成し、Alertmanagerと連携して通知を行います。
  • Go言語で開発: 高いパフォーマンスと信頼性を実現しています。

特にコンテナ化された環境やマイクロサービスアーキテクチャでの監視に強みを発揮しますが、一般的なサーバーやネットワーク機器の監視にも広く利用されています。

Prometheusサーバーのデプロイ

Prometheus監視システムの中心となるサーバーをセットアップします。ここでは、以下の構成例を想定します。

ホスト名IPアドレス
monitor-server192.168.88.5
application-host192.168.88.100

システム時刻の同期

監視データの正確性を保つため、すべてのサーバーで時刻を同期させることが重要です。以下のコマンドでタイムゾーンを設定し、時刻を確認します。

timedatectl set-timezone Asia/Tokyo
date

必要に応じて、NTPサービス(例: chronyd)を有効にすることをお勧めします。

Prometheusのインストール

Prometheusのバイナリパッケージをダウンロードし、適切なディレクトリに展開します。

# 最新バージョンはPrometheus公式サイトで確認してください
wget https://github.com/prometheus/prometheus/releases/download/v2.48.0/prometheus-2.48.0.linux-amd64.tar.gz
tar xvf prometheus-2.48.0.linux-amd64.tar.gz
sudo mv prometheus-2.48.0.linux-amd64 /usr/local/prometheus

Prometheusサービスの設定と起動

Prometheusをsystemdサービスとして管理するために、サービス定義ファイルを作成します。

# /etc/systemd/system/prometheus.service
[Unit]
Description=Prometheus Metric Collection Server
Wants=network-online.target
After=network-online.target

[Service]
User=nobody
Group=nobody
Type=simple
ExecStart=/usr/local/prometheus/prometheus \
    --config.file=/usr/local/prometheus/prometheus.yml \
    --storage.tsdb.path=/usr/local/prometheus/data \
    --web.listen-address=":9090" \
    --web.external-url="http://192.168.88.5:9090"

SyslogIdentifier=prometheus
Restart=always

[Install]
WantedBy=multi-user.target

サービスをリロードし、Prometheusを起動して有効にします。

sudo systemctl daemon-reload
sudo systemctl enable prometheus --now
sudo systemctl status prometheus

PrometheusのWebインターフェースは通常http://<PrometheusサーバーIP>:9090でアクセスできます。

監視対象ノードの追加 (Node Exporter)

Prometheusは「プル型」の監視システムであり、監視対象ノードに導入されたエージェント(Exporter)からメトリクスを定期的に取得します。システム全体のハードウェアやOSのメトリクスを収集するには、Node Exporterが一般的に使用されます。

Node Exporterのデプロイ (application-host: 192.168.88.100)

監視対象となるapplication-hostNode Exporterをインストールし、サービスとして起動します。

# 最新バージョンはNode ExporterのGitHubページで確認
wget https://github.com/prometheus/node_exporter/releases/download/v1.7.0/node_exporter-1.7.0.linux-amd64.tar.gz
tar xvf node_exporter-1.7.0.linux-amd64.tar.gz
sudo mv node_exporter-1.7.0.linux-amd64 /usr/local/node_exporter

次に、systemdサービスファイルを作成します。

# /etc/systemd/system/node_exporter.service
[Unit]
Description=Prometheus Node Exporter
Wants=network-online.target
After=network-online.target

[Service]
User=nobody
Group=nobody
Type=simple
ExecStart=/usr/local/node_exporter/node_exporter \
    --web.listen-address=":9100"

SyslogIdentifier=node_exporter
Restart=always

[Install]
WantedBy=multi-user.target

サービスを起動し、ポート9100がリッスンされていることを確認します。

sudo systemctl daemon-reload
sudo systemctl enable node_exporter --now
sudo systemctl status node_exporter
ss -tlnp | grep :9100

Prometheusサーバーへの監視ターゲット追加

Prometheusサーバーのprometheus.yml設定ファイルを編集し、application-hostを監視ターゲットとして追加します。

# /usr/local/prometheus/prometheus.yml
global:
  scrape_interval: 15s

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

  - job_name: "application-server"
    static_configs:
      - targets: ["192.168.88.100:9100"]
        labels:
          environment: "production"
          instance_name: "web-server-01"

変更を反映させるため、Prometheusサービスを再起動します。

sudo systemctl restart prometheus

PrometheusのWeb UI (http://192.168.88.5:9090/targets) で、application-serverUPステータスになっていることを確認できます。

Grafanaによるデータの可視化

Grafanaは、Prometheusを含む多様なデータソースから収集したメトリクスを、リッチでインタラクティブなダッシュボードで可視化するためのオープンソースツールです。

Grafanaのインストールと初期設定

Prometheusサーバーと同じmonitor-server上にGrafanaをインストールします。

# 公式サイトの指示に従ってインストールしてください。OSによって異なります。
# 例: Debian/Ubuntuの場合
sudo apt-get install -y apt-transport-https software-properties-common wget
wget -q -O - https://packages.grafana.com/gpg.key | sudo apt-key add -
echo "deb https://packages.grafana.com/oss/deb stable main" | sudo tee -a /etc/apt/sources.list.d/grafana.list
sudo apt-get update
sudo apt-get install grafana

# 例: CentOS/RHELの場合
sudo yum install -y grafana

# サービス起動と有効化
sudo systemctl enable grafana-server --now
sudo systemctl status grafana-server

GrafanaのWeb UIはhttp://192.168.88.5:3000でアクセスできます。初期ログイン情報はユーザー名admin、パスワードadminです。初回ログイン時にパスワード変更が求められます。

Prometheusデータソースの追加

Grafanaにログイン後、以下の手順でPrometheusをデータソースとして追加します。

  1. 左側メニューの「Connections」アイコンをクリックし、「Add new connection」を選択。
  2. データソースのリストから「Prometheus」を選択。
  3. 「HTTP」セクションで、PrometheusサーバーのURL (例: http://localhost:9090) を入力。
  4. 「Save & Test」をクリックして接続を確認。

これにより、Prometheusから取得した時系列データをGrafanaダッシュボードで利用できるようになります。

ターゲットの自動検出 (File-based Service Discovery)

監視対象ノードが頻繁に追加・変更される環境では、prometheus.ymlを手動で更新するのは非効率です。Prometheusは様々なサービスディスカバリ(SD)メカニズムをサポートしており、中でも「ファイルベースSD」はシンプルな環境で有効です。これにより、Prometheusは指定されたファイルの内容を定期的にチェックし、変更があれば自動的に監視ターゲットを更新します。

Prometheus設定をファイルベースSDを使用するように変更します。

# /usr/local/prometheus/prometheus.yml (抜粋)
global:
  scrape_interval: 15s

rule_files:
  - "/usr/local/prometheus/rules/*.rules" # 後述のアラートルール用

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

  # ファイルベースのサービスディスカバリ設定
  - job_name: "dynamic-targets"
    file_sd_configs:
      - names:
          - "/usr/local/prometheus/sd_config/*.yml"
        refresh_interval: 60s # 60秒ごとにファイルをチェック

次に、自動検出されるターゲット情報を記述するディレクトリを作成し、サンプルファイルを作成します。

sudo mkdir -p /usr/local/prometheus/sd_config

例として、application-hostの情報をapplication_hosts.ymlとして作成します。

# /usr/local/prometheus/sd_config/application_hosts.yml
- targets:
    - '192.168.88.100:9100'
  labels:
    env: 'production'
    service: 'backend-app'
    datacenter: 'tokyo-dc1'
- targets:
    - '192.168.88.101:9100'
  labels:
    env: 'staging'
    service: 'frontend-proxy'

Prometheusサービスを再起動し、変更を適用します。

sudo systemctl restart prometheus

これにより、/usr/local/prometheus/sd_config/ディレクトリ内の.ymlファイルに記述されたターゲットが、自動的にPrometheusの監視対象に追加・削除されるようになります。

Alertmanagerによるアラート通知

Prometheusはアラートを生成しますが、その後の通知管理、重複排除、グルーピング、抑制といった高度な処理はAlertmanagerが担当します。Alertmanagerは、Prometheusから送られてきたアラートを受け取り、設定されたルールに基づいて、メール、Slack、PagerDutyなど、様々なチャネルに通知を送信します。

Alertmanagerの主な機能

  • グルーピング (Grouping): 多数のアラートが同時に発生した場合でも、関連するアラートをまとめて一つの通知として送信し、通知の洪水(アラートストーム)を防ぎます。
  • 抑制 (Inhibition): 特定のアラート(例: クリティカルなアラート)がアクティブな場合、関連する他のアラート(例: そのクリティカルなアラートの原因となる警告レベルのアラート)の通知を停止します。
  • サイレンス (Silences): メンテナンス期間中など、意図的にアラート通知を一時的に抑制する機能です。Web UIから設定できます。
  • ルーティング (Routing): アラートのラベルに基づいて、異なる受信者や通知方法にルーティングします。

Alertmanagerのデプロイ

AlertmanagerもPrometheusサーバーと同じmonitor-server上にデプロイします。

# 最新バージョンはAlertmanagerのGitHubページで確認
wget https://github.com/prometheus/alertmanager/releases/download/v0.26.0/alertmanager-0.26.0.linux-amd64.tar.gz
tar xvf alertmanager-0.26.0.linux-amd64.tar.gz
sudo mv alertmanager-0.26.0.linux-amd64 /usr/local/alertmanager

systemdサービスファイルを作成します。

# /etc/systemd/system/alertmanager.service
[Unit]
Description=Prometheus Alertmanager
Wants=network-online.target
After=network-online.target

[Service]
User=nobody
Group=nobody
Type=simple
ExecStart=/usr/local/alertmanager/alertmanager \
    --config.file=/usr/local/alertmanager/alertmanager.yml \
    --web.listen-address=":9093" \
    --web.external-url="http://192.168.88.5:9093"

SyslogIdentifier=alertmanager
Restart=always

[Install]
WantedBy=multi-user.target

サービスを起動し、有効にします。

sudo systemctl daemon-reload
sudo systemctl enable alertmanager --now
sudo systemctl status alertmanager

AlertmanagerのWeb UIはhttp://192.168.88.5:9093でアクセスできます。

Alertmanagerの設定ファイル (alertmanager.yml)

Alertmanagerの動作はalertmanager.ymlで定義されます。ここでは、メール通知の設定例を示します。まず、設定ファイルを作成します。

# /usr/local/alertmanager/alertmanager.yml
global:
  # SMTPサーバー設定 (例: ローカルのPostfixを利用)
  smtp_smarthost: 'localhost:25'
  smtp_from: 'alert@example.com' # 送信元メールアドレス
  smtp_require_tls: false # TLSを必要としない場合 (テスト環境向け)

route:
  group_by: ['alertname', 'severity'] # アラート名と重要度でグルーピング
  group_wait: 30s # 最初のアラート発生から待機する時間
  group_interval: 5m # グループ内の新しいアラートの通知を待つ時間
  repeat_interval: 1h # 同じアラートを再通知する間隔
  receiver: 'default-email' # デフォルトの受信者

receivers:
  - name: 'default-email'
    email_configs:
      - to: 'sysadmin@example.com' # 受信者メールアドレス
        send_resolved: true # 解決済みアラートも送信
        html: true # HTML形式のメールを送信

inhibit_rules:
  # 'critical' severityのアラートが発生した場合、同じ'alertname'と'instance'を持つ'warning'アラートを抑制
  - target_match:
      severity: 'warning'
    source_match:
      severity: 'critical'
    equal: ['alertname', 'instance']

設定変更後、Alertmanagerサービスを再起動します。

sudo systemctl restart alertmanager

メール送信機能を確認するために、postfixや他のMTAが正しく設定・動作していることを確認してください。

PrometheusとAlertmanagerの連携

Prometheusが生成したアラートをAlertmanagerに送信するよう、prometheus.ymlを更新します。

# /usr/local/prometheus/prometheus.yml (抜粋)
alerting:
  alertmanagers:
  - static_configs:
      - targets: ['localhost:9093'] # Alertmanagerのホストとポート

Prometheusサービスを再起動し、変更を適用します。

sudo systemctl restart prometheus

Prometheusアラートルールの作成

Prometheusがアラートを生成するためのルールを定義します。ルールは.rulesファイルに記述し、prometheus.ymlから参照されます。

sudo mkdir -p /usr/local/prometheus/rules

以下の内容でhost_monitoring.rulesファイルを作成します。

# /usr/local/prometheus/rules/host_monitoring.rules
groups:
  - name: host_alerts
    rules:
    - alert: InstanceDown
      expr: up{job="dynamic-targets"} == 0
      for: 5m
      labels:
        severity: critical
      annotations:
        summary: "監視対象インスタンスが停止: {{ $labels.instance }}"
        description: "ジョブ '{{ $labels.job }}' のインスタンス '{{ $labels.instance }}' が5分以上ダウンしています。"

    - alert: HighMemoryUsage
      expr: (node_memory_MemTotal_bytes - node_memory_MemAvailable_bytes) / node_memory_MemTotal_bytes * 100 > 85
      for: 2m
      labels:
        severity: warning
      annotations:
        summary: "メモリ使用量が高い: {{ $labels.instance }}"
        description: "インスタンス '{{ $labels.instance }}' のメモリ使用量が2分間以上85%を超えています (現在の使用率: {{ printf "%.2f" $value }}%)"

これらのルールをPrometheusがロードするように、prometheus.ymlを再度更新します。

# /usr/local/prometheus/prometheus.yml (抜粋)
rule_files:
  - "/usr/local/prometheus/rules/*.rules" # 作成したルールファイルを指定

Prometheusサービスを再起動して、新しいアラートルールをロードします。

sudo systemctl restart prometheus

これで、Prometheusが定義されたルールに基づいてアラートを生成し、Alertmanager経由で通知を送信する準備が整いました。テストとして、監視対象のapplication-hostを停止し、AlertmanagerのWeb UI (http://192.168.88.5:9093/#/alerts) や設定したメールアドレスに通知が届くかを確認してください。

タグ: Prometheus 監視 Alertmanager grafana Node Exporter

6月21日 22:45 投稿