Grafana: Prometheusで取り込んだデータを監視してLINEにアラートメッセージを出してみた


###### 実施環境：

```Linux:Linux
[root@testhost ~]# uname -a
Linux testhost 4.18.0-448.el8.x86_64 #1 SMP Wed Jan 18 15:02:46 UTC 2023 x86_64 x86_64 x86_64 GNU/Linux
[root@testhost ~]# cat /etc/redhat-release
CentOS Stream release 8
[root@testhost ~]# yum list installed | grep grafana
grafana-enterprise.x86_64                          10.0.3-1  
```

prometheus：2.46.0.linux-amd64
node_exporter：1.6.1.linux-amd64

iOS 16.7.2
LINE 13.18.1

### 0. 概要

 Grafana は、主にデータの可視化に使用されるオープンソースのソフトウェアです。
ですが、実は Grafana は、データからグラフや表を作るだけではなく、データを監視してアラートを出すことも出来たりします。

今回はシステム監視ソフトウェアの Prometheus と LINE のサービスの1つである LINE Notify を用いて、 CPU 使用率が一定の値を超えた際に LINE にアラートメッセージを出すシステムを作成してみたいと思います。

### 1. 事前準備

 Prometheus と Grafana のインストールと連携については、以下の過去記事を参照してください。

[Linux: システム監視ソフト「Prometheus」を無料インストールしてみた](https://qiita.com/frozencatpisces/items/01b575e34f28651f1496)

[Linux: データ可視化ソフト「Grafana」を無料インストールしてみた＋「Prometheus」と連携させてみた](https://qiita.com/frozencatpisces/items/f6e331c1c1c14be7275d)

 Line Notify のトークン発行については、以下の過去記事を参照してください。

[LINE: LINE Notifyを用いてWindowsのcurlコマンドからメッセージを投稿する](https://qiita.com/frozencatpisces/items/679d66ab1d617b7a40cb)

 Prometheus における CPU 使用率の監視方法については、以下の過去記事を参照してください。

[Prometheus: CPU、メモリ、ディスクの使用率の算出方法+Grafanaでの算出方法](https://qiita.com/frozencatpisces/items/529abd26dfb2b807d322)

### 2. アラートの作成

まずは、アラート本体を作成します。
メニュー画面から、「 Alerting 」⇒「 Alert rules 」を選択します。

![WS000709.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/557f1053-ba5a-1c8a-fec9-4a66a9c2e23b.jpeg "menu")

「 Create alert rule 」を押します。

![WS000710.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/b2fedf95-a19f-33f5-cbe2-c7be29010165.jpeg "alert_rules")

すると、アラートの作成画面が表示されます。

アラート名は何でもよいのですが、今回は「 test_alert 」にします。

![WS000712.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/07768fc9-118d-39cc-3249-db30f4cfb528.jpeg "name")

次の項目はデフォルトの「 Grafana managed alert 」のままにします。

![WS000713.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/2fde5d49-5d4a-7d51-d61c-c9c204c9f056.jpeg "manage")

アラート条件については、次のように指定します。

まず、監視する値( A )については、値の取得元を「 Prometheus 」、期間を「 now-1m to now (過去1分)」とし、以下の過去記事を参考として CPU 使用率を指定します。

![WS000718.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/a397cc01-68a7-76b8-46ab-a950a66898ff.jpeg "A")

集計値( B )については、「 Last A ( A の最新値 )」にします。
 Mode は「 Strict (数値でない場合は NaN として扱う)」のままでよいです。

![WS000720.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/2010d77f-c3b4-ba49-b32f-c21755530375.jpeg "B")

判定条件( C )については、「 B is above 20 ( B が 20 を超過した場合アラート)」にします。

![WS000723.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/0f5b33e4-9d5c-cc29-e669-71d131039f15.jpeg "C")

次に、ルールの所属するグループを選択します。
今回はまだグループを作成していませんので、 Folder に「 test_alert_folder 」と、 Evaluation group に「 test_alert_group 」と入力し、それぞれ Enter キーを押してフォルダ「 test_alert_folder 」とグループ「 test_alert_group 」を作成します。

![WS000724.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/f02117f7-e2fd-0b6c-7639-8bf91c8ee2d4.jpeg "group")

 Evaluate every (監視の実行間隔)には「 1m (1分ごと)」を指定します。
 for (判定から発行までの待機時間)には「 5m (5分間)」を指定します。

![WS000726.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/8d8d7133-b092-658c-93e3-ac5990d990ef.jpeg "interval")

:::note info
 for は「判定条件( C )が成立してから実際にアラートが発行されるまでの待機時間」を表します。
この待機時間の間に再度判定が行われ条件が成立していなかったら、アラートの発行は取りやめられます。
判定条件が成立した時点でアラートを発行したければ、 for に 0 を指定すれば即座にアラートが発行されます。
:::

詳細設定については今回は設定しません。

![WS000727.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/e65e7b09-3b16-09bf-c0fc-05177ad8510f.jpeg "detail")

ラベルは後で使いますが、今は一旦スルーします。

![WS000729.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/fa0bc91f-6e28-4e37-d9b0-0a16e0b44eab.jpeg "label")

ここまで設定したら、「 Save rule and exit 」を押して作成したアラートを保存します。

![WS000800.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/b1171977-5e49-3ffa-3057-21bc7a1abb7e.jpeg "save")

これで、アラートが作成できました。

![WS000732.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/617ce75a-ca84-4817-153e-28fbf1bfa5c4.jpeg "alert_1")

### 3. アラートの確認

さて、では実際にアラートが発行されるところを確認してみましょう。
「目」のマークが書かれているボタンを押せば、アラートの状態が確認できます。

![WS000732.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/1ea21720-3bcf-83f0-87a1-354338c52fe7.jpeg "alert_2")

判定条件が満たされていない状態だと、以下のようにステータスは「 Normal 」になっています。

![WS000733.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/87d40070-037d-e1aa-6c87-eff0b1797adc.jpeg "normal")

今回は CPU 使用率を監視しているので、以下のように yes コマンドをいくつか実行して CPU に負荷をかけます。

```Linux:Linux
[testuser@testhost ~]$ yes > /dev/null
```

:::note info
 yes コマンドは Linux のコマンドの1つで、コマンドの実行を中断するまで指定した文字列を出し続けるコマンドです。
引数を指定しない場合は、文字「 y 」を出し続けます。
本来は YES / NO の選択肢が出た際に自動で YES を選び続けるためのコマンドですが、このようにサーバーに負荷をかける際などにも利用できます。
:::

判定条件が満たされた直後は、以下のように「 Pending 」というステータスになります。
この状態で判定条件が満たされなくなれば、ステータスは「 Normal 」に戻ります。

![WS000763.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/0e20460c-87b1-6529-2fdc-38da2b340aaf.jpeg "Pending")

判定条件が満たされた状態で一定時間(今回は5分間)たつと、いよいよ「 Alerting 」ステータスになります。

![WS000764.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/f14b4810-c468-0226-0f0c-449b50d199b4.jpeg "Alerting")

### 4. アラートメッセージ出力先の登録

さて、アラートは発行されましたが、この段階ではどこにもアラートメッセージは出せていません。
一応 Grafana のデフォルトとしてメールでのアラートメッセージ出力が設定されているのですが、メールアドレスも何も設定していないため機能していない状態です。
これでは、せっかくの監視もほとんど意味をなしません。

アラートメッセージを出力するためには、出力先の情報を登録した後、先ほどスルーした「ラベル」を用いて、アラートと出力先を紐づける必要があります。
まずは、アラートメッセージ出力先の情報を登録しましょう。
今回は、 LINE を出力先として登録します。

「 Alerting 」から「 Contact points 」を選択します。

![WS000803.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/33e8f219-5f33-b383-7305-1462bda51308.jpeg "menu2")

「 Add contact point 」を選択します。

![WS000753.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/abc51f74-eb0f-3baa-1745-9afebda37ce3.jpeg "contact_points")

すると、アラートメッセージ出力先の新規登録画面が表示されます。

 Alertmanager はデフォルトの「 Grafana 」のままにします。

![WS000754.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/f53d9839-118e-29bc-de02-cfddbdd2b1fe.jpeg "Alertmanager")

登録名は「 TEST_POINT_LINE 」にしましょう。

![WS000755.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/02ac7e8d-69c7-4a62-d136-8d961c9b1fde.jpeg "point_name")

 Integration には「 LINE 」を選択し、 Token には LINE Notify で発行したトークンを入力します。
一通り入力が終わったら、「 TEST 」を押します。

![WS000756.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/53e2d64a-1705-eeef-928c-efc2cd14ad9f.jpeg "integration")

テスト画面が開くので、 Notification message は「 Predefined 」のまま、「 Send test notification 」を押します。

![WS000757.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/b85ca85a-b423-3ee9-38aa-eee32dd21b28.jpeg "test_point")

テストに成功したならば、 LINE のトークルームに以下のようなメッセージが投稿されているはずです。

![WS000798.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/dc8e9b7d-5ccf-1777-0c7b-f675b714fe82.jpeg "test_line")

問題なければ、「 Save contact point 」を押して登録内容を保存します。

![WS000759.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/4a7be083-bc3c-2bb4-d196-6851c683e516.jpeg "save_point")

### 5. アラートメッセージ出力先とラベルの紐づけ

次に、先ほど登録したアラートメッセージ出力先とラベルを紐づけます。
「 Alerting 」から「 Notification policies 」を選択します。

![WS000760.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/5a69a3f3-c7ed-eeab-b598-c7fad9cff3da.jpeg "alert_menu")

デフォルト設定を編集してもよいのですが、今回は新しく設定を作りましょう。
「 New nested policy 」を押します。

![WS000765.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/6e3f18b7-531b-dc96-d439-150306f1597d.jpeg "notification_policies")

ラベルの判定条件には、「 test_label = test_value 」を指定しましょう。
 Contact point には先ほど登録した「 TEST_POINT_LINE 」を選択します。

![WS000767.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/729d5168-0632-c767-c41d-3e4b62953363.jpeg "add_policy")

その他の設定はデフォルトのままでかまいません。
「 Save policy 」を押して設定を保存します。

![WS000768.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/bea01968-8f9c-e51f-0ce3-5e4282829c75.jpeg "save_policy")

### 6. アラートとラベルの紐づけ

さて、引き続きアラートとラベルも紐づけます。
「 Alerting 」から「 Alert rules 」を選択します。

![WS000770.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/e1cb53f0-e8c9-494c-d3d7-b3c3ccfa3f98.jpeg "alert_menu2")

「ペン」のマークが書かれているボタンを押して、先ほどの「 test_alert 」の編集画面を開きます。

![WS000771.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/80e4d2ed-d460-2976-760a-da3248b4a59b.jpeg "edit")

先ほどスルーした「 Labels 」について設定します。
この段階ではまだラベルは作成されていないので、左の欄に「 test_label 」、右の欄に「 test_value 」と入力し、 Enter キーをそれぞれ押してラベルを作成します。

![WS000772.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/3645b3f5-8f80-752a-148b-aad68ed09bb3.jpeg "custom_label")

設定できたら「 Save rule and exit 」を押して変更を保存しましょう。

![WS000801.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/859e20a8-f3a4-6b60-b0e1-3fedc2f51c99.jpeg "save2")

### 7. アラートメッセージの確認

これで、アラートメッセージの出力のための設定は一通り完了しました。
先ほどと同様に yes コマンドで CPU 使用率を上げてアラートを発行してみます。

![WS000775.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/78ec3061-ac0b-ac31-4236-246ee75982dd.jpeg "alerting2")

以下のようなメッセージが LINE に出力されれば、設定は成功です。

![WS000799.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/c46c7f8f-0bf7-25a3-85be-ef05473410b3.jpeg "alert_line")

なお、回復した場合はきちんと回復メッセージも投稿されます。

![WS000837.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/893a73f9-d498-def5-c9d6-15c2c1fe2b1a.jpeg "alert_line2")