GitHub Copilot usage metrics APIにレビュー指標追加|仕様差分・互換性・対応手順

GitHub Copilot usage metrics APIをETLやBIダッシュボードへ取り込んでいる場合、今回の更新で最初に確認すべきなのは、追加フィールドを既存のJSONパーサーや固定スキーマが拒否しないかです。

結論として、今回の変更は既存フィールドの削除や型変更ではなく、AI活用フェーズ別の集計に2つのレビュー指標を追加するものです。通常のJSONクライアントであれば緊急の移行は不要ですが、厳格なJSON Schema、固定列のETL、レスポンス全体を比較するスナップショットテストでは修正が必要になる可能性があります。GitHubではレスポンスフィールドの追加を非破壊的な変更として扱っています。(The GitHub Blog)

なお、対象として指定された2026年7月8日の更新に対応する公式Changelogは、ページ上では2026年7月7日付です。社内の変更管理台帳では、確認日と公式発表日を分けて記録すると混乱を防げます。(The GitHub Blog)

目次

GitHub Copilot usage metrics APIの更新で何が変わったのか

今回の更新では、企業または組織の利用状況レポートに含まれるtotals_by_ai_adoption_phaseへ、次の2フィールドが追加されました。

追加フィールド公式定義集計対象
avg_pull_requests_minutes_to_reviewPull Request作成から最初のレビューまでの時間を分単位で示す指標マージされたPull Request
avg_pull_requests_review_cyclesマージまでに受けたレビュー提出回数を示す指標マージされたPull Request

公式Changelogでは、いずれも中央値を用いた指標として説明されています。対象となるのは最終的にマージされたPull Requestだけで、レビュー済みでもマージされなかったPull Requestは集計に入りません。また、Pull Requestはマージされた日に一度だけ計上されます。(The GitHub Blog)

「time-to-adoption」を測る更新ではない

更新名の「Add review cycles and time to adoption phases in the usage API」は、Copilotの導入完了までにかかった時間を測定する機能と誤読しやすい表現です。

実際に追加された時間指標は、Pull Request作成から最初のレビューまでの時間です。これをCopilotのAI活用フェーズ別に比較できるようになった、という更新です。

つまり、今回のAPIで直接分かるのは次の内容です。

  • Copilotの活用段階が異なるグループ間で、レビュー開始までの時間に差があるか
  • マージまでに何回のレビュー提出が発生しているか
  • コードレビュー工程の待ち時間や手戻りがどこにあるか

一方、Copilotライセンス付与から初回利用までの日数や、利用者が上位の活用フェーズへ移行するまでの期間は、今回追加されたフィールドだけでは測定できません。

AI活用フェーズは既存の分類をそのまま利用する

totals_by_ai_adoption_phaseは、直近28日間のCopilot利用状況に応じてユーザーを分類する既存の集計です。今回の更新によって、フェーズの定義やユーザーの分類方法は変更されていません。

フェーズ概要
Phase 0対象となるCopilot利用が確認されないユーザー
Phase 1コード補完やIDE内のエージェントモードを中心に利用
Phase 2Copilot coding agent、コードレビュー、CLIなど、単一のエージェント領域を利用
Phase 3複数のエージェント領域または新しいGitHub Copilotアプリを利用

フェーズ判定はローリング28日間の利用状況に基づきます。そのため、同じユーザーでも利用状況の変化によって所属フェーズが変わる可能性があります。今回の2指標は、この既存フェーズごとのレビュー状況を把握するために追加されたものです。(The GitHub Blog)

APIレスポンスの仕様差分

変更点と、今回変更されていない部分を整理すると次のようになります。

確認項目更新後の扱い
追加場所totals_by_ai_adoption_phase
新しい指標初回レビューまでの時間、レビュー提出回数
対象レポートEnterprise/Organizationの1日レポートと28日レポート
集計対象マージされたPull Requestのみ
計上日Pull Requestがマージされた日
同一PRの計上回数1回
フェーズ定義変更なし
エンドポイント変更なし
認証方式変更なし
既存フィールド削除・名称変更の案内なし

次は説明用に簡略化したレスポンス例です。数値は実データではありません。

{
  "phase": "Phase 2",
  "phase_number": 2,
  "total_engaged_users": 120,
  "avg_pull_requests_median_minutes_to_merge": 480,
  "avg_pull_requests_minutes_to_review": 95,
  "avg_pull_requests_review_cycles": 2
}

既存のフェーズ別オブジェクトを維持したまま、末尾に2つのキーが追加されるイメージです。フィールドの順序はJSONの意味を持たないため、キーの並び順を前提にした処理は避ける必要があります。

