Cloud Monitoring アラートで VM マシンのメトリクスを監視する

記事タイトルとURLをコピーする

G-gen の武井です。当記事では Cloud Monitoring アラートを使って VM マシンのメトリクスを監視をする方法を紹介します。

Cloud Monitoring

はじめに

Google Cloud では、Cloud Operations (オペレーション スイート) という名称でインフラやアプリケーションの監視を行うための一連のプロダクトを提供しています。

これらはマネージドサービスとして提供されており、Google Cloud をはじめ、他のパブリッククラウドやオンプレミス環境の情報を収集して監視や運用に活用することができます。

当記事では Cloud Monitoring のアラート機能を使って VM マシンのメトリクスを監視をする方法を紹介します。

前提知識

Cloud Monitoring とは

オペレーションスイートの 1つ である Cloud Monitoring は次の機能を提供します。

  • 指標 (メトリクス) の収集
  • 可視化 (ダッシュボード)
  • アラート管理
  • インシデント管理

詳細は以下の記事で解説しておりますのでご参照ください。

blog.g-gen.co.jp

指標の収集

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 をクリックします。

EDIT NOTIFICATION CHANNEL をクリック

次に Email の ADD NEW をクリックし、メールアドレスを登録します。

ADD NEW をクリック
メールアドレスと表示名を入力して保存
通知チャネルとして登録

アラートポリシーの作成

ディスク使用率の指標を使ってアラートを設定します。

Cloud コンソール > Monitoring > アラート の順に遷移し、CREATE POLICY をクリックします。

CREATE POLICY をクリック

指標

指標を選択 をクリックし、VM Instance > Disk > Disk utilization を選択したら 適用 をクリックします。

指標を選択したら 適用 をクリック

フィルタ

Linux VM マシン 2台 のディスク (/dev/sda1) の使用率を指標とするため、ADD A FILTER をクリックして 2つ のフィルタを作成します。

device (ボリューム名) が /dev/sda1

state (状態) が used

ローリングウィンドウ / ローリングウィンドウ関数

Monitoring アラートでは ローリングウインドウ / ローリングウィンドウ関数 で定めた期間内の指標を収集・計算した上で異常か否かを判断します。

今回は過去 5分間 で収集した指標の平均値 (mean) にもとづき判断するよう設定します。

過去5分間で収集した指標の平均値を計算する

トリガー

トリガーはアラートの発報条件になります。

今回準備した VM マシンのディスク使用率がいずれも 23 % となっているので、20% を超過した場合にアラートが通知されるようにトリガーを設定します。

ディスク使用率が20%を超過した際にアラート通知

なお、条件名は以下に示したとおりアラート通知メールの件名として使用されるため、件名が長くなりすぎないに工夫すると良いでしょう。

アラート通知メール件名の規則

ALERT + [条件名] + on + [プロジェクト名] + [インスタンス名]

通知チャネル

最後に通知チャネルを選択し、アラートポリシー名を入力します。

通知チャネルを選択

アラートポリシー名を入力してポリシーを作成する

動作確認

アラートポリシーの確認

先ほど作成したアラートポリシーを確認します。Cloud コンソール > Monitoring > アラート の順に遷移します。

ポリシー名をクリックすると設定内容や監視状況が確認できます。

ポリシー名をクリック
設定内容や監視状況が確認できる

インシデントの確認

アラート通知の条件を満たすと、インシデントとしてダッシュボード上に登録されます。インシデントの概要名をクリックすると詳細が確認できます。

インシデントとして登録
インシデント詳細画面

通知の確認

上記同様アラート通知の条件を満たしたため、Slack に Email 通知が届いています。

Slack にアラートが通知

関連機能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 をクリックしてファイルをダウンロードします。

JSON ファイルをダウンロードする

NotificationChannelStrategy オブジェクトの定義

次に先程ダウンロードした JSON ファイルの AlertStrategy オブジェクトに NotificationChannelStrategy オブジェクトを追記します。

実行例では Slack に 30分おきにリマインダーを通知するよう定義しています。

また、値が設定されていないオブジェクト (以下の場合 documentationuserLabels) が残っているとコマンド実行時にエラーとなるので削除します。

# 変更前
  
{
  "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分おきにリマインダー通知を受信していることがわかります。

繰り返し通知設定により30分おきにリマインダー通知を受信

注意事項

繰り返し通知設定を実装した場合、それ以降の更新を Cloud コンソールから行うと繰り返し通知設定が削除されてしまうのでご注意ください。

先にもお伝えした通り、Cloud コンソールでは設定できない項目となっているため、設定なし で上書きされてしまうからです。

関連機能2: スヌーズ

概要

スヌーズ とは、指定した期間内でインシデントの登録やアラート通知を抑制する機能です。メンテナンス中やフラッピングによって発生する不要なアラート通知を抑制する際など、様々な場面で活用できます。

長らくプレビュー状態にあった本機能ですが、ついに 2023年5月より GA (一般公開) されました。

繰り返し通知のような設定上の制約はありません。Cloud コンソール、gcloud コマンド または API から設定可能です。

設定方法

概要

今回は gcloud コマンドを使った設定方法を説明します。スヌーズ対象のアラートポリシーは前述で繰り返し通知設定を実装したポリシーとします。

Cloud コンソールや API による設定方法についてはこちらの公式ガイド、またはプレビュー期間中に弊社社員が執筆した以下の記事も参照いただけると幸いです。

blog.g-gen.co.jp

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 上でも同様に上記スヌーズの確認が可能です。

Cloud コンソールから見たスヌーズ設定
Cloud コンソールから見たスヌーズ設定

動作確認

スヌーズ期間中はこれまで30分おきに受信していた通知が抑制されたのと合わせて、インシデントのステータスもRESOLVED (復旧) に遷移しています。

Cloud コンソール > Monitoring > アラート > Incidents 上でも確認できます。

スヌーズにより通知が抑制
スヌーズ期間中はインシデントの状態が復旧

スヌーズ期間終了後ですが、インシデントの状態が再び ALERT 状態に遷移し、アラート通知も再開しました。

スヌーズ期間終了後、アラート通知が再開
スヌーズ期間終了後にインシデントとして再登録

武井 祐介 (記事一覧)

2022年4月にジョイン。クラウドソリューション部所属。G-gen唯一の山梨県在住エンジニア

Google Cloud Partner Top Engineer 2024 に選出。IaC や CI/CD 周りのサービスやプロダクトが興味分野です。

趣味はロードバイク、ロードレースやサッカー観戦です。