Prometheusは、SoundCloudで開発され、現在はCloud Native Computing Foundation (CNCF) のプロジェクトとして管理されているオープンソースの監視システムです。このシステムは、サーバー、サービス、アプリケーションなどから時系列データを収集、保存、分析し、異常を検知した際にはアラートを発する機能を提供します。
その主な特徴は以下の通りです。
- 時系列データベース (TSDB): 収集したメトリクスをタイムスタンプとキー/バリュー形式のラベルとともに保存します。これにより、多次元的なデータ分析が可能です。
- プル型アーキテクチャ: 監視対象(ターゲット)からHTTP経由でメトリクスを定期的に取得(スクレイピング)します。
- 強力なクエリ言語 (PromQL): 豊富な関数と演算子を備え、複雑な時系列データ分析を実行できます。
- アラート機能: 定義されたルールに基づいてアラートを生成し、Alertmanagerと連携して通知を行います。
- Go言語で開発: 高いパフォーマンスと信頼性を実現しています。
特にコンテナ化された環境やマイクロサービスアーキテクチャでの監視に強みを発揮しますが、一般的なサーバーやネットワーク機器の監視にも広く利用されています。
Prometheusサーバーのデプロイ
Prometheus監視システムの中心となるサーバーをセットアップします。ここでは、以下の構成例を想定します。
| ホスト名 | IPアドレス |
|---|---|
monitor-server | 192.168.88.5 |
application-host | 192.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-hostにNode 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-serverがUPステータスになっていることを確認できます。
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をデータソースとして追加します。
- 左側メニューの「Connections」アイコンをクリックし、「Add new connection」を選択。
- データソースのリストから「Prometheus」を選択。
- 「HTTP」セクションで、PrometheusサーバーのURL (例:
http://localhost:9090) を入力。 - 「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) や設定したメールアドレスに通知が届くかを確認してください。