Monitorare gli errori di NGINX su Grafana
Monitora proattivamente gli errori NGINX su Grafana. Usa Telegraf e Prometheus per ottenere metriche chiare e prevenire i malfunzionamenti nel tuo HomeLab.
Chi come me, si dedica all'HomeLabbing per diletto, ampliamento di conoscenze e soprattutto per migliorare la propria vita digitale sa benissimo (e lo scopre tramite terapia d'urto) che gestirsi le cose da soli significa anche dover aggiustare eventuali problemi contando solo sulle proprie forze.
Dopotutto, come diceva Peter Parker:
"Da grandi poteri derivano grandi responsabilità"
Lo so, la citazione può sembrare completamente fuori luogo, ma gli HomeLabber mi capiranno: quando tutto funziona, ci sentiamo veramente dei supereroi (e per chi vive in casa nostra, lo siamo davvero).
Non esiste un modo per aggiustare automaticamente i problemi ancora prima che accadano, ma possiamo fare il possibile per accorgerci dei guasti prima che diventino invalidanti, soprattutto se utilizzate NGINX come Load Balancer per server DNS.
Una delle soluzioni a questo problema potrebbe essere quello di monitorare costantemente i log di errore di NGINX tramite
tail -f /var/log/nginx/error.log
ma... così facendo non ci rimane tempo per dedicarci ad altro.
Purtroppo NGINX non espone metriche relative agli errori che riscontra, o perlomeno non al momento della scrittura di questo articolo, ma ho messo a punto un metodo per leggere queste metriche tramite Telegraf e visualizzarle quindi su Grafana tramite Prometheus.
Vediamo insieme come fare!

Prerequisiti
Per seguire i passaggi indicati in questa guida avrete bisogno di:
- Un'istanza di Grafana e Prometheus, e di aver censito Prometheus come DataSource in Grafana
- Almeno un'istanza di NGINX da monitorare
- Telegraf installato sull'istanza di NGINX da monitorare
- (opzionalmente) Aver attivato lo stub_status_module di NGINX per monitorare altre metriche relative ad NGINX, come spiegato nella guida Introduzione ad NGINX durante la creazione del site nginx_metrics.
Dovete inoltre avere attivato, nel vostro file nginx.conf, i log di errore.
Questo perché l'automatismo che andremo a configurare tramite Telegraf andrà periodicamente a leggere il file contenente i log di errori di NGINX, conterà quelli relativi agli ultimi 60 secondi, ed esporterà una metrica che indica il numero totale di errori avvenuti in quell'arco temporale.
La configurazione di Telegraf indicata nei passaggi successivi dà per scontato che abbiate lasciato l'impostazione di default /var/log/nginx/error.log, ma potete cambiare questo puntamento variando il parametro relativo.

Configurazione
Vediamo insieme come configurare il tutto, partendo dalla configurazione di Telegraf sul nodo NGINX, configurando il job di scraping su Prometheus ed infine visualizzando le metriche su Grafana.
Telegraf
- Se non avete ancora installato Telegraf sulla vostra macchina NGINX, potete farlo seguendo la mia guida

