Dev Study
← 研修トップ

SLI を数える — 分母と分子を決める

SLI の値は測って出ますが、何を数えるかは決めるものです。同じ 2,000 行のログから、4xx を分母に入れるか外すかで 86% と 97% が出ます。nginx が断った 429 とアプリが断った 429 は状態コードの列では同じ数字で、データが揃っていない事象は 500 にも 200 の縮退応答にもなります。失敗は見た層のログにしか残らず、リトライは試行の数を膨らませ、比を平均すると全体の比から 23 ポイントずれます。SRE Workbook と Art of SLOs の逐語、nginx・Prometheus・PostgreSQL を Docker で動かした生ログから、分母と分子を決める手順を積み上げます。

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