🦮

Datadogで複合条件を用いたモニターを作成する

2023/12/08に公開

この記事は 検索エンジンプロダクトを一緒に開発してた同窓会 Advent Calendar 2023 の7日目の記事です。
昨日は mado さんの Cloud RunのSLOをTerraformを用いてDatadog上に作成する でした。

はじめに

Datadogでアラートを設定する際に複数の条件に応じて発報するモニターを作成したい機会があり、ユースケースに沿って実現してみます。
実装にはTerraformを用います。

複合条件モニター

複合条件モニター は個別の構成モニターを組み合わせて1つのモニターにし、詳細なアラート条件を定義できます。
Terraformでは構成モニターも複合条件モニターも datadog_monitor で作成でき、構成モニターには query alert など任意のtypeを設定でき、複合条件モニターはtypeに composite を設定してqueryには構成モニターを論理式で並べます。

ユースケース

APIのlatency悪化の検知(但し、リクエストが少ない時間帯を除く)

APIのlatencyが悪化した場合を検知したいと思います。
ただし、立ち上がりが遅いアプリケーションにおいて、リクエストが少ない時間帯を無視したい場合に以下のように設定できます。

# latency悪化検知の構成モニター
resource "datadog_monitor" "loadbalancing_latencies_avg" {
  name    = "Loadbalancer latency is high"
  type    = "query alert"
  message = "This monitor is for Composite Monitor."

  query = <<-QUERY
    avg(last_1h):avg:gcp.loadbalancing.https.total_latencies.avg{*} > 100
  QUERY

  monitor_thresholds {
    critical = 100
  }
}

# リクエストが少ない時間帯を検知する構成モニター
resource "datadog_monitor" "loadbalancing_request_count" {
  name    = "Loadbalancer request exceeded."
  type    = "query alert"
  message = "This monitor is for Composite Monitor."

  query = <<-QUERY
    sum(last_1h):sum:gcp.loadbalancing.https.request_count{*}.as_count() > 1000
  QUERY

  monitor_thresholds {
    critical = 1000
  }
}

# 複合条件モニター
resource "datadog_monitor" "loadbalancing_latencies_avg_alert" {
  name    = "Loadbalancer latency is high and constant number of requests"
  type    = "composite"
  message = "@some-mention"
  query   = "${datadog_monitor.loadbalancing_latencies_avg.id} && ${datadog_monitor.loadbalancing_request_count.id}"
}

タスクキューの広義単調増加の検知(但し、値が0の場合を除く)

タスクキューにおいて、処理が進まずタスク数が広義単調増加していることを検知したいと思います。
ただし、タスク数が0の場合は除きたい場合に以下のように設定できます。

# タスクキューの広義単調増加を検知する構成モニター
resource "datadog_monitor" "task_count_derivative_monotonic_increase" {
  name    = "task count derivative monotonic increase"
  type    = "query alert"
  message = "This monitor is for Composite Monitor."

  query = <<QUERY
min(last_1h):derivative(default_zero(avg:gcp.workload.custom.task.count{*})) >= 0
QUERY

  monitor_thresholds {
    critical = 0
  }
}

# 値が0の場合をを検知する構成モニター
resource "datadog_monitor" "task_count_continues_many" {
  name    = "TFTQ task count continues many"
  type    = "query alert"
  message = "This monitor is for Composite Monitor."

  query = <<QUERY
min(last_1h):default_zero(avg:gcp.workload.custom.task.count{*}) > 0
QUERY

  monitor_thresholds {
    critical = 0
  }
}

# 複合モニター
resource "datadog_monitor" "task_count_usage" {
  name    = "Abnormal task count usage."
  type    = "composite"
  message = "@some-mention"

  query = "${datadog_monitor.task_count_derivative_monotonic_increase.id} && ${datadog_monitor.task_count_continues_many.id}"
}

最後に

監視設定はできるだけシンプルにした方が良いと思いますが、時には複雑な条件でのアラートも求められます。
Datadogでは複合条件モニターを用いることで多種多様な条件でのアラートを実現できそうです。

Discussion