Cloud Monitoringからのアラート連携を整理してみた

GoogleCloud上にアプリケーションを構築して、その監視にCloudMonitoringを使うことが多いです。
ただ、毎回設定で悩むところがあるため、ここで改めて整理することにしました。


## Cloud Monitoringとは

Google Cloud のオペレーション スイート（旧称 Stackdriver）の機能群の一つです


公式の引用  
> Cloud Monitoring では、クラウドで実行されるアプリケーションのパフォーマンスや稼働時間、全体的な動作状況を確認できます。Google Cloud サービス、ホストされた稼働時間プローブ、アプリケーション インストゥルメンテーション、その他のさまざまなアプリケーション コンポーネントから、指標、イベント、メタデータを収集します。このデータをグラフやダッシュボードで可視化して、指標が想定の範囲外になったときに通知されるようアラートを作成できます。

要は、GoogleCloudの様々なデータで監視をしてくれるということです。
「様々なデータ」についてここで詳しくは言及しませんが、Google Cloud リソースのCPU使用率やAPIリクエスト数といったものだったり、Cloud Loggingへの出力を任意の条件で絞り込んだ「ログ指標」など、広く利用可能です


「指標が想定の範囲外になったときに通知されるようアラートを作成できます。」が今回のメイントピックです。
全体の動きとしてはこちらの図のようなイメージになってきます。

![202212_qiita.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2345258/e0798ad2-b898-ce65-df1b-6274129374c0.png)




## アラート設定の使い方
アラート設定は「何が(どの指標が?)」「どうなった時(想定の範囲外とは?)」を定義してあげて、その状態になったときに任意の相手に通知するというものです。
「何が(どの指標が?)」については、CPU利用率であったり通信のドロップ数(率)であったり、目的が明らかであれば特に選ぶのは難しくないと思います。

一方で、「どうなった時(想定の範囲外とは?)」についてはやや複雑になってきます。
ここでは以下の概念を把握する必要があります
 - ローリング ウィンドウ
指標の評価をする期間を設定するパラメータです。
以下、[公式ページ](https://cloud.google.com/monitoring/alerts/concepts-indepth#google-cloud-console_1)の図が、イメージをつかむのに良さそうでした。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2345258/f8eea378-9b73-8f15-8df6-efc0412e0eee.png)

ここでは、ローリングウィンドウを5分間とした時に、どのタイミングの指標値を評価対象に含めるかということを示しています。
丸でプロットされたところが青色になっているのが、評価対象ということを示しています。
5分間のローリングウィンドウでは、直近5分での値を評価値として1分ごとにスライドしていきます。

したがってそれぞれのタイミングで評価に使われる値は以下となります。
・start の時     : [0,0,0,0,1]
・start + 1mの時 : [0,0,0,1,1]
・start + 2mの時 : [0,0,1,1,1]

なお、設定できるウィンドウは最短1分で、1秒単位で設定可能です。

 - ローリングウィンドウ関数
ローリングウィンドウの値を取り扱う関数(計算方法)を選択します。
代表的なものだとsum(合計)、count(データ個数) mean(平均値)  などがあります。
先ほどの図の例で行くと、以下のように取ることができます。

・start の時     : [0,0,0,0,1] => sum = 1
・start + 1mの時 : [0,0,0,1,1] => sum = 2
・start + 2mの時 : [0,0,1,1,1] => sum = 3


 - アラート条件
上記、ローリングウィンドウとローリングウィンドウ関数により算出される値がどうなった時にアラートを発砲するかを決めます。
「閾値(Threshold)」または「Metric absence(不在条件)」による設定となります。
・閾値: 任意の閾値を設定し、監視により算出された値が閾値を上回った場合にアラートを発砲する
・不在条件: 任意の期間を設定し、その期間に監視データが無かった場合にアラートを発砲する


## ケーススタディ

実際にアラートを作成してみます。

#### VMのCPU利用率が5分間の平均で80%を越えたらアラートを発砲する

考え方としては以下のようになります。
 - 指標: CPU使用率(CPU_Utilization)
 - ローリングウィンドウ: 5分
 - ローリングウィンドウ関数: 平均(mean)
 - アラート条件: 閾値 80%

それぞれ実際に設定してみます。

1. 指標の設定
VM Instance > instance > CPU utilizationを選びます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2345258/a1ef3c09-c5ca-3419-1895-fec473713210.png)

2. ローリングウィンドウ、ローリングウィンドウ関数の設定
それぞれを設定すると、実際にその設定から算出される値がどうなるのかを見ることができます。
![qiita_1_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2345258/c9e042cb-7e04-93c6-6584-35836ad1b437.png)

3. アラート条件の設定
閾値 80%を設定します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2345258/171cd970-1dba-ad57-a750-03f4c81739f6.png)

4. 通知先の設定
細かいところはここでは言及しませんが、前述の全体図のように、ここからメールやPub/Subといった通知先を指定することができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2345258/4c8403b0-99b4-2d28-a3cd-c7c5e286690c.png)

## 終わりに
Cloud Monitoringのアラート設定回りは、設定項目に複雑なものが多く、若干とっつきにくいところもあります。ただし、それだけ多くの指標がGoogleCloudの中で取得されているということでもあり、うまく使えれば非常に頼もしい機能となります。
ぜひ活用してみてください。

## 参考
 - [Google Cloud のオペレーション スイート（旧称 Stackdriver）](https://cloud.google.com/products/operations?hl=ja)
 - [データの変換 | オペレーションスイート](https://cloud.google.com/monitoring/alerts/target-metric-selector?&_ga=2.127940876.-1410876353.1659052514#aggregation-option)