はじめに
アーキテクトチームの長沼です。
JDEPでは、アプリケーションの開発にAIペアプログラマーGitHub Copilot Business(以下、GCB)を取り入れています。 GCBは開発者にとって非常に便利な支援ツールであり、積極的に活用していきたいと考えています。 一方で、企業として利用する以上、費用対効果の説明やリソースの効率的な利用も時に求められます。
そこでJDEPでは、GCBの利用状況の可視化にも取り組んでいます。 今回はその1つとして、Copilot利用者数を可視化する取り組みについてご紹介します。
アーキテクチャ
GCBでは、GitHub Copilot User Management APIによって Copilot利用者の情報(利用者毎にAPIコール時点での最終利用日時や使用エディタ等)を取得できます。
これを日次で取得することによって、1日にどの程度GCBが利用されているかを可視化できます。
今回は以下のようなアーキテクチャで可視化してみることにしました。
各構成要素の役割は以下のとおりです。
# | 構成要素 | 処理概要 |
---|---|---|
(1) | Cloud Functions | GitHub Copilot User Management APIからGCBの利用者情報を取得し、後述(4)のBigQueryに格納 |
(2) | Cloud Scheduler | 日次で(1)のCloud Functionsを実行 |
(3) | BigQuery | GCBの利用者情報を時系列で保存するデータベース |
(4) | Looker | BigQueryのデータを可視化するツール |
実装
以降では、前述の構成要素の実装例についてご紹介します。
なお(1)〜(3)で示す実装例では、エラー処理ほか本筋に関係しない部分は省略して記述している部分があります。
(1) Cloud Functionsの処理
環境変数に指定された
- GITHUB_ORG: 情報を取得したいGCB利用者が所属するGitHubのOrganization
- GITHUB_TOKEN: GitHub Copilot User Management APIから情報を取得するためのAPIトークン
- GOOGLE_CLOUD_PROJECT_ID: 構成要素(3)のBigQueryが属するGoogleのProject ID
を入力パラメータとして、 GitHub Copilot User Management APIから情報を取得し、BigQueryに格納する処理をPythonで実装した例を以下に示します。
import os import requests from datetime import datetime, timezone from google.cloud import bigquery # GitHubのAPIにより、GitHub Copilot利用者の最終利用日時を取得 def get_copilot_seat_usages(request=None): # GitHub側の変数 GITHUB_HOSTNAME = os.getenv("GITHUB_HOSTNAME") or "api.github.com" GITHUB_API_VERSION = os.getenv("GITHUB_API_VERSION") or "2022-11-28" GITHUB_ACCEPT = os.getenv("GITHUB_ACCEPT") or "application/vnd.github+json" GITHUB_ORG = os.getenv("GITHUB_ORG") GITHUB_TOKEN = os.getenv("GITHUB_TOKEN") # Google Cloud側の変数 GOOGLE_CLOUD_PROJECT_ID = os.getenv("GOOGLE_CLOUD_PROJECT_ID") BIGQUERY_DATASET_ID = os.getenv("BIGQUERY_DATASET_ID") or "github_copilot" BIGQUERY_TABLE_ID = os.getenv("BIGQUERY_TABLE_ID") or "copilot_seat_usages" # 処理実行時の時間 REQUEST_TIMESTAMP = datetime.now( timezone.utc).strftime("%Y-%m-%dT%H:%M:%SZ") # GitHub APIからGitHub Copilot利用者のusage情報を取得 org_url = f"https://{GITHUB_HOSTNAME}/orgs/{GITHUB_ORG}/" seat_usage_url = f"{org_url}copilot/billing/seats" headers = { "Authorization": f"Bearer {GITHUB_TOKEN}", "Accept": GITHUB_ACCEPT, "X-GitHub-Api-Version": GITHUB_API_VERSION, } data = (requests.get(seat_usage_url, headers=headers)).json() # 取得usage情報からBigQuery格納情報を生成 seats = data['seats'] rows = [] for seat in seats: asignee = seat['assignee'] rows.append(( asignee['id'], # user_id asignee['login'], # username seat['last_activity_editor'], # user_editor seat['last_activity_at'], # last_activity_time REQUEST_TIMESTAMP # request_timestamp )) # BigQueryに格納 bqclient = bigquery.Client(project=GOOGLE_CLOUD_PROJECT_ID) table = bqclient.get_table( f"{GOOGLE_CLOUD_PROJECT_ID}.{BIGQUERY_DATASET_ID}.{BIGQUERY_TABLE_ID}") errors = bqclient.insert_rows(table, rows) if errors == []: return "Successfully inserted rows into BigQuery." else: return ("Encountered errors while inserting rows: {}".format(errors)) if __name__ == "__main__": get_copilot_seat_usages()
(2) Cloud Schedulerの処理
Cloud Schedulerは、Cronjobと同様の記述方法で、指定した日時に指定された処理(今回は(1)のCloud Functions)を実行できるGoogle Cloudのサービスです。
これを用いて、前述(1)のCloud Functionsを例えば毎日午前9時に実行することにより、実行時点での各GCB利用者の最終利用日時(last_activity_at
)を取得します。
この利用日時が前日の午前9時以降の時間であれば、前日その利用者はGCBを利用していた、と考えることができます。
このCloud Schedulerの記述をTerraformで記述した例を以下に示します。
resource "google_cloud_scheduler_job" "get_copilot_seat_usages_invoker" { name = "get_copilot_seat_usages_invoker" description = "Invoke get-copilot-seat-usage cloud functions" schedule = "0 9 * * *" # 9:00 JST time_zone = "Asia/Tokyo" region = var.region # Please change me # 以降、target設定等の記述 (今回は省略) }
(3) BigQueryの構造
BigQueryは、データ分析向けによく使われるGoogle Cloudのマネージドデータベースサービスです。
このBigQueryに、日次で(1)のCloud Functionsにより取得したGCBの利用者情報を
- ユーザID
- ユーザ名
- 最終利用日時
- 最終利用時のエディタ
- 取得日時((1)のCloud Functions実行時間)
として格納していきます。
これをスキーマ含めてTerraformで構築する例を以下に示します。
resource "google_bigquery_dataset" "github_copilot" { dataset_id = "github_copilot" location = var.location # Please change me description = "Dataset for GitHub Copilot" } resource "google_bigquery_table" "copilot_seat_usages" { dataset_id = google_bigquery_dataset.github_copilot.dataset_id table_id = "copilot_seat_usages" schema = <<EOF [ { "name": "user_id", "type": "INT64", "mode": "REQUIRED", "description": "user id (seat[].assignee.id)" }, { "name": "username", "type": "STRING", "mode": "REQUIRED", "description": "username (seat[].assignee.login)" }, { "name": "last_editor", "type": "STRING", "mode": "NULLABLE", "description": "used editor in the last usage (seat[].last_activity_editor)" }, { "name": "last_use_date", "type": "TIMESTAMP", "mode": "NULLABLE", "description": "last usage date in UTC (seat[].last_activity_at)" }, { "name": "data_acq_date", "type": "TIMESTAMP", "mode": "REQUIRED", "description": "acquisition date by the daily request" } ] EOF }
このほかJDEPでは、利用者と所属チーム(アプリケーション)の関係を保持するテーブルなども用意し、より詳細な分析も可能としています。
(4) Looker で用いるクエリ
Lookerは、BigQueryに格納された様々なデータを可視化するGoogle Cloudのサービスです。
可視化のイメージがアーキテクチャの図で示した右側のダッシュボードとなります。
本記事ではLookerの具体的な実装・設定は割愛しますが、日次で(data_acq_date
-1)日午前9時からの24時間でGCBを使用した利用者数(latest_total_uesed_seats
)の一覧を取得するクエリは以下のように書くことができます。
SELECT data_acq_date, COUNT(last_use_date) as latest_total_uesed_seats FROM `{GOOGLE_CLOUD_PROJECT_ID}.{BIGQUERY_DATASET_ID}.{BIGQUERY_TABLE_ID}` WHERE last_use_date >= DATE_SUB(data_acq_date, INTERVAL 1 DAY) AND last_use_date <= data_acq_date GROUP BY data_acq_date
おわりに
今回は、GitHubが提供するAPIを用いて、GitHub Copilot Businessの日々の利用者を可視化する取り組みについてご紹介しました。
さらに最近、GitHub Copilot Metrics APIが公開され、Acceptance Rate (提案をどの程度採用したかの割合)等の指標がAPIで取得できるようになりました。
こうした情報も可視化・活用し、さらなる活用促進や効率的な利用に取り組んでいきたいと思います。
最後となりましたが、JCBでは我々と一緒に働きたいという人材を募集しています。 詳しい募集要項等については採用ページをご覧下さい。
本文および図表中では、「™」、「®」を明記しておりません。 記載されているロゴ、システム名、製品名は各社及び商標権者の登録商標あるいは商標です。