また、フィールド名はavg_で始まりますが、公式Changelogの説明では中央値として定義されています。社内ダッシュボードで単に「平均レビュー時間」と表示すると誤解を招くため、「初回レビューまでの時間(公式定義に基づく集計値)」など、意味が分かるラベルを付けるのが安全です。(The GitHub Blog)

既存実装との互換性

GitHubのREST APIでは、既存レスポンスへのフィールド追加は非破壊的な変更に分類されます。破壊的変更は新しいAPIバージョンで提供されますが、フィールド追加だけを理由に新しいバージョンへ切り替える必要はありません。(GitHub Docs)

ただし、実際に影響がないかどうかは、受信側の実装によって変わります。

既存実装想定される影響必要な対応
未知のJSONフィールドを無視する原則として影響なし通常の回帰テストのみ
JSON SchemaでadditionalProperties: falseを指定検証エラーになる可能性新フィールドをスキーマへ追加
DTOの厳格なデシリアライズ未知フィールドで失敗する可能性未知フィールドを許容する設定へ変更
レスポンス全体のスナップショット比較差分テストが失敗新フィールドを期待値へ追加
列固定のCSV・データウェアハウス取り込み列不足やマッピングエラーの可能性nullable列を追加して再テスト
許可リスト方式で必要項目だけ抽出既存処理は継続するが新指標を取得できない活用する場合のみ抽出項目へ追加
JSONキー数や並び順に依存誤動作する可能性キー名による参照へ修正

特に注意したいのが、自動生成した型付きクライアントです。多くのライブラリは未知のフィールドを無視しますが、設定や言語によっては例外を発生させます。

本番コードを変更する前に、次のような未知フィールドを追加したモックレスポンスを既存パーサーへ入力し、正常に処理できるか確認してください。

{
  "existing_field": 100,
  "avg_pull_requests_minutes_to_review": 95,
  "avg_pull_requests_review_cycles": 2,
  "future_unknown_field": "test"
}

future_unknown_fieldを含めても正常に処理できれば、今後の追加フィールドにも耐えやすい実装になっています。

利用条件とレポートの取得方法

利用前に確認する条件

GitHub Copilot usage metrics APIを利用するには、対象の契約、ポリシー、権限を確認する必要があります。

項目確認内容
契約GitHub Copilot BusinessまたはGitHub Copilot Enterprise
EnterpriseポリシーCopilot usage metricsを利用可能な状態にする
Enterpriseレポートの権限Enterprise owner、billing manager、または許可されたカスタムロール
Organizationレポートの権限Organization owner、または許可されたユーザー
トークンエンドポイントに対応したEnterpriseまたはOrganizationの読み取り権限
APIバージョンX-GitHub-Api-Versionヘッダーの明示を推奨
データ反映対象日終了後、少なくとも2日分のUTC日付が経過してから確認

REST APIのドキュメントでは、EnterpriseでCopilot usage metricsポリシーが有効になっていることが前提とされています。Enterprise用とOrganization用では、必要なロールやトークンスコープが異なるため、HTTP 403が返る場合はライセンスより先に権限を確認してください。(GitHub Docs)

また、利用データはリアルタイムではありません。対象日が終了してから2つの完全なUTC日が経過するまで反映されない場合があります。更新直後のテストでフィールドが見つからなくても、すぐに仕様未反映と判断しないことが重要です。(GitHub Docs)

Organizationの1日レポートを取得する例

次の例では、Organizationの2026年7月10日分のレポート情報を取得します。

ORG="your-organization"
DAY="2026-07-10"

curl -L \
  -H "Accept: application/vnd.github+json" \
  -H "Authorization: Bearer ${GITHUB_TOKEN}" \
  -H "X-GitHub-Api-Version: 2026-03-10" \
  "https://api.github.com/orgs/${ORG}/copilot/metrics/reports/organization-1-day?day=${DAY}" \
  -o report-metadata.json

このAPIの初回レスポンスには、集計データそのものではなく、レポートファイルを取得するための署名付きダウンロードURLが含まれます。URLには有効期限があるため、取得後は速やかにファイルを保存します。(GitHub Docs)

DOWNLOAD_URL=$(jq -r '.download_links[0]' report-metadata.json)

curl -L "${DOWNLOAD_URL}" -o copilot-usage-report.ndjson

複数のdownload_linksが返される可能性を考慮し、本番処理では配列全体をループして取得してください。

28日レポートを取得する場合は、次のエンドポイントを利用します。

