Prometheusは障害発生時にEmail, Slack, Hipchatなど多数の通知機能を備えています。このページではアラートを定義し、アラートを通知する簡易的な操作を説明します。
単にアラートを発報するだけでは運用は成り立ちません。多くの場合はアラートを抑制したり類似アラートをまとめたりの必要性に迫られるでしょう。このような機能は「Prometheus アラートマネージャー」を参照ください。
前提
参照資料
動作確認済環境
- Rocky Linux 8.6
- Prometheus 2.36.2
- alertmanager 0.24.0
構成図
3台の仮想マシンに対して、以下コンポーネントがインストール済の状態とします。
+----------------+ +----------------+ +----------------+ | linux040 | | linux041 | | linux042 | | 172.16.1.40/24 | | 172.16.1.41/24 | | 172.16.1.42/24 | | node_exporter | | node_exporter | | node_exporter | | prometheus | | | | | +----------------+ +----------------+ +----------------+
アラートに関する設定
アラートの設定
アラートの書式は「Prometheus レコーディング」と非常によく似ています。以下のように設定すれば、jobがnodeという名前のマシンについて、80%未満が生存していればアラート「SomeInstancesDown」を発報し、50%未満が生存していればアラート「ManyInstancesDown」を発報します。
cat << EOF > /etc/prometheus/rules.yml groups: - name: example rules: - record: job:up:avg expr: avg without(instance)(up{job="node"}) - alert: SomeInstancesDown expr: job:up:avg < 0.8 for: 5m labels: severity: warn - alert: ManyInstancesDown expr: job:up:avg < 0.5 for: 5m labels: severity: critical EOF
「Prometheus レコーディング」と同様に、prometheus.ymlに外部ファイルrules.ymlを参照するように設定する。
cat << EOF > /etc/prometheus/prometheus.yml global: scrape_interval: 10s evaluation_interval: 10s rule_files: - rules.yml scrape_configs: - job_name: prometheus static_configs: - targets: - 172.16.1.40:9090 - job_name: node static_configs: - targets: - 172.16.1.40:9100 - 172.16.1.41:9100 - 172.16.1.42:9100 EOF
アラートマネージャーの設定
アラートを発報するにはアラートマネージャーというソフトウェアが必要です。このページでは動作確認用の最低限の説明に留めます。
まずは、アラートマネージャーをインストールします。
dnf install alertmanager
メールを用いた通報をするには以下のように設定します。
cat << EOF > /etc/prometheus/alertmanager.yml route: receiver: 'email-notice' receivers: - name: 'email-notice' email_configs: - to: '<宛先メールアドレス>' from: '送信元名 <送信元メールアドレス>' smarthost: '<メールサーバFQDN>:<メールサーバポート番号>' auth_username: '<メールユーザ名>' auth_password: '<メールパスワード>' require_tls: false EOF
アラートマネージャーを起動します。
systemctl enable alertmanager.service --now
アラートマネージャーはtcp9093でlistenしています。Prometheusからアラートマネージャーのtcp9093へ通報するように設定します。
cat << EOF > /etc/prometheus/prometheus.yml global: scrape_interval: 10s evaluation_interval: 10s rule_files: - rules.yml scrape_configs: - job_name: prometheus static_configs: - targets: - 172.16.1.40:9090 - job_name: node static_configs: - targets: - 172.16.1.40:9100 - 172.16.1.41:9100 - 172.16.1.42:9100 alerting: alertmanagers: - static_configs: - targets: - 'localhost:9093' EOF
アラートの動作確認
アラートの状態遷移
アラート画面(http://<IPアドレス>9090/alerts)をブラウザで閲覧します。すると、アラートが緑色で「inactive」と表示されます。これが正常な状態です。
1台のマシンでNode Exporterを停止し、疑似的な障害を発生させます。
systemctl stop node_exporter.service
アラート画面を見ると、黄色で「pending」と表示されます。この時点ではアラートは発報されません。
ここでrules.ymlに設定したアラートのルールを思い出してください。以下にrules.yamlを再掲します。「for:5m」という期間を設定しています。これは一時的なダウンで発報しないための仕様で、exprの条件を満たした時間がforを超過すると、「pending」から「firing」に変わります。
cat << EOF > /etc/prometheus/rules.yml groups: - name: example rules: - record: job:up:avg expr: avg without(instance)(up{job="node"}) - alert: SomeInstancesDown expr: job:up:avg < 0.8 for: 5m - alert: ManyInstancesDown expr: job:up:avg < 0.5 for: 5m EOF
5分経過後、再度、アラート画面を見ます。状態が「pending」から「firing」に変わった事を確認します。
メールの受信確認
メールサーバの設定に誤りがないならば、以下スクリーンショットのようにメールの受信を確認できます。もし、メールサーバの構築が手間ならばSMTPによる接続を公開しているフリーメール(Gmail, Yahooメールなど)を利用しても良いでしょう。
補足
メール以外の通知方法
webhook
アラートマネージャーはwebhookによる通知も可能です。適当な動作確認用のwebhookをすぐに準備できない方はwebhook.siteを利用すると良いでしょう。以下スクリーンショットのようなサービスです。
webhookに通知するには以下のような設定を作成します。urlの部分は環境に合わせて適宜変更してください。
cat << EOF > /etc/prometheus/alertmanager.yml route: receiver: 'webhook-notice' receivers: - name: webhook-notice webhook_configs: - url: https://webhook.site/18b24b33-efcc-4713-9cc9-4a83909af3a6 EOF
node exporterのうち1台を停止させると、以下のようなアラートが発報されます。