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.

Condividi
Monitorare gli errori di NGINX su Grafana

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
Installazione di Telegraf
Telegraf è un software open source di InfluxData che raccoglie metriche da servizi e sistemi (compresa la macchina su cui viene installato) per poi esporle tramite un webserver e farle utilizzare da altri servizi.
  • 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.

‼️
ATTENZIONE
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
❓
È SICURO?
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
Installazione di Prometheus
Prometheus è un software open source (github) che immagazzina metriche in un Time-Series DataBase (TSDB) e permette di eseguire query sui dati.

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
Installazione ed Utilizzo di Grafana
Una guida completa per installare e configurare Grafana su Ubuntu. Segui i passaggi dettagliati per collegare Prometheus e creare da zero la tua prima dashboard di monitoraggio, trasformando i dati grezzi in grafici chiari ed efficaci.
  • 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.

uno screenshot della dashboard una volta importata su Grafana

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!