/orgs/{org}/copilot/metrics/reports/organization-28-day/latest
/enterprises/{enterprise}/copilot/metrics/reports/enterprise-28-day/latest

新フィールドが含まれているか確認する

NDJSON内の階層を固定せず、対象フィールドを再帰的に検索する例です。

jq -c '
  ..
  | objects
  | select(
      has("avg_pull_requests_minutes_to_review")
      or has("avg_pull_requests_review_cycles")
    )
  | {
      phase,
      phase_number,
      total_engaged_users,
      avg_pull_requests_minutes_to_review,
      avg_pull_requests_review_cycles
    }
' copilot-usage-report.ndjson

既存システムへ組み込む前に、まず保存した生のNDJSONでフィールドの位置、値の型、欠損時の表現を確認するのが確実です。

テスト時に見落としやすいポイント

マージされていないPull Requestは集計されない

最も起きやすいテストミスは、レビュー済みのPull Requestを用意しただけで数値が変わると考えることです。

新しい2指標の対象は、最終的にマージされたPull Requestです。レビューを受けてもオープンのまま、またはマージせずクローズしたPull Requestは集計に含まれません。(The GitHub Blog)

作成日やレビュー日ではなくマージ日に計上される

たとえば、次のPull Requestがあるとします。

  • 7月10日:Pull Requestを作成
  • 7月11日:最初のレビューを受領
  • 7月14日:修正後にマージ

このPull Requestは、7月10日や7月11日ではなく、7月14日のレポートへ計上されます。ただし、初回レビューまでの時間は7月10日の作成時刻から7月11日の最初のレビュー時刻までを基に計算されます。(The GitHub Blog)

日別レポートを検証するときは、作成日ではなくマージ日を指定してください。

レビューコメント数とレビュー提出回数を混同しない

avg_pull_requests_review_cyclesの公式説明で使われているのは、レビューコメント数ではなくreview submissionsです。

1回のレビュー提出に複数のインラインコメントが含まれることもあります。コメント件数を手作業で数えてAPI値と比較しても一致しない可能性があるため、レビュー提出イベントを基準に検証してください。

空のフェーズを想定する

対象期間中にマージされたPull Requestがないフェーズでは、数値を計算できません。公開Changelogだけでは、その場合にフィールドが省略されるのか、nullになるのか、0になるのかが明記されていません。

受信側では、次の3パターンをすべて処理できるようにします。

const minutesToReview =
  phase.avg_pull_requests_minutes_to_review ?? null;

if (minutesToReview === null) {
  console.log("対象データなし");
}

データなしを0分として扱うと、「レビューが即時に完了した」と誤解されます。欠損値と実測値の0は明確に分けてください。

1件追加しても中央値が変わるとは限らない

新しいテスト用Pull Requestを1件マージしても、既存データの件数や分布によっては集計値が変化しない場合があります。

テストでは値が増減したかだけでなく、次の点を確認します。

テスト観点確認内容
スキーマ2つのフィールドが読み取れるか
数値、null、欠損を安全に処理できるか
日付マージ日のレポートへ計上されるか
除外条件未マージのPull Requestが入っていないか
互換性既存フィールドの取り込みが継続できるか
期間1日レポートと28日レポートの両方で取得できるか
将来耐性未知のフィールドが増えても失敗しないか

1日レポートと28日レポートの使い分け

両方のレポートで新しい指標を利用できますが、用途は異なります。

レポート向いている用途注意点
1日レポート障害、繁忙日、施策実施日の確認マージ件数が少ない日は値が大きく変動しやすい
28日レポート導入傾向、フェーズ別比較、月次レビュー利用者のフェーズ移動や構成変化を含む

日々の増減だけで施策の成功を判断するのではなく、1日レポートで異常を見つけ、28日レポートで継続的な傾向を確認する使い方が適しています。

AI活用フェーズは直近28日間の利用状況によって決まるため、前月と今月でPhase 2の値が変わっていても、同じユーザー集団を比較しているとは限りません。定点観測では、total_engaged_userstotal_pull_requests_mergedも併せて保存し、母数の変化を確認してください。(The GitHub Blog)

新指標をコードレビュー改善へ活用する方法

新しい2指標は、既存のマージ所要時間と組み合わせることで、レビュー工程のどこに問題があるかを判断しやすくなります。

