Four Keys って何？ | Datadog DORA Metrics の可視化

## はじめに
こんにちは、Datadog Japan で Sales Engineer をしている [**AoTo**](https://qiita.com/AoTo0330) です。

この記事は **[<font color="#6495ED">AoTo Advent Calendar 2023</font>](https://qiita.com/advent-calendar/2023/aoto) 20日目**の記事です。

**Four Keys** と呼ばれる開発生産性を示す4つの指標があります。
今回はこの指標の定義から始めどのようにメトリクスを記録するか、Datadog ではどのように可視化できるか、を記事内で前半・後半に分けてまとめます。

https://cloud.google.com/blog/ja/products/gcp/using-the-four-keys-to-measure-your-devops-performance

# Four Keys って何？
## 概要
**Four Keys** は [**DevOps Research and Assessment（DORA）**](https://cloud.google.com/blog/products/devops-sre/the-2019-accelerate-state-of-devops-elite-performance-productivity-and-scaling)チームの研究から、ソフトウェア開発チームのパフォーマンスを示す指標として知られています。
2023年最新の『[**State of DevOps Report 2023**](https://cloud.google.com/devops/state-of-devops)』でもこれらの調査を行っており、実際の調査結果に基づいてパフォーマンスレベルを提示しています。

 - **デプロイ頻度** - 正常なリリースの頻度
 - **変更リードタイム** - コミットからデプロイまでの所要時間
 - **変更障害率** - デプロイ起因の障害が発生する割合
 - **サービス復元時間** - 障害から回復するのにかかる時間

デプロイ頻度と変更リードタイムは**速度の指標**で、変更障害率とサービス復元時間は**安定性の指標**です。開発チームはこれらの値を測定して、継続的に改善を繰り返すことでビジネス成果を向上させることができます。

以下では、それぞれの指標の説明と２０２３年の調査に基づいたパフォーマンスレベルについて、簡潔にまとめています。パフォーマンスレベルが高いほど組織のパフォーマンスが高く、収益性や・市場占有率・KPI の達成度などビジネス的な寄与に繋がっています。

### デプロイ頻度
デプロイ頻度は「組織による**正常な本番環境**へのリリースの**頻度**」を測定する指標です。
これは、<INS>デプロイが成功した時点のデータ</INS>が必要となります。

1週間のうちに正常なデプロイが1回以上行われた日数の中央値が3日以上である場合、「毎日」に分類されます。また、本番環境へのデプロイが成功したと見なす条件は、チームのビジネス要件によります。

| 　Elite(18%)　 | 　High(31%)　 | 　Medium(33%)　 | 　Low(17%)　 |
| :-: | :-: | :-: | :-: |
| １日に数回 | 1週-1ヶ月に1回 | 1ヶ月-半年に1回 | 半年に1回未満 |

### 変更リードタイム
変更リードタイムは「**`commit`** から**本番環境稼働**までの**所要時間**」を測定する指標です。
これは、<INS>`commit`発生時点とデプロイ実行時点の2つのデータ</INS>が必要となります。

すべてのデプロイに含まれる変更のリストを維持し、これをデプロイテーブルと結合してタイムスタンプを取得します。これにより、リード時間の中央値を計算します。

| 　Elite(18%)　 | 　High(31%)　 | 　Medium(33%)　 | 　Low(17%)　 |
| :-: | :-: | :-: | :-: |
| 1時間未満 | 1日-1週 | 1ヶ月-半年 | 半年以上 |

### 変更障害率
変更障害率は「**デプロイ**が原因で本番環境で**障害**が発生する**割合**」を測定する指標です。
これは、<INS>試行されたデプロイ数と、障害が発生したデプロイ数の2つの数値</INS>が必要となります。

デプロイテーブルから合計デプロイ回数を、バグやGitHubインシデントのラベルなどからインシデントを取得して障害が発生したデプロイの数を算出して、障害の発生割合を計算します。

| 　Elite(18%)　 | 　High(31%)　 | 　Medium(33%)　 | 　Low(17%)　 |
| :-: | :-: | :-: | :-: |
| 5% | 10% | 15% | 64% |

### サービス復元時間
サービス復元時間「組織が本番環境での**障害**から**回復**するのにかかる**時間**」を測定する指標です。
これは、<INS>インシデント作成時点とインシデント解決時点の2つのデータ</INS>が必要となります。

変更障害率と同様に、このデータはインシデントを管理するさまざまなシステムから取得されてます。

| 　Elite(18%)　 | 　High(31%)　 | 　Medium(33%)　 | 　Low(17%)　 |
| :-: | :-: | :-: | :-: |
| 1時間未満 | 1日未満 | 1日-1週 | 1ヶ月-半年 |

## 効果
Four Keys を測定する効果について考察していきます。

前述の通り、Four Keys は各2つの**速度の指標**と**安定性の指標**によって構成されています。これらの指標は互いに**コンパティビリティの関係**であり、むしろ特定の指標の改善が他の指標の改善に間接的に寄与する可能性もあります。この指標の関係は改善を促す組織の文化づくりに大きく寄与し、Elite の開発チームの場合全ての指標が高い水準にあります。

**Four Keys にトレードオフはない**、というお話を含めて、Four Keys の基礎と重要性をまとめられている素晴らしいスライドがあるので、ご参考ください。

https://speakerdeck.com/yigarashi/30fen-dewakarufour-keysnoji-chu-tozhong-yao-xing?slide=10

これらの指標を可視化し、ダッシュボードなどで常に確認することによって、開発チームが早い段階でパフォーマンスの低下を把握して対処をすることができます。そもそものパフォーマンスが低い場合は、ビジネス KPI を達成するために、上位の段階のパフォーマンスレベルを OKR として設定できます。

実際、Elite の開発チームによって組織のパフォーマンスの目標以上の結果を得る可能性は、その他のパフォーマンスの開発チームと比較して2倍ほどあるという結果が出ています。

## 記録
これらの指標の記録方法はさまざまありますが、一貫してデプロイ・変更・インシデントなどのデータを CI/CD パイプラインやインシデント管理ツールなどから収集する必要がります。そのため、これらのデータを収集し Four Keys として可視化するために、データの収集・加工・可視化を行うソリューションが重要となります。

これを実現するツールとして、以下のようなものが存在します。

 - DORA team / [**fourkeys**](https://github.com/dora-team/fourkeys)
 - Findy Team + / [**DevOps 分析**](https://prtimes.jp/main/html/rd/p/000000042.000045379.html)
 - Datadog / [**DORA Metics**](https://docs.datadoghq.com/ja/dora_metrics/?tab=apicurl) (Private beta)

また、カスタマイズされたツールを使用せずに Google Cloud 上で構築されたアーキテクチャの Four Key を可視化する方法が紹介されています。

https://cloud.google.com/blog/products/devops-sre/another-way-to-gauge-your-devops-performance-according-to-dora

# Datadog DORA Metrics の可視化
## 概要
Datadog では現在 [**DORA Metrics**](https://docs.datadoghq.com/ja/dora_metrics/) という名称で、Four Keys の記録と可視化のソリューションを提供しています。こちらは現在は**非公開ベータ**となっており、アクセスをリクエストし承認後に Datadog コンソール上で該当の専用ページを利用することができます。

Datadog では [**DORA Metrics API**](https://docs.datadoghq.com/ja/api/latest/dora-metrics/#send-a-deployment-event-for-dora-metrics) および [**Datadog CI CLI**](https://www.npmjs.com/package/@datadog/datadog-ci)、[**GitHub integration**](https://docs.datadoghq.com/integrations/github/)を用いて DORA Metrics(Four Keys) の元となるデータを取得します。

:::note info
2023/12/20 時点での情報を元に執筆しています。最新の公開状況は　[**DORA Metrics**](https://docs.datadoghq.com/ja/dora_metrics/) をご確認ください。
:::


## 効果
Datadog のプラットフォーム上で Four Keys を可視化することで、Datadog 上で可視化されている関連するテレメトリーデータを参照して、開発サイクルの改善に繋げることができます。

### Datadog CI Visibility
[**Datadog CI Visibility**](https://docs.datadoghq.com/continuous_integration/) は、CI プロバイダから直接情報を収集して、開発パイプラインの重要なメトリクスと結果を表示することができます。

パイプラインの障害のトラブルシューティング・パフォーマンスのボトルネックの特定を行いデプロイ上の問題を解消して**変更リードタイム**を短縮したり、CI パイプラインの効率化を行うことで**デプロイ頻度**の向上に繋げることができます。

### Datadog Test Visibility
[**Datadog Test Visibility**](https://docs.datadoghq.com/tests/) は、各言語のテストツールの動作を追跡・記録して、コードテストの重要なメトリクスと結果を表示することができます。

[Flaky Test](https://docs.datadoghq.com/tests/guides/flaky_test_management/) を検出しテスト品質を向上することで高品質なテストを実行し**変更障害率**を低減したり、[Intelligent Test Runner](https://docs.datadoghq.com/intelligent_test_runner/)によって変更されるコードに基づくテストのみを自動的に実行し**変更リードタイム**を短縮し、障害時の**サービス復元時間**の削減に繋げることができます。

**公開ベータ**の機能ですが、[Quality Gates](https://docs.datadoghq.com/quality_gates/)を利用することで、Datadog の監視テレメトリを用いて特定の品質基準に達していないコードのデプロイを停止することで、**変更障害率**を下げることができます。

## 記録
ここからは [Datadog DORA Metrics](https://docs.datadoghq.com/ja/dora_metrics/) の設定から、データソースと可視化の方法を見ていきましょう。

Datadog では DORA Metrics　を設定する際に、Four Keys の計測を行う対象のアプリケーションを [Service Catalog](https://docs.datadoghq.com/ja/tracing/service_catalog/) に準じた[サービス定義を追加する](https://docs.datadoghq.com/ja/tracing/service_catalog/setup/)必要があります。[^1]
[^1]: Datadog APM, USM で自動検出されていればそのサービス名を利用できます。

### デプロイ頻度
[**DORA Metrics API**](https://docs.datadoghq.com/ja/api/latest/dora-metrics/#send-a-deployment-event-for-dora-metrics) と [**Datadog CI CLI**](https://www.npmjs.com/package/@datadog/datadog-ci) によって収集できます。デプロイ属性として`started_at`と`finished_at`を記録することでデプロイが実行された時間を記録します。Datadog ではこれに加えて、計測対象のアプリケーションを識別するために`service`属性を取得する必要があります。

![DPRA_DF.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2363567/4b06b7fb-ebef-86f9-5ee4-628320a07c96.jpeg)

### 変更リードタイム
[**DORA Metrics API**](https://docs.datadoghq.com/ja/api/latest/dora-metrics/#send-a-deployment-event-for-dora-metrics) と [**Datadog CI CLI**](https://www.npmjs.com/package/@datadog/datadog-ci) によって収集できます。デプロイ頻度で記録した属性に加えて、デプロイ属性として`repository_url`と`commit_sha`を追加することでリポジトリとバージョンを識別できるようにします。

単一のリポジトリに複数のサービスのコードが含まれている場合は、これを区別するためにパスのパターンを加えることで複数のサービスのリードタイムを分けて取得できます。
 
さらに、[**GitHub integration**](https://docs.datadoghq.com/integrations/github/) による変更リードタイムの取得も可能です。

![DORA_CLT.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2363567/6ec00dc5-da37-753d-b56e-7a8b7ac4101b.jpeg)
 
### 変更障害率
[**DORA Metrics API**](https://docs.datadoghq.com/ja/api/latest/dora-metrics/#send-a-deployment-event-for-dora-metrics) と [**Datadog CI CLI**](https://www.npmjs.com/package/@datadog/datadog-ci) によって収集できます。デプロイイベントが送信された上で、デプロイ属性と同一のインシデントの属性として`service`と`started_at`属性が追加されている必要があります。この属性はデプロイ属性と同じ要素ですが、記録先が`dora/incident`となり、これにより対象のデプロイがインシデントとして記録されます。

![DORA_CFR.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2363567/c0d68c9b-2a4f-39a4-6760-a4b7c4ffea3d.jpeg)

### サービス復元時間
[**DORA Metrics API**](https://docs.datadoghq.com/ja/api/latest/dora-metrics/#send-a-deployment-event-for-dora-metrics) と [**Datadog CI CLI**](https://www.npmjs.com/package/@datadog/datadog-ci) によって収集できます。変更障害率のため、インシデントイベントを送信した上でインシデント属性`finished_at`を含むインシデントイベントを送信することで自動的に記録されます。

![DORA_MTTR.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2363567/e24ed2f6-0e4b-0269-71f5-25d34d6c7ce9.jpeg)

## おわりに
Four Keys の紹介から、具体的な実装方法を Datadog DORA Metrics を元に解説してきました。Four Keys はそれぞれそこまで複雑な指標ではないため、手動での記録をしつつまずはデプロイ頻度から自動取得をはじめるのも良いでしょう。

Datadog で Four Keys を取得すれば、Datadog のソリューションと統合されたさまざまな機能を利用可能です。Datadog CI Visibility や Test Visibility と共に Observability の Shift-Left を実践してみてはいかがでしょうか🐶