ghaperf
ghaperf analyzes the performance of GitHub Actions workflows using GitHub API and raw job logs. Unlike other tools, it can detect bottlenecks inside composite actions by parsing job logs and extracting step-level timing data.
Why ghaperf?
- Existing tools can't detect bottlenecks inside steps. ghaperf solves this by analyzing actions logs.
- Many existing tools need metrics storage, so the setup is bothersome and it costs 💸. ghaperf doesn't need any storage, so it's easy to use and free
Key Features
- Deep visibility into composite actions - Detect bottlenecks inside composite actions that other tools miss
- No infrastructure needed - Just a CLI tool, no backend or metrics storage required
- Multiple analysis modes - Analyze workflows, workflow runs, or individual jobs
- Markdown reports - Generate shareable performance reports
- Intelligent caching - Cache GitHub API responses for completed runs to speed up analysis
- Flexible filtering - Filter and normalize job names using configuration files
Quick Start
- Install ghaperf
- Set your GitHub Access token to download action logs
- Run ghaperf
export GITHUB_TOKEN=xxx
# Analyze a workflow across multiple runs
ghaperf --repo aquaproj/aqua-registry --workflow test.yaml --count 10 --threshold 2sExample Report
<details <summaryExample Report Output</summary
This report was generated by ghaperf. <table <tr<tdghaperf version</td<td<a href="https://github.com/suzuki-shunsuke/ghaperf/releases/tag/v0.1.1"v0.1.1</a</td</tr <tr<tdCreated At</td<td2025-11-02T21:03:34+09:00</td</tr <tr<tdThreshold</td<td2s</td</tr <tr<tdRepository</td<td<a href="https://github.com/aquaproj/aqua-registry"aquaproj/aqua-registry</a</td</tr <tr<tdThe Number of Workflow Runs</td<td10</td</tr <tr<tdWorkflow Name</td<tdtest.yaml</td</tr </table
Job: test / test / test (macos-13)
<table <tr<tdAverage Job Duration</td<td1m15s (11m11s/9)</td</tr <tr<tdSlowest Jobs</td<td<a href="https://github.com/aquaproj/aqua-registry/actions/runs/19007740980/job/54284198226"8m25s</a, <a href="https://github.com/aquaproj/aqua-registry/actions/runs/19008352862/job/54285609922"24s</a, <a href="https://github.com/aquaproj/aqua-registry/actions/runs/19010028182/job/54289608586"23s</a</td</tr </table
Slow steps
- 1m4s (8m31s/8): Run aquaproj/registry-action/test@68f10339de561d67f9acea40b91dc36aa5011ea8
- 1m36s (7m58s/5): Run aqua i --test
- 16s (16s/1): Run rustup update
- 6s (48s/8): Set up job
- 6s (49s/8): GITHUBTOKEN Permissions
- 4s (30s/8): Run actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8
- 4s (29s/8): Run aquaproj/aqua-installer@ea518c135a02fc11ff8024364510c181a5c6b342
- 3s (21s/8): Run if [ "${SKIPINSTALLAQUA:-}" = true ] && command -v aqua /dev/null; then