観測された傾向考えられる状態確認・改善する内容
初回レビューまでが長く、レビュー回数は少ないレビュアー割り当てや着手待ちがボトルネックCODEOWNERS、通知、当番制、レビューSLAを確認
初回レビューは速いが、レビュー回数が多い要件の曖昧さ、PRの大きさ、品質不足による手戻りPR分割、テンプレート、事前テストを改善
両方とも小さいが、マージまでが長いCI、承認待ち、リリース制限がボトルネックActionsの実行時間、必須チェック、承認ルールを確認
上位フェーズほどすべて改善しているCopilot活用と効率改善に相関がある可能性複数期間で再確認し、チームやPR規模の差も分析
上位フェーズほどレビュー回数が多いAI生成量の増加に対しレビュー負荷が増えている可能性生成コードの品質、テスト、PRサイズを確認

たとえば、初回レビューまでの時間が短縮しても、レビュー回数とマージまでの時間が増えていれば、単にレビュー開始が早くなっただけで、開発サイクル全体は改善していない可能性があります。

反対に、レビュー回数だけを減らすことを目標にすると、必要な指摘まで抑制するおそれがあります。指標は評価目的ではなく、工程改善の仮説を立てるために使うのが適切です。

フェーズ間の差をCopilotの効果と断定しない

Phase 3の初回レビュー時間がPhase 1より短くても、Copilotだけが原因とは限りません。

フェーズ間では、次の条件が異なる可能性があります。

  • 開発者の経験年数
  • チームの人数
  • Pull Requestの変更行数
  • リポジトリの種類
  • レビュアーの配置
  • CIの所要時間
  • 必須承認数
  • 休日やタイムゾーン

GitHub Copilot usage metrics APIの値だけで因果関係を証明するのではなく、Pull Requestのサイズやリポジトリ、チームなどのデータと組み合わせて分析してください。

OrganizationとEnterpriseではユーザーの所属や集約方法も異なるため、両者の数値を単純に一致させる用途には向きません。複数Organizationに所属するユーザーの扱いを含め、比較対象の範囲をそろえる必要があります。(GitHub Docs)

対応要否を判断する基準

今回の更新への対応レベルは、現在の利用方法によって判断できます。

現在の利用状況対応要否推奨対応
APIレスポンスをそのまま保存している緊急対応は不要保存処理が未知フィールドを許容するか確認
必要なキーだけを抽出している既存処理への影響は小さい新指標を使う場合のみ抽出処理を追加
厳格なJSON Schemaを使用している対応が必要新フィールドを任意項目として追加
固定列のデータ基盤へ投入している対応が必要nullable列、データ辞書、型定義を追加
スナップショットテストを使用している対応が必要期待値更新と将来フィールドへの耐性を追加
開発生産性ダッシュボードを運用している導入価値が高い初回レビュー、レビュー回数、マージ時間を併記
User、Team、Repositoryレポートだけを利用しているレポート構成の見直しが必要EnterpriseまたはOrganizationの1日・28日レポートを確認
未マージPRのレビュー状況も分析したい今回の指標だけでは不足Pull Requestイベントを別途取得して補完
Usage metricsポリシーを無効にしているAPI利用前の設定が必要ポリシー、ロール、トークン権限を確認

実務で行うべき対応手順

まず、既存のAPI取り込み処理が未知フィールドを許容しているか確認します。厳格なスキーマや固定列を使っている場合は、2つのフィールドを任意項目として追加してください。

次に、更新日以降かつUTC基準の反映待ち時間を満たした1日レポートを取得し、生のNDJSONを保存します。未マージのPull Requestではなく、レビュー後にマージされたPull Requestを含む日を選ぶことが重要です。

その後、次の順序で検証します。

  1. APIリクエストとレポートダウンロードが成功する
  2. 新しい2フィールドを検出できる
  3. 欠損、null、数値を安全に処理できる
  4. 既存フィールドの取り込み結果が変わっていない
  5. 1日レポートと28日レポートの両方を処理できる
  6. ダッシュボードの表示名が公式定義と矛盾していない
  7. 今後フィールドが追加されても処理が失敗しない

通常の寛容なJSON処理であれば、大規模な改修は不要です。一方、厳格なデータ基盤では、フィールド追加そのものが障害原因になり得ます。まず互換性テストを行い、その後にレビュー待ち時間、レビュー回数、マージ時間を組み合わせた可視化へ進むのが、最も安全で実用的な対応です。

この記事を書いた人

実務の現場で詰まりがちなポイントを地図にするITブログ「IT trip」を運営。Windows/Office(Teams・Excel)からSQL、サーバ運用、ガジェットまで、再現性のある手順と“なぜそうなるか”を丁寧に解説します。読んだらすぐ試せること、そして迷った人の次の一歩が見えることを大切にしています。

コメント

コメントする

目次