やばい時には通知する
監視の練習として, Alertmanagerを使ってラズパイから通知をGmailで送るようにした.
やったことのまとめ
- Googleアカウントの設定をしてSMTPサーバーを使えるようにした
- ラズパイにAlertmanagerを突っ込んでGmail経由で通知を送るようにした
つかうもの
- Raspberry Pi 3 Model B+
- OSはRaspbian(10.0)
- Node exporter
- version=“0.18.1”
- Prometheus
- version=“2.15.2”
- Alertmanager
- version=“0.20.0”
- 今回入れる
- Googleのアカウント
Node exporterとPrometheusはラズパイにインストール済み
構成

今回は図のような構成で通知を送る.
Prometheus は各 exporter を常に監視しており,
監視対象(ラズパイ)に何か問題が発生した場合 Node exporter のメトリクスが変化する.
Prometheus では監視対象のメトリクスについて設定した条件(放っておいたらまずい状態)を満たした際にアラートを発火させる.
Alertmanager は発火したアラートに応じた処理を行うが,
今回はGmail経由で管理者に通知するようにする.
やったこと
SMTPサーバーの設定
まずはラズパイ上のアプリケーションからメールを送れるようにSMTPサーバーの設定を行う.
今回はGmailをSMTPサーバーとして使用するが, 他に利用可能なメールサーバーがあれば飛ばしても良い.
ここを参考に, Googleアカウントでアプリ用パスワードを設定する.
https://myaccount.google.com/u/1/security を開き, セキュリティ->2段階認証プロセスと進む.

もろもろの設定をして2段階認証を有効化する.
細かい設定手順はここを参考にする.

再度 https://myaccount.google.com/u/1/security を開くとアプリパスワードの項目が増えているので進む.アプリを選択からその他(名前を入力)を選び, 適当な名前(alertmanager)を入力して生成を押す.

16文字のアプリパスワードが生成されるので覚えておく.
このパスワードを使ってラズパイからメールを送る.

SMTPサーバーの設定はここを参考に後ほどAlertmanagerの設定に記述する.
| 項目 | 値 |
|---|---|
| SMTPホスト名 | smtp.gmail.com |
| ポート番号 | 587 |
| アカウント | アプリパスワードを発行したアカウント名 |
| パスワード | アプリパスワード |
以上でGmailをSMTPサーバーとして使うための準備は完了.
Alertmanagerのインストール
次にPrometheusで発火したアラートを処理するためのAlertmanagerをインストールする.
ファイルは前回と同じようにここからダウンロードする. Architectureはarmv7であることに注意.
# 任意のディレクトリで実行
$ cd /path/to/workspace
# Alertmanagerをダウンロードして展開, フォルダを移動
$ wget https://github.com/prometheus/alertmanager/releases/download/v0.20.0/alertmanager-0.20.0.linux-armv7.tar.gz
$ tar -xzf alertmanager-0.20.0.linux-armv7.tar.gz
$ sudo cp -a alertmanager-0.20.0.linux-armv7 /usr/local/alertmanager
# service用ユーザの作成, データ保存用ディレクトリの作成
$ sudo useradd -U -s /sbin/nologin -M -d / alertmanager
$ sudo mkdir -p /var/lib/alertmanager/data
$ sudo chown -R alertmanager:alertmanager /var/lib/alertmanager
# serviceファイルを作成
$ sudo vim /etc/systemd/system/alertmanager.service
# serviceを起動
$ sudo systemctl daemon-reload
$ sudo systemctl enable alertmanager
Created symlink /etc/systemd/system/multi-user.target.wants/alertmanager.service → /etc/systemd/system/alertmanager.service.
$ sudo systemctl start alertmanager
$ systemctl status alertmanager
● alertmanager.service - Alertmanager
Loaded: loaded (/etc/systemd/system/alertmanager.service; enabled; vendor preset: enabled)
Active: active (running) since Mon 2020-01-27 00:10:38 JST; 4s ago
Main PID: 9413 (alertmanager)
Tasks: 13 (limit: 2200)
Memory: 7.7M
CGroup: /system.slice/alertmanager.service
└─9413 /usr/local/alertmanager/alertmanager --config.file=/usr/local/alertmanager/alertmanager.yml --storage.path=/var/lib/alertmanager/data
...
Jan 27 00:10:38 raspberrypi alertmanager[9413]: level=info ts=2020-01-26T15:10:38.829Z caller=main.go:497 msg=Listening address=:9093
...
alertmanager.service
[Unit]
Description=Alertmanager
[Service]
User=alertmanager
ExecStart=/usr/local/alertmanager/alertmanager \
--config.file=/usr/local/alertmanager/alertmanager.yml \
--storage.path=/var/lib/alertmanager/data
[Install]
WantedBy=multi-user.target
<ラズパイのIP>:9093をブラウザで開くとAlertmanagerのUI画面が表示される.
(ラズパイのブラウザで開く場合はlocalhost:9093)

