Cloud Monitoringのメトリックの途切れを監視する

背景: 日々の運用にCloud Monitoringのメトリックは便利

  • Cloud Monitoringによる監視は便利*1です
  • 元々組み込みで使えるメトリックだけでも十分便利ですが、独自のメトリックを定義 & 定期的に投稿すると、さらに便利になります
    • 仕事ではArgo上で動かしているバッチの成否や、BigQueryのクエリの実行時間などをメトリックとして日々投稿しています
    • 色々使いどころが出てきたので、コマンドラインからさっとCloud Monitoringのメトリックに投稿できるようなツールも作っています

課題感: メトリックが途切れたことに気付けない

独自のメトリックは便利ではあるのですが、それを投稿する仕組み自体も当然システムです。システムである以上、壊れる可能性が当然あります。例えばこういうやつですね。

  • Argoのサーバー自体が落ちてしまった
  • メトリックを投稿するバッチの権限がなぜか外れてしまっていた
  • ライブラリのアップデートなどで挙動が変わってしまった

特にArgo上で動かしているバッチの成否が監視できていない場合、バッチの失敗などが検知できていない、ということで非常に危険な状態です。この自体に気付けるようにしたいです。ですが、監視の監視になるので、自前でこれを担保するのは若干面倒です。

解決策: メトリックの途切れを監視しよう

この課題感を解決する方法がCloud Monitoring自体から提供されています。指標の不在条件を使うと、一定時間メトリックが投稿されていない場合に検知することができます。

ちなみに、こういったメトリックが途切れたことに関する監視はCloud Monitoring独自というわけではなく、Mackerelなど監視を扱うサービスでは採用されていることが多いので、他のSaaSを使っていても同じことをできることは多いと思います。

Terraformでの設定例

Terraformでの設定例も置いときます。

resource "google_monitoring_alert_policy" "metric_absent_alert_policy" {
  display_name = "メトリックの投稿が途切れていないか"
  combiner     = "OR"
  conditions {
    display_name = "メトリックの投稿が途切れています"

    condition_absent {
      duration        = "600s"
      filter          = <<-EOT
        metric.type = "custom.googleapis.com/${var.YOUR_CUSTOM_METRIC_NAME}"
        AND resource.type = global
        AND resource.labels.project_id = ${var.YOUR_PROJECT_ID}
        AND metric.labels.argo_cron_workflow_name = batch-monitor # ここは自分の好みでどうぞ
      EOT
    }
  }
  
  notification_channels = [...]

  documentation {
    content   = <<-EOT
      メトリックが途切れています。XXXを確認しましょう。
    EOT
    mime_type = "text/markdown"
  }
}

*1:使い込み始めると色々言いたいことは出てくるけども...