diff --git a/README.md b/README.md index 836514ba..3fb2aeec 100644 --- a/README.md +++ b/README.md @@ -1,9 +1,39 @@ # GitHub runner operators - ![WIP](https://img.shields.io/badge/status-WIP-yellow) A monorepo containing charms to operate Self-Hosted GitHub Action Runners. -At the moment, it contains initial code for the `webhook-gateway` -application, that receives and forwards GitHub webhooks to an AMQP queue. +## Repository layout + +``` +charms/ + planner-operator/ # Juju charm: GitHub runner planner + cos_custom/ + grafana_dashboards/ # Grafana dashboards for the planner charm + # (served via cos-configuration-k8s, path: charms/planner-operator/cos_custom/grafana_dashboards) + webhook-gateway-operator/ # Juju charm: GitHub webhook gateway + +runner_grafana_dashboards/ # Grafana dashboards for runner VM host metrics + # (served via cos-configuration-k8s, path: runner_grafana_dashboards) +``` + +## Observability: Grafana dashboards + +Dashboards in this repo are delivered to Grafana through +[`cos-configuration-k8s`](https://charmhub.io/cos-configuration-k8s), which syncs +JSON files from this Git repository and provisions them via the `grafana-dashboard` +relation. Provisioned dashboards are **immutable** in Grafana regardless of user +role — they cannot be edited or deleted through the UI. + +### Conventions + +| Directory | Purpose | `grafana_dashboards_path` config value | +|---|---|---| +| `charms//cos_custom/grafana_dashboards/` | Dashboards for a specific charm's workload metrics | `charms//cos_custom/grafana_dashboards` | +| `runner_grafana_dashboards/` | Dashboards for runner VM host-level metrics (CPU, memory, disk, network) | `runner_grafana_dashboards` | + +Dashboard JSON files must use `__inputs` to declare the datasource (type `prometheus`) and +set `"editable": false`. Metric names follow the +[OpenTelemetry hostmetrics receiver](https://opentelemetry.io/docs/collector/components/#receiver) +Prometheus naming convention (e.g. `system_cpu_time_seconds_total`). diff --git a/runner_grafana_dashboards/runner_vm_hostmetrics.json b/runner_grafana_dashboards/runner_vm_hostmetrics.json new file mode 100644 index 00000000..30499bb5 --- /dev/null +++ b/runner_grafana_dashboards/runner_vm_hostmetrics.json @@ -0,0 +1,1145 @@ +{ + "__inputs": [ + { + "name": "prometheusds", + "label": "Prometheus / Mimir", + "description": "", + "type": "datasource", + "pluginId": "prometheus", + "pluginName": "Prometheus" + } + ], + "__elements": {}, + "__requires": [ + { + "type": "grafana", + "id": "grafana", + "name": "Grafana", + "version": "10.0.0" + }, + { + "type": "datasource", + "id": "prometheus", + "name": "Prometheus", + "version": "1.0.0" + }, + { + "type": "panel", + "id": "bargauge", + "name": "Bar gauge", + "version": "" + }, + { + "type": "panel", + "id": "stat", + "name": "Stat", + "version": "" + }, + { + "type": "panel", + "id": "timeseries", + "name": "Time series", + "version": "" + } + ], + "description": "Host-level resource metrics (CPU, memory, disk, network, load) for GitHub Actions runner VMs. Filter by repository, workflow, job and runner to inspect a specific run.", + "editable": false, + "fiscalYearStartMonth": 0, + "graphTooltip": 1, + "id": null, + "links": [], + "panels": [ + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 0 + }, + "id": 100, + "title": "Overview", + "type": "row" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${prometheusds}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "yellow", + "value": 70 + }, + { + "color": "red", + "value": 90 + } + ] + }, + "unit": "percent", + "min": 0, + "max": 100 + }, + "overrides": [] + }, + "gridPos": { + "h": 4, + "w": 4, + "x": 0, + "y": 1 + }, + "id": 1, + "options": { + "colorMode": "background", + "graphMode": "none", + "justifyMode": "center", + "orientation": "auto", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "textMode": "auto" + }, + "title": "CPU Usage", + "type": "stat", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${prometheusds}" + }, + "expr": "100 - (avg by (github_runner) (rate(system_cpu_time_seconds_total{state=\"idle\",github_runner=~\"$github_runner\",github_job=~\"$github_job\",github_repository=~\"$github_repository\"}[$__rate_interval])) * 100)", + "legendFormat": "{{instance}}", + "refId": "A" + } + ] + }, + { + "datasource": { + "type": "prometheus", + "uid": "${prometheusds}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "yellow", + "value": 70 + }, + { + "color": "red", + "value": 90 + } + ] + }, + "unit": "percent", + "min": 0, + "max": 100 + }, + "overrides": [] + }, + "gridPos": { + "h": 4, + "w": 4, + "x": 4, + "y": 1 + }, + "id": 2, + "options": { + "colorMode": "background", + "graphMode": "none", + "justifyMode": "center", + "orientation": "auto", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "textMode": "auto" + }, + "title": "Memory Usage", + "type": "stat", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${prometheusds}" + }, + "expr": "100 * (1 - (system_memory_usage_bytes{state=\"free\",github_runner=~\"$github_runner\",github_job=~\"$github_job\",github_repository=~\"$github_repository\"} / sum without (state) (system_memory_usage_bytes{github_runner=~\"$github_runner\",github_job=~\"$github_job\",github_repository=~\"$github_repository\"})))", + "legendFormat": "{{instance}}", + "refId": "A" + } + ] + }, + { + "datasource": { + "type": "prometheus", + "uid": "${prometheusds}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "yellow", + "value": 70 + }, + { + "color": "red", + "value": 90 + } + ] + }, + "unit": "percent", + "min": 0, + "max": 100 + }, + "overrides": [] + }, + "gridPos": { + "h": 4, + "w": 4, + "x": 8, + "y": 1 + }, + "id": 3, + "options": { + "colorMode": "background", + "graphMode": "none", + "justifyMode": "center", + "orientation": "auto", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "textMode": "auto" + }, + "title": "Filesystem Usage (/)", + "type": "stat", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${prometheusds}" + }, + "expr": "100 * system_filesystem_usage_bytes{state=\"used\",mountpoint=\"/\",github_runner=~\"$github_runner\",github_job=~\"$github_job\",github_repository=~\"$github_repository\"} / (system_filesystem_usage_bytes{state=\"used\",mountpoint=\"/\",github_runner=~\"$github_runner\",github_job=~\"$github_job\",github_repository=~\"$github_repository\"} + system_filesystem_usage_bytes{state=\"free\",mountpoint=\"/\",github_runner=~\"$github_runner\",github_job=~\"$github_job\",github_repository=~\"$github_repository\"})", + "legendFormat": "{{instance}}", + "refId": "A" + } + ] + }, + { + "datasource": { + "type": "prometheus", + "uid": "${prometheusds}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "blue", + "value": null + } + ] + }, + "unit": "Bps" + }, + "overrides": [] + }, + "gridPos": { + "h": 4, + "w": 6, + "x": 12, + "y": 1 + }, + "id": 4, + "options": { + "colorMode": "value", + "graphMode": "area", + "justifyMode": "center", + "orientation": "auto", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "textMode": "auto" + }, + "title": "Network In", + "type": "stat", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${prometheusds}" + }, + "expr": "sum by (github_runner) (rate(system_network_io_bytes_total{direction=\"receive\",github_runner=~\"$github_runner\",github_job=~\"$github_job\",github_repository=~\"$github_repository\"}[$__rate_interval]))", + "legendFormat": "{{instance}}", + "refId": "A" + } + ] + }, + { + "datasource": { + "type": "prometheus", + "uid": "${prometheusds}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "blue", + "value": null + } + ] + }, + "unit": "Bps" + }, + "overrides": [] + }, + "gridPos": { + "h": 4, + "w": 6, + "x": 18, + "y": 1 + }, + "id": 5, + "options": { + "colorMode": "value", + "graphMode": "area", + "justifyMode": "center", + "orientation": "auto", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "textMode": "auto" + }, + "title": "Network Out", + "type": "stat", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${prometheusds}" + }, + "expr": "sum by (github_runner) (rate(system_network_io_bytes_total{direction=\"transmit\",github_runner=~\"$github_runner\",github_job=~\"$github_job\",github_repository=~\"$github_repository\"}[$__rate_interval]))", + "legendFormat": "{{instance}}", + "refId": "A" + } + ] + }, + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 5 + }, + "id": 101, + "title": "CPU", + "type": "row" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${prometheusds}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "lineWidth": 1, + "fillOpacity": 10, + "gradientMode": "none", + "showPoints": "never" + }, + "unit": "percent", + "min": 0, + "max": 100 + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "idle" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "green", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "system" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "red", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "user" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "blue", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "iowait" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "orange", + "mode": "fixed" + } + } + ] + } + ] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 6 + }, + "id": 10, + "options": { + "tooltip": { + "mode": "multi", + "sort": "desc" + }, + "legend": { + "displayMode": "list", + "placement": "bottom", + "calcs": [ + "mean", + "max" + ] + } + }, + "title": "CPU Time by State", + "type": "timeseries", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${prometheusds}" + }, + "expr": "avg by (state) (rate(system_cpu_time_seconds_total{github_runner=~\"$github_runner\",github_job=~\"$github_job\",github_repository=~\"$github_repository\"}[$__rate_interval])) * 100", + "legendFormat": "{{state}}", + "refId": "A" + } + ] + }, + { + "datasource": { + "type": "prometheus", + "uid": "${prometheusds}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "lineWidth": 2, + "fillOpacity": 0, + "showPoints": "never" + }, + "unit": "short", + "min": 0 + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 6 + }, + "id": 11, + "options": { + "tooltip": { + "mode": "multi", + "sort": "desc" + }, + "legend": { + "displayMode": "list", + "placement": "bottom", + "calcs": [ + "lastNotNull" + ] + } + }, + "title": "Load Average", + "type": "timeseries", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${prometheusds}" + }, + "expr": "system_cpu_load_average_1m{github_runner=~\"$github_runner\",github_job=~\"$github_job\",github_repository=~\"$github_repository\"}", + "legendFormat": "1m", + "refId": "A" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${prometheusds}" + }, + "expr": "system_cpu_load_average_5m{github_runner=~\"$github_runner\",github_job=~\"$github_job\",github_repository=~\"$github_repository\"}", + "legendFormat": "5m", + "refId": "B" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${prometheusds}" + }, + "expr": "system_cpu_load_average_15m{github_runner=~\"$github_runner\",github_job=~\"$github_job\",github_repository=~\"$github_repository\"}", + "legendFormat": "15m", + "refId": "C" + } + ] + }, + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 14 + }, + "id": 102, + "title": "Memory", + "type": "row" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${prometheusds}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "lineWidth": 1, + "fillOpacity": 20, + "gradientMode": "none", + "showPoints": "never", + "stacking": { + "mode": "normal", + "group": "A" + } + }, + "unit": "bytes", + "min": 0 + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "used" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "red", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "cached" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "blue", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "buffered" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "purple", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "free" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "green", + "mode": "fixed" + } + } + ] + } + ] + }, + "gridPos": { + "h": 8, + "w": 24, + "x": 0, + "y": 15 + }, + "id": 20, + "options": { + "tooltip": { + "mode": "multi", + "sort": "desc" + }, + "legend": { + "displayMode": "list", + "placement": "bottom", + "calcs": [ + "mean", + "max" + ] + } + }, + "title": "Memory Usage by State", + "type": "timeseries", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${prometheusds}" + }, + "expr": "system_memory_usage_bytes{github_runner=~\"$github_runner\",github_job=~\"$github_job\",github_repository=~\"$github_repository\",state=~\"used|cached|buffered|free\"}", + "legendFormat": "{{state}}", + "refId": "A" + } + ] + }, + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 23 + }, + "id": 103, + "title": "Disk I/O", + "type": "row" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${prometheusds}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "lineWidth": 1, + "fillOpacity": 10, + "showPoints": "never" + }, + "unit": "Bps", + "min": 0 + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 24 + }, + "id": 30, + "options": { + "tooltip": { + "mode": "multi", + "sort": "desc" + }, + "legend": { + "displayMode": "list", + "placement": "bottom", + "calcs": [ + "mean", + "max" + ] + } + }, + "title": "Disk Throughput", + "type": "timeseries", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${prometheusds}" + }, + "expr": "rate(system_disk_io_bytes_total{github_runner=~\"$github_runner\",github_job=~\"$github_job\",github_repository=~\"$github_repository\"}[$__rate_interval])", + "legendFormat": "{{device}} {{direction}}", + "refId": "A" + } + ] + }, + { + "datasource": { + "type": "prometheus", + "uid": "${prometheusds}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "lineWidth": 1, + "fillOpacity": 10, + "showPoints": "never" + }, + "unit": "iops", + "min": 0 + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 24 + }, + "id": 31, + "options": { + "tooltip": { + "mode": "multi", + "sort": "desc" + }, + "legend": { + "displayMode": "list", + "placement": "bottom", + "calcs": [ + "mean", + "max" + ] + } + }, + "title": "Disk Operations/s", + "type": "timeseries", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${prometheusds}" + }, + "expr": "rate(system_disk_operations_total{github_runner=~\"$github_runner\",github_job=~\"$github_job\",github_repository=~\"$github_repository\"}[$__rate_interval])", + "legendFormat": "{{device}} {{direction}}", + "refId": "A" + } + ] + }, + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 32 + }, + "id": 104, + "title": "Filesystem", + "type": "row" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${prometheusds}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "yellow", + "value": 70 + }, + { + "color": "red", + "value": 90 + } + ] + }, + "unit": "percent", + "min": 0, + "max": 100 + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 24, + "x": 0, + "y": 33 + }, + "id": 40, + "options": { + "displayMode": "gradient", + "orientation": "horizontal", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "showUnfilled": true + }, + "title": "Filesystem Usage %", + "type": "bargauge", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${prometheusds}" + }, + "expr": "100 * system_filesystem_usage_bytes{state=\"used\",github_runner=~\"$github_runner\",github_job=~\"$github_job\",github_repository=~\"$github_repository\"} / (system_filesystem_usage_bytes{state=\"used\",github_runner=~\"$github_runner\",github_job=~\"$github_job\",github_repository=~\"$github_repository\"} + system_filesystem_usage_bytes{state=\"free\",github_runner=~\"$github_runner\",github_job=~\"$github_job\",github_repository=~\"$github_repository\"})", + "legendFormat": "{{mountpoint}} ({{device}})", + "refId": "A" + } + ] + }, + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 41 + }, + "id": 105, + "title": "Network", + "type": "row" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${prometheusds}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "lineWidth": 1, + "fillOpacity": 10, + "showPoints": "never" + }, + "unit": "Bps", + "min": 0 + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 42 + }, + "id": 50, + "options": { + "tooltip": { + "mode": "multi", + "sort": "desc" + }, + "legend": { + "displayMode": "list", + "placement": "bottom", + "calcs": [ + "mean", + "max" + ] + } + }, + "title": "Network Traffic", + "type": "timeseries", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${prometheusds}" + }, + "expr": "rate(system_network_io_bytes_total{github_runner=~\"$github_runner\",github_job=~\"$github_job\",github_repository=~\"$github_repository\"}[$__rate_interval])", + "legendFormat": "{{device}} {{direction}}", + "refId": "A" + } + ] + }, + { + "datasource": { + "type": "prometheus", + "uid": "${prometheusds}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "lineWidth": 1, + "fillOpacity": 10, + "showPoints": "never" + }, + "unit": "pps", + "min": 0 + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 42 + }, + "id": 51, + "options": { + "tooltip": { + "mode": "multi", + "sort": "desc" + }, + "legend": { + "displayMode": "list", + "placement": "bottom", + "calcs": [ + "mean", + "max" + ] + } + }, + "title": "Network Errors & Drops", + "type": "timeseries", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${prometheusds}" + }, + "expr": "rate(system_network_errors_total{github_runner=~\"$github_runner\",github_job=~\"$github_job\",github_repository=~\"$github_repository\"}[$__rate_interval])", + "legendFormat": "errors {{device}} {{direction}}", + "refId": "A" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${prometheusds}" + }, + "expr": "rate(system_network_dropped_total{github_runner=~\"$github_runner\",github_job=~\"$github_job\",github_repository=~\"$github_repository\"}[$__rate_interval])", + "legendFormat": "drops {{device}} {{direction}}", + "refId": "B" + } + ] + } + ], + "refresh": "30s", + "schemaVersion": 38, + "tags": [ + "github-runner", + "hostmetrics" + ], + "templating": { + "list": [ + { + "name": "prometheusds", + "type": "datasource", + "pluginId": "prometheus", + "query": "prometheus", + "label": "Prometheus", + "hide": 0, + "refresh": 1, + "includeAll": false, + "multi": false + }, + { + "name": "github_repository", + "type": "query", + "datasource": { + "type": "prometheus", + "uid": "${prometheusds}" + }, + "label": "Repository", + "query": "label_values(system_cpu_time_seconds_total, github_repository)", + "refresh": 2, + "sort": 1, + "includeAll": true, + "multi": false, + "allValue": ".*", + "hide": 0 + }, + { + "name": "github_workflow", + "type": "query", + "datasource": { + "type": "prometheus", + "uid": "${prometheusds}" + }, + "label": "Workflow", + "query": "label_values(system_cpu_time_seconds_total{github_repository=~\"$github_repository\"}, github_workflow)", + "refresh": 2, + "sort": 1, + "includeAll": true, + "multi": false, + "allValue": ".*", + "hide": 0 + }, + { + "name": "github_job", + "type": "query", + "datasource": { + "type": "prometheus", + "uid": "${prometheusds}" + }, + "label": "Job", + "query": "label_values(system_cpu_time_seconds_total{github_repository=~\"$github_repository\",github_workflow=~\"$github_workflow\"}, github_job)", + "refresh": 2, + "sort": 1, + "includeAll": true, + "multi": false, + "allValue": ".*", + "hide": 0 + }, + { + "name": "github_runner", + "type": "query", + "datasource": { + "type": "prometheus", + "uid": "${prometheusds}" + }, + "label": "Runner", + "query": "label_values(system_cpu_time_seconds_total{github_repository=~\"$github_repository\",github_workflow=~\"$github_workflow\",github_job=~\"$github_job\"}, github_runner)", + "refresh": 2, + "sort": 1, + "includeAll": true, + "multi": true, + "allValue": ".*", + "hide": 0 + } + ] + }, + "time": { + "from": "now-1h", + "to": "now" + }, + "timepicker": {}, + "timezone": "browser", + "title": "GitHub Runner VM Hostmetrics", + "uid": "github-runner-vm-hostmetrics", + "version": 1 +} \ No newline at end of file