J’ai un dashboard Grafana planté, qu’est-ce que je fait ? maman, plus rien ne marche, je ne peux même pas revenir en arrière ?!
Concrètement, que s’est-il passé ? Lors de l’édition d’un dashboard, on a édité une requête quelconque puis enregistré le tout. Depuis, l’affichage de ce dashboard précisément fige l’interface web: on ne peut plus rien faire, tout est figé. Accessoirement on ne peut pas non plus revenir en arrière. Bloqué ? say no more.
Architecture de Grafana
Afin de bien comprendre la solution, il est nécessaire de revenir sur l’architecture de Grafana 2 minutes. C’est un site web qui se découpe en deux parties :
- le frontend ou dit autrement la partie du site web qui s’exécute exclusivement sur le navigateur. Le frontend est responsable de l’affichage des pages web et particulièrement des graphiques, à partir des données brutes envoyées par le backend, et plus généralement de toute l’interface.
- le backend, qui agit comme un simple proxy entre le navigateur et les différentes sources de données (ElasticSearch, Prometheus…). Son rôle est d’exécuter les requêtes contenu dans les dashboards auprès des sources de données puis de renvoyer le résultat au navigateur pour que ce dernier puisse rendre les différents graphique composant un dashboard
Les dashboards Grafana sont intégralement sérialisés et stockés sous forme JSON. Le point délicat est que la charge d’interpréter ce fichier pour reconstituer le dashboard n’est pas sous la responsabilité du backend mais du frontend. Son rôle est donc bien plus critique que le simple affichage de jolis dessins.
Malheureusement qui dit frontend dit aussi application écrite en JavaScript. Il suffira d’une minuscule coquille dans un des scripts JavaScript ou dans ce qu’il traite (hint: disons le dashboard sérialisé en JSON par exemple) pour que toute la machine se grippe. Certes le try/catch existe en JavaScript mais l’on ne peut pas dire que cela soit la fonctionnalité la plus utilisée, n’est-ce pas ?
Lorsque cela arrive, tout ce qui fait appel à un peu de code Javascript ne fonctionne plus. Vu que les dashboards sont une single web app, une anomalie JavaScript bloque toute interaction sur le dashboard, incluant édition, suppression, etc…
Persistence
Pour conserver les dashboards, Grafana repose sur une base de données dont le modèle est relativement simple. Par défaut il s’agit de SQLite mais Grafana supporte également MySQL (et ses dérivées) afin de le rendre Hautement Disponible.
Deux tables vont s’avérer particulièrement utiles :
La table dashboard contient tous les dashboards existant. La définition du dashboard est enregistré dans la colonne data. Son contenu correspond à ce que l’on a lorsque l’on effectue un export via l’interface web.
La table dashboard_version contient la même chose historisé. Pour un dashboard donné, cette table contiendra toutes les modifications qui ont été effectuées dessus, permettant ainsi de revenir en arrière très simplement. En effet il suffira de prendre le data dans dashboard_version d’une version saine et le placer dans la table dashboard. Pouf, problème résolu !
API
Ce plongeon dans les entrailles était intéressant. La modification en live de la base est la méthode que j’avais employé pour réparer ce graphe parce qu’à ce moment là j’étais justement sur la sauvegarde de l’application mais il existe une solution beaucoup moins intrusive. Vu l’existence du frontend js, ce dernier communique avec le côté serveur à travers une API REST pas mal fichu. En récupérant l’id du dashboard malade, j’aurais simplement eu à faire un POST bien placé.
No Comments