2018年10月2日火曜日

Prometheus のアラート機能を試してみた

概要

Prometheus には蓄積したデータからアラートを発泡することができます
アラートの種類はさまざまあり Slack や Gmail などに通知することができます
アラートを通知するには AlertManager というプロセスを立ち上げる必要があります
今回は AlertManager の構築方法と構築した Prometheus サーバとの連携方法を紹介します
また簡単な通知のテストを Slack を使ってやってみました

環境

  • Ubuntu 16.04 LTS
  • Prometheus 2.4.2
  • Prometheus AlertManager v0.15.2
  • docker 18.03.1-ce

事前準備

Prometheus サーバの構築と Slack の Incomming Webhook のインテグレーションの設定は済ませておいてください

Prometheus サーバに AlertManager を登録する

まずは Prometheus サーバに通知を依頼する AlertManager を登録します
登録するには YAML ファイルを編集して Prometheus サーバを再起動します

  • vim prometheus.yml
alerting:
  alertmanagers:
  - static_configs:
    - targets:
      - '192.168.100.20:9093'

alertmanagers ディレクティブを使います
192.168.100.20 は AlertManager です
あとでこのサーバ上で AlertManager を構築します
ポートは AlertManager デフォルトの 9093 を使用します

Prometheus サーバに監視ルールを登録する

Prometheus に蓄積データを使って通知を飛ばすには監視ルールを作成する必要があります
ここで言う監視ルールとは単純に「CPU 使用率 80%」などのルールになります
ルールを登録するには例のごとく YAML ファイルを編集します
ちなみにルールを UI から追加することはできないので新規で監視ルールを追加する場合はルール用の設定ファイルを毎度編集する必要があります

  • vim prometheus.yml
rule_files:
  - 'alerts.rule'

alerts.rule ファイルを別途作成しここに監視のルールを記載します
ルールも YAML で定義します
Prometheus のバージョン 2 からルールも YAML で定義できるようになりました
バージョン 1 を使っている場合は監視ルールの YAML 定義が使えないので注意してください

groups:
  - name: 'Containers monitoring'
    rules:
    - alert: 'container_1 cpu usage alert'
      expr: container_cpu_usage_seconds_total{name=~"container_1",cpu="cpu01"} > 80
      for: 5s
      annotations:
        summary: 'container_cpu_usage_seconds_total:container_1 > 80'

ポイントは exprforannotatins.summary になります

expr は監視する式を記載します
container_cpu_usage_seconds_total は cAdvisor の exporter を使って取得できるデータになります
cAdvisor と Prometheus を連携する方法はこちらを参照してください
あとは引数に監視するコンテナ名と CPU が複数あるので 1 つ分の CPU を指定します
この値が > 80 になったときにアラートが発泡されます
> 80 は単純に CPU 使用率が 80% を越えたらという条件になります

for> 80 の条件がどれだけの期間続いたらアラートを発泡するかの指定になります
つまり 5s を指定した場合は 1 秒や 2 秒だけ 80% を越えてもアラートは来ません

annotations.summary はアラート時のメッセージになります
今回は使っていませんが $value などの変数が使えます
CPU の使用率などが変数に展開されるのでそれを通知内容に含めることができます

AlertManager 用の設定ファイルを作成する

AlertManager 用の設定ファイルには主に通知先の設定を記載します
今回は Slack に通知するので Slack の Incomming Webhook の URL やチャネルなどを定義します

  • vim alertmanager.yml
route:
  receiver: 'containers_notification'
receivers:
- name: 'containers_notification'
  slack_configs:
    - api_url: 'https://hooks.slack.com/services/xxxxxxxx/xxxxxxxxx/xxxxxxxxxxxxxxxxxxxxxxxx'
      channel: '#general'
      text: "{{ .CommonAnnotations.summary }}"
      send_resolved: true

api_urlchannel に関しは Slack の情報を入力してください
ポイントは {{ .CommonAnnotations.summary }} でルールで定義した annotatins.summary の内容を参照することができます

AlertManager を起動する

今回は Docker で起動します

  • docker run -d -p 9093:9093 --name alertmanager -v $(pwd):/alertmanager prom/alertmanager --config.file=/alertmanager/alertmanager.yml

で 9093 で LISTEN すれば OK です
ブラウザでアクセスすると簡単な管理画面を確認することができます

alertmanager: error: unknown short flag '-c', try --help というエラーが出る場合は引数を見直してください
--config.file でハイフンが 2 つ指定が必要です
-config.file でハイフンが 1 つだと上記のエラーが発生します

Prometheus サーバを起動する

すでにコンテナが起動している場合は docker restart だけで OK です
まだコンテナが起動していない場合は以下で起動します

  • docker run -d -p 9090:9090 --name prometheus -v $(pwd):/prometheus-data prom/prometheus --config.file=/prometheus-data/prometheus.yml

9090 にアクセスすると管理画面が確認できます

動作確認

まずはちゃんと監視ルールが Prometheus サーバに認識されているか確認しましょう
Alert を開いて監視ルールが存在するか確認します
prometheus_alertmanager1.png

現状は CPU 使用率が 80% 以下なのでアラートが飛びません
適当にコンテナの CPU 使用率を上げると AlertManager に対して通知依頼おリクエストが飛びます

Slack には以下のようにアラートが来ると思います
prometheus_alertmanager2.png

最後に

Prometheus のアラート機能を試してみました
ポイントは監視ルールの定義と AlertManager の通知設定かなと思います
まずは監視ルールだけ追加して問題なくルールが動作しているようであれば AlertManager を追加する流れが良いかなと思います

通知先と AlertManager の登録は一度行えば OK なので後は監視ルールの変更をチューニングしましょう

参考サイト

0 件のコメント:

コメントを投稿