Grafana è un server di visualizzazione senza uno storage di metriche proprio: ogni pannello interroga al volo una sorgente esterna — Graphite, Prometheus, InfluxDB, Elasticsearch, OpenTSDB — e ne disegna la risposta. Questa scelta architetturale, presente fin dalle prime versioni, tiene distinto il problema di conservare le serie temporali da quello di mostrarle, e spiega perché un singolo cruscotto possa mescolare dati che arrivano da backend diversi.
Contesto
Il progetto nasce nel 2014 come fork dell’interfaccia di Kibana 3. Lo scrive Torkel Ödegaard partendo dal proprio lavoro sul rendering di serie temporali con Graphite. La motivazione tecnica, documentata, è che Kibana all’epoca resta legato al backend Elasticsearch e non è pensato per interrogare TSDB generici. Grafana eredita l’impianto a pannelli su griglia di quell’interfaccia e lo riorienta attorno a una sola astrazione: la query verso una sorgente di metriche.
Il codice esce sotto licenza Apache 2.0, permissiva: consente uso, modifica e ridistribuzione anche dentro prodotti chiusi, senza obbligo di rilasciare il derivato. Sull’adozione ha pesato: molte organizzazioni mettono Grafana dentro stack interni senza doversi preoccupare di vincoli copyleft.
Architettura
L’elemento centrale è il data source plugin. Un data source è un modulo che traduce la richiesta di un pannello — un intervallo temporale, una o più espressioni di query, una risoluzione — nel protocollo nativo della sorgente, e ne normalizza la risposta in serie (timestamp, valore) che il frontend sa disegnare. Il backend di Grafana fa da proxy verso la sorgente; il browser non parla quasi mai direttamente con il TSDB.
Sopra il data source stanno tre astrazioni stabili:
- la dashboard, descritta per intero da un documento JSON versionabile, che tiene la disposizione dei pannelli sulla griglia, le query e le opzioni di rendering;
- il pannello, unità di visualizzazione (grafico a linee, gauge, tabella, heatmap) legato a una o più query verso uno o più data source;
- la variabile di template, un segnaposto risolto a runtime — di solito con una query alla sorgente — che fa servire ambienti, servizi o host diversi da un’unica dashboard, tramite menu a tendina.
Dato che la dashboard è un JSON autocontenuto, la si esporta, la si versiona in un repository e la si ricostruisce altrove: il cruscotto diventa un artefatto di configurazione, non uno stato opaco dentro l’applicazione.
Con la query al centro, ogni pannello può puntare a una sorgente diversa. Sullo stesso schermo convivono una serie applicativa da Prometheus, un contatore infrastrutturale da Graphite e una query SQL su PostgreSQL, perché ciascun pannello risolve la propria richiesta in autonomia, attraverso il rispettivo plugin.
Punto critico
La separazione netta tra storage e visualizzazione è anche il limite più evidente, e la versione 4.0 — stabile da dicembre 2016 — lo rende esplicito portando l’alerting nel core. Finché Grafana si limita a interrogare al momento della richiesta, non tiene alcuno stato proprio sulle metriche: ogni grafico nasce da una query effimera. L’alerting rompe questa proprietà, perché valutare una regola di soglia richiede che qualcosa esegua quella query a intervalli regolari, di continuo, che ci sia o no un browser a guardare.
Quella valutazione è finita in grafana-server, il backend, non nel frontend. Una regola si definisce sul pannello grafico già esistente, trascinando la soglia sull’asse; da quel momento il server la rivaluta a intervalli, tiene lo stato dell’allarme (ok, alerting, no_data) e manda le notifiche ai canali configurati — Slack, PagerDuty, email, webhook — quando la condizione cambia.
Il vincolo tecnico è che la valutazione lato server deve sapere come eseguire la query senza il rendering del frontend, e questo non vale per tutti i plugin allo stesso modo. Alla 4.0 l’alerting funziona sulle sorgenti il cui modello di query gira in backend — Graphite, Prometheus, InfluxDB, OpenTSDB — mentre le altre restano fuori. È il prezzo di aver tenuto separati per anni i due piani: aggiungere uno stato persistente sulle metriche obbliga a rimettere nel server una parte della logica di query che prima viveva solo nel disegno del grafico.
Implicazioni
Trattare la dashboard come JSON ha effetti pratici che vanno oltre la portabilità. Un cruscotto può stare in un repository accanto al codice del servizio che descrive, passare per la code review e seguire lo stesso ciclo di rilascio dell’applicazione. Le annotazioni — marcatori sovrapposti ai grafici per segnalare deploy, incident o cambi di configurazione — completano il quadro operativo: correlano a vista un salto in una metrica con l’evento che lo ha causato, senza uscire dalla stessa schermata.
Il disaccoppiamento conviene anche sul lungo periodo: cambiare il backend di raccolta — migrare da Graphite a Prometheus, per dire — non costringe a riscrivere le dashboard da zero, ma a riscrivere le query dei pannelli lasciando intatta la struttura. La visualizzazione sopravvive alla sorgente.
Limiti
Restano alcuni vincoli da tenere a mente. Grafana non interpola né ricostruisce dati: se la sorgente non conserva una serie a una certa risoluzione, nessun pannello se la inventa, e la qualità del grafico dipende per intero dalla retention e dalla granularità del TSDB sottostante. Non è un sistema di raccolta: a monte serve comunque un agente o un’esposizione di metriche, perché Grafana dà per scontato che i dati esistano già da qualche parte. E l’alerting della 4.0, valutato in grafana-server, è un unico punto in cui far girare le regole: la sua disponibilità e la sua frequenza di valutazione vanno dimensionate, soprattutto quando le regole crescono di numero.
La forza dell’astrazione a query uniforme si paga quando una sorgente espone funzioni che non rientrano in un modello comune: lì il pannello mostra quel che il plugin sa tradurre, non l’intero ventaglio del linguaggio di query nativo.
- https://grafana.com/blog/2016/12/12/grafana-4.0-stable-release/
- https://grafana.com/blog/2016/11/09/grafana-4.0-beta-release/
- https://en.wikipedia.org/wiki/Grafana
- https://www.apache.org/licenses/LICENSE-2.0
- https://www.noze.it/insights/grafana-open-source/
Immagine di copertina: Schermata di una dashboard Grafana con piu pannelli su griglia scura e grafici a linee di serie temporali — schermata di Shiunu, CC BY-SA 4.0 — https://commons.wikimedia.org/wiki/File:Grafana_Dashboard_(2017).jpg