GCE インスタンス (COS) を Google Cloud Monitoring で監視する
はじめに
Container-Optimized OS (COS) で構築されたGCEインスタンスを Google Cloud Monitoring で監視する方法を試したので、設定方法を共有したいと思います。コンソール画面から簡単に設定できるのですが、監視項目が多いと手動で設定するのは厳しいので、Terraform の書き方も紹介します。
COSでは Node Problem Detector というエージェントでインスタンスの状態を無料でモニタリングできます。COSでモニタリングを有効にするにはGCEの設定が必要です。詳細はGoogleドキュメントを参照してください。
アラート設定する前の準備
まずはどの指標をどのような条件でアラート通知するかを決めます。
モニタリング可能な指標を確認する
ディスク使用率、メモリ使用率、CPU使用率、CPUロードアベレージあたりを監視することが多いかと思います。GoogleドキュメントにGCEのモニタリング指標一覧が載っているので、監視対象がリストにあるかを確認します。guest/
が付いている指標はCOSだけが利用できるもので、他のOSではOpsエージェントという有料の指標になりますが、COSでは無料でモニタリングできます。
監視対象が見つかったら、アラート設定で必要になるので、以下の情報を確認します。
- Metric type
- Labels
- Unit
用語を理解する
アラート設定でよくあるのが、5分平均値が80%を超えたとき
に通知したい、というものです。GCPでは、5分平均値
をローリングウィンドウ、80%を超えたとき
をトリガー条件と呼びます。
ローリングウィンドウ
監視対象の5分平均値
を集計したい場合、ローリングウィンドウを5分
、ローリングウィンドウ関数を平均
に設定します。
GCPの指標は1分間隔で収集されるため、ローリングウィンドウの最小値は60s
です。ローリングウィンドウ関数は平均値の他に、最小値、最大値、総和、カウントなどが用意されていますが、指標ごとに選択可能な関数が決まっているので、何を選んでもいいわけではありません。何を選べるかは、現時点ではドキュメントからは分からなかったため、GCPコンソールのアラート通知設定画面で確認する必要がありました。
トリガー条件
例えば80%を超えたとき
を条件にアラート通知させたい場合、しきい値を80%
、比較条件をしきい値より上
に設定します。
しきい値の単位に要注意です。例えば、CPUロードアベレージ (guest/cpu/load_1m) の単位は1
となっているので、しきい値を80%としたい場合は0.8
と設定します。一方で、CPU使用率 (instance/cpu/utilization) の単位は10^2.%
なので、80
と設定します。
アラート設定
監視項目を決めたら、実際にアラート設定をTerraformで書いていきます。基本的には Terraformドキュメントの例を参考に書いていけば設定できるかと思いますが、少し設定に苦労した指標があったので、基本的な書き方と併せて紹介したいと思います。
tfファイルの基本的な書き方
メモリ空き容量のアラート設定を例として示します。以下のアラート通知条件の場合、tfファイルは次のようになります。
- Metric type: compute.googleapis.com/guest/memory/bytes_used
- Labels: state=free (使用量ではなく、空き容量を監視する)
- ローリングウィンドウ:60秒
- ローリングウィンドウ関数:平均
- トリガーのしきい値:2e+07 B (= 19 MB)
- トリガーの比較条件:しきい値を下回った時
resource "google_monitoring_alert_policy" "gce_memory_usage_free" {
display_name = "GCE: Memory usage (Free)"
combiner = "OR"
conditions {
display_name = "GCE: Memory usage (Free)"
condition_threshold {
filter = "metric.type=\"compute.googleapis.com/guest/memory/bytes_used\" AND metric.labels.state = \"free\" AND resource.type=\"gce_instance\""
// ローリングウィンドウ
aggregations {
alignment_period = "60s"
per_series_aligner = "ALIGN_MEAN"
}
// トリガー条件
threshold_value = "2e+07"
comparison = "COMPARISON_LT"
trigger {
count = 1
}
duration = "0s"
}
}
// 通知チャンネル
notification_channels = [
google_monitoring_notification_channel.slack.id
]
}
resource "google_monitoring_notification_channel" "slack" {
display_name = "Slack channel"
type = "slack"
labels = {
"channel_name" = var.notification_slack_channel
}
sensitive_labels {
auth_token = var.slack_token
}
}
設定に詰まった指標
CPU使用率 (iowait) の5分平均値が80%を超えたとき
にアラート通知するように設定したかったのですが、しきい値を何にするかで詰まりました。
CPU使用率 (iowait) は、COSの指標では guest/cpu/usage_time
で監視できます。この指標の単位はs{CPU}
で、vCPUコアの合計のCPU時間となっています。監視したいのは "使用率" なので、ローリングウィンドウ関数は rate
を選択します。これで単位はCPU使用率 (%) になりましたが、vCPUコアの合計であることに注意が必要です。2vCPUのインスタンスの場合、指標がとりうる値の範囲は~200%になります。したがって、vCPUあたりの使用率 80%
をしきい値にしたい場合、設定値は160%になります。
このように、指標によっては、説明と単位をしっかり確認して、適切なローリングウィンドウ関数やしきい値を設定する必要がありました。
おわりに
Google Cloud Monitoring は、一度設定方法を理解すれば、簡単に指標を追加できますし、グラフも見やすいので、とても便利だと感じています。指標の種類もだんだんと増えてきていますので、今後さらに充実することが期待されます。
Discussion