SLO期間が28日のとき、アラートの閾値をバーンレート14.4にしてよいのか
SLOの期間に関わらず、バーンレート14.4をアラートの閾値としている例を見かけます。
14.4が常に最適なのか、考えてみましょう。
『サイトリライアビリティワークブック』は14.4を推奨
『サイトリライアビリティワークブック』の5章では、エラーバジェットの消費速度に基づくアラートが推奨されています。
ページする閾値の妥当な初期値としては1時間で2%のバジェット消費と6時間で5%のバジェット消費を、そしてチケットのアラートのベースラインとしては3日間で10%のバジェット消費をおすすめします。
同じページには、次の表も掲載されています。推奨値が分かりやすいですね。
SLOバジェットの消費 | 時間のウィンドウ | バーンレート | 通知 |
---|---|---|---|
2% | 1時間 | 14.4 | ページ |
5% | 6時間 | 6 | ページ |
10% | 3日 | 1 | チケット |
これを参考にしているのでしょう、バーンレート14.4や6をアラートの閾値としている例をちらほら見かけます。
14.4には暗黙の前提がある
しかし、先の表には暗黙の前提があります。SLOの期間が30日と仮定されているのです。
バーンレートの定義上、SLOの全期間でエラーバジェットをちょうど消費し終える速度が「1」です。
表の最下行でバーンレートが1なのは、期間が30日だからです。30日の10%=3日で、10%のエラーバジェットを消費するのですから、バーンレートは1となります。
計算式にすると下記の通りです。
2% * (30d / 1h) = 0.02 * 720 = 14.4
5% * (30d / 6h) = 0.05 * 120 = 6
10% * (30d / 3d) = 0.10 * 10 = 1
先の表と整合していますね。
SLO期間が28日だと13.44になる
一方で同書の2章では、SLOの期間は4週間が推奨されています。
たとえば30日のウィンドウを採用すると、期間によっては4つの週末が含まれたり、5つの週末が含まれたりします。平日のトラフィックが週末のトラフィックとは大きく異なるのであれば、つまらない理由でSLIが変動しかねません。
(中略)
私たちは、4週間のローリングウィンドウが汎用的な期間として優れていることを見いだしました。
これに従い、SLOの期間を28日としている例も見かけます。
ただ、期間が違うなら、バーンレートを求める計算の前提も変わります。解き直してみましょう。
2% * (28d / 1h) = 0.02 * 672 = 13.44
5% * (28d / 6h) = 0.05 * 112 = 5.6
10% * (28d / 3d) = 0.10 * 9.33 = 0.933
期間が28日の場合、1時間で2%のエラーバジェットを消費するバーンレートは、14.4ではなく13.44となりました。
Google CloudのCREも13.44を使用
Google CloudのCRE (Customer Reliability Engineer) であるYuri Grinshteynさんは、「How to alert on SLOs」という記事で、バーンレート13.44をアラートの閾値として使う例を紹介しています。
- Alerting window size = 1 hour
- Budget consumed = 2% or .02
- Period = 28 days or 672 hours
To calculate burn rate, I used
burn rate = budget consumed * period / alerting window = .02 * 672 / 1 = 13.44
14.4が常に最適とは限らないということです。
同氏は一方で、下記の計算ミスも犯していました。正しい結果は5.6ですよね。
burn rate = budget consumed * period / alerting window = .05 * 672 / 6 = 6.72
ブザウザでバーンレートを計算できるMultiple Burn Rate Calculatorを使えば、このようなミスが防げます。
14.4を使っても間違いではない
以上を知ったうえで、あえて、SLO期間が28日の場合にバーンレート14.4を閾値に採用するのであれば、間違いとは言えません。
下記の計算で分かるように、アラートされるエラーバジェットの消費率には大差ないからです。
# 30日の場合
14.4 * 1h / 30d = 14.4 / 720 = 0.02
6 * 6h / 30d = 36 / 720 = 0.05
1 * 3d / 30d = 72 / 720 = 0.10
# 28日の場合
14.4 * 1h / 28d = 14.4 / 672 = 0.021
6 * 6h / 28d = 36 / 672 = 0.054
1 * 3d / 28d = 72 / 672 = 0.107
ただし、消費率が2.1%・5.4%・10.7%となるため、もしキリの良さを重視するなら、バーンレート14.4をアラートの閾値に選ぶのは適切ではありません。
いずれにしても、バーンレートには期間が関係していることをふまえて、適切な閾値を選びましょう。ご意見・ご質問などあれば、@iwamotまでお知らせください。