こんにちは。サイオステクノロジー OSS サポート担当 山本 です。
以前の記事で扱った監視ツール Prometheus には、収集した metrics が一定の条件を満たした場合にメール等で通知する機能があります。
今回はその Prometheus の通知機能のうち、メールでの通知方法について確認していきます。
■Prometheus の通知機能
Prometheus のような監視ツールでは通知機能が存在していることは珍しくないですが、勿論 Prometheus にも通知機能は存在しています。
Prometheus の通知機能を使用する場合、別途通知機能を扱う AlertManager というツールが必要になります。
今回は Prometheus と node_exporter の設定を終えたところから必要になる設定を見ていきます。
Prometheus などの設定方法につきましては、以前の記事を参照してください。
■Alertmanager の導入と設定
まずは Prometheus で通知を行うために必要になる Alertmanager を導入しましょう。
Alertmanager は Prometheus 公式サイトの ダウンロードページからダウンロードできます。
まずはダウンロードして解凍しましょう。この記事の投稿時点では、以下のコマンドを実行すれば OK です。
# wget https://github.com/prometheus/alertmanager/releases/download/v0.17.0/alertmanager-0.17.0.linux-amd64.tar.gz # tar xzvf alertmanager-0.17.0.linux-amd64.tar.gz
続いて、Alertmanager の設定を行います。Alertmanager では通知先や通知方法など、「どのようにして」「どこへ」通知を行うかの設定を行います。
Alertmanager の設定ファイル alertmanager.yml を開き、以下の項目を設定します。
・(global:) smtp_from: <送信元メールアドレス>
・(global:) smtp_smarthost: <メールサーバのアドレス:ポート>
・(route: routes:) – receiver: <任意のレシーバ名>
・(route: routes: – receiver: match:) <任意のラベル名>: <任意のラベル値>
・(receivers:) – name: <レシーバ名>
・(receivers: – name: email_configs:) – to: <送信先メールアドレス>
・(receivers: – name: email_configs: – to:) require_tls: false (※TLS を使用しない場合のみ)
例えば、デフォルトの設定に localhost のメールサーバで localhost の root ユーザにメール通知を行う設定を追加すると、以下のようになります。
alertmanager.yml 例1
global: resolve_timeout: 5m smtp_from: 'prometheus.test@example.com' smtp_smarthost: 'localhost:25' route: group_by: ['alertname'] group_wait: 10s group_interval: 10s repeat_interval: 1h receiver: 'web.hook' routes: - receiver: 'mailtest' match: test_type: SampleAlert receivers: - name: 'mailtest' email_configs: - to: 'root@localhost.localdomain' require_tls: false - name: 'web.hook' webhook_configs: - url: 'https://127.0.0.1:5001/' inhibit_rules: - source_match: severity: 'critical' target_match: severity: 'warning' equal: ['alertname', 'dev', 'instance']
デフォルトで設定されている “web.hook” レシーバの設定がいらない場合は、以下のような形にすることもできます。
alertmanager.yml 例2
global: resolve_timeout: 5m smtp_from: 'prometheus.test@example.com' smtp_smarthost: 'localhost:25' route: group_by: ['alertname'] group_wait: 10s group_interval: 10s repeat_interval: 1h receiver: 'mailtest' receivers: - name: 'mailtest' email_configs: - to: 'root@localhost.localdomain' require_tls: false inhibit_rules: - source_match: severity: 'critical' target_match: severity: 'warning' equal: ['alertname', 'dev', 'instance']
その他の詳細な設定やメール以外の方法で通知を行いたい場合などは公式ドキュメントを参照してください。
設定を終えたら、以下のコマンドを実行して Alertmanager を起動します。
(Alertmanager のディレクトリ内) # nohup ./alertmanager --config.file=alertmanager.yml &
起動後、node_exporter の時と同様に nohups.out から Alertmanager のポート番号を確認しておきましょう。
(通常、Alertmanager の使用ポートは 9093 です。)
■Prometheus の設定変更
さて、Prometheus で通知を行うためには、Alertmanager の設定だけではなく Prometheus 側の設定も必要になります。
Alertmanager と連携させる設定は勿論ですが、「どんな時に通知を行うのか」、つまり通知条件の設定も Prometheus 側で行う必要があります。
まずは Alertmanager との連携設定から見ていきます。
Prometheus と Alertmanager の連携は Prometheus の設定ファイル prometheus.yml に設定します。デフォルトで Alertmanager を設定する箇所が用意されていますので、以下の設定を追加しましょう。
・(alerting: alertmanagers: – static_configs: – targets:) – <Alertmanager を動作させているホスト名> : <ポート番号>
prometheus.yml
: # Alertmanager configuration alerting: alertmanagers: - static_configs: - targets: # - alertmanager:9093 - localhost:9093 :
次に、通知条件の設定です。
その前にまず、Prometheus の Web インターフェースから、今回の例で確認に使うファイルシステムの空き領域を取得する metrics、node_filesystem_avail_bytes の値の確認をしましょう。ブラウザから以下のページにアクセスして確認しておいてください。
https://(IP アドレス or サーバ名):9090/graph
さて、通知条件の設定方法ですが、Prometheus のディレクトリ内に任意の名前の yml ファイルを作成して設定を記述します。
今回は「alert_rules.yml」というファイルを作成し、ファイルシステムの空き領域が一定以下になったら通知が行われるように設定してみます。
設定例は以下のとおりです。
alert_rules.yml
groups: - name: sample_alert rules: - alert: AlertTest expr: node_filesystem_avail_bytes{mountpoint="/"} < 8589934592 for: 3m labels: severity: test test_type: SampleAlert annotations: summary: sample_alert
この設定のうち、特に重要になるのは以下の 3つです。
・(groups: - name: rules: - alert:) expr: <promQL を用いた条件式>
(この条件式を満たしている間、通知を行います)
・(groups: - name: rules: - alert:) for: <時間>
(expr の条件を満たしてから、最初の通知を行うまでの時間)
・(groups: - name: rules: - alert: labels:) [<ラベル名>: <ラベル値>]
(Alertmanager の設定ファイル alertmanager.yml で route: routes: - receiver : match を設定した receiver を使う場合に必要)
上記の設定例は「node_filesystem_avail_bytes{mountpoint="/"} が 8589934592byte より小さい状態が 3分間続いた場合には通知を送る」という設定になります。
この手順に沿って実際に試す場合には、expr に設定する条件式の数値は先に Prometheus のインターフェースで確認した値より 100MB 程度小さい値に設定しておいてください。
続いて、Prometheus からこの通知設定ファイル alert_rules.yml を参照するように prometheus.yml で設定します。
こちらはデフォルトで用意されている "rule_files" 要素に追加する形で設定すれば OK です。
・(rule_files:) - "<通知設定ファイル名>"
prometheus.yml
: # Load rules once and periodically evaluate them according to the global 'evaluation_interval'. rule_files: # - "first_rules.yml" # - "second_rules.yml" - "alert_rules.yml" :
ここまで設定を行ったら、最後に Prometheus を再起動、または設定を再読み込みさせれば Prometheus の通知設定は完了です。
(起動) # nohup ./prometheus --config.file=prometheus.yml & または (設定の再読み込み) # killall -HUP prometheus
■通知の確認
それでは、通知が機能するのか確認してみましょう。
まず、ブラウザから以下のアドレスにアクセスして、Prometheus の Alerts 画面を開いてみてください。
https://(IP アドレス or サーバ名):9090/alerts
正しく設定ができていれば、"alert_rules.yml" の設定内容のうち、「alert」に設定した値と同じ名前の項目が表示されているはずです。また、expr の条件を満たしていない場合、この項目の背景は緑色になっています。
この項目を押下すると、設定されている通知の詳細が確認できます。
上手く設定できているのが確認できたら、例として以下のコマンドを実行して 200MB のダミーファイルを作成し、今回の expr の条件を満たす状態にしてみましょう。
# fallocate -l 200MiB dummy_file
ダミーファイルを作成したら、再度ブラウザから Alerts 画面を開いてみてください。Prometheus が監視データを収集して expr の条件が満たされたことが検知されると、対象の通知項目が背景の黄色い「PENDING」に変化するはずです。しかし、この時点ではまだメール通知は行われません。
「PENDING」状態で expr の条件を満たしたまま 3分 ("alert_rules.yml" で「for」に設定した時間) が経過すると、対象の通知項目が背景の赤い「FIRING」状態となるはずです。更に、この時点で alertmanager.yml で設定したメールの送信先に通知メールが届いているはずです。
また、デフォルトではメール通知後 FIRING 状態のまま1時間 ("alertmanager.yml" の「repeat_interval」に設定されている時間) が経過する毎に、通知メールが送られます。
以上で prometheus でメール通知を行う方法の確認手順は終了です。
確認を終えたら、忘れずに今回の手順で作成したダミーファイルを削除しましょう。
# rm -f dummy_file
■最後に
今回は prometheus でメール通知を行う方法を見てきました。
prometheus などの監視ツールでは「どのような監視ができるのか」が最重要だと思いますが、同時にこの「通知方法」についても特に障害検知の観点ではかなり重要な要素ではないか、と思います。
今回はメールでの通知の設定を扱いましたが、公式ドキュメントによれは prometheus には他にも様々な通知方法に対応しているとのことですので、監視ツールを選定中の方はよく使うツールが対応していないかを確認してみてはいかがでしょう。