push ci run metrics to victoriametrics, with a grafana board
A swarm-ci-metrics host unit on a 5-minute timer lists every forge repo's Actions runs as the new read-only ci-metrics account and pushes each finished run's duration and queue wait over OTLP, stamped at the run's stop time. The first pass backfills from run 1. swarm-controller mints the account's token into bao and keeps a ci-metrics team with read on the Actions unit in every organisation. Closes #5376
This commit is contained in:
parent
8b7a4e7955
commit
b072fbf4d6
36 changed files with 2849 additions and 56 deletions
|
|
@ -354,6 +354,35 @@ let
|
|||
grafanaRemoteAuthelia.services.hyperhive.swarm.statusPublish.tokenEndpoint
|
||||
== "https://auth.example.invalid/api/oidc/token";
|
||||
}
|
||||
{
|
||||
# The CI board is in the directory the provider scans (`bao.json` is the
|
||||
# control that the entries are read at all), and every metric it queries
|
||||
# is a name the poller pushes: a renamed metric on either side is a board
|
||||
# of empty panels.
|
||||
name = "the CI dashboard ships, and queries the metric names the CI run poller pushes";
|
||||
ok =
|
||||
let
|
||||
provider = lib.head grafanaWithAuthelia.containers.swarm-grafana.config.services.grafana.provision.dashboards.settings.providers;
|
||||
shipped = map (e: e.name) provider.options.path.entries;
|
||||
board = builtins.fromJSON (builtins.readFile ../host-modules/swarm-grafana/dashboards/ci.json);
|
||||
exprs = lib.concatMap (p: map (t: t.expr or "") (p.targets or [ ])) board.panels;
|
||||
queried = lib.unique (
|
||||
lib.concatMap (
|
||||
e: map lib.head (lib.filter lib.isList (builtins.split ''"(hyperhive\.ci\.[a-z_.]+)"'' e))
|
||||
) exprs
|
||||
);
|
||||
pushed = builtins.readFile ../../swarm-ci-metrics/src/sample.rs;
|
||||
in
|
||||
lib.elem "ci.json" shipped
|
||||
&& lib.elem "bao.json" shipped
|
||||
&&
|
||||
lib.sort lib.lessThan queried == [
|
||||
"hyperhive.ci.run.duration"
|
||||
"hyperhive.ci.run.queue_wait"
|
||||
]
|
||||
&& lib.all (m: lib.hasInfix "\"${m}\"" pushed) queried
|
||||
&& lib.any (v: v.name == "repo") board.templating.list;
|
||||
}
|
||||
{
|
||||
# The standing check on the collector's PRIORITY mapping — whether a line
|
||||
# ever reaches the log store carrying no severity. It is shipped config
|
||||
|
|
|
|||
Loading…
Reference in a new issue