センスがある名前をつけたい

インフラ技術をメインに、技術検証の内容をメモとしてブログに残していきます。

stackdriverにおける監視設定とそれに伴うTerraform設定

はじめに

この記事ではstackdriverのCloud Loggingでエラーを拾いslackに通知する方法を説明し、それをTerraformに落とし込むまでを対象としてます。

前提条件

この記事のTerraformのバージョンは0.13.0で行います。

概要

エラーをslack通知するには以下の3つを設定する必要があります。

  • ログベース指標
  • 通知チャネル
  • アラートポリシー

用語に関して順番に説明していきます。

ログベース指標とは

ログベース指標とはCloud Loggingでどのようなログをどのような条件で取得するかを設定します。

通知チャネルとは

アラートの閾値を越えたら通知するチャネルを設定します。

 

今回slackで通知をさせたいのですが、Terraformでslackのチャンネルを管理するためにはOAuth認証/パスワード認証/サービスキー認証をする必要があり、slack側からどのように取得するのかが不明なので、管理外とします。

 

www.terraform.io

 
resource "google_monitoring_notification_channel" "default" {
  display_name = "Test Slack Channel"
  type         = "slack"
  labels = {
    "channel_name" = "#foobar"
  }
  sensitive_labels {
    auth_token = "one"
  }
}
 

手動設定はこちらのGCPの公式ドキュメントを参照ください。

参考資料: Managing notification channels  |  Cloud Monitoring  |  Google Cloud

アラートポリシーとは

アラートを出す閾値を設定します。

今回の場合は、ログベース指標から取得したログに対してどのような閾値を設けてアラートを出すかを設定します。

 アラートを設定

ログベース指標を設定する

Terraformのgoogle_logging_metricリソースを使い設定しします。

以下にコードの例を出します。

www.terraform.io

 
resource "google_logging_metric" "gae_logging_metric" {
name = "gae_logging_metric"
filter = "resource.type=gae_app AND severity>=ERROR"
metric_descriptor {
metric_kind = "DELTA"
value_type = "INT64"
display_name = "My metric"
labels {
key = "regexp_string"
value_type = "STRING"
description = "filter regexp string in logs"
}
labels {
key = "id"
value_type = "INT64"
description = "filter id in logs"
}
}
label_extractors = {
"regexp_string" = "REGEXP_EXTRACT(jsonPayload.name, \"(sample)\")"
"id" = "EXTRACT(jsonPayload.id)"

}
}
  

この例では、以下のことを行っています。

  • filterで抽出したログをを定義する
  • アラートポリシーの閾値で使う値をlabelsで定義する
  • labelsの具体的な設定はlabel_extractorsで定義する

具体的な処理内容しては、GAEログでログレベルがエラーのものを抽出し、

アラートポリシーで閾値に使える値として、ログでjsonPayload.nameフィールドの中にsampleが入っているものを抽出するregexp_stringラベルとjsonPayload.idフィールドを抽出するidラベルの2つを設定します。

 

問題はmetric_kindが何が正しいのかがわからなかったが、手動でルールを作りgcloud logging metrics describeを実行して、手動作成したルールの値を見ることをオススメします。

アラートポリシーを設定する

アラートポリシーはTerraformのgoogle_monitoring_alert_policyリソースで設定します。

www.terraform.io

 

以下がアラートポリシーの例になります。

resource "google_monitoring_alert_policy" "alert_policy" {
display_name = "GAE Alert"
combiner = "OR"
conditions {
display_name = "Check GAE Logs"
condition_threshold {
comparison = "COMPARISON_GT"
duration = "60s"
filter = "resource.type=\"gae_app\" AND metric.type=\"logging.googleapis.com/user/${google_logging_metric.gae_logging_metric.name}\""
threshold_value = "0"
aggregations {
alignment_period = "60s"
cross_series_reducer = "REDUCE_COUNT"
per_series_aligner = "ALIGN_SUM"
group_by_fields = [
"metric.label.regexp_string"
]
}
trigger {
count = 1
}
}
}

notification_channels = ["projects/プロジェクト名/notificationChannels/アラートチャンネルID"]

depends_on = [google_logging_metric.gae_logging_metric]
}

このアラートポリシーはgoogle_logging_metricで設定したfilterルールをgoogle_monitoring_alert_policyのfilterに適用し、アラートを出力する閾値として、google_logging_metricで設定したlabelを使ってます。

 

手動でslackチャンネルを作った場合は、gcloud beta monitoring channels listでチャンネル名を取得できるので、取得したチャンネル名をnotification_channelsに記載して下さい。

 

終わりに

GCP単体でエラー通知の設定が書いている記事があまりなく、この設定をするまでは苦労しました。自分と同じようにGCPのstackdriver単体で監視を完結させようとする人の手助けになれれば幸いです。