CLOVER🍀

That was when it all began.

PrometheusのAlertmanagerを試す

これは、なにをしたくて書いたもの?

  • Prometheusにアラート通知の仕組みがあるらしいので、試してみようと
  • まずは、お試しということで

Alertmanager?

Prometheusには、Alertmanagerというプロダクトがあります。

Alertmanager | Prometheus

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を表示。

f:id:Kazuhira:20190211185831p:plain

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メニューを見てみます。

すると、作成したルールが表示されます(名前をクリックすると、定義が展開されます。このキャプチャは、展開状態のものです)。

f:id:Kazuhira:20190211185816p:plain

ここで、Node Exporterをダウンさせてみます。

10秒間隔でPrometheusからNode Exporterに情報を取得に行っているので、そこで検出され、Stateが「PENDING」になります。

f:id:Kazuhira:20190211190359p:plain

さらに30秒待つと、Stateが「FIRING」になってAlertmanagerへの通知が始まります。

f:id:Kazuhira:20190211190413p:plain

猶予があるというのは、この30秒間のことですね。

Alertmanagerからメール通知を行ってみる

では、Alertmanagerからアラートに合わせてメール通知を行ってみます。メールの受け取り先には、MailCatcherを使用しました。

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の設定のリファレンスは、こちら。

Configuration | Prometheus

確認

ここまで用意したものを合わせて、メール通知が行われるまで確認してみましょう。

AlertmanagerにもWeb UIがあるので、そちらから見てみます。ポート9093で参照できます。

AlertmanagerのWeb UIのAlertsメニューを見てみると、Node Exporterが起動した状態だと、特になにも表示されません。

f:id:Kazuhira:20190211201722p:plain

そしてNode Exporterがダウンし、30秒経過してStateが「FIRING」となると、Alertmanager側に情報が現れます。

f:id:Kazuhira:20190211201736p:plain

で、少し待っているとメール通知が行われることが確認できるでしょう。

f:id:Kazuhira:20190211201804p:plain

Node Exporterを起動させると、Alerts側から情報が消えます。

f:id:Kazuhira:20190211201813p:plain

簡単ではありますが、Alertmanagerでのメールを使ったアラート通知が確認できました、と。