Mobile Factory Tech Blog

技術好きな方へ!モバイルファクトリーのエンジニアたちが楽しい技術話をお届けします!

開発生産性を可視化する基盤を作った話

駅メモ!チームでエンジニアをしている id:stakHash です。

開発活動に関わるデータを収集し、開発生産性を測るためのメトリクス(便宜的に「開発メトリクス」と呼びます)を可視化するための仕組みを作りました。
その目的や設計などについてまとめました。

どんなものを作ったのか

開発生産性を測るためのデータを簡単に収集し、可視化するためのダッシュボードです。
画像はごく一部ですが、このようなグラフの形で各種メトリクスを見ることができます。

GitHub PR 関連のダッシュボード例

2025 年 6 月 16 日現在では、以下のようなメトリクスを可視化したダッシュボードがあります。

  • テスト所要時間の推移や、特に時間のかかっているテスト
  • ビルド・デプロイ所要時間の推移
  • コード品質の推移

なぜ作ったのか

GitHub リポジトリなどをベースに開発メトリクスを集計するような SaaS もありますが、今回は内製することにしました。
理由は大きく 2 点あります。 「スモールスタートしたかった」 こと、 「既に部分的にデータが収集されていた」 ことです。

Four Keys をはじめとした開発メトリクスは広く認知を得ていますが、駅メモ!チーム内では活用事例が少ない状態でした。新機能を追加するプロジェクトの範囲で計測されることがあったり、個人がスクリプトを書いて部分的に計算したりすることはありましたが、継続的に計測されているものは限られていました。
長期的な計測を改善活動に結びつける仕組み・文化づくりが必要だったため、最初から金銭的コストをかけて SaaS を使うという選択肢は取りづらかったのです。まず MVP を作成し、必要に応じて SaaS の導入を検討しよう、という流れになりました。

そんな中、自動テストの運用に関わるメトリクスは既に継続的に計測されていました。例えば GitHub Actions がランナーを掴むまでの時間、成功率、中断率などです。
この仕組みを参考にしつつ、より包括的なデータを収集できる仕組みを作ることにしました。

どう作ったのか

構成は非常にシンプルです。全て AWS 上でホストしています。

構成図

集計対象のデータは様々なワークフローに散らばっているため、どのような環境でも送信しやすいように HTTP リクエストで受け付けます。
リクエストボディは以下のような形式です。

{
  "type": "metrics-type",
  "payload": {
    "key1": "value1",
    "key2": "value2",
    ...
  },
}

受けたリクエストの type を元に分類し、まず S3 バケットに格納します。
ここではまだデータの整形や集計は行わず、payload をほぼそのままログの形で保存します。分析が進んでいく中で、求める集計方法は変化していくことが想定されるためです。生のデータを保持しておくことで、集計方法が改善されても再集計すれば良く、対応が簡単です。

S3 バケットに集められたログを可視化する仕組みは、 ElasticsearchGrafana を利用しました。
類似のダッシュボードツールは他にも Redash や、検索エンジンとバンドルされた OpenSearch ダッシュボード等もありますが、今回は社内で利用実績のあった Grafana にしました。

Grafana ではブラウザ上からグラフィカルにダッシュボードを作成できます。
作成したダッシュボードは JSON 形式で出力できるので、これを Git 管理し、インスタンス起動時に terraform で構成しています。
ID の類やバージョン情報には、ダッシュボードを作成・編集する際に自動で割り当てられるものもあります。これらはスクリプトを書いて JSON から削除しておくと、 terraform で扱うときに無駄な差分が減って管理しやすいです。

resource "grafana_dashboard" "dev_metrics" {
  for_each = toset([
    "dashboard-name",
    ...
  ])

  config_json = file("${path.module}/dashboard-models/${each.value}.json")
}

弊社では各エンジニアに利用する開発環境として EC2 インスタンスを提供しているので、今回は簡単のため Elasticsearch と Grafana をホストする EC2 インスタンスを用意しました。
EC2 インスタンスを起動したタイミングで、 S3 バケットに蓄積したログを取得・集計し、 Elasticsearch にロードします。
前回の起動時から未集計のデータが大量に追加されていると集計に時間がかかってしまうこともありますが、現在の運用上そこまで大量に積まれないため、これで問題ありません。

どう使っているのか

週に 1 回前後 EC2 インスタンスを起動し、最新のデータを取り込んで各種メトリクスの推移を確認しています。

直近 1 週間で大きな変化はないか、もしあればその原因は何が考えられるか、すぐに改善できるものか否かなどを検討し、必要に応じて改善タスクとして登録します。
こうして登録されたタスクは、他の改善タスクと合わせて毎週優先度や担当チームが割り当てられます。
定期的にチェックすることで、例えばランダムに失敗するユニットテストを見つけて修正したり、ESLint などのルールを調整したりといった改善に繋げられています。

その他にも、何か改善を行った際の効果測定にも利用することがあります。

まとめ

開発生産性を向上させ、ひいてはプロダクトを改善すること目的に、AWS の各サービスや Grafana を利用し、開発メトリクスを集計するダッシュボードを作りました。

もし「これから集計したいけど、SaaS の導入は難しい」というようなシーンがありましたら、設計の参考になれば幸いです。