Le basi di PromQL
Se hai bisogno di monitorare le tue applicazioni all’interno del cluster, allora Prometheus potrebbe essere tuo alleato: ma come sfruttarlo a pieno? In questo post, impariamo le basi di PromQL, il linguaggio che ci permette di interrogare le metriche raccolte da Prometheus.
Cos’è PromQL
PromQL (Prometheus Query Language) è stato sviluppato come parte del progetto Prometheus, creato nel 2012 da SoundCloud, azienda nota per il suo servizio di streaming per la musica. La necessità di un linguaggio di query potente e flessibile è emersa quando SoundCloud ha scoperto che i loro strumenti di monitoraggio esistenti, come StatsD e Graphite, non soddisfacevano le loro esigenze di monitoraggio multi-dimensionale e di semplicità operativa.
E così, ispirandosi al sistema prodotto da Google chiamato Borgmon, hanno creato PromQL: sfruttando le metriche raccolte e messe a disposizione da Prometheus, diventa possizione selezionare e fare aggregazioni dei dati temporali in real-time.
Fun fact: esiste un “museo dell’arte” delle serie temporali rappresentate da Borgmon sul blog di Google, che riportano alcuni grafici a dir poco interessanti.
“A skein of yarn unravels” - Credits to cloud.google.com
“The Borgmonster” - Credits to cloud.google.com
Cosa sono le metriche
Le metriche in Prometheus sono delle serie temporali, dove ogni serie viene descritta da un nome, un insieme di etichette e una serie di punti dati (ciascuno con un timestamp e un valore). I dati delle serie temporali nel monitoraggio si riferiscono a punti dati indicizzati in ordine temporale.
La struttura di una metrica in genere include i seguenti componenti chiave:
- Nome: un identificatore esplicito per la metrica, che spesso riflette ciò che misura. Ad esempio,
http_requests_total
. - Set di etichette: coppie chiave-valore che forniscono dimensioni aggiuntive alla metrica, consentendo un monitoraggio più dettagliato e specifico. Un’etichetta di esempio per
http_requests_total
potrebbe essere{method="GET", endpoint="/api"}.
- Valore: il punto effettivo che rappresenta la misurazione, che potrebbe essere un conteggio, una durata, ecc.
- Timestamp: il momento in cui è stato registrato il valore metrico (spesso aggiunto automaticamente dal sistema di monitoraggio).
Prometheus espone quattro tipi di metriche standard, ognuna progettata per soddisfare specifiche esigenze di monitoraggio:
- Counter, ossia una metrica cumulativa che può solo aumentare o essere azzerata (ad esempio, al riavvio). È utilizzato per tracciare eventi come il numero di richieste servite o gli errori verificatisi.
- Gauge: questo rappresenta un valore numerico che può oscillare continuamente. È utile per misurare valori variabili, come la temperatura o l’utilizzo della memoria.
- Histogram: questo tipo campiona osservazioni e le registra in “bucket” (insiemi) configurabili. Consentono di analizzare distribuzioni di valori, come i tempi di risposta delle richieste.
- Summary: simile alla tipologia precedente, queste metriche campionano osservazioni e calcolano quantili su una finestra temporale mobile. Tuttavia, non sono adatti per l’aggregazione di dati da più istanze.
Come funziona PromQL
PromQL (aka Prometheus Query Language) è utilizzato per interrogare e aggregare le metriche messe a disposizione da Prometheus.
Immaginando di avere a disposizione una serie di metriche applicative, come quella che riporta tutte le request eseguite (e.g.: http_requests_total
), vediamo alcuni esempi di query.
La sintassi è la seguente: utilizzando la metrica senza fornire informazioni altre informazioni, verranno restituiti i valori della metrica senza particolari filtri:
http_requests_total
Per poter specificare un certo range temporale del quale visualizzare le metriche, è possibile usare un’espressione come la seguente, che mostra gli ultimi 5 minuti:
http_requests_total[5m]
E se volessimo vedere il valore medio in un certo intervallo di tempo? Esistono le funzioni di aggregazione, che servono per calcolare media (aka avg()
), somma (aka sum()
), minimo (aka min()
) o altri calcoli che vengono eseguiti usando i dati temporali.
Un esempio è il seguente: avg_over_time
viene usata per calcolare l’uso medio (in questo caso) della CPU nelle ultime 24 ore:
avg_over_time(cpu_usage[1d])
sum(process_uptime_seconds{pod="mypod-82h86", namespace='mynamespace'}) by (pod)
Quest’altro esempio è utilizzata per monitorare il tempo di attività di un pod specifico in un namespace. In particolare, process_uptime_seconds
rappresenta il tempo di attività di un processo, espresso in secondi ed è una metrica di tipo gauge, che può aumentare o diminuire. Poi, {pod="mypod", namespace='mynamespace'}
rappresenta un set per etichette che filtra i dati della metrica process_uptime_seconds
per includere solo quelli relativi a un pod specifico chiamato “mypod
” e a un namespace specifico chiamato “mynamespace
”. Infine, abbiamo la funzione sum()
aggrega i risultati della metrica, utilizzando la clausola by (pod)
specifica che l’aggregazione deve essere effettuata raggruppando i risultati per l’etichetta pod
.
Questo significa che la query mostrerà il tempo totale di attività per ogni pod individuato.
sum(rate(http_requests_total[5m])) by (job)
In questo esempio, la funzione rate()
(di tipo Counter) calcola la media per secondo del tasso di incremento della metrica http_requests_total
su un intervallo di 5 minuti.
Questo significa che, per ogni secondo all’interno dell’intervallo di 5 minuti, Prometheus considera l’incremento della metrica e calcola una media. È utile per ottenere un valore “smussato” che riduce la variabilità causata da picchi improvvisi nelle richieste.
Poi, abbiamo la funzione sum()
aggrega i risultati della funzione rate()
. Questo permette di ottenere un totale aggregato delle richieste HTTP per tutte le istanze monitorate.
L’ultima parte dell’espressione by (job)
specifica che l’aggregazione deve essere effettuata raggruppando i risultati in base all’etichetta job
.
In altre parole, il risultato finale mostrerà il tasso totale di richieste HTTP per ciascuna entità definita job
.
Visualizzare le metriche
Per poter vedere questi dati e creare dei grafici, esiste Grafana: questo tool utilizza le metriche di Prometheus per visualizzare i dati raccolti attraverso dashboard interattive. Dopo aver configurato Prometheus come data source, Grafana sfrutta PromQL per recuperare i dati delle metriche e rappresentarle in vari formati, come grafici a linee, tabelle e gauge. Gli utenti possono personalizzare le dashboard per monitorare le performance del sistema, analizzare tendenze e identificare anomalie, facilitando così la gestione e il monitoraggio delle applicazioni e dei servizi in tempo reale.