Insight
On this page 10
The numbers an operator opens on a Monday: how often pipelines pass, how long they take, how long they wait for a machine, what the machines cost, and what the flaky tests are costing in re-runs.
Every figure here is available two ways, computed once so they cannot disagree:
- A screen, at
/{owner}/{repository}/insight, for one repository. - The API, at
GET /api/insight, in the same shape the screen renders.
The window
Everything is measured over a window you choose, defaulting to seven days and capped at ninety. A window outside that range is clamped rather than refused, and the response says which window it actually used:
{ "window": { "days": 7, "from": "2026-08-10T09:00:00.000Z", "to": "2026-08-17T09:00:00.000Z" } }
What is reported
Runs
Run count, success rate, median and 95th-percentile duration, and the share of jobs that took more than one attempt - overall and per workflow.
curl "https://example.com/api/insight?owner=acme&repo=api&days=30" \
-H 'Authorization: Bearer ros_...'
{
"overall": { "runs": 214, "success_rate": 0.873, "p50_ms": 264000, "p95_ms": 741000, "retry_rate": 0.031, "samples": 209 },
"workflows": [
{ "workflow": "CI", "path": ".github/workflows/ci.yml", "runs": 180, "success_rate": 0.9, "p50_ms": 240000, "p95_ms": 690000, "retry_rate": 0.02, "samples": 178 }
]
}
Two things about these numbers are deliberate.
A rate with too little behind it is null, not a number. Under five
finished runs there is no success rate and no percentile, and the response says
null with samples beside it. A success rate over three runs is the last
three runs; printing it as a percentage is how a figure nobody should trust ends
up in a planning document. The screen renders those as a dash.
Cancelled runs are not failures. A run somebody stopped on purpose - a superseded push, a queue being drained - is left out of the success rate entirely. Counting it as a failure makes the teams who cancel superseded runs, which is the behaviour you want, look like the least reliable teams you have.
Percentiles are nearest-rank rather than interpolated, so a reported p95 is a duration some run actually took.
Failure by job
Which job the red builds are in, ranked by how many builds went red rather than by failure rate. A job that fails a tenth of four hundred runs costs forty red builds; a job that failed its only run has a rate of 1.0 and costs one.
Queue wait
Median and p95 wait by queue and by pool. This is the number that says to add runners.
It is measured from the moment a runner could have taken the job to the moment
one did, which is not the same as the moment the run was created. A job waiting
on needs: has not been waiting for a machine, and measuring from run creation
reports your dependency graph as a fleet shortage. Jobs still waiting are not
included at all: a percentile that climbs while nothing happens describes the
dashboard's clock rather than the queue.
It is per queue on purpose. One saturated queue and three idle ones average out to a fleet that looks fine while one team cannot ship.
Runner utilization
Busy time, idle time, and the share of the window each machine spent working. This is the number that says to remove some, and it is meant to be read next to the wait above: a long wait beside an idle fleet is a routing problem and a long wait beside a busy one is a shopping list. Only the two together tell you which.
Cost proxies
Total run minutes by repository, by owner, and by queue.
Nothing here is billed. That is exactly why the figure is worth showing: somebody self-hosting pays for these machines out of a budget nothing else itemises, and "where did the minutes go" has no other answer.
Flaky test impact
How many failed runs failed on a test that was already known to be flaky, and what share of your failures that is.
"Already known" is the load-bearing part. A test that this very run taught us was flaky could not have been fixed beforehand, so it is not an argument for anything; counting it would make the apparent cost of flakiness rise every time flake detection got better. Only tests marked flaky before the results arrived are counted, and the unit is the run - one test failing twice in a run is one run somebody had to re-trigger.
Who may ask
- One repository (
ownerandrepo): anybody who can read that repository. The numbers are about their own CI. - The whole instance (no
owner/repo): an instance administrator only. Fleet-wide utilization and per-owner minutes describe every tenant on the instance, which is not something one tenant is owed.
A caller who may not read the instance-wide view gets 404, not 403 - the
same answer as for a repository that does not exist. Whether this instance has
a fleet is not a fact to confirm to a stranger by the shape of a refusal.
What is not here yet
- Alerting on any of it. These are figures you read, not thresholds that page somebody.
- Retention. The numbers are computed from the run and job rows themselves, so a window only reaches as far back as those rows do.