これは、なにをしたくて書いたもの?
- Prometheusにアラート通知の仕組みがあるらしいので、試してみようと
- まずは、お試しということで
Alertmanager?
Prometheusには、Alertmanagerというプロダクトがあります。
Prometheusとは別に起動するプロセスで、Prometheusからのアラートに関する情報を受け取って、通知はAlertmanagerが
行うという役割分担になっています。
Alertmanagerでは、メール、Slack、WebHookなどで通知を行うことができます。
また、以下のような特徴を持ちます。
- グルーピング … 類似のアラートを、単一の通知に分類
- inhibition(抑制) … 他のアラートが発生している時に、特定のアラート通知を抑制する
- silences(ミュート) … 一定時間、アラートをミュートする
この他、Prometheusからの駆動ではなく、直接アラート通知を行うクライアントとして操作したり、高可用性に関する
特性などもあるようです。
今回は、シンプルなケースでアラート通知を行うまでを確認してみます。
環境
今回の環境は、こちらです。Dockerコンテナで、以下の4つのコンテナを用意しました。
- Node Exporter 0.17.0 … 172.17.0.2
- Prometheus 2.7.1 … 172.17.0.3
- Alertmanager 0.16.1 … 172.17.0.4
- MailCatcher … 172.17.0.5
Prometheusに関しては構築は端折りますが、その他に関しては簡単なインストール方法から書いていきます。
今回のお題としては、Node ExporterでOSのメトリクスをエクスポートしますが、このNode Exporterがダウンしたら
アラート通知を行う、というシナリオで考えてみたいと思います。
Node Exporterから情報取得
まずは、メトリクスの収集元であるNode Expoterを起動します。
GitHub - prometheus/node_exporter: Exporter for machine metrics
ダウンロードして展開、起動。
$ wget https://github.com/prometheus/node_exporter/releases/download/v0.17.0/node_exporter-0.17.0.linux-amd64.tar.gz $ tar xf node_exporter-0.17.0.linux-amd64.tar.gz $ cd node_exporter-0.17.0.linux-amd64 $ ./node_exporter
Node Exporter側の準備は、これだけです。
続いて、用意したNode Exporterからメトリクスを収集するように、Prometheusを設定します。
prometheus.yml
global: scrape_interval: 10s evaluation_interval: 10s scrape_configs: - job_name: 'prometheus' static_configs: - targets: ['localhost:9090'] - job_name: 'node' static_configs: - targets: ['172.17.0.2:9100']
10秒間隔で、情報収集を行うように設定しました。
確認として、up(起動数)と直近1分のLoad Averageを表示。
Alertmanager
それでは、Alertmanagerを用意します。
GitHub - prometheus/alertmanager: Prometheus Alertmanager
ダウンロードして、起動。
$ wget https://github.com/prometheus/alertmanager/releases/download/v0.16.1/alertmanager-0.16.1.linux-amd64.tar.gz $ tar xf alertmanager-0.16.1.linux-amd64.tar.gz $ cd alertmanager-0.16.1.linux-amd64 $ ./alertmanager
起動したら、Prometheusに対してAlertmanagerへの参照と、アラートに関するルール設定をします。 prometheus.yml
global: scrape_interval: 10s evaluation_interval: 10s rule_files: - rules.yml alerting: alertmanagers: - static_configs: - targets: - 172.17.0.4:9093 scrape_configs: - job_name: 'prometheus' static_configs: - targets: ['localhost:9090'] - job_name: 'node' static_configs: - targets: ['172.17.0.2:9100']
Node Exporterに関するjob_nameは、「node」と名付けました。
Alertmanagerへの参照設定は、こちら。
alerting: alertmanagers: - static_configs: - targets: - 172.17.0.4:9093
ルールに関するファイルは、以下の部分ですが
rule_files: - rules.yml
実体は、prometheus.ymlと同じディレクトリに配置した、以下のファイルに記載しています。 rules.yml
groups: - name: example rules: - alert: NodeInstanceDown expr: up{job='node'} == 0 for: 30s
ルールに関する記述は、こちらを参照。
https://prometheus.io/docs/prometheus/2.7/configuration/alerting_rules/
アラートのルールとして「NodeInstanceDown」という名前で、job_nameが「node」のものが0になったらアラートの通知対象と
なります。ただ、「for」で指定していますが30秒間の猶予期間を設けています。
この猶予期間について、どういうことか確認してみましょう。
とりあえず、この設定ファイルを書いてPrometheusに設定を再読み込みさせてから、PrometheusのWeb UI(ポート9090)の
Alertsメニューを見てみます。
すると、作成したルールが表示されます(名前をクリックすると、定義が展開されます。このキャプチャは、展開状態のものです)。
ここで、Node Exporterをダウンさせてみます。
10秒間隔でPrometheusからNode Exporterに情報を取得に行っているので、そこで検出され、Stateが「PENDING」になります。
さらに30秒待つと、Stateが「FIRING」になってAlertmanagerへの通知が始まります。
猶予があるというのは、この30秒間のことですね。
Alertmanagerからメール通知を行ってみる
では、Alertmanagerからアラートに合わせてメール通知を行ってみます。メールの受け取り先には、MailCatcherを使用しました。
Dockerイメージがあったので、こちらを利用。
DockerHub / schickling/mailcatcher
$ docker container run -it --rm --name mailcatcher schickling/mailcatcher:latest
起動したら、Alertmanagerの設定を変更して、メール通知の設定を行います。
alertmanager.yml
global: smtp_smarthost: '172.17.0.5:1025' smtp_from: 'alertmanager@example.com' smtp_require_tls: false route: receiver: 'example.email' receivers: - name: 'example.email' email_configs: - to: 'alert@example.com'
グローバルな領域にSMTPサーバーおよび、formアドレスの設定、TLSの設定を行います。これらは、メール通知の個別設定の
デフォルト値として利用されます。
※デフォルトでTLSの利用がONなので、切っておきました
あとは、メールのtoアドレスの設定をしてAlertmanagerを再起動しました。
Alertmanagerの設定のリファレンスは、こちら。
確認
ここまで用意したものを合わせて、メール通知が行われるまで確認してみましょう。
AlertmanagerにもWeb UIがあるので、そちらから見てみます。ポート9093で参照できます。
AlertmanagerのWeb UIのAlertsメニューを見てみると、Node Exporterが起動した状態だと、特になにも表示されません。
そしてNode Exporterがダウンし、30秒経過してStateが「FIRING」となると、Alertmanager側に情報が現れます。
で、少し待っているとメール通知が行われることが確認できるでしょう。
Node Exporterを起動させると、Alerts側から情報が消えます。
簡単ではありますが、Alertmanagerでのメールを使ったアラート通知が確認できました、と。