CNPA — クラウドネイティブプラットフォームエンジニアリングアソシエイト
デプロイ台帳からプラットフォーム指標を計算する
目標
28日分のデプロイ元帳1枚から、DORAの4つのメトリクスと採用率、エラーバジェットを自分で計算します。値を目分量で書かず、元帳から取り出す手を作ります。
なぜ重要なのか
メトリクスをめぐる議論は、ほとんどが定義ではなく計算方法から始まります。平均か中央値か、分母がデプロイ件数か失敗件数か、アクティブ利用を何で数えるかによって、同じデータが何倍も違う数字を出します。プラットフォームチームがメトリクスを導入するときに最初にすべきことは、計算をコードで固定し、誰が回しても同じ値が出るようにすることです。このラボの採点ツールも、同じ原理で動作します。書き出された数字を信用せず、元帳から計算し直して照合します。
ステップ
/root/cnpa-metrics/deploys.csvにデプロイ元帳を書き写してください。ヘッダーはservice,day,lead_min,result,restore_minで、データは15行です。内容は、形式の例にあるとおりです。resultはsuccessまたはfailedで、成功したデプロイのrestore_minは0です。/root/cnpa-metrics/freq.jsonにデプロイ頻度を入れてください。キーはwindow_days(28)、weeks(4)、per_weekで、per_weekにはサービスごとの週あたりのデプロイ件数を小数第2位まで入れます。元帳にある3つのサービスだけを入れます。/root/cnpa-metrics/lead.jsonにリードタイムの中央値を入れてください。キーはmedian_min(サービスごとの中央値)とoverall_median_min(15件全体の中央値)です。/root/cnpa-metrics/cfr.jsonに変更失敗率を入れてください。キーはtotal、failed、cfr_pct(小数第1位)です。/root/cnpa-metrics/mttr.jsonに復旧時間を入れてください。キーはfailed、mean_restore_min(失敗したデプロイの平均復旧時間、小数第1位)、max_restore_minです。/root/cnpa-metrics/dora.jsonに4つのメトリクスのレベルを入れてください。キーはdeploy_frequency、lead_time、change_failure_rate、mttrで、値はElite、High、Medium、Lowのいずれかです。しきい値は次のとおりです。デプロイ頻度(全デプロイを4週間で割った週あたりの件数)は、7以上ならElite、1以上ならHigh、0.25以上ならMedium、それ未満ならLowです。リードタイム(全体の中央値、分)は、60未満ならElite、1440未満ならHigh、10080未満ならMedium、それ以上ならLowです。変更失敗率は、5%以下ならElite、10%以下ならHigh、15%以下ならMedium、それより大きければLowです。復旧時間(平均、分)は、リードタイムと同じしきい値を使います。/root/cnpa-metrics/services.csvにサービス名簿を書き写してください。ヘッダーはservice,onboarded_day,golden_path,last_deploy_dayで、データは6行です。そのあと、/root/cnpa-metrics/platform-adoption.jsonに採用状況を入れてください。キーはtotal_services(名簿のサービス数)、onboarded(golden_pathがyesの数)、active(golden_pathがyesで、かつlast_deploy_dayが15以上の数)、active_rate_pct(アクティブ数を全サービス数で割ったパーセンテージ、小数第1位)です。/root/cnpa-metrics/budget.jsonにエラーバジェットを入れてください。プラットフォームSLOは99.5%、ウィンドウは28日です。キーはslo_pct(99.5)、window_days(28)、budget_min(ウィンドウ全体の分の0.5%)、burned_min(元帳の復旧時間の合計)、burn_pct(消化率、小数第1位)、remaining_min(残りのバジェット)です。
参考
- 中央値は、
sort -nで並べ替えたあとに、真ん中の値を選べばよいです。奇数個なら、真ん中の1つです。 - 小数の桁は、
awk 'BEGIN { printf "%.1f", ... }'で合わせます。 - JSONは、
jq -n --argjsonで作れば、数字が文字列に変わりません。 - 採点ツールは、作成したJSONを元帳と照合します。元帳を書き換えて数字を合わせようとすると、ステップ1の採点が先に落ちます。
デプロイ元帳を書き写す
/root/cnpa-metrics/deploys.csvにデプロイ元帳を書き写してください。ヘッダーはservice,day,lead_min,result,restore_minで、データは15行です。内容は、形式の例にあるとおりです。resultはsuccessまたはfailedで、成功したデプロイのrestore_minは0です。
すべての計算の出発点です。1文字でも違うと、後のステップの値がすべて変わるため、書き写したあとで合計で確認してください。
デプロイ頻度
/root/cnpa-metrics/freq.jsonにデプロイ頻度を入れてください。キーはwindow_days(28)、weeks(4)、per_weekで、per_weekにはサービスごとの週あたりのデプロイ件数を小数第2位まで入れます。元帳にある3つのサービスだけを入れます。
サービスごとに別々に数えます。28日は4週間で、値は小数第2位まで書きます。
リードタイムの中央値
/root/cnpa-metrics/lead.jsonにリードタイムの中央値を入れてください。キーはmedian_min(サービスごとの中央値)とoverall_median_min(15件全体の中央値)です。
並べ替えたあとの真ん中の値です。全体の中央値は、15件をすべて並べて求めます。サービスごとの中央値を平均するのではありません。
変更失敗率
/root/cnpa-metrics/cfr.jsonに変更失敗率を入れてください。キーはtotal、failed、cfr_pct(小数第1位)です。
分母はデプロイ件数です。サービス数でも障害件数でもありません。パーセンテージは小数第1位まで書きます。
復旧時間
/root/cnpa-metrics/mttr.jsonに復旧時間を入れてください。キーはfailed、mean_restore_min(失敗したデプロイの平均復旧時間、小数第1位)、max_restore_minです。
平均を出すときに割る数は、失敗したデプロイ件数です。全デプロイで割ると、値が何分の1にも小さくなります。
レベルの判定
/root/cnpa-metrics/dora.jsonに4つのメトリクスのレベルを入れてください。キーはdeploy_frequency、lead_time、change_failure_rate、mttrで、値はElite、High、Medium、Lowのいずれかです。しきい値は次のとおりです。デプロイ頻度(全デプロイを4週間で割った週あたりの件数)は、7以上ならElite、1以上ならHigh、0.25以上ならMedium、それ未満ならLowです。リードタイム(全体の中央値、分)は、60未満ならElite、1440未満ならHigh、10080未満ならMedium、それ以上ならLowです。変更失敗率は、5%以下ならElite、10%以下ならHigh、15%以下ならMedium、それより大きければLowです。復旧時間(平均、分)は、リードタイムと同じしきい値を使います。
しきい値は、指示文に書かれているものをそのまま使います。デプロイ頻度は、組織全体(15件)を4週間で割った値で判定します。
採用率
/root/cnpa-metrics/services.csvにサービス名簿を書き写してください。ヘッダーはservice,onboarded_day,golden_path,last_deploy_dayで、データは6行です。そのあと、/root/cnpa-metrics/platform-adoption.jsonに採用状況を入れてください。キーはtotal_services(名簿のサービス数)、onboarded(golden_pathがyesの数)、active(golden_pathがyesで、かつlast_deploy_dayが15以上の数)、active_rate_pct(アクティブ数を全サービス数で割ったパーセンテージ、小数第1位)です。
オンボーディングとアクティブ利用は違います。アクティブとは、ゴールデンパスでオンボーディングし、直近14日以内にデプロイしたサービスです。アクティブ率の分母は、全サービスです。
エラーバジェット
/root/cnpa-metrics/budget.jsonにエラーバジェットを入れてください。プラットフォームSLOは99.5%、ウィンドウは28日です。キーはslo_pct(99.5)、window_days(28)、budget_min(ウィンドウ全体の分の0.5%)、burned_min(元帳の復旧時間の合計)、burn_pct(消化率、小数第1位)、remaining_min(残りのバジェット)です。
28日は40320分です。SLOが99.5%なので、その0.5%が今回のウィンドウのバジェットで、消化は元帳の復旧時間の合計です。