- Modificate il file di configurazione di Telegraf
sudo nano /etc/telegraf/telegraf.conf
- Aggiungete in fondo al file il seguente contenuto:
###############################################################################
# 1) INPUT: Nginx error log (solo livelli "error")
###############################################################################
[[inputs.tail]]
files = ["/var/log/nginx/error.log"]
from_beginning = false
data_format = "grok"
grok_patterns = ['%{YEAR}/%{MONTHNUM}/%{MONTHDAY} %{TIME} \[%{LOGLEVEL:log_level}\] %{GREEDYDATA:message}']
name_override = "debug_tail"
###############################################################################
# 2) PROCESSOR: trasforma il log "error" in error_count = 1 (int)
###############################################################################
[[processors.starlark]]
namepass = ["debug_tail"]
drop_original = true
source = '''
def apply(metric):
level = metric.fields.get("log_level", "").lower()
if level == "error":
metric.name = "nginx_errors"
metric.fields.clear()
metric.fields["error_count"] = int(1)
return [metric]
return []
'''
###############################################################################
# 3) AGGREGATORE: somma tutti gli error_count nell’ultimo minuto
###############################################################################
[[aggregators.basicstats]]
namepass = ["nginx_errors"]
period = "60s"
drop_original = true
stats = ["sum"]
fieldpass = ["error_count"]
Di default, questa configurazione mostra in una metrica gli errori che si sono verificati negli ultimi 60 secondi. Se volete rendere più granulare questa metrica, potete cambiare il parametro period a 30s o 15s. Un valore più piccolo permette di avere una maggiore granularità nel monitoraggio, ma è fondamentale che questo valore sia un multiplo dell'intervallo di scraping impostato su Prometheus.
Fate attenzione a non indicare nello script un intervallo di tempo minore dell'intervallo di scraping di Prometheus.
Facendo così, perderete i dati relativi a diversi intervalli di aggiornamento. Ad esempio, se Prometheus fa lo scraping ogni 60 secondi, impostare il parametro
period a 30 secondi comporterà la perdita di metà dei dati.Idealmente, impostate un valore almeno equivalente all'intervallo di scraping, e comunque un multiplo di quel numero.
- Aggiungete l'utente telegraf al gruppo adm per permettergli di leggere il file di log
sudo usermod -aG adm telegraf
Generalmente sì.
Il gruppo adm nelle distribuzioni come Debian, Ubuntu e derivate ha accesso in lettura a molti file di log, e principalmente si usa per fini di monitoraggio ed auditing. Di conseguenza, se l'utente telegraf dovesse venire compromesso, un attaccante potrebbe accedere a log sensibili, come tentativi di accesso SSH ed errori di autenticazione.
Tuttavia, per motivi di semplicità e dato il contesto "casalingo" di queste guide, sono abbastanza tranquillo nel suggerirvi di procedere in questo modo.
- Riavviate il servizio di telegraf per applicare le modifiche
sudo systemctl restart telegraf
Prometheus
- Se non avete ancora installato Prometheus, potete farlo seguendo la mia guida

Se non avete già integrato in Prometheus l'istanza di Telegraf sul nodo NGINX, modificate il file di configurazione prometheus.yml aggiungendo un nuovo job di scraping (vi consiglio di monitorare i nodi NGINX in un job a parte):
- Modificate il file prometheus.yml
sudo nano prometheus/prometheus.yml
- Aggiungete un nuovo job col seguente contenuto
- job_name: 'NGINX'
static_configs:
- targets: ['Indirizzo.IP.di.NGINX:9273']
- Salvate il file e riavviate Prometheus per applicare le modifiche
sudo systemctl restart prometheus
- Controllate di non aver rotto niente 👼🏻
sudo systemctl status prometheus
- Controllate che i target del job NGINX siano funzionanti, accedendo all'interfaccia web di Prometheus
http://Indirizzo.IP.di.Prometheus:9090
Grafana
- Se non avete ancora installato Grafana, potete farlo seguendo la mia guida

- Dovrete inoltre aggiungere Prometheus come DataSource su Grafana. Potete trovare anche questo processo illustrato nella guida di Installazione ed Utilizzo di Grafana
Attendete qualche istante e dovreste poter già creare i vostri widget usando la nuova metrica nginx_errors_error_count_sum.
Se preferite, potete importare questa dashboard generica che ho creato, che utilizza le metriche provenienti dal site nginx_status che abbiamo abilitato nella mia guida Introduzione ad NGINX e la metrica nginx_errors_error_count_sum appena configurata.


Conclusioni
In questo articolo, abbiamo visto come monitorare in modo efficace gli errori di NGINX, trasformando un task potenzialmente noioso come l'analisi dei log in un sistema di monitoraggio proattivo e visuale con Telegraf, Prometheus e Grafana.
I vantaggi di questo approccio sono molteplici:
- Monitoraggio proattivo: Ora che sappiamo quanti errori vengono registrati su NGINX, possiamo intervenire prima che i problemi diventino critici, riducendo i tempi di inattività, quando notiamo dei picchi nel numero di errori.
- Visualizzazione centralizzata: Abbiamo i dati relativi a tutte le istanze di NGINX in un'unica dashboard Grafana, per un'analisi facilitata.
- Avvisi personalizzabili: Grazie alle funzionalità di alerting di Grafana, possiamo ricevere notifiche automatiche in caso di anomalie.
Spero che questa guida vi sia stata utile per migliorare la stabilità e la gestione dei vostri server NGINX, sia che li utilizziate per progetti personali o per scopi più professionali.
Ora, tocca a voi! Personalizzate la configurazione, create dashboard che riflettano le vostre esigenze specifiche e combinate queste preziose metriche con altre informazioni chiave per avere una visione completa della salute del vostro sistema.
Continuate a sperimentare e a migliorare il vostro HomeLab, un passo alla volta!



