Grafana Dashboard Validator · Observability
Import-Fallen finden, bevor das Dashboard ausgeliefert wird.
22 Regeln über einen echten Parse Ihres Dashboard-JSON: die Template-Variable, die nichts deklariert, der ${DS_PROMETHEUS}-Platzhalter, den Provisioning nie auflösen wird, das AngularJS-Panel, das Grafana 12 entfernt hat, das Panel ohne type, das einen leeren Kasten zeichnet. Jeder Fund nennt den JSON-Pfad, an dem er sitzt — und nichts, was Sie einfügen, verlässt den Tab.
Läuft in Ihrem Browser — nichts, was Sie einfügen, verlässt diese Seite. Wie wir das belegen
Grafana Dashboard Validator Playground
The uid is the stable identifier you choose and keep in git; the id is a row number belonging to one Grafana database, and it should be null in any file you commit. schemaVersion records which of Grafana's own dashboard-format migrations have already been applied to the JSON.
Rules pinned to grafana-12 / schemaVersion 41 — every version-sensitive finding is phrased as a range, never as one exact release.
Results update as you type — press Enter to run now.
Press Esc to release keyboard focus from the editor; ⌘/Ctrl + Enter lints and leaves the editor. Dashboards are too large for a shareable link, so use Save snapshot instead — it stays in this browser. Nothing you paste is uploaded.
Paste a Grafana dashboard JSON above — or tap an example — to see every finding here, with the JSON path it lives at and the fix.
Die Lücke
Ein Dashboard, das importiert, ist kein Dashboard, das funktioniert.
Grafana ist auf die schlechteste denkbare Weise nachsichtig. Eine nicht deklarierte Variable ist kein Fehler — die Query läuft einfach mit $env darin, das Panel ist also leer oder trifft weit mehr Serien als gemeint und ist gefüllt und falsch. Ein Panel ohne type zeichnet einen leeren Kasten. Ein repeat über eine nicht existierende Variable rendert genau ein Panel und sieht fertig aus. Nichts in der Oberfläche widerspricht.
Und ein Dashboard ist das eine Artefakt, das niemand reviewen kann. Ein JSON-Diff über viertausend Zeilen, in dem gridPos-Werte verschoben, IDs neu nummeriert und fieldConfig von der Oberfläche umgeschrieben wurde, ist kein Diff, den ein Mensch liest — es ist ein Diff, den ein Mensch freigibt. Die Defekte, die ein Review überleben, sind die, die aussehen wie jede andere Zeile der Datei.
Lassen Sie ein Modell ein Dashboard schreiben, und Sie erben dieselbe Fehlerklasse mit mehr Selbstsicherheit obendrauf. Generierte Dashboards sind flüssig: plausible Panel-Titel, plausibles PromQL, ein templating-Block — und Queries, die Variablen referenzieren, die dieser Block nie deklariert, eine schemaVersion aus der Erinnerung an ein älteres Grafana und Panel-Typen, die zwei Major-Releases zurückliegen. Die Behauptung zu prüfen dauert Sekunden. Zu wissen, was zu prüfen ist, ist der schwierige Teil — und genau den übernimmt dieses Tool: jede Regel steht auf dieser Seite, und alles, was es bewusst nicht meldet, ebenfalls.
Auch die Queries im Review? PromQL Explainer zerlegt eine Query in Klartext, und Alertmanager Route Tester beweist, wo die Alerts zu diesen Panels tatsächlich landen.
Die Pipeline
So funktioniert es.
Vier Schritte, alle im Browser-Tab, bei jeder Eingabe erneut.
-
Parsen — und sagen, was das gekostet hat.
Erst strenges JSON. Dann ein Byte-Order-Mark, `// Kommentare`, Trailing-Kommas, ein API-Wrapper `{ dashboard: … }` oder ein als escapter String gespeichertes Dashboard — jedes davon wiederhergestellt und jedes gemeldet, denn Grafanas API ist nicht so nachsichtig.
-
Jedes Panel-Layout abflachen.
`panels` auf oberster Ebene, die Kinder einer eingeklappten Row, die Geschwister, die eine ausgeklappte Row besitzt, und `rows[]` vor schemaVersion 16 — alles in eine Liste, in der jedes Panel den JSON-Pfad behält, aus dem es kam.
-
Die Variablen indizieren.
Jeder String im Dokument wird nach `$var`, `${var}`, `${var:format}` und `[[var]]` durchsucht und gegen das abgeglichen, was `templating.list` deklariert, plus Grafanas Built-ins. Benutzt, unbenutzt und nicht auflösbar fallen aus demselben Index.
-
22 Regeln laufen lassen, dann Pfad und Fix melden.
Jede Regel läuft in ihrem eigenen try/catch — eine, die stolpert, kostet einen einzigen Hinweis und nicht die anderen Funde. Jede Diagnose nennt den Pfad, den Grund und die Änderung: fertig zum Einfügen in ein Review.
Referenz
Variablen, Schemaversionen und alle 22 Regeln.
Das Regelwerk ist auf grafana-12 / schemaVersion 41 gepinnt, und jeder versionsabhängige Fund ist als Bereich formuliert statt als ein exaktes Release. 7 Regeln sind Fehler, 11 sind Warnungen und 4 sind Hinweise.
Die vier Variablen-Syntaxen
Alle vier lösen heute auf, und zwei Dinge, die wie Variablen aussehen, sind keine. Der Linter liest jede davon aus jedem String im Dokument — Queries, Titel, Legendenformate, Panel-Links, Annotation-Queries und die Queries anderer Variablen.
| Form | Seit | Was zu wissen ist |
|---|---|---|
| $env | Immer | Endet am ersten Zeichen, das kein Buchstabe, keine Ziffer und kein Unterstrich ist — „$env-prod“ ist also die Variable env, gefolgt vom Literal „-prod“. |
| ${env} | Grafana 6 | Die aktuelle Form. Eindeutig neben umgebendem Text und die einzige, die ein Format tragen kann. |
| ${env:regex} | Grafana 6 | Eine formatierte Interpolation — regex, csv, json, pipe, glob und weitere — und genau das macht eine Mehrfachwert-Variable innerhalb einer Query sicher. |
| [[env]] | Vor Grafana 6 | Veraltet. Löst noch auf, kann kein Format tragen. Wird als legacy-var-syntax gemeldet. |
| $__rate_interval | Grafana 7.2 | Ein Built-in, keine Ihrer Variablen. Jeder Name, der mit zwei Unterstrichen beginnt, gilt als Built-in und wird nie gemeldet. |
| ${DS_PROMETHEUS} | — | Überhaupt keine Template-Variable, sondern ein __inputs-Import-Platzhalter. Wird als unresolved-ds-input gemeldet. |
schemaVersion-Meilensteine
Die Grafana-Spalte nennt den Release-Bereich, in dem die Migration ausgeliefert wurde, keine Eins-zu-eins-Zuordnung: Grafana erhöht schemaVersion auch innerhalb von Minor-Releases. Nehmen Sie die Zeilen als Orientierungspunkte, nicht als Nachschlagetabelle.
| schemaVersion | Grafana | Was sich geändert hat |
|---|---|---|
| 16 | 5.x | Panels wanderten aus „rows“ in ein „panels“-Array auf oberster Ebene, und gridPos ersetzte span. Darunter ist alles am Layout eines Dashboards anders gespeichert. |
| 36 | 8.3–9.x | Die „datasource“ eines Panels wurde eine { type, uid }-Referenz statt eines Namens. Diese Migration steckt hinter den meisten „läuft auf meiner Instanz“-Importen. |
| 39 | 11.x | Das Schema der Grafana-11-Linie, in der Angular-Panels standardmäßig deaktiviert wurden. |
| 41 | 12.x | Die neueste Schemaversion, die dieser Linter kennt. Alles über 41 wird als Hinweis gemeldet, nie als Fehler. |
Der Regelkatalog
Ein Fehler bedeutet, dass Grafana etwas anderes tut, als das JSON sagt; eine Warnung bedeutet, es lädt und ist falsch oder nicht portabel; ein Hinweis ist wissenswert. Jeder Fund im Playground verlinkt auf seine Regel hier.
Geben Sie dem Dashboard eine uid
Ohne uid erzeugt jeder Import ein NEUES Dashboard, statt das vorhandene zu aktualisieren — dieselbe Datei zweimal importiert hinterlässt also zwei Kopien, und jeder gespeicherte Link zeigt auf die inzwischen veraltete. Grafana akzeptiert bis zu 40 Zeichen aus Buchstaben, Ziffern, Bindestrich und Unterstrich.
Fix "uid": "api-slo"
id muss in einer committeten Datei null sein
id ist eine Zeilennummer in genau einer Grafana-Datenbank. In eine andere Instanz übertragen scheitert der Import entweder — oder er landet auf einem Dashboard, das nichts mit Ihrem zu tun hat. Grafana vergibt seine id immer selbst.
Fix "id": null
Geben Sie dem Dashboard einen Titel
Ein fehlender oder leerer title erscheint als „New dashboard“: in der Suche nicht zu finden und von jedem anderen versehentlich angelegten Board nicht zu unterscheiden.
Fix "title": "API SLO"
Panel-IDs müssen eindeutig sein
Grafana adressiert Panel-Links, „View panel“-URLs und Repeats über die Panel-id. Zwei Panels mit derselben id brechen alle drei, und die Oberfläche sagt dazu nichts — das zweite Panel ist einfach nicht mehr adressierbar.
Fix Eines der beiden neu nummerieren; IDs müssen nur innerhalb dieses Dashboards eindeutig sein
Variablennamen müssen eindeutig sein
Zwei Einträge in templating.list mit demselben name: Grafana behält den letzten und verwirft den ersten stillschweigend. Typ, Query und Default der Variablen sind also die, die die zweite Deklaration zufällig gesetzt hat.
Fix Einen der beiden umbenennen oder löschen
Eine alte schemaVersion neu exportieren
schemaVersion hält fest, welche von Grafanas eigenen Format-Migrationen das JSON schon durchlaufen hat. Unter 36 ist die datasource eines Panels noch ein Name; unter 16 liegen Panels noch in rows. Grafana migriert beim Laden — die Datei in Ihrem Repository migriert sich nicht selbst. Ein Review dieser Datei ist damit ein Review von etwas, das Grafana nie rendern wird.
Fix In Grafana 9 oder neuer öffnen und erneut exportieren
Eine schemaVersion, die dieser Linter nicht kennt
Neuer als die gepinnte 41, ganz fehlend oder als String statt als Zahl geschrieben. Wird als Hinweis gemeldet und nie als Fehler: eine unbekannte Schemaversion ist eine Grenze dieses Linters, kein Mangel Ihres Dashboards.
Fix Nichts zu ändern — der Hinweis markiert die Funde unten als unverbindlich
Jede $Variable muss deklariert sein
Eine Referenz, die nichts deklariert, bleibt als reiner Text in der Query stehen: die Abfrage läuft mit „$env“ darin und das Panel liefert nichts — oder, schlimmer, etwas Plausibles. Grafanas eigene Built-ins ($__rate_interval, $__from, $__range und die übrigen) sind bekannt und werden nie gemeldet, ebenso wenig $1, das eine Regex-Rückreferenz ist.
Fix Unter templating.list ergänzen oder die Schreibweise korrigieren
Eine Variable, die niemand liest
Deklariert, aber von keinem Panel, keiner Query, keinem Titel, Link oder Annotation referenziert. An sich harmlos — außer dass eine „query“-Variable, die niemand liest, bei jedem einzelnen Laden des Dashboards trotzdem ihre Abfrage ausführt.
Fix Löschen oder verwenden
[[var]] ist die Form vor Grafana 6
Sie löst weiterhin auf und ist weiterhin veraltet. Sie ist außerdem die einzige Form, die kein Format tragen kann — ein Wert, der als Regex-Alternation oder CSV-Liste gebraucht wird, muss also erst umgeschrieben werden, bevor er überhaupt formatiert werden kann.
Fix "${env}" bzw. "${env:regex}", wenn die Query ein Muster braucht
Datasources über uid referenzieren, nicht über den Namen
Ein Name löst nur auf, wenn auf der Zielinstanz eine Datasource mit exakt diesem Namen existiert. Genau dieser Unterschied trennt ein Dashboard, das importiert, von einem, das auf dem Grafana einer Kollegin „Datasource not found“ zeigt. Die Form { type, uid } ist seit schemaVersion 36 das, was Grafana schreibt.
Fix "datasource": { "type": "prometheus", "uid": "P1809F7CD0C75ACF3" }
${DS_…} braucht den Import-Dialog
„Export for sharing externally“ ersetzt jede Datasource durch einen __inputs-Platzhalter, den nur Dashboards → Import ausfüllt. Provisioniert man dieselbe Datei stattdessen, meldet Grafana „Datasource ${DS_PROMETHEUS} not found“ — und eine ${DS_…}-Referenz ohne jeden __inputs-Block scheitert selbst über den Dialog.
Fix Über den Dialog importieren oder vorher die echte { type, uid } einsetzen
Ein Panel ohne Query
Überhaupt keine targets, das Panel rendert also leer. Panel-Typen, die nie abfragen — row, text, dashlist, news, alertlist, annolist — werden nicht gemeldet, und Library-Panels ebenso nicht: deren Queries liegen in der Library, nicht in dieser Datei.
Fix Ein target ergänzen oder das Panel löschen
graph, singlestat und table-old
Grafana 9–12 migriert diese beim Laden des Dashboards — und genau deshalb sind sie eine Meldung wert: Was Sie im JSON reviewen, ist nicht das, was jemand auf dem Bildschirm sieht. Ein erneutes Speichern ab Grafana 9 schreibt die Migration in die Datei, damit Review und Rendering endlich übereinstimmen.
Fix "type": "timeseries" / "stat" / "table"
AngularJS-Panel-Plugins
Angular wurde in Grafana 9 als veraltet markiert und über Grafana 11–12 entfernt. Anders als bei den Kern-Typen oben gibt es für ein Plugin keine automatische Migration — das Panel verschlechtert sich also nicht, es rendert gar nichts.
Fix piechart für grafana-piechart-panel, geomap für grafana-worldmap-panel
Ein repeat über nichts
Ein repeat, das eine nicht existierende Variable nennt, erzeugt ein einziges Panel und keine Fehlermeldung. Eine Row, die über jedes Cluster fächern sollte, zeigt still ein Cluster — und das Dashboard sieht fertig aus.
Fix Die Variable deklarieren oder „repeat“ entfernen
Ein Standard-Zeitraum, den niemand will
Zeiträume länger als ein Jahr, Zeiträume, die rückwärts laufen, Zeiträume der Länge null und Ausdrücke, die Grafana überhaupt nicht parsen kann. Jedes Panel führt den Standard-Zeitraum in dem Moment aus, in dem das Dashboard geöffnet wird — das macht dies zum günstigsten Performance-Fehler der Datei.
Fix "time": { "from": "now-6h", "to": "now" }
Ein refresh unter zehn Sekunden
Unter zehn Sekunden stauen sich die Queries schneller, als sie fertig werden — in jedem Tab, in dem das Dashboard offen ist, und die Datasource bezahlt für alle. Grafanas eigenes min_refresh_interval überstimmt Sie unter Umständen ohnehin, das JSON sagt dann eines und die Instanz tut ein anderes.
Fix "refresh": "1m"
Ein Override, das nichts anwendet
Ein byName-Matcher ohne Wert trifft kein Feld; ein Override mit leerem properties-Array setzt nichts. Grafana behält beides im JSON und wendet keines an — sie lesen sich also wie Konfiguration, die etwas tut.
Fix Etwas zum Treffen und etwas zum Setzen geben, oder löschen
Eine Row ohne Panels
Eine eingeklappte Row mit leerem panels-Array ist unsichtbar, bis jemand sie ausklappt und nichts darin findet. Eine AUSGEKLAPPTE Row wird nicht gemeldet, wenn ihre Panels als Geschwister folgen — so speichert Grafana sie tatsächlich, und eine Meldung würde bei jedem modernen Dashboard feuern.
Fix Die Row löschen oder Panels hineinziehen
Ein Panel ohne type
Nichts sagt Grafana, was es rendern soll — es zeichnet also einen leeren Kasten an die Stelle des Panels. Ein Panel ohne type wurde meist von Hand bearbeitet, schlecht gemerged oder von einem Generator erzeugt. Library-Panels sind die einzige legitime Ausnahme: Grafana speichert sie als {id, title, gridPos, libraryPanel}, und diese Regel überspringt sie.
Fix "type": "timeseries"
Ein Panel, das keinen Platz einnimmt
Ein gridPos mit Breite oder Höhe null ist unsichtbar. Ein fehlendes gridPos lässt Grafana auf eine Standardposition zurückfallen, an der Panels übereinander landen können. Das Grid ist 24 Spalten breit.
Fix "gridPos": { "h": 8, "w": 12, "x": 0, "y": 0 }
Der Zaun
Was er bewusst nicht meldet.
Jeder dieser Punkte wurde geprüft und verworfen, und dieselbe Liste steht als Kommentar am Anfang der Engine. Ein Schweigen, das man nachlesen kann, ist mehr wert als eine Regel, die man zu ignorieren lernt.
Vollständige Schema-Validierung
Dies ist ein struktureller Lint, keine Schema-Prüfung. Grafanas Dashboard-Schema ist groß, versioniert und in Bewegung; eine teilweise Prüfung, die als Schema-Prüfung ausgegeben wird, wäre eine Lüge.
PromQL, LogQL und SQL in targets
Eine Abfragesprache verdient ihr eigenes Werkzeug. Der PromQL Explainer macht das richtig, statt dass dieses Tool Ausdrücke halb parst.
Alles, was Ihr Grafana braucht
Ob eine uid vergeben ist, ob ein Plugin installiert ist, ob ein Folder existiert. Hier gibt es kein Netzwerk — Raten wäre Erfinden.
Tippfehler in $__Namen
Alles, was mit zwei Unterstrichen beginnt, gilt als Grafana-Built-in, weil Grafana laufend neue ergänzt. Das Built-in des nächsten Jahres „nicht definiert“ zu nennen wäre schlimmer, als einen Tippfehler zu übersehen.
Panels ohne Titel
Text-Panels und einzelne Kennzahl-Kacheln sind legitim ohne Titel. Nur der DASHBOARD-Titel ist Pflicht.
gridPos-Überlappungen und Layout-Geometrie
Grafana packt das Grid beim Laden neu — eine Überlappung im JSON ist also keine Überlappung auf dem Bildschirm.
Panel-Größen in Legacy-rows[]
Layouts vor schemaVersion 16 nutzten span, nicht gridPos. Ein fehlendes gridPos dort zu melden würde bei jedem Panel eines Dashboards feuern, dessen eigentliches Problem schon ein Fehler ist.
Ein refresh, den dieser Linter nicht parsen kann
Zu raten, was „1m30s“ ergibt, ist Raten — und die Meldung wäre über die Vermutung, nicht über das Dashboard.
Veraltete Felder in Panel-Optionen
Sie sind pro Plugin verschieden, ändern sich mit jedem Release und werden von Grafana beim Laden migriert. Eine Regel dazu wäre binnen einer Minor-Version überholt.
Grenzen, genannt statt verschwiegen: Der Linter liest bis zu 5.000.000 Zeichen, behält höchstens 50 Funde pro Regel und 400 insgesamt und nennt die tatsächliche Zahl, sobald eine Grenze greift.
Nächster Schritt
Den Report ins Review einfügen.
„Copy report“ gibt Ihnen den ganzen Lauf als Klartext — eine Zeile pro Fund, mit JSON-Pfad, Regel-ID und Fix, und der gepinnten Regelversion obenan, damit niemand raten muss, was geprüft hat. Und dann weiter: die Queries dieser Panels lesen und beweisen, dass die Alerts daneben jemanden erreichen.
Grafana Dashboard Validator — 7 errors, 12 warnings, 3 notes
— variables: 2 defined, 2 unresolved, schemaVersion 27
Rules: grafana-12 / schemaVersion 41
ERRORS (7)
error duplicate-panel-id (panels[1].id): Panel id 1 is
already used by "Requests" (panels[0]).
error undefined-variable (panels[2].targets[0].expr):
"$cluster" is used here, but no template variable named
"cluster" is defined and it is not a Grafana built-in. FAQ
Fragen, beantwortet.
Tippen Sie auf eine Frage, um die Antwort aufzuklappen.
Was prüft der Grafana Dashboard Validator?
22 Regeln über einen echten Parse des Dashboards: 7 Fehler, 11 Warnungen und 4 Hinweise. Die Fehler sind die, die ändern, was Grafana tut — eine Template-Variable, die nichts deklariert, ein ${DS_…}-Platzhalter ohne __inputs-Block, ein AngularJS-Panel, das auf Grafana 11–12 nichts rendert, zwei Panels mit derselben id, ein repeat über eine nicht existierende Variable, ein Panel ohne type und eine schemaVersion, die so alt ist, dass JSON und Rendering zwei verschiedene Dashboards sind. Die Warnungen sind die Portabilitäts- und Review-Probleme: fehlende uid, eine Datenbank-id in einer committeten Datei, eine über den Namen referenzierte Datasource, ein veraltetes graph- oder singlestat-Panel, ein unsichtbares Panel der Breite null, ein Standard-Zeitraum von über einem Jahr, ein refresh unter zehn Sekunden. Jede Regel hat auf dieser Seite ihren eigenen Unterabschnitt, und die Regel-Chips im Playground verlinken direkt dorthin.
Verlässt mein Dashboard jemals meinen Browser?
Nein. Der Parser und alle Regeln sind JavaScript, das in Ihrem Tab läuft — es gibt keinen Server, keinen API-Aufruf und kein Logging, also werden 0 Bytes hochgeladen. Das zählt hier mehr als bei den meisten Tools: ein Dashboard-JSON ist eine Landkarte Ihrer internen Landschaft. Metriknamen, Datasource-uids, Hostnamen in Legendenformaten, Servicenamen in Variablen-Queries, manchmal eine interne URL in einem Panel-Link. Genau die Datei, die man nicht in einen beliebigen Online-Formatierer einfügen sollte.
Ist das eine Schema-Validierung?
Nein, und das sagt das Tool ausdrücklich. Grafanas Dashboard-Schema ist groß, versioniert und weiterhin in Bewegung; eine teilweise Prüfung, präsentiert als Schema-Prüfung, wäre schlimmer als keine Prüfung. Was hier passiert, ist ein struktureller Lint: er liest die Formen, die Importe und Reviews brechen — Variablen, Datasource-Referenzen, Panel-Typen, IDs, Layout, Zeit und refresh — und nennt zu jedem Fund den JSON-Pfad. Er parst kein PromQL, kennt Ihre Plugins nicht und spricht mit keinem Grafana. Die vollständige Liste dessen, was er bewusst nicht meldet, steht oben unter „Was er bewusst nicht meldet“.
Warum scheitert mein Import mit „Datasource ${DS_PROMETHEUS} not found“?
Weil die Datei mit „Export for sharing externally“ erzeugt wurde. Dieser Export ersetzt jede Datasource-Referenz durch einen Platzhalter — ${DS_PROMETHEUS} — und ergänzt einen „__inputs“-Block, der beschreibt, was jeder Platzhalter braucht. Nur der Dialog Dashboards → Import liest diesen Block und fragt nach einer echten Datasource. Provisioniert man dieselbe Datei, POSTet sie an die API oder legt sie in einen Git-synchronisierten Folder, wird der Dialog übersprungen: der Platzhalter überlebt in das gespeicherte Dashboard und jedes Panel scheitert daran. Importieren Sie also über den Dialog — oder setzen Sie vor dem Provisionieren die echte { type, uid } ein. Dieser Linter meldet den Platzhalter in beiden Fällen als Fehler, weil die Datei so nicht provisionierbar ist.
Was ist der Unterschied zwischen uid und id?
Die uid ist der Identifier, den Sie wählen. Sie ist Teil der Dashboard-URL, sie ist das, was Provisioning und API ansprechen, und sie gehört zusammen mit dem JSON in die Versionskontrolle. Die id ist eine Zeilennummer in der Datenbank genau einer Grafana-Instanz — anderswo bedeutet sie nichts. Eine Datei mit uid aktualisiert bei jedem Import dasselbe Dashboard; eine ohne erzeugt bei jedem Import eine neue Kopie. Eine Datei mit veralteter id scheitert beim Import oder trifft ein Dashboard, das nichts mit Ihrem zu tun hat — deshalb sollte ein Export „id“: null tragen.
Mein Dashboard nutzt graph-Panels. Funktioniert es auf Grafana 12 noch?
Die Kern-Panels graph, singlestat und table-old werden beim Laden automatisch migriert und funktionieren also weiter — aber das JSON in Ihrem Repository wird nicht migriert. Die Datei, die Sie reviewen, und das Panel, das Grafana rendert, sind damit zwei verschiedene Dinge. Speichern Sie das Dashboard ab Grafana 9 erneut, damit die Migration in die Datei geschrieben wird. AngularJS-Panel-PLUGINS sind eine andere Geschichte: grafana-piechart-panel, grafana-worldmap-panel und die übrigen haben keine automatische Migration, und Angular wurde in Grafana 9 als veraltet markiert und über Grafana 11–12 entfernt. Diese Panels rendern nichts und müssen von Hand ersetzt werden.
Auf welche Grafana-Version ist das gepinnt, und wenn meine neuer ist?
Das Regelwerk ist auf grafana-12 / schemaVersion 41 gepinnt — abgedruckt auf dieser Seite und in jedem kopierten Report, damit nie unklar ist, was geprüft hat. Versionsabhängige Regeln sind als Bereiche formuliert — „Grafana 9–12“, „über Grafana 11–12 entfernt“ — statt als ein exaktes Release, weil Ihre Instanz in der Nähe dieses Punkts liegt und nicht genau darauf. Ist die schemaVersion Ihres Dashboards höher als 41, erhalten Sie einen HINWEIS dazu, und die schemaspezifischen Funde werden als unverbindlich markiert. Eine unbekannte Schemaversion ist eine Grenze dieses Linters, kein Mangel Ihres Dashboards — sie wird deshalb nie als Fehler gemeldet.
Warum ist eine nicht deklarierte Variable ein Fehler und keine Warnung?
Weil Grafana nicht scheitert — es interpoliert nichts und führt die Query mit dem Literal darin aus. Ein PromQL-Selektor {env="$env"} trifft keine Serie, das Panel ist also leer; ein Selektor mit Regex-Matching kann viel MEHR Serien treffen als gemeint, das Panel ist dann gefüllt und falsch. In keinem der beiden Fälle erscheint irgendwo in der Oberfläche eine Meldung. Die einzige Ausnahme, die dieser Linter macht, ist eine Referenz in einem String, der wie ein regulärer Ausdruck aussieht: dort ist „$“ auch ein Zeilenende-Anker, und der Fund sinkt auf eine Warnung, weil das geschriebene „$env“ tatsächlich ein Anker mit folgendem Text sein kann.
Wie groß darf das Dashboard sein?
Bis zu 5.000.000 Zeichen, was ein generiertes Dashboard mit mehreren Tausend Panels abdeckt; ein Dashboard mit 500 Panels wird in wenigen Millisekunden geprüft. Darüber verweigert das Tool mit einer Meldung, statt Ihren Tab einzufrieren — eine so große Eingabe ist ein Log oder ein Archiv, kein Dashboard. Auch die Funde sind begrenzt: höchstens 50 pro Regel und 400 insgesamt, und das Panel nennt die Grenze und die tatsächliche Zahl, sobald eine greift — eine gekürzte Liste, die ihre Kürzung nicht nennt, wäre genau die stille Unrichtigkeit, gegen die dieses Tool existiert.
More free, private DevOps tools.
Der Grafana Dashboard Validator ist ein Tool in OpsCanopy — einem wachsenden Dach browserbasierter Validatoren, Konverter und Tester, die keinen Server berühren.
More in Observability
39 free tools, every one offline-capable — opscanopy.com works with no signup and nothing uploaded.
Verwandt: PromQL Explainer für die Queries in den Panels, Alertmanager Route Tester dafür, wo die Alerts daneben landen, der Prometheus Relabel Tester für die Labels, nach denen Ihre Variablen filtern, und der JSON ↔ YAML Converter, wenn die Provisioning-Datei um das Dashboard herum umgeformt werden muss — oder durchsuchen Sie das vollständige Tool-Verzeichnis.
Nicht mit Grafana Labs verbunden, von Grafana Labs unterstützt oder gesponsert. „Grafana“ ist eine Marke von Raintank, Inc. dba Grafana Labs und wird hier nur benutzt, um zu beschreiben, was dieses Tool liest. Bereitstellung ohne Gewähr; prüfen Sie ein Dashboard immer gegen das Grafana, das es rendern wird. OpsCanopy ist kostenlos und offen.