背景
GCPの Cloud Monitoringの設定で、ある条件のエラーログが検知されたら、Slack通知される、という仕組みを作成していた。terraform設定の概要は下記のようになる(少し編集してあります)
resource "google_monitoring_alert_policy" "alert_policy_api_failure_sample" {
...
conditions {
...
condition_matched_log {
filter = <<-EOT
resource.type="cloud_run_revision"
resource.labels.service_name="sample-endpoint"
severity=ERROR
EOT
label_extractors = {
message = "EXTRACT(jsonPayload.message)"
tenant = "EXTRACT(jsonPayload.tenant)"
}
}
}
...
// 条件にマッチしたログをslackに流す
notification_channels = [
var.notification_channel
]
...
// 通知に追記されるメッセージ
documentation {
content = <<-EOT
*${var.env}環境*
tenant_id: `$${log.extracted_label.tenant_id}`
EOT
mime_type = "text/markdown"
}
}
発生した問題
新しくログに載せる項目を増やすために、label_extractor
に項目を追加した。
label_extractors = {
message = "EXTRACT(jsonPayload.message)"
tenant = "EXTRACT(jsonPayload.tenant)"
+ target = "EXTRACT(jsonPayload.target)"
}
documentation {
content = <<-EOT
*${var.env}環境*
tenant_id: `$${log.extracted_label.tenant_id}`
+ target: `$${log.extracted_label.target}`
EOT
mime_type = "text/markdown"
}
これで、target
という名前の項目がとれるので、ログに出力されるはずだった。
が、出力されなかった。
原因
どうやら、jsonPayload.targetのキーあるいは値が存在しないとき、インシデントとして見なされないようで、slackに通知されない。
対策
jsonPayload.target
に 必ず 値が設定されるようにする!で今回のハマりはとりあえずなんとか乗り越えられた。
キーおよび値が設定されないと通知されない。デフォルト値をいれておくのもいいかもしれない。
(詳細未確認だが、デフォルト値が空文字だともしかしたらダメかもしれない。