これでAlertmanagerのインストールと起動ができた.
通知設定とテスト
次にPrometheusでアラートを発生させるための設定を行う.
アラートルールの設定ファイルrules.ymlで監視対象がダウンしたときに発火するInstanceDownアラートを定義し,prometheus.ymlでこれを参照するよう設定する.
# アラートの条件を記述するファイルを作成
$ vim /usr/local/prometheus/rules.yml
# prometheusの設定ファイルを修正
$ vim /usr/local/prometheus/prometheus.yml
# prometheusのserviceを再起動
$ sudo systemctl restart prometheus
rules.yml
groups:
- name: instance
rules:
- alert: InstanceDown
expr: up == 0 # 監視対象のupが0(down)になり
for: 1m # かつその状態が1分以上続くと発火
prometheus.yml
global:
scrape_interval: 15s
evaluation_interval: 15s
rule_files:
- rules.yml # アラート設定を読み込む
alerting:
alertmanagers:
- static_configs:
- targets: ['localhost:9093'] # 9093番ポートで起動しているAlertmanagerにアラートを送る
scrape_configs:
- job_name: 'prometheus'
static_configs:
- targets: ['localhost:9090']
- job_name: 'node'
static_configs:
- targets: ['localhost:9100']
この時点で<ラズパイのIP>:9090をブラウザで開き, Alertsを選択するとアラート設定が有効になっていることがわかる.

ここで試しに監視対象のNode exporterを止めてアラートを発火させてみる.
# Node exporterのサービスを止める
$ sudo systemctl stop node_exporter
# アラートの動作確認(発火)が完了した後で再度サービスを起動する
$ sudo systemctl start node_exporter
rules.ymlで定義したとおり,
監視対象(Node exporter)がダウンして1分経つとアラートが発火する.

また, PrometheusからAlertmanagerにアラートが飛んできていることが確認できる.

以上でPrometheusのアラート設定は完了.
次にAlertmanagerでアラートを処理する設定を行う.
Alertmanagerの設定ファイルalertmanager.yamlを修正し,
アラートが飛んできた際の処理を設定する.
メール設定の部分にSMTPサーバーの設定で確認した項目を書き込む.
設定の書き方はここを参考にする.
# Alertmanagerの設定ファイルを編集
$ vim /usr/local/alertmanager/alertmanager.yml
# サービスを再起動
$ sudo systemctl restart alertmanager
alertmanager.yml
global:
resolve_timeout: 5m
smtp_smarthost: 'smtp.gmail.com:587' # SMTPサーバーのホスト名
smtp_from: 'xxxxxxxxx@gmail.com' # 先程設定したアカウントのメールアドレスを送信元に設定
smtp_auth_username: 'xxxxxxxxx' # アカウント名
smtp_auth_password: 'wwwwwwwwwwwwwwww' # アプリパスワード
route:
group_by: ['alertname']
group_wait: 10s
group_interval: 10s
repeat_interval: 1h
receiver: alert-email
receivers:
- name: alert-email
email_configs:
- to: 'yyyyyyyyy@gmail.com' # 通知を受け取るメールアドレスを設定
以上でAlertmanagerからGmail経由で通知メールを送る設定は完了.
動作確認のため, 先程と同様にNode exporterを再度落としてみる.
# Node exporterのサービスを止める
$ sudo systemctl stop node_exporter
# アラートの動作確認(発火)が完了したら再度サービスを起動する
$ sudo systemctl start node_exporter
宛先に指定したメールアドレス(yyyyyyyyy@gmail.com)の受信トレイを確認すると,
アラートメールが送信されていることがわかる.

やったぜ.
これでPrometheusのアラートをGmail経由で通知できるようになった.
おわり
以上でラズパイ監視のアラートを通知できるようになった.
いよいよ監視っぽくなってきた…
おまけ

