【初心者】Prometheus/Loki/Grafanaを使ってみる #2 (Alertmanagerによるアラーム通知)

# 1. はじめに
- 前回の記事「【初心者】Prometheus/Loki/Grafanaを使ってみる (メトリクス/ログの収集と表示) 」で、データの収集と表示を行った。
- 次のステップとして、PrometheusにAlertmangerコンポーネントを追加し、アラートの出力方法を確認する。
- 関連記事の一覧は以下。
    -  [【初心者】Prometheus/Loki/Grafanaを使ってみる (メトリクス/ログの収集と表示)](https://qiita.com/mksamba/items/40e8c1cc9126e2e72cfa)
        -  メトリクスとログを収集しGrafanaで表示させる。
    -  【初心者】Prometheus/Loki/Grafanaを使ってみる #2 (Alertmanagerによるアラーム通知)
        -  本記事。Alertmanagerを追加し、CPU高負荷時にslackへの通知を行う。
    -  [【初心者】Prometheus/Loki/Grafanaを使ってみる #3 (Amazon Managed Service for Promethus連携)](https://qiita.com/mksamba/items/99f7400c1c361add6fdb)
        -  自分のPrometheusで収集したメトリクスをAmazon Managed Service for Promethusに連携する。

# 2. やったこと
- 既存のPrometheusサーバにAlertmanagerのコンポーネントを追加し、必要な設定を行う。
    - Alertmanagerのインストール、サービス化
    - Alertmanagerからの通知先設定(今回はslackへ通知)
    - Alertmanagerのルール設定(今回は、監視対象サーバのCPU使用率70%超過で通知)
- ルール適合時に実際にalertが通知されることを確認する。

# 3. 構成図
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189302/b7cbbb7e-3ea9-81d0-ad8d-3c15f1ed8484.png)

# 4. 手順
## 4.1 事前準備
- 通知先となるslackを用意する。
    - 検証用のワークスペースにチャネル mksamba-prometheus-alert を作成する。
    - チャネル mksamba-prometheus-alert に対する Webhook (https:\//hooks.slack.com/services/xxxxxxのようなURL) を設定する。

## 4.2 Alertmanager
- 既存の監視サーバ(Prometheusインストール済)にAlertmanagerコンポーネントを追加インストールする。

### インストール
- 資材をダウンロード、インストールする。
```
# 2023/9時点の最新版 v0.26.0 (2023/8/23リリース) を使用 
[ec2-user@ip-10-0-0-249 alertmanager]$ wget https://github.com/prometheus/alertmanager/releases/download/v0.26.0/alertmanager-0.26.0.linux-amd64.tar.gz
[ec2-user@ip-10-0-0-249 alertmanager]$ tar xvf alertmanager-0.26.0.linux-amd64.tar.gz
[ec2-user@ip-10-0-0-249 alertmanager]$ cd alertmanager-0.26.0.linux-amd64/
[ec2-user@ip-10-0-0-249 alertmanager-0.26.0.linux-amd64]$ sudo cp -p alertmanager /usr/local/bin
```

### slack通知設定
- alertmanager.ymlのテンプレートを元に編集し、slack通知設定を行う。

``` /etc/alertmanager/alertmanager.yml
route:
  group_by: ['alertname']
  group_wait: 30s
  group_interval: 5m
  repeat_interval: 1h
  receiver: 'slack'
receivers:
  - name: 'slack'
    slack_configs:
      - api_url: 'https://hooks.slack.com/services/xxxxxxxx'
        channel: 'mksamba-prometheus-alert'
        send_resolved: true
inhibit_rules:
  - source_match:
      severity: 'critical'
    target_match:
      severity: 'warning'
    equal: ['alertname', 'dev', 'instance']
```

:::note info 
routeのreceiver(アラート受信先)で「slack」を定義し、receiversの「slack」のところで、slackのincoming webhookのURLやチャネル名を設定する。send_resolved: true　とすることで、復旧時にも通知が行われる。
:::

### alertのルール設定
- 既存のprometheus.yml を編集し、Alertmanagerに関する設定を追加する。

``` /etc/prometheus/prometheus.yml (変更箇所のみ)
# Alertmanager configuration
alerting:
  alertmanagers:
    - static_configs:
        - targets:
          - 'localhost:9093'
          
# Load rules once and periodically evaluate them according to the global 'evaluation_interval'.
rule_files:
  - '/etc/prometheus/alert_rules.yml'
```
:::note info 
Alertmanagerのインストール場所(エンドポイント)として、localhost:9093を指定し、またalertの詳細を記載する外部ファイルとしてalert_rules.ymlを指定する。
:::

- alert定義ファイル alert_rules.ymlを新規作成し、テスト用のルール(CPU使用率70%超過)を設定する。
``` /etc/prometheus/alert_rules.yml
groups:
  - name: example
    rules:
      - alert: HighCpuUsage
        expr: (100 - (avg by (instance) (irate(node_cpu_seconds_total{mode="idle"}[1m])) * 100)) > 70
        for: 1m
        labels:
          severity: warning
        annotations:
          summary: "High CPU usage on {{ $labels.instance }}"
          description: "CPU usage on instance {{ $labels.instance }} is above 70% for the last 1 minutes."
```

### サービス化
- systemd ユニットファイルを作成する。
``` /usr/lib/systemd/system/alertmanager.service
[Unit]
Description=Alert Manager

[Service]
Type=simple
ExecStart=/usr/local/bin/alertmanager --config.file=/etc/alertmanager/alertmanag
er.yml
Restart=always

[Install]
WantedBy=multi-user.target
```

- Alertmanagerをサービスとして登録、再起動する。
```
[ec2-user@ip-10-0-0-249 ~]$ sudo systemctl daemon-reload
[ec2-user@ip-10-0-0-249 ~]$ sudo systemctl enable alertmanager.service
[ec2-user@ip-10-0-0-249 ~]$ sudo systemctl start alertmanager.service
[ec2-user@ip-10-0-0-249 ~]$ sudo systemctl status alertmanager.service
```

### prometheusのサービス再起動
- 設定変更反映のため、prometheusも再起動する。
```
[ec2-user@ip-10-0-0-249 ~]$ sudo systemctl restart prometheus.service
```

## 4.3 動作確認

- prometheusのalertの画面(http:\//監視サーバ:9090/alerts) で、alertがないことを確認する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189302/16a8f233-1cd2-70c2-74cf-44f5010e08c9.png)

- 監視対象サーバにて、stressコマンドを用いてCPU使用率を70%超にする。
```
[ec2-user@ip-10-0-0-124 ~]$ stress -c 1
```

- stressコマンド実行中、prometheusのalert画面で、alertが出ていることを確認する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189302/42c5fdc7-b10c-33b7-976f-0780bb000797.png)

- stressコマンド実行中、slackに通知(Firing)が来ていることを確認する。またstressコマンド停止後、再度通知(Resolved)が来ていることを確認する。

![pro02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189302/12acfd5e-bf50-aba9-caf3-08340f65ac2c.png)

# 5. 参考サイト
- [【Prometheus】Alertmanagerをローカルで使ってみる](https://amateur-engineer-blog.com/alertmanager-docker-compose/)
- [PrometheusのAlertmanagerをインストールする！（Rocky Linux 9）](https://lab4ict.com/system/archives/7040)

# 6. 所感

- やっと監視っぽいことを行うことができてきた。