Watch
0
0
Fork
You've already forked hyperhive
0

grafana: the ci runner board shows each runner, with a runner filter

The panels took the max or sum over the one swarm runner. A runner variable
(the series' service.instance.id) filters every panel, and uptime, job slots
and slot use show one series per runner, so a runner registered by hand shows
up beside the swarm's once its metrics reach the store.
This commit is contained in:
iris 2026-11-10 18:40:48 +01:00
commit 71b634d461

View file

@ -1,7 +1,7 @@
{ {
"title": "hyperhive · ci runner", "title": "hyperhive · ci runner",
"uid": "hyperhive-swarm-ci-runner", "uid": "hyperhive-swarm-ci-runner",
"description": "The forge's Actions runner: how busy it is, how its jobs go, and whether it polls.", "description": "The forge's Actions runners: how busy each is, how its jobs go, and whether it polls.",
"tags": ["hyperhive", "swarm", "ci", "runner"], "tags": ["hyperhive", "swarm", "ci", "runner"],
"editable": true, "editable": true,
"refresh": "1m", "refresh": "1m",
@ -35,9 +35,9 @@
"type": "prometheus", "type": "prometheus",
"uid": "@datasourceUid@" "uid": "@datasourceUid@"
}, },
"expr": "max(gitea_runner_uptime_seconds)", "expr": "max by (\"service.instance.id\") ({__name__=\"gitea_runner_uptime_seconds\", \"service.instance.id\"=~\"$runner\"})",
"instant": true, "instant": true,
"legendFormat": "uptime" "legendFormat": "{{service.instance.id}}"
} }
], ],
"fieldConfig": { "fieldConfig": {
@ -94,9 +94,9 @@
"type": "prometheus", "type": "prometheus",
"uid": "@datasourceUid@" "uid": "@datasourceUid@"
}, },
"expr": "max(gitea_runner_capacity)", "expr": "max by (\"service.instance.id\") ({__name__=\"gitea_runner_capacity\", \"service.instance.id\"=~\"$runner\"})",
"instant": true, "instant": true,
"legendFormat": "slots" "legendFormat": "{{service.instance.id}}"
} }
], ],
"fieldConfig": { "fieldConfig": {
@ -153,7 +153,7 @@
"type": "prometheus", "type": "prometheus",
"uid": "@datasourceUid@" "uid": "@datasourceUid@"
}, },
"expr": "sum(increase(gitea_runner_job_total[$__range])) or vector(0)", "expr": "sum(increase({__name__=\"gitea_runner_job_total\", \"service.instance.id\"=~\"$runner\"}[$__range])) or vector(0)",
"instant": true, "instant": true,
"legendFormat": "jobs" "legendFormat": "jobs"
} }
@ -212,7 +212,7 @@
"type": "prometheus", "type": "prometheus",
"uid": "@datasourceUid@" "uid": "@datasourceUid@"
}, },
"expr": "sum(increase(gitea_runner_job_duration_seconds_sum[$__range])) / sum(increase(gitea_runner_job_duration_seconds_count[$__range]))", "expr": "sum(increase({__name__=\"gitea_runner_job_duration_seconds_sum\", \"service.instance.id\"=~\"$runner\"}[$__range])) / sum(increase({__name__=\"gitea_runner_job_duration_seconds_count\", \"service.instance.id\"=~\"$runner\"}[$__range]))",
"instant": true, "instant": true,
"legendFormat": "mean" "legendFormat": "mean"
} }
@ -271,8 +271,8 @@
"type": "prometheus", "type": "prometheus",
"uid": "@datasourceUid@" "uid": "@datasourceUid@"
}, },
"expr": "max(gitea_runner_job_running)", "expr": "max by (\"service.instance.id\") ({__name__=\"gitea_runner_job_running\", \"service.instance.id\"=~\"$runner\"})",
"legendFormat": "running" "legendFormat": "{{service.instance.id}} running"
}, },
{ {
"refId": "B", "refId": "B",
@ -280,8 +280,8 @@
"type": "prometheus", "type": "prometheus",
"uid": "@datasourceUid@" "uid": "@datasourceUid@"
}, },
"expr": "max(gitea_runner_job_capacity_utilization_ratio) * 100", "expr": "max by (\"service.instance.id\") ({__name__=\"gitea_runner_job_capacity_utilization_ratio\", \"service.instance.id\"=~\"$runner\"}) * 100",
"legendFormat": "slots used %" "legendFormat": "{{service.instance.id}} slots used %"
} }
], ],
"fieldConfig": { "fieldConfig": {
@ -336,7 +336,7 @@
"type": "prometheus", "type": "prometheus",
"uid": "@datasourceUid@" "uid": "@datasourceUid@"
}, },
"expr": "sum by (status) (increase(gitea_runner_job_total[1h]))", "expr": "sum by (status) (increase({__name__=\"gitea_runner_job_total\", \"service.instance.id\"=~\"$runner\"}[1h]))",
"legendFormat": "{{status}}" "legendFormat": "{{status}}"
} }
], ],
@ -397,7 +397,7 @@
"type": "prometheus", "type": "prometheus",
"uid": "@datasourceUid@" "uid": "@datasourceUid@"
}, },
"expr": "sum(increase(gitea_runner_job_duration_seconds_sum[1h])) / sum(increase(gitea_runner_job_duration_seconds_count[1h]))", "expr": "sum(increase({__name__=\"gitea_runner_job_duration_seconds_sum\", \"service.instance.id\"=~\"$runner\"}[1h])) / sum(increase({__name__=\"gitea_runner_job_duration_seconds_count\", \"service.instance.id\"=~\"$runner\"}[1h]))",
"legendFormat": "mean" "legendFormat": "mean"
}, },
{ {
@ -406,7 +406,7 @@
"type": "prometheus", "type": "prometheus",
"uid": "@datasourceUid@" "uid": "@datasourceUid@"
}, },
"expr": "histogram_quantile(0.95, sum by (le) (increase(gitea_runner_job_duration_seconds_bucket[1h])))", "expr": "histogram_quantile(0.95, sum by (le) (increase({__name__=\"gitea_runner_job_duration_seconds_bucket\", \"service.instance.id\"=~\"$runner\"}[1h])))",
"legendFormat": "p95" "legendFormat": "p95"
} }
], ],
@ -462,7 +462,7 @@
"type": "prometheus", "type": "prometheus",
"uid": "@datasourceUid@" "uid": "@datasourceUid@"
}, },
"expr": "sum by (result) (rate(gitea_runner_poll_fetch_total[$__rate_interval])) * 60", "expr": "sum by (result) (rate({__name__=\"gitea_runner_poll_fetch_total\", \"service.instance.id\"=~\"$runner\"}[$__rate_interval])) * 60",
"legendFormat": "{{result}}" "legendFormat": "{{result}}"
} }
], ],
@ -497,5 +497,28 @@
} }
} }
} }
] ],
"templating": {
"list": [
{
"name": "runner",
"label": "Runner",
"type": "query",
"datasource": {
"type": "prometheus",
"uid": "@datasourceUid@"
},
"query": "label_values({__name__=\"gitea_runner_uptime_seconds\"}, \"service.instance.id\")",
"refresh": 2,
"includeAll": true,
"allValue": ".*",
"multi": true,
"current": {
"text": "All",
"value": "$__all"
},
"sort": 1
}
]
}
} }