G-gen の武井です。当記事では Cloud Monitoring アラートを使って VM マシンのメトリクスを監視をする方法を紹介します。
はじめに
Google Cloud では、Cloud Operations (オペレーション スイート) という名称でインフラやアプリケーションの監視を行うための一連のプロダクトを提供しています。
これらはマネージドサービスとして提供されており、Google Cloud をはじめ、他のパブリッククラウドやオンプレミス環境の情報を収集して監視や運用に活用することができます。
当記事では Cloud Monitoring のアラート機能を使って VM マシンのメトリクスを監視をする方法を紹介します。
- 参考 : アラートの仕組み
前提知識
Cloud Monitoring とは
オペレーションスイートの 1つ である Cloud Monitoring は次の機能を提供します。
- 指標 (メトリクス) の収集
- 可視化 (ダッシュボード)
- アラート管理
- インシデント管理
詳細は以下の記事で解説しておりますのでご参照ください。
指標の収集
Google Cloud の各種リソースから自動的に収集される標準的な指標を Google Cloud の指標 といいますが、この指標には メモリ使用率
、ディスク使用率
、スワップ使用率
といった VM マシンにおける重要な指標が含まれていません。
Ops エージェント とよばれる fluentbit ベースのエージェントソフトウェアをインストールすると、Ops エージェントの指標 として収集できます。
※当記事では Ops エージェントのインストール方法に関する説明は割愛します。
アラート
指標にしきい値を設定し、超過した際にメールを飛ばすなどの アラート設定 が行えます。
一つ一つの設定を アラートポリシー といい、設定内容は大きく分けて次の 2つ です。
# | 設定内容 | 説明 |
---|---|---|
1 | 条件 | 監視対象となる指標、リソース、トリガーなどを定義 |
2 | 通知 | 通知先 (メール、SMS、Slack 等) やアラート名などを定義 |
これにより、例えば「CPU使用率が」「あるインスタンスグループで」「5分の間」「80%を超えた場合に」「メールを発報する」 といったアラートを制御できます。
設定手順
概要
今回は Linux VM マシン 2台 を用意して、各マシンのディスク使用率がしきい値を超過した際に チャットツール「Slack」にアラートを通知させます。
通知先の登録
Slack のメールアドレスを取得
今回は Slack をアラートの通知先として使用します。こちら に従い任意のチャネルに紐づくメールアドレスを取得します。
※ Slack チャンネルのインテグレーション用メールアドレスを取得するには Slack の有料プランの契約が必要です。
通知チャネル (notification channel) の作成
先程取得した Slack 通知用のメールアドレスを Monitoring アラートの通知先として登録します。Cloud Monitoring ではアラートの通知先を 通知チャネル といいます。
Cloud コンソール > Monitoring > アラート
の順に遷移し、EDIT NOTIFICATION CHANNELS
をクリックします。
次に Email の ADD NEW
をクリックし、メールアドレスを登録します。
アラートポリシーの作成
ディスク使用率の指標を使ってアラートを設定します。
Cloud コンソール > Monitoring > アラート
の順に遷移し、CREATE POLICY
をクリックします。
指標
指標を選択
をクリックし、VM Instance > Disk > Disk utilization
を選択したら 適用
をクリックします。
フィルタ
Linux VM マシン 2台 のディスク (/dev/sda1) の使用率を指標とするため、ADD A FILTER
をクリックして 2つ のフィルタを作成します。
ローリングウィンドウ / ローリングウィンドウ関数
Monitoring アラートでは ローリングウインドウ / ローリングウィンドウ関数 で定めた期間内の指標を収集・計算した上で異常か否かを判断します。
今回は過去 5分間 で収集した指標の平均値 (mean) にもとづき判断するよう設定します。
トリガー
トリガーはアラートの発報条件になります。
今回準備した VM マシンのディスク使用率がいずれも 23 % となっているので、20% を超過した場合にアラートが通知されるようにトリガーを設定します。
なお、条件名
は以下に示したとおりアラート通知メールの件名として使用されるため、件名が長くなりすぎないに工夫すると良いでしょう。
アラート通知メール件名の規則
ALERT + [条件名] + on + [プロジェクト名] + [インスタンス名]
通知チャネル
最後に通知チャネルを選択し、アラートポリシー名を入力します。
動作確認
アラートポリシーの確認
先ほど作成したアラートポリシーを確認します。Cloud コンソール > Monitoring > アラート
の順に遷移します。
ポリシー名をクリックすると設定内容や監視状況が確認できます。
インシデントの確認
アラート通知の条件を満たすと、インシデントとしてダッシュボード上に登録されます。インシデントの概要名をクリックすると詳細が確認できます。
通知の確認
上記同様アラート通知の条件を満たしたため、Slack に Email 通知が届いています。
関連機能1 : 繰り返し通知
概要
繰り返し通知 を設定すると、インシデント登録されたアラートに対して定期的にリマインダーを送信できます。
デフォルトではインシデントが登録された際に1回だけ通知されます。サービス障害に直結する重要な監視項目に対して設定すると対応漏れなどを防ぐことができます。
繰り返し通知は Cloud コンソールからは設定できません。
詳細は次で説明しますが、アラートポリシーの AlertStrategy
オブジェクトに少なくとも 1 つの NotificationChannelStrategy
オブジェクトを gcloud コマンド または API から設定します。
# PROJECT_ID と CHANNEL_ID には環境固有の値を入力する # renotifyInterval には 30分以上24時間以内の値を秒単位で入力する "alertStrategy": { "notificationChannelStrategy": [ { "notificationChannelNames": [ "projects/PROJECT_ID/notificationChannels/CHANNEL_ID" ], "renotifyInterval": "1800s" } ] }
設定方法
概要
これまでの解説で作成したアラートポリシーを例に、gcloud
コマンドを使った繰り返し通知の設定方法を説明します。
JSON ファイルの準備
作成済みのアラートポリシーから JSON ファイルを取得します。
Cloud コンソール > Monitoring > アラート
から対象のアラートポリシーを選択し、JSON
をクリックしてファイルをダウンロードします。
NotificationChannelStrategy オブジェクトの定義
次に先程ダウンロードした JSON ファイルの AlertStrategy
オブジェクトに NotificationChannelStrategy
オブジェクトを追記します。
実行例では Slack に 30分おきにリマインダーを通知するよう定義しています。
また、値が設定されていないオブジェクト (以下の場合 documentation
と userLabels
) が残っているとコマンド実行時にエラーとなるので削除します。
# 変更前 { "name": "projects/example/alertPolicies/1111111111", "displayName": "Linux VM Disk Utilization Test Policy", "documentation": {}, "userLabels": {}, "conditions": [ { "name": "projects/example/alertPolicies/1111111111/conditions/2222222222", "displayName": "Disk Used (%)", "conditionThreshold": { "aggregations": [ { "alignmentPeriod": "300s", "perSeriesAligner": "ALIGN_MEAN" } ], "comparison": "COMPARISON_GT", "duration": "0s", "filter": "resource.type = \"gce_instance\" AND metric.type = \"agent.googleapis.com/disk/percent_used\" AND (metric.labels.device = \"/dev/sda1\" AND metric.labels.state = \"used\")", "thresholdValue": 20, "trigger": { "count": 1 } } } ], "alertStrategy": { "autoClose": "1800s" }, "combiner": "OR", "enabled": true, "notificationChannels": [ "projects/example/notificationChannels/3333333333" ], "creationRecord": { "mutateTime": "2023-05-04T14:38:46.558191920Z", "mutatedBy": "example@g-gen.co.jp" }, "mutationRecord": { "mutateTime": "2023-05-17T03:14:54.109178339Z", "mutatedBy": "example@g-gen.co.jp" } }
# 変更後 { "name": "projects/example/alertPolicies/1111111111", "displayName": "Linux VM Disk Utilization Test Policy", "conditions": [ { "name": "projects/example/alertPolicies/1111111111/conditions/2222222222", "displayName": "Disk Used (%)", "conditionThreshold": { "aggregations": [ { "alignmentPeriod": "300s", "perSeriesAligner": "ALIGN_MEAN" } ], "comparison": "COMPARISON_GT", "duration": "0s", "filter": "resource.type = \"gce_instance\" AND metric.type = \"agent.googleapis.com/disk/percent_used\" AND (metric.labels.device = \"/dev/sda1\" AND metric.labels.state = \"used\")", "thresholdValue": 20, "trigger": { "count": 1 } } } ], "alertStrategy": { "autoClose": "1800s", "notificationChannelStrategy": [ { "notificationChannelNames": [ "projects/example/notificationChannels/3333333333" ], "renotifyInterval": "1800s" } ] }, "combiner": "OR", "enabled": true, "notificationChannels": [ "projects/example/notificationChannels/3333333333" ], "creationRecord": { "mutateTime": "2023-05-04T14:38:46.558191920Z", "mutatedBy": "example@g-gen.co.jp" }, "mutationRecord": { "mutateTime": "2023-05-17T03:14:54.109178339Z", "mutatedBy": "example@g-gen.co.jp" } }
アラートポリシーの更新
JSON ファイルの修正が完了したら、gcloud alpha monitoring policies update
コマンドで既存のアラートポリシーを更新し、繰り返し通知設定を反映します。
# アラートポリシー ID と JSON ファイルパスを指定する gcloud alpha monitoring policies update projects/example/alertPolicies/1111111111 \ --policy-from-file=example.json
設定内容の確認
gcloud alpha monitoring policies list
コマンドで設定変更前後を比較します。AlertStrategy
オブジェクトに NotificationChannelStrategy
オブジェクトが追加されていることがわかります。
# 変更前 [ { "alertStrategy": { "autoClose": "1800s" }, "combiner": "OR", "conditions": [ { "conditionThreshold": { "aggregations": [ { "alignmentPeriod": "300s", "perSeriesAligner": "ALIGN_MEAN" } ], "comparison": "COMPARISON_GT", "duration": "0s", "filter": "resource.type = \"gce_instance\" AND metric.type = \"agent.googleapis.com/disk/percent_used\" AND (metric.labels.device = \"/dev/sda1\" AND metric.labels.state = \"used\")", "thresholdValue": 20.0, "trigger": { "count": 1 } }, "displayName": "Disk Used (%)", "name": "projects/example/alertPolicies/1111111111/conditions/2222222222" } ], "creationRecord": { "mutateTime": "2023-05-04T14:38:46.558191920Z", "mutatedBy": "example@g-gen.co.jp" }, "displayName": "Linux VM Disk Utilization Test Policy", "enabled": true, "mutationRecord": { "mutateTime": "2023-05-17T03:14:54.109178339Z", "mutatedBy": "example@g-gen.co.jp" }, "name": "projects/example/alertPolicies/1111111111", "notificationChannels": [ "projects/example/notificationChannels/3333333333" ] } ]
# 変更後 [ { "alertStrategy": { "autoClose": "1800s", "notificationChannelStrategy": [ { "notificationChannelNames": [ "projects/example/notificationChannels/3333333333" ], "renotifyInterval": "1800s" } ] }, "combiner": "OR", "conditions": [ { "conditionThreshold": { "aggregations": [ { "alignmentPeriod": "300s", "perSeriesAligner": "ALIGN_MEAN" } ], "comparison": "COMPARISON_GT", "duration": "0s", "filter": "resource.type = \"gce_instance\" AND metric.type = \"agent.googleapis.com/disk/percent_used\" AND (metric.labels.device = \"/dev/sda1\" AND metric.labels.state = \"used\")", "thresholdValue": 20.0, "trigger": { "count": 1 } }, "displayName": "Disk Used (%)", "name": "projects/example/alertPolicies/1111111111/conditions/2222222222" } ], "creationRecord": { "mutateTime": "2023-05-04T14:38:46.558191920Z", "mutatedBy": "example@g-gen.co.jp" }, "displayName": "Linux VM Disk Utilization Test Policy", "enabled": true, "mutationRecord": { "mutateTime": "2023-06-28T08:57:23.371148479Z", "mutatedBy": "example@g-gen.co.jp" }, "name": "projects/example/alertPolicies/1111111111", "notificationChannels": [ "projects/example/notificationChannels/3333333333" ] } ]
動作確認
繰り返し通知設定後、30分おきにリマインダー通知を受信していることがわかります。
注意事項
繰り返し通知設定を実装した場合、それ以降の更新を Cloud コンソールから行うと繰り返し通知設定が削除されてしまうのでご注意ください。
先にもお伝えした通り、Cloud コンソールでは設定できない項目となっているため、設定なし で上書きされてしまうからです。
関連機能2: スヌーズ
概要
スヌーズ とは、指定した期間内でインシデントの登録やアラート通知を抑制する機能です。メンテナンス中やフラッピングによって発生する不要なアラート通知を抑制する際など、様々な場面で活用できます。
長らくプレビュー状態にあった本機能ですが、ついに 2023年5月より GA (一般公開) されました。
繰り返し通知のような設定上の制約はありません。Cloud コンソール、gcloud コマンド または API から設定可能です。
設定方法
概要
今回は gcloud
コマンドを使った設定方法を説明します。スヌーズ対象のアラートポリシーは前述で繰り返し通知設定を実装したポリシーとします。
Cloud コンソールや API による設定方法についてはこちらの公式ガイド、またはプレビュー期間中に弊社社員が執筆した以下の記事も参照いただけると幸いです。
JSON ファイルの準備
こちらの公式ガイドから取得した雛形をベースに JSON ファイルを作成します。
# スヌーズ対象のアラートポリシーはアラートポリシー ID で指定する # 開始 / 終了時刻は ISO 8601 形式 かつ UTC で指定する { "criteria": { "policies": [ "projects/example/alertPolicies/1111111111" ] }, "interval": { "startTime": "2023-07-03T12:15:00.000Z", "endTime": "2023-07-03T14:15:00.000Z" }, "displayName": "snooze_for_maintanance_20230703" }
スヌーズの作成
JSON ファイルの準備が完了したら、gcloud monitoring snoozes create
コマンドを実行してスヌーズを作成します。
# --snooze-from-file オプションで JSON ファイルのパスを指定する gcloud monitoring snoozes create --snooze-from-file=snooze_for_maintanance_20230703.json
成功すると以下の戻り値が表示されます。
Created snooze [projects/example/snoozes/4444444444].
設定内容の確認
gcloud monitoring snoozes list
コマンドで設定内容を確認します。
2023/07/03 21:15 ~ 23:15 (JST)
の2時間の間、指定したアラートポリシーに関するアラート通知を抑制するスヌーズが作成できました。
gcloud monitoring snoozes list --format=json [ { "criteria": { "policies": [ "projects/example/alertPolicies/1111111111" ] }, "displayName": "snooze_for_maintanance_20230703", "interval": { "endTime": "2023-07-03T14:15:00Z", "startTime": "2023-07-03T12:15:00Z" }, "name": "projects/example/snoozes/4444444444" } ]
Cloud コンソール > Monitoring > アラート > Snoozes
上でも同様に上記スヌーズの確認が可能です。
動作確認
スヌーズ期間中はこれまで30分おきに受信していた通知が抑制されたのと合わせて、インシデントのステータスもRESOLVED (復旧)
に遷移しています。
Cloud コンソール > Monitoring > アラート > Incidents
上でも確認できます。
スヌーズ期間終了後ですが、インシデントの状態が再び ALERT
状態に遷移し、アラート通知も再開しました。
武井 祐介 (記事一覧)
クラウドソリューション部所属。G-gen唯一の山梨県在住エンジニア
Google Cloud Partner Top Engineer 2025 選出。IaC や CI/CD 周りのサービスやプロダクトが興味分野です。
趣味はロードバイク、ロードレースやサッカー観戦です。
Follow @ggenyutakei