← 研修トップ
SLI を数える — 分母と分子を決める
SLI の値は測って出ますが、何を数えるかは決めるものです。同じ 2,000 行のログから、4xx を分母に入れるか外すかで 86% と 97% が出ます。nginx が断った 429 とアプリが断った 429 は状態コードの列では同じ数字で、データが揃っていない事象は 500 にも 200 の縮退応答にもなります。失敗は見た層のログにしか残らず、リトライは試行の数を膨らませ、比を平均すると全体の比から 23 ポイントずれます。SRE Workbook と Art of SLOs の逐語、nginx・Prometheus・PostgreSQL を Docker で動かした生ログから、分母と分子を決める手順を積み上げます。
- 1約 7 分良い事象 ÷ 有効な事象 — 1本のログから4つの可用性同じ 2,000 行の nginx アクセスログから、分子と分母の決め方4通りで 86.000% / 97.000% / 96.629% / 96.667% が出ました。5xx の 60 件はどの決め方でも同じで、変わったのは何を分母に置くかです。
- 2約 8 分状態コードは、誰が断ったかを言わない — 同じ 429 を原因で分けるかnginx が利用者の割当超過で断った 429 と、アプリが自分の混雑で断った 429 は、状態コードの列では同じ 429 です。分かれるのは、誰が断ったかを書いた別の列だけです。
- 3約 8 分原因ではなく、返ったもので数える — データ起因の 500 と、200 の縮退応答「データが揃っていない」という同じ事象でも、アプリが 500 を返せば可用性 SLI は 70.00% に下がり、既定値で埋めて 200 を返せば 100.00% のままです。どちらの数字に写るかは、アプリの書き方が決めています。
- 4約 8 分失敗は、見た層のログにしか残らない — アプリ・nginx・外からの3か所で数える同じ壊し方でも、行が残る場所は層ごとに違います。アプリ停止・読み取りタイムアウト・nginx 停止の3つを同じ1分間に起こすと、可用性は外からの prober で 53.8%、nginx で 66.7%、アプリで 100% と、3つの別の数になりました。
- 5約 7 分試行を数えるか、操作を数えるか — リトライで分母が膨らむクライアントが最大3回まで試す100操作の実験で、同じ nginx ログが、試行で数えると 69.23%、操作で数えると 99.00%、初回の試行だけなら 66.00% になりました。
- 6約 9 分誰の要求を分母に入れるか — ヘルスチェック、prober、ボットアクセスログには利用者以外の要求も並びます。良い=5xx以外に固定したまま分母だけを変えると、同じ5分間の全滅が 91.667% にも 50.000% にも 0.000% にもなりました。
- 7約 8 分レイテンシも数えた比 — 閾値の下に何件あったかレイテンシの SLI は「p95 が何秒か」ではなく、「閾値以下で返った要求が何件あったか」の比として数えられます。閾値にバケット境界があれば、件数の比は生データの割合と一致しました(1065/1200 = 0.8875)。
- 8約 8 分比は平均しない — 分子と分母を別々に足してから割る同じ 9,096 行のアクセスログでも、3台の可用性を平均すると 76.541%、良い件数と有効な件数を別々に足してから割ると 99.549% になります。
- 9約 9 分短い窓の比は、予算を燃やす速さで読む — 件数の少ない窓と0件の窓同じ5分間・180件の失敗でも、5分の窓で数えればバーンレートは 20.0、1時間の窓なら 1.67 です(窓の長さぶんの記録がある場合)。窓の長さを決めることは、分母の件数を決めることです。
- 10約 8 分要求の無い仕組みは、何を1件と数えるかから決める — 鮮度・網羅・正しさバッチやパイプラインには「要求」という決まった1件がありません。鮮度も網羅も、行・読み出し・実行のどれを1件とするかで、同じ表の状態から違う値が出ます。