エラー経済学-予算を破るのを避ける方法


SLOConf 2021で、私たちは、私たちがCIパイプラインの一部として走る信頼性テストにパス/フェイル基準を加えるために、エラー予算を使う方法について話しました.
サイトの信頼性エンジニアとして、我々の主な目標の一つは、我々が管理するシステムを維持すると同時に、手動労働、または労苦を最小限に抑えることです.安全な方法でこれを行うことができるように、我々は簡単にシステムの状態を検査することが本当に重要です.
我々がこの努力において成功しているかどうかを測るために、我々はサービスレベル協定(SLA)、サービスレベル指標(SLI)とサービスレベル目標(SLO)を確立します.伝統的なモニタリングは、これを行うのに本当に役に立ちます、しかし、問題がすでに存在するまで、行動をとるのを許しません.
積極的に行動を起こすことができるように、我々は負荷発電機や信頼性試験ツールのようなものを使用して、我々のシステムの負荷をシミュレートすることができます.私たちは決して生産を実行していないという事実のために完全に補償することはできませんが、私たちはまだ負荷のような生産をシミュレートすることができます、おそらく、システムに現実世界の乱流を注入しながら、我々は同様に生産に期待できるもののかなり良い写真を与えながら.

サイト信頼性の成功をどう測るか


私たちがこれらのサービスレベルのアーティファクトを作成することを開始するとき、それは通常、すべてのエッジケースを考慮しようとして、それらをオーバーエンジニアに誘惑されます.私の推薦は、あなたが可能な範囲までこれを避けるようにしようとすることです.
代わりに、複数のシステムのためにそれらを使用することができるように十分な総量である指標と目的の単純なセットを目指します.その後、それらを拡大して、時間をかけて増加を管理するシステムの理解としてより具体的にすることができます.これをすることは、我々の経験の不足のために、我々がそうでなければ非現実的であるか無関係な測定または要件を考え出す傾向があるので、これをすることはあなたに多くの時間を節約しそうです.

サービスレベル指標


サービスレベル指標はシステムの健康の定量的尺度である.それを覚えやすくするために、我々は我々が測定しているものとしてこれを考えることができる.例えば、私たちが典型的なWebアプリケーションのためのいくつかのSLISを思い出そうとするなら、リクエスト持続時間、uptime、エラーレートのようなもので終わるでしょう.

slisとslosの作成


何が含まれるべきですか?ほとんどの場合、有効なリクエストを含めるだけです.SLISを作成するときに続く良い公式はGoogle SRE docsで利用可能です.SLIが良い出来事の量に等しいそれらの州、有効なイベントの量によって分けられて、100倍、パーセントとして表されます.
例として、ユーザがサービスの定義された制約の範囲内にないリクエストを送信することを決定した場合、ユーザはリクエストをサポートしていないことを知っています.しかし、我々は適切に処理されていない要求の責任を負うべきではありません.

サービスレベル目標


一方、サービスレベルの目標は、我々のSLISの目標です.対策がOKであることを示すべきであると考えてください.例えば、私たちのSLIが要求期間に基づいていて、すべての要求のどのくらいのパーセントが500 ms未満であるかを示すなら、我々のSLOは我々のサービスのために我々が500 ms以下であると予想するパーセンテージがどれくらい大きいかを表します.

何がエラーの予算ですか?


