👀

【Google Cloud Monitoring】アラートが一定時間継続した場合に通知する方法

2023/10/26に公開

はじめに

Google Cloud Monitoring を利用する中で、以下のような通知設定をしたいと考えたので、その方法を調査しました。Google Cloud コンソールでの設定方法と、Terraform 設定ファイルの書き方をまとめます。

  • CPU使用率などの指標が、しきい値を一定時間超過し続けたら通知してほしい
  • 特定のログが一定時間に n 回以上発生した場合に通知してほしい

指標の計測値がしきい値を一定時間超過し続けたら通知する

一時的にシステムに負荷がかかり、すぐに平常状態に戻るようなときは、特に通知が必要ないケースがあるかと思います。その場合は 再テストウィンドウ の項目を設定すれば、一定時間しきい値を超過し続けたら通知し、一定時間内にしきい値以下に戻った場合は通知しないようにすることができます。

再テストウィンドウとは「測定値がしきい値に違反してアラートがインシデントを生成するまでの期間」と、ドキュメントで説明されています。即時通知したい場合は再テストウィンドウを0秒に設定し、指標の計測値が10分間しきい値を超えたら通知したい場合は、再テストウィンドウを10分に設定します。

以下に、GCE の CPU 使用率が 70% を10分以上超えたら通知するアラートポリシーの作成方法を紹介します。

コンソールでの設定方法

  1. アラートポリシーを作成する
設定内容

■指標の設定
 メトリック: VM Instance - CPU utilization
 ローリングウィンドウ: 1分
 ローリングウィンドウ関数: mean
■トリガーの設定
 トリガー条件: Threshold (しきい値)
 アラートトリガー: 任意の時系列の違反
 しきい値の位置: しきい値より上
 しきい値: 70%
 再テストウィンドウ: 10分
 欠落データの扱い: Missing data points treated as values that do not violate the policy condition (欠落データポイントはポリシーに違反しない値として扱う)

Terraform の書き方

resource "google_monitoring_alert_policy" "gce_cpu_utilization" {
  display_name = "VM Instance - CPU utilization"
  combiner     = "OR"
  conditions {
    display_name = "VM Instance - CPU utilization"
    # CPU使用率がしきい値を10分間超えたら通知する
    condition_threshold {
      # 指標の設定
      filter     = "metric.type=\"compute.googleapis.com/instance/cpu/utilization\" AND resource.type=\"gce_instance\""
      aggregations {
        alignment_period = "60s"             # ローリングウィンドウ
        per_series_aligner = "ALIGN_MEAN"    # ローリングウィンドウ関数
      }
      # トリガーの設定
      threshold_value = "0.7"                # しきい値
      comparison = "COMPARISON_GT"           # しきい値の位置
      duration   = "600s"                    # 再テストウィンドウ
      trigger {
        count = 1
      }
      evaluation_missing_data = "EVALUATION_MISSING_DATA_NO_OP" # 欠落データの扱い
    }
  }
}

特定のログが一定時間に n 回以上発生した場合に通知する

まずは、クエリに一致したログが出現した回数をカウントする ログベースの指標 を作成します。次に、期間と回数をトリガー条件に設定したアラートポリシーを作成します。

以下に、Cloud Functions のエラーログが10分間に5回以上発生したら通知するアラートポリシーの作成方法を紹介します。

コンソールでの設定方法

  1. ログベースの指標を設定する
設定内容

指標タイプ: Counter
ログのスコープ: プロジェクトのログ
フィルタ: resource.type=cloud_function AND severity>=ERROR (ログクエリを書く)

  1. アラートポリシーを作成する
    作成した指標のをクリックし、「指標に基づいて通知を作成する」を選択し、以下の設定でポリシーを作成する。
設定内容

■指標の設定
 ローリングウィンドウ: 10分(ログ出現回数を集計する期間)
 ローリングウィンドウ関数: delta
 時系列集計: sum
■トリガーの設定
 トリガー: 任意の時系列の違反
 しきい値の位置: しきい値より上
 しきい値: 5(ログ出現回数)

Terraform の書き方

# Cloud Functions のエラーログをカウントする指標
resource "google_logging_metric" "function_errors" {
  name        = "log_metric_function_errors"
  filter      = "resource.type=cloud_function AND severity>=ERROR"
  metric_descriptor {
    metric_kind = "DELTA"
    value_type  = "INT64"
  }
}

# ログベースの指標のアラートポリシー
resource "google_monitoring_alert_policy" "log_metric" {
  display_name = "Log-based metric"
  combiner     = "OR"
  # Cloud Functionのエラーログが10分間に5回以上発生したら通知する
  conditions {
    display_name = "Cloud Function Errors"
    condition_threshold {
      # 指標の設定
      filter      = "metric.type=\"logging.googleapis.com/user/${google_logging_metric.function_errors.name}\" AND resource.type = \"cloud_function\""
      aggregations {
        alignment_period = "600s"           # ローリングウィンドウ
        per_series_aligner = "ALIGN_DELTA"  # ローリングウィンドウ関数
        cross_series_reducer = "REDUCE_SUM" # 時系列集計
      }
      # トリガーの設定
      threshold_value = 5                   # しきい値
      comparison  = "COMPARISON_GT"         # しきい値の位置
      duration    = "0s"
      trigger {
        count = 1
      }
    }
  }
}

まとめ

今回は、アラートポリシーを少し工夫して、アラートを即時通知するのではなく、一定時間アラートが出続けた場合に通知する方法をまとめました。重要でないインシデントの通知を避けて、システム運用の負担を減らせるとよいと思いました。

レスキューナウテックブログ

Discussion