Google CloudのObservability : Personalized Service Health
はじめに
先日、これまでプレビュー版だった、Google Cloudの稼働監視サービスのPersonalized Service HealthがGAになりました!
基本的な使用方法や設定はこちらのブログにて詳しく解説されていますので、ここでは運用面の機能を中心にPersonalized Service Healthを見ていきます。
Google Cloudの障害情報をプロジェクト単位でキャッチしたい!! Personalized Service Healthを使ってみた
Google CloudのObservability
Google Cloudの各種サービスステータスは、Google Cloud Service Healthにて公開されています
一方、Personalized Service Healthでは、使用中である関連するプロダクトのインシデント、そのステータス、ロケーションなどの情報が提供される他、公開されていないインシデントに加え、Google Cloud Service Health からのインシデントも、インシデント対応状況の証跡も含めてカバーされます。
インシデントが発生すると、以下のようにダッシュボード上に警告**!**の表示がつきます。
また Personalized Service Healthでは Service Health event と呼ばれるイベント情報がCloud LoggingにLoggingされます
インシデント管理ワークフローとして組み込み可能な以下のような手法があります。
- Dashboard
- Alert(Cloud Monitoring, Cloud Logging)
- API
Personalized Service Health shows emerging incidents | Google Cloud Blog
まさに、Google Cloudの可観測性(Observability) を提供してくれていると言って良いのではないでしょうか
ログ集約
Personalized Service Healthはプロジェクトごとに有効化の設定を行うこともできますし、組織またはフォルダー内のすべてのプロジェクトに対してPersonalized Service Healthを適用することも可能です。
そのため、組織レベルで1つのプロジェクトに対してLog Sinkを行うことでログを集約し分析ワークロードを組むことも可能です。
Enable Personalized Service Health for all projects in an organization or folder | Google Cloud
Terraform対応
Personalized Service Health固有のresource定義については現在のところ特にありません
アラートの設定は、Cloud Monitoringのアラートポリシーを使用する形で実装できます
PROJECT_ID
, NOTIFICATION_CHANNEL
は自身の環境に合わせて修正してください
フィルターを変更することで、インデントアラートに対するスコープを組織レベルからプロジェクトレベルまで変更できます(ここでは、すべてのインシデントとそれに伴うアップデートを通知する例を示します)
# Enable Personalized Service Health API
resource "google_project_service" "project" {
service = "servicehealth.googleapis.com"
}
# Alert Policy for Personalized Service Health
resource "google_monitoring_alert_policy" "alert_policy_all" {
display_name = "All incidents, all updates"
combiner = "OR"
enabled = "true"
conditions {
display_name = "test condition"
condition_matched_log {
filter = "resource.type = \"servicehealth.googleapis.com/Event\" AND jsonPayload.category = \"INCIDENT\" AND jsonPayload.@type = \"type.googleapis.com/google.cloud.servicehealth.logging.v1.EventLog\""
label_extractors = {
state = "EXTRACT(jsonPayload.state)"
description = "EXTRACT(jsonPayload.description)"
impactedProducts = "EXTRACT(jsonPayload.impactedProducts)"
startTime = "EXTRACT(jsonPayload.startTime)"
title = "EXTRACT(jsonPayload.title)"
impactedLocations = "EXTRACT(jsonPayload.impactedLocations)"
}
}
}
documentation {
content = "### $${log.extracted_label.title}\nCheck out [Personalized Service Health dashboard](https://console.cloud.google.com/servicehealth/eventDetails/projects%2F$${resource.labels.resource_container}%2Flocations%2F$${resource.labels.location}%2Fevents%2F$${resource.labels.event_id}) for more details.<br><br> Description: $${log.extracted_label.description}<br><br> Impacted products: $${log.extracted_label.impactedProducts}<br><br> Impacted locations: $${log.extracted_label.impactedLocations}<br><br> Incident start time: $${log.extracted_label.startTime}<br><br> State: $${log.extracted_label.state}"
mime_type = "GoogleCloud稼働監視"
}
alert_strategy {
notification_rate_limit {
period = "300s"
}
}
notification_channels = ["projects/PROJECT_ID/notificationChannels/NOTIFICATION_CHANNEL"]
user_labels = { # Add any extra labels that might be helpful
scope = "all"
}
}
個人的には、認証周りをterraformにて管理するのは運用負荷が上がってしまうため、通知チャンネルは管理コンソールから手動で追加し、以下のようdataで取得するようにしたい派です。
以下は、通知チャンネルにemailを設定した例です
data "google_monitoring_uptimecheck_config" "email"{
display_name = "your-email-display-name"
}
notification_channels = [
data.google_monitoring_uptimecheck_config.email.id
]
Configure alerts in Terraform | Personalized Service Health | Google Cloud
user_labelを設定することで、Alert Policyごとに制御範囲を任意で識別することも可能です
user_labeles = { "severity" : "info" }
まとめ
Personalized Service Healthを用いることで、Google Cloud上でのサービスの健全性をより詳細に、かつ柔軟に監視・管理することができるようになります。
また、Cloud MonitoringやCloud Loggingと統合されたインシデントワークフローの構築により、インシデント発生時の迅速な対応と詳細な容易な管理が可能になります。
使っていこう!Personalized Service Health🥳
Discussion
terraform 定義、おそらく GCP が自動生成してくれたものを記載しているかと思うのですが、
現在では生成してくれるリソースがアップデートされてるみたいです。
自分の手元だとこんなのが生成されました。
あんまり影響ないものは省くようになったみたい。