SLIが適用されると、エラー予算はSLIの残りです.例えば、我々のSLOが99.9 %であるならば、それは我々のエラー予算が100 %まで残りの1 %であることを意味します.我々のスロットを破らないために、我々はそれから我々がセットアップした基準に従うことができないすべてのイベントに合うことができなければなりません.これは停電、サービスの劣化、計画されたメンテナンスウィンドウさえ含みます.
私が言おうとしていることは、4つのナイン、あるいはあなたのSLO(99.99 %、99、9 %)として3つに行く誘惑を感じるかもしれない間、これは必要とされるエンジニアリング努力に天文学的影響を及ぼします.ダウンタイム/非可用性SLIのために、3つの9つのSLOは基本的にあなたが少しの余裕があることを意味します:
毎日
  • ドル:1 m 26 s
  • 週刊
  • 週刊:10 m 4 s
  • 毎月
  • :43 m 49 s
  • 四半期:2 h 11 m 29 s
  • 年間
  • 年:8 h 45 m 56 s
  • 「Nines」を比較するために、uptime.isに移動してください.
    私の経験では、非常に少数のシステムが十分にこの可用性の動機づけに重要です.このようにSLOを使えば、ロールリスタートやゼロダウンタイムを展開しても、まったく間違いをする余裕はない.

    予算を燃やす


    目的のために予算を燃やすのはいつですか.私は次の文を親指の規則として使うのが好きです

    It is only acceptable to burn error budget on purpose if the goal of the activity causing the burn is to reduce the burn-rate going forward.


    期待の設定


    我々のSLISを選ぶこと


    このデモでは、我々は準備されているオンライン食品のサービスをサービスを提供しています.サービスレベルの指標として、リクエストの応答時間とHTTPレスポンスステータスの成功率を使用します.

    我々のスロットを選ぶこと


    これらのSLISのための合理的なスロットは何でしょうか?最初に、我々は我々がすでにSLAの形で我々の顧客またはユーザーに約束をするならば、我々自身を尋ねるようになりました.我々がそうするならば、我々は少なくともその中にとどまる必要があります.
    しかし、それは我々の内部の野心に同意するのも良いです.そして、通常、これらの野心は、我々が我々のユーザーを約束する勇気がある何よりも寛容であると判明します.
    この例では、次のスロットを使用します.
    すべての有効な要求の
  • パーセントは、300 ms
  • 未満の応答時間を持ちます
    すべての有効な要求の
  • の99.9 %は、成功したHTTP応答ステータスで返答します.
  • これは、応答時間のエラー予算が5 %であり、HTTP成功のためのエラー予算が0.1 %であることを意味します.

    測定


    我々が予算の中にとどまることができるかどうか知るために、我々は生産でこれを測る必要があります.また、私たちのスロットにタイムウィンドウを割り当てる必要があります.例えば、SLOを月から月単位で測定するか、7日間のスライディングを行う.
    また、一定の変化が回帰を導入したかどうかを確認するために、どうにかしてテストする必要があります.これは一般的に、K 6や負荷発電機が入ってくる場所です.
    ほとんどの時間は、我々のスロットを監視するだけで話します.この一歩をさらに踏み出すことを提案します.監視の伝統的なアプローチでは、我々は本当に前に見ていた非常にタイトな予算で、予算を消費する前に反応するために本当に装備されていない.その代わりに、我々がすでにSLOゲームに接近しているならば、我々は警戒されるだけです.
    私はここで間違っていない、私はまだ私たちが必要と信じて、私たちの生産スロットを監視する必要がありますが、我々はまた、我々は予算違反が発生する前に行動を起こすことができますいくつかの種類の示すテストでこれを補完する必要があります.おそらく、問題が解決されるまで、リリースを完全に止めてください.
    生産中のユーザのトラフィックと振る舞いをシミュレートするテストを実行することによって、変更が時間とともに与えられる影響を外挿し、変更が生産スロットに影響する方法の指標として使用することができます.
    しかし、私たちがそれに入る前に、我々はまた、予定されているダウンタイム、またはメンテナンスウィンドウについて少し話をする必要があります.

    予定ダウンタイムの会計


    現実世界の生産システムでは、これらは常に起こります.いくつかのケースでは、これは可能な限りのダウンタイムを必要とせずに可能ですが、大多数の場合、いくつかのダウンタイムは、現在、その後は避けられないです.
    我々は実際にダウンタイムを必要とする活動を識別するためにいくつかの時間を置く必要がありますし、我々のテストのためのアカウント.我々のslosが月から月まで基礎で測定されるならば、我々は通常すべてのWordDayの10分のダウンタイムを持っています、我々も我々のエラー予算から対応する量を差し引く必要があります.
    31日1日、22日の仕事日であり、すべての労働時間のダウンタイムの10分は、我々は744時間あたり220分、または0.0049 %の予定のダウンタイムを持っていることを意味します.
    220/(744*60) = 0,0049%
    
    
    我々は、したがって、エラー予算を計算する前に、したがって、我々のテストで使用するスロットを調整します.非常に簡略化されて、使用量の広がりを考慮していないので、私たちのケースでは、我々のテストのための実際のエラー予算は、00951 %と49951 %です.

    デモ


    これらの計算されたエラー予算を使用することによって、我々は彼らを我々のテストの閾値として表現して、我々のビルドが成功したかどうかについて、パス/フェイル基準として彼らを使用するかもしれません.そして、一旦我々が我々のCIワークフローでそれらを持つならば、我々はエラー予算を壊さない製品反復の我々の信頼を増やすこともできます.
    これがK 6でどのように見えるかを見てみましょう.K 6は無料でオープンソースとして利用可能です.あなたの既存のCIパイプラインでそれをフックすることは、どんな追加費用または重要な時間投資なしででも通常されます.
    あなたがランタイムの閾値を設定することをサポートするいくつかの他の負荷テストツールを使用している場合、これはおそらく同様に動作します.このデモでは、この小さなテストスクリプトを使用するつもりです.
    import http from 'k6/http'
    
    export const options = {
      vus: 60,
      duration: '30s'
    }
    
    export default function() {
      const res = http.get('https://test-api.k6.io')
    }
    
    
    では、このスクリプトは実際に何をしますか?30秒の間、それは平行に50の仮想ユーザーを走らせます.そして、可能な限り多くの時間として242479152ページを訪問します.実世界のシナリオでは、このテストは、おそらくもっと広範囲になるだろうと私たちのSLOを定義しているサービスとのユーザーの相互作用を模倣しようとする.
    テストを実行しましょう.
    http_req_duration..............: avg=132.05ms min=101.44ms med=127.55ms max=284.2ms p(90)=156.19ms p(95)=165.75ms
    http_req_failed................: 0.00% ✓ 0 ✗ 6576
    
    
    ご覧の通り、我々はすでに我々が我々のスロットを果たすかどうかを知ることができるすべての情報を得ます.また、我々のテストが我々のエラー予算を突破したかどうかを自動的に検出するいくつかのしきい値を定義しましょう.
    我々のK 6スクリプトで我々のしきい値としてそれらをセットしましょう.
      export const options = {
        thresholds: {
          http_req_duration: ['p(95.0049)<300'] // 95% below 300ms, accounting for planned downtime
          http_req_failed: ['rate<0.00951'] // 99,99049% successful, accounting for planned downtime
        }
      }
    
    
    それだ!あなたのChのワークフローでパス/失敗しきい値としてあなたのslosとslisを使用することで、エラーの予算を中断しない製品の繰り返しに自信を高めることができるでしょう.