kakakakakku blog

Weekly Tech Blog: Keep on Learning!

GitHub Codespaces のストレージ使用率 90% !? DuckDB で GitHub Usage Report を分析する

最近 GitHub から以下のようなメールが届いていた✉️

[GitHub] You've used 75% of included services for the kakakakakku account
[GitHub] You've used 90% of included services for the kakakakakku account

GitHub Codespaces では毎月「コア時間」「ストレージ」に無料利用枠が設定されていて,Settings > Billing and plans (Spending limit)「Email alerts」の設定をしておくと,75% / 90% / 100% でメールが届く.

docs.github.com

実際に Settings > Billing and plans (Plans and usage) を確認したところ You've used 90% of included services for GitHub Codespaces storage. というアラートが出ていて,ストレージ(GitHub Pro だと 20 GB)で 90% を超えていて,GitHub 画面で確認できる内訳としては以下となっていた📝

Storage: 8.99 GB
Prebuild Storage: 9.16 GB

Zenn Book と GitHub Codespaces

現在 Zenn Book で「LocalStack 実践入門」というワークショップを2つ公開していて(AWS アプリケーション開発ワークショップAWS サーバレスパターン開発ワークショップ),ワークショップ環境として GitHub Codespaces を採用している💡さらに GitHub Codespaces の起動時間を短くするために GitHub Codespaces prebuilds(プレビルド)という機能も採用している❗️

kakakakakku.hatenablog.com

よって内訳として,ワークショップの動作確認をしたときに Storage が消費されて,プレビルドを保管していると Prebuild Storage が消費されるということは予想できるものの,それ以上の情報はなく,もっと詳細に分析したいな〜と感じた.

GitHub Usage Report

そんなときには GitHub の「Usage Report」を活用できる❗️

Usage Report(CSV ファイル)には GitHub Actions, GitHub Packages, GitHub Codespaces の利用状況がまとまっている.期間としては過去7日間 / 過去30日間 / 過去90日間 / 過去180日間から選べる📅

docs.github.com

GitHub Usage Report と DuckDB

Usage Report の分析に DuckDB が使える🦆

データ構造

⚫◗ DESCRIBE SELECT *
    FROM '4b3a5d14_2025-02-06_180.csv';
┌────────────────────┬─────────────┬─────────┬─────────┬─────────┬─────────┐
│    column_name     │ column_type │  null   │   key   │ default │  extra  │
│      varcharvarcharvarcharvarcharvarcharvarchar │
├────────────────────┼─────────────┼─────────┼─────────┼─────────┼─────────┤
│ DateDATE        │ YES     │         │         │         │
│ Product            │ VARCHAR     │ YES     │         │         │         │
│ SKU                │ VARCHAR     │ YES     │         │         │         │
│ Quantity           │ DOUBLE      │ YES     │         │         │         │
│ Unit TypeVARCHAR     │ YES     │         │         │         │
│ Price Per Unit ($) │ DOUBLE      │ YES     │         │         │         │
│ Multiplier         │ DOUBLE      │ YES     │         │         │         │
│ Owner              │ VARCHAR     │ YES     │         │         │         │
│ Repository Slug    │ VARCHAR     │ YES     │         │         │         │
│ Username           │ VARCHAR     │ YES     │         │         │         │
│ Actions Workflow   │ VARCHAR     │ YES     │         │         │         │
│ Notes              │ VARCHAR     │ YES     │         │         │         │
├────────────────────┴─────────────┴─────────┴─────────┴─────────┴─────────┤
│ 12 rows                                                        6 columns │
└──────────────────────────────────────────────────────────────────────────┘

Product / SKU カラム別の件数(2025年1月)

1ヶ月間の区切りは請求月の開始日に紐付いていて,僕自身の環境だと「毎月6日〜翌月5日まで」となる.

⚫◗ SELECT Product, SKU, COUNT(*) AS COUNT
    FROM '4b3a5d14_2025-02-06_180.csv'
    WHERE Date BETWEEN '2025-01-06' AND '2025-02-05'
    GROUP BY Product, SKU
    ORDER BY Product;
┌────────────────────┬──────────────────┬───────┐
│      Product       │       SKU        │ COUNT │
│      varcharvarchar      │ int64 │
├────────────────────┼──────────────────┼───────┤
│ Actions            │ Compute - UBUNTU │     1 │
│ Codespaces - Linux │ Compute - 2 core │     2 │
│ Codespaces - Linux │ Storage          │    57 │
│ Codespaces - Linux │ Prebuild storage │    62 │
│ Shared Storage     │ Shared Storage   │     2 │
└────────────────────┴──────────────────┴───────┘

GitHub Codespaces の利用状況(2025年1月)

GitHub 画面をキャプチャしたタイミングと Usage Report をダウンロードしたタイミングが微妙に違うけど,ほとんど同じ値になっていることを確認できた👌

⚫◗ SELECT SKU, SUM(Quantity) AS SUM
    FROM '4b3a5d14_2025-02-06_180.csv'
    WHERE
        Product = 'Codespaces - Linux' AND
        Date BETWEEN '2025-01-06' AND '2025-02-05'
    GROUP BY SKU;
┌──────────────────┬────────────────────┐
│       SKU        │        SUM         │
│     varchar      │       double       │
├──────────────────┼────────────────────┤
│ Compute - 2 core │ 1.2688000000000001 │
│ Storage          │             8.9764 │
│ Prebuild storage │   9.13889999999999 │
└──────────────────┴────────────────────┘

GitHub Codespaces prebuilds(プレビルド)のリポジトリ別の利用状況(2025年1月)

Repository Slug カラムでリポジトリ名まで特定できる❗️

⚫◗ SELECT SKU, "Repository Slug", SUM(Quantity) AS SUM
    FROM '4b3a5d14_2025-02-06_180.csv'
    WHERE
        Product = 'Codespaces - Linux' AND
        SKU = 'Prebuild storage' AND
        Date BETWEEN '2025-01-06' AND '2025-02-05'
    GROUP BY SKU, "Repository Slug";
┌──────────────────┬──────────────────────────────────────────────────┬───────────────────┐
│       SKU        │                 Repository Slug                  │        SUM        │
│     varcharvarchar                      │      double       │
├──────────────────┼──────────────────────────────────────────────────┼───────────────────┤
│ Prebuild storage │ aws-application-workshop-using-localstack        │ 4.532299999999998 │
│ Prebuild storage │ aws-serverless-pattern-workshop-using-localstack │ 4.606599999999999 │
└──────────────────┴──────────────────────────────────────────────────┴───────────────────┘

GitHub Codespaces prebuilds(プレビルド)のリポジトリ別の日別利用状況(2025年1月)

⚫◗ SELECT Date, SKU, "Repository Slug", Quantity AS SUM
    FROM '4b3a5d14_2025-02-06_180.csv'
    WHERE
        Product = 'Codespaces - Linux' AND
        SKU = 'Prebuild storage' AND
        Date BETWEEN '2025-01-06' AND '2025-02-05'
    ORDER BY "Repository Slug", Date;
┌────────────┬──────────────────┬──────────────────────────────────────────────────┬────────┐
│    Date    │       SKU        │                 Repository Slug                  │  SUM   │
│    datevarcharvarchar                      │ double │
├────────────┼──────────────────┼──────────────────────────────────────────────────┼────────┤
│ 2025-01-06 │ Prebuild storage │ aws-application-workshop-using-localstack        │ 0.1464 │
│ 2025-01-07 │ Prebuild storage │ aws-application-workshop-using-localstack        │ 0.1403 │
│ 2025-01-08 │ Prebuild storage │ aws-application-workshop-using-localstack        │ 0.1464 │
│ 2025-01-09 │ Prebuild storage │ aws-application-workshop-using-localstack        │ 0.1464 │
│ 2025-01-10 │ Prebuild storage │ aws-application-workshop-using-localstack        │ 0.1464 │
│ 2025-01-11 │ Prebuild storage │ aws-application-workshop-using-localstack        │ 0.1464 │
│ 2025-01-12 │ Prebuild storage │ aws-application-workshop-using-localstack        │ 0.1464 │
│ 2025-01-13 │ Prebuild storage │ aws-application-workshop-using-localstack        │ 0.1464 │
│ 2025-01-14 │ Prebuild storage │ aws-application-workshop-using-localstack        │ 0.1464 │
│ 2025-01-15 │ Prebuild storage │ aws-application-workshop-using-localstack        │ 0.1464 │
│ 2025-01-16 │ Prebuild storage │ aws-application-workshop-using-localstack        │ 0.1464 │
│ 2025-01-17 │ Prebuild storage │ aws-application-workshop-using-localstack        │ 0.1464 │
│ 2025-01-18 │ Prebuild storage │ aws-application-workshop-using-localstack        │ 0.1464 │
│ 2025-01-19 │ Prebuild storage │ aws-application-workshop-using-localstack        │ 0.1464 │
│ 2025-01-20 │ Prebuild storage │ aws-application-workshop-using-localstack        │ 0.1464 │
│ 2025-01-21 │ Prebuild storage │ aws-application-workshop-using-localstack        │ 0.1464 │
│ 2025-01-22 │ Prebuild storage │ aws-application-workshop-using-localstack        │ 0.1464 │
│ 2025-01-23 │ Prebuild storage │ aws-application-workshop-using-localstack        │ 0.1464 │
│ 2025-01-24 │ Prebuild storage │ aws-application-workshop-using-localstack        │ 0.1464 │
│ 2025-01-25 │ Prebuild storage │ aws-application-workshop-using-localstack        │ 0.1464 │
│ 2025-01-26 │ Prebuild storage │ aws-application-workshop-using-localstack        │ 0.1464 │
│ 2025-01-27 │ Prebuild storage │ aws-application-workshop-using-localstack        │ 0.1464 │
│ 2025-01-28 │ Prebuild storage │ aws-application-workshop-using-localstack        │ 0.1464 │
│ 2025-01-29 │ Prebuild storage │ aws-application-workshop-using-localstack        │ 0.1464 │
│ 2025-01-30 │ Prebuild storage │ aws-application-workshop-using-localstack        │ 0.1464 │
│ 2025-01-31 │ Prebuild storage │ aws-application-workshop-using-localstack        │ 0.1464 │
│ 2025-02-01 │ Prebuild storage │ aws-application-workshop-using-localstack        │ 0.1464 │
│ 2025-02-02 │ Prebuild storage │ aws-application-workshop-using-localstack        │ 0.1464 │
│ 2025-02-03 │ Prebuild storage │ aws-application-workshop-using-localstack        │ 0.1464 │
│ 2025-02-04 │ Prebuild storage │ aws-application-workshop-using-localstack        │ 0.1464 │
│ 2025-02-05 │ Prebuild storage │ aws-application-workshop-using-localstack        │ 0.1464 │
│ 2025-01-06 │ Prebuild storage │ aws-serverless-pattern-workshop-using-localstack │ 0.1488 │
│ 2025-01-07 │ Prebuild storage │ aws-serverless-pattern-workshop-using-localstack │ 0.1426 │
│ 2025-01-08 │ Prebuild storage │ aws-serverless-pattern-workshop-using-localstack │ 0.1488 │
│ 2025-01-09 │ Prebuild storage │ aws-serverless-pattern-workshop-using-localstack │ 0.1488 │
│ 2025-01-10 │ Prebuild storage │ aws-serverless-pattern-workshop-using-localstack │ 0.1488 │
│ 2025-01-11 │ Prebuild storage │ aws-serverless-pattern-workshop-using-localstack │ 0.1488 │
│ 2025-01-12 │ Prebuild storage │ aws-serverless-pattern-workshop-using-localstack │ 0.1488 │
│ 2025-01-13 │ Prebuild storage │ aws-serverless-pattern-workshop-using-localstack │ 0.1488 │
│ 2025-01-14 │ Prebuild storage │ aws-serverless-pattern-workshop-using-localstack │ 0.1488 │
│ 2025-01-15 │ Prebuild storage │ aws-serverless-pattern-workshop-using-localstack │ 0.1488 │
│ 2025-01-16 │ Prebuild storage │ aws-serverless-pattern-workshop-using-localstack │ 0.1488 │
│ 2025-01-17 │ Prebuild storage │ aws-serverless-pattern-workshop-using-localstack │ 0.1488 │
│ 2025-01-18 │ Prebuild storage │ aws-serverless-pattern-workshop-using-localstack │ 0.1488 │
│ 2025-01-19 │ Prebuild storage │ aws-serverless-pattern-workshop-using-localstack │ 0.1488 │
│ 2025-01-20 │ Prebuild storage │ aws-serverless-pattern-workshop-using-localstack │ 0.1488 │
│ 2025-01-21 │ Prebuild storage │ aws-serverless-pattern-workshop-using-localstack │ 0.1488 │
│ 2025-01-22 │ Prebuild storage │ aws-serverless-pattern-workshop-using-localstack │ 0.1488 │
│ 2025-01-23 │ Prebuild storage │ aws-serverless-pattern-workshop-using-localstack │ 0.1488 │
│ 2025-01-24 │ Prebuild storage │ aws-serverless-pattern-workshop-using-localstack │ 0.1488 │
│ 2025-01-25 │ Prebuild storage │ aws-serverless-pattern-workshop-using-localstack │ 0.1488 │
│ 2025-01-26 │ Prebuild storage │ aws-serverless-pattern-workshop-using-localstack │ 0.1488 │
│ 2025-01-27 │ Prebuild storage │ aws-serverless-pattern-workshop-using-localstack │ 0.1488 │
│ 2025-01-28 │ Prebuild storage │ aws-serverless-pattern-workshop-using-localstack │ 0.1488 │
│ 2025-01-29 │ Prebuild storage │ aws-serverless-pattern-workshop-using-localstack │ 0.1488 │
│ 2025-01-30 │ Prebuild storage │ aws-serverless-pattern-workshop-using-localstack │ 0.1488 │
│ 2025-01-31 │ Prebuild storage │ aws-serverless-pattern-workshop-using-localstack │ 0.1488 │
│ 2025-02-01 │ Prebuild storage │ aws-serverless-pattern-workshop-using-localstack │ 0.1488 │
│ 2025-02-02 │ Prebuild storage │ aws-serverless-pattern-workshop-using-localstack │ 0.1488 │
│ 2025-02-03 │ Prebuild storage │ aws-serverless-pattern-workshop-using-localstack │ 0.1488 │
│ 2025-02-04 │ Prebuild storage │ aws-serverless-pattern-workshop-using-localstack │ 0.1488 │
│ 2025-02-05 │ Prebuild storage │ aws-serverless-pattern-workshop-using-localstack │ 0.1488 │
├────────────┴──────────────────┴──────────────────────────────────────────────────┴────────┤
│ 62 rows                                                                         4 columns │
└───────────────────────────────────────────────────────────────────────────────────────────┘

まとめ

Zenn Book で公開しているワークショップで GitHub Codespaces を使っていて,ストレージ使用量 90% のアラートが出たため,GitHub Usage Report と DuckDB を組み合わせて分析してみた🦆納得感のある内訳になっていることを確認できて良かった❗️

特に GitHub Codespaces prebuilds(プレビルド)は常に使用量が増えていくため,要注意だと思う.もしストレージ使用量が 100% になってしまうとプレビルドが使えなくなってしまうので,ワークショップ提供のことを考えると結構クリティカルな問題になってしまう.今後(2025年2−3月頃)に3つ目のワークショップを公開予定だったりもして,今後は GitHub Codespaces の追加課金も検討しようと思う💰️

docs.github.com

あとプレビルドではなく,通常のストレージ使用量で言うと,GitHub Codespaces の Default retention period30 days1 days に変更しておくと良さそう(現在の個人の用途だと翌日に消えてしまって問題ないため).

docs.github.com