🐶

Datadog SLO の推移をダッシュボードに表示する

2022/12/25に公開1

はじめに

Datadog には SLO を計測する機能が標準で備わっています。

https://docs.datadoghq.com/ja/monitors/service_level_objectives/

そして、作成した SLO をダッシュボードに追加すると、現在のステータスとエラーバジェットの値が表示されます。

https://docs.datadoghq.com/ja/dashboards/widgets/slo/

執筆時点では他のメトリクスのように任意の期間におけるグラフとして表示する機能はありません。(私が知らないだけの可能性があるので、もしあれば教えてください)

これは、現在のエラーバジェットをもとに開発の優先度を決めたり、バーンレートによるアラートを設定して顧客体験の悪化を検知したりするのが SLO の主な活用法なので、基本的には現在の値だけ知っていれば十分ということなのだと解釈しています。

しかし、障害対応後のポストモーテムや、プロダクトチームの振り返りの際に過去の値を知りたいという場面はあるのではないでしょうか。

この記事では、API とカスタムメトリクスを利用して SLO の推移をダッシュボードに表示する方法を紹介します。

手順

Datadog SLO API

まず、Datadog が SLO の履歴を取得する API を用意しているので、これを利用します。

https://docs.datadoghq.com/api/latest/service-level-objectives/#get-an-slos-history

任意の期間とを指定すると、その期間の SLO に関する値を詳細に取得できます。

curl -X GET "https://api.datadoghq.com/api/v1/slo/${slo_id}/history?from_ts=${from_ts}&to_ts=${to_ts}" \
  -H "Accept: application/json" \
  -H "DD-API-KEY: ${DD_API_KEY}" \
  -H "DD-APPLICATION-KEY: ${DD_APP_KEY}"

今回必要な値に関するポイントは以下の2つです。

  • リクエストの総数(= 計算式の分母)と成功したリクエスト(= 計算式の分子)の raw value が取得できるので自分で SLI を計算できるし、計算した値も返してくれる
  • クエリパラメータに SLO ターゲット(99.95% など)を指定すれば SLI に加えてエラーバジェットの残量も取得できる

よって、現在のタイムスタンプを起点に time window の分だけ遡って期間を指定しつつ、SLO ターゲットも指定すれば現時点での SLO のステータスとエラーバジェットが取得できます。

カスタムメトリクス

次に取得した値をカスタムメトリクスとして登録します。

https://docs.datadoghq.com/api/latest/metrics/#submit-metrics

curl -X POST "https://api.datadoghq.com/api/v2/series" \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-H "DD-API-KEY: ${DD_API_KEY}" \
-d @- << EOF
{
  "series": [
    {
      "metric": "system.load.1",
      "type": 0,
      "points": [
        {
          "timestamp": 1636629071,
          "value": 0.7
        }
      ],
      "resources": [
        {
          "name": "dummyhost",
          "type": "host"
        }
      ]
    }
  ]
}
EOF

タイムスタンプとして指定できるのは(前後に少し余裕はありますが)現在値のみなので、注意する必要があります。
私は過去の SLO の値を登録しようとしてこの仕様にハマりました。

サンプルコード

最後にシェルスクリプトでの全体例を載せておきますが、API クライアントは各種言語で用意されているので適宜読み替えてください。

#!/bin/bash
set -eu

# Path parameters
slo_id="${SLO_ID}"
slo_target="${SLO_TARGET}"
slo_window="${SLO_WINDOW}"

# Required query arguments
to_ts=$(date +%s)
from_ts=$(date -d "$(($slo_window - 1)) days ago" +%s)

echo "to_ts: $to_ts"
echo "from_ts: $from_ts"

# Curl command
response=$(curl -sS -X GET "https://api.datadoghq.com/api/v1/slo/${slo_id}/history?from_ts=${from_ts}&to_ts=${to_ts}&target=${slo_target}" \
  -H "Accept: application/json" \
  -H "DD-API-KEY: ${DD_API_KEY}" \
  -H "DD-APPLICATION-KEY: ${DD_APP_KEY}")

sli_value=$(echo "$response" | jq -r .data.overall.sli_value)
error_budget=$(echo "$response" | jq -r .data.overall.error_budget_remaining.custom)

echo "sli_value: $sli_value"
echo "error_budget: $error_budget"

## Dynamic Points
# Post time-series data that can be graphed on Datadog’s dashboards.
# Curl command
curl -sS -X POST "https://api.datadoghq.com/api/v2/series" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -H "DD-API-KEY: ${DD_API_KEY}" \
  -d @- << EOF
{
  "series": [
    {
      "metric": "$SLO_METRIC_NAME",
      "type": 2,
      "points": [
        {
          "timestamp": $to_ts,
          "value": $sli_value
        }
      ]
    },
    {
      "metric": "$ERROR_BUDGET_METRIC_NAME",
      "type": 2,
      "points": [
        {
          "timestamp": $to_ts,
          "value": $error_budget
        }
      ]
    }
  ]
}
EOF

あとはこれを定期的に実行するだけでメトリクスデータが溜まっていき、ダッシュボードにグラフとして表示することができるようになります。

ただ SLO ターゲットとして100%に近い値を設定しているとグラフが丸められてしまうので、実用するためにはスケールを調整するなどの工夫が必要です。その点ではエラーバジェットの方が視認性の高いグラフになるかもしれません。

まとめ

Datadog SLO をカスタムメトリクス化してダッシュボードに表示する方法を紹介しました。
今後 Datadog 自体に機能が追加されて、このような力技を使わなくても SLO をグラフとして表示できるようになるかもしれません。
しかし、カスタムメトリクスを使って可視化するやり方などは他にも応用できると思うので、何かの参考になれば幸いです。

Discussion