Category: Monitoring

  • Esportare metriche di sistema centralizzate

    Esportare metriche di sistema centralizzate

    Tenere una dozzina di host monitorati senza centralizzare le metriche è come gestire una contabilità con post-it sparsi: funziona finché non serve davvero. Il mio stack attuale è Glances come collector locale, InfluxDB come time series database e Grafana come dashboard. è la terza iterazione del setup, dopo aver provato Telegraf+InfluxDB e Prometheus+node_exporter. Quello che lascio qui è la versione che gira oggi.

    Glances in modalità export

    Glances è nato come strumento “top-like” interattivo, ma supporta export verso una decina di backend, tra cui InfluxDB v2. L’idea: su ogni host gira glances come daemon che ogni dieci secondi pubblica le metriche verso un InfluxDB centrale.

    Installazione su Debian/Ubuntu:

    
    sudo apt install glances
    

    Per il supporto InfluxDB v2 mi serve la libreria Python:

    
    sudo apt install python3-influxdb-client
    

    Su Mac uso brew:

    
    brew install glances
    pip3 install influxdb-client
    

    Configurazione /etc/glances/glances.conf, sezione InfluxDB v2:

    
    [influxdb2]
    host=influx.example.local
    port=8086
    protocol=http
    org=homelab
    bucket=metrics
    token=GENERATO_DA_INFLUXDB_UI
    prefix=glances
    tags=host:nome-host
    

    Il token e l’org/bucket li creo via UI di InfluxDB. Il tag host mi consente di filtrare in Grafana per macchina.

    Lanciare Glances come servizio

    Niente script custom, uso il file unit di systemd che il pacchetto fornisce e creo un override per attivare l’export:

    
    sudo systemctl edit glances.service
    

    Aggiungo:

    
    [Service]
    ExecStart=
    ExecStart=/usr/bin/glances --export influxdb2 -q -t 10
    

    -q disabilita la UI (è un daemon), -t 10 aggiorna ogni dieci secondi. Poi:

    
    sudo systemctl enable --now glances.service
    

    InfluxDB centrale

    L’InfluxDB sta su un Raspberry Pi 5 con SSD USB (mai microSD per database). Installazione dai repo ufficiali InfluxData:

    
    wget -qO- https://repos.influxdata.com/influxdata-archive_compat.key | gpg --dearmor | sudo tee /etc/apt/trusted.gpg.d/influxdata.gpg > /dev/null
    echo "deb https://repos.influxdata.com/debian stable main" | sudo tee /etc/apt/sources.list.d/influxdata.list
    sudo apt update
    sudo apt install influxdb2
    sudo systemctl enable --now influxdb
    

    Il primo setup, sulla porta 8086, definisce org homelab, bucket metrics con retention 30 giorni e token operatore. Il token operatore lo conservo offline, e creo un token write-only “glances” da distribuire sugli host: in questo modo se un host viene compromesso, l’attaccante può scrivere metriche fasulle ma non leggere o cancellare quelle altrui.

    Grafana sulla stessa macchina

    Grafana sta nello stesso Pi InfluxDB, repo ufficiale, datasource InfluxDB con token read-only. Dashboard “Glances v2” importata dal marketplace ufficiale Grafana, ID 17424. Mi mostra in un colpo d’occhio CPU, RAM, load, IO, network, top processes per host.

    Su Grafana imposto allerting nativo per soglie semplici: cpu_total > 80% per 10m, mem_used_pct > 90% per 5m, disk_used_pct > 85%. Notifiche via Telegram bot personale e email Resend.

    Un caso reale

    Un sabato mattina, verso le 9:00, ho aperto la dashboard per controllare i grafici prima del caffè e ho visto che l’host edge aveva avuto un picco di load avg 12.4 nelle quattro ore precedenti. CPU era stata al 100% per intervalli regolari. Ho guardato i top processes catturati da Glances: un cron mal configurato lanciava un import dati ogni cinque minuti invece che ogni cinque ore. Una virgola dimenticata nel crontab. Ho corretto e ho riallineato il job. Senza la cronologia centralizzata, il picco notturno me lo sarei perso, perché l’host era tornato in range per quando ho aperto la sessione SSH del mattino. Il bello di un time series database è esattamente questo: ti racconta cosa è successo quando tu non c’eri.

    Cosa funziona bene

    Glances è semplicissimo da installare e configurare, copre subito CPU, RAM, IO, network, processi, sensori. InfluxDB v2 con retention policy non si gonfia mai oltre i 5-6 GB di storage. Grafana è lo standard de facto e dashboard belle si trovano già fatte.

    Limiti

    Glances usa un po’ di RAM (50-80 MB per host) e su SBC molto vecchi (Raspberry Pi Zero) può essere troppo. L’export ogni dieci secondi è generoso per un homelab, ma se voglio cardinalità più alta devo passare a Telegraf. Per metriche applicative custom Glances non basta: aggiungo Prometheus scraper su porte specifiche, dove serve.

    In pratica

    Lo stack Glances+Influx+Grafana è il livello “infrastruttura di base” delle mie metriche. Sopra ci poggiano monitoring applicativi specifici (Observium per SNMP di rete, ping check serverless per uptime). Avere tre piani separati e indipendenti mi protegge dal classico problema “il monitoring è giù, quindi non so se è giù”: se Glances tace ma Observium grida, so subito da dove cominciare.


    Immagine generata con Cloudflare Workers AI / FLUX.

  • Monitoraggio di rete con SNMP senza diventare matti

    Monitoraggio di rete con SNMP senza diventare matti

    SNMP è uno di quei protocolli vecchi (RFC 1157 è del 1990) che continuano a funzionare bene proprio perché fanno una cosa sola: leggere contatori e variabili da apparati di rete. Per il mio homelab ho provato vari NMS prima di fermarmi su Observium Community, e dopo qualche tentativo sbagliato ho una configurazione che gira da oltre un anno senza farmi impazzire.

    Il mio setup

    Faccio girare Observium su un Raspberry Pi 5 8GB casalingo, con Debian (Raspberry Pi OS Lite 64-bit, ARM64). Lo storage è un SSD da 480 GB attaccato via USB 3.0, perché una microSD generica sotto MariaDB ha vita breve, lo so per esperienza diretta. Tutto ciò che è /var/lib/observium, /var/lib/mysql e /var/lib/observium/rrd finisce sull’SSD via bind mount. Sul Pi resta solo il sistema operativo, su una microSD ad alta affidabilità classe A2. La rete è ethernet gigabit, niente Wi-Fi per un servizio di monitoring che dipende dalla connettività.

    Observium su ARM64 funziona dai pacchetti community. Le dipendenze le installo dai repo Debian, prima di tutto:

    
    sudo apt update
    sudo apt install apache2 mariadb-server php php-mysql php-gd php-snmp \
      php-curl php-mbstring snmp snmpd fping mtr-tiny rrdtool whois ipmitool
    

    Poi clone del repository community:

    
    sudo mkdir -p /opt/observium
    cd /opt
    sudo git clone https://git.observium.org/observium.git observium
    

    In /opt/observium/config.php configuro utente DB dedicato (mai root MariaDB), password forte e $config['snmp']['version'] a 2c come default, con SNMPv3 dove possibile.

    Il bootstrap iniziale crea lo schema e la prima dashboard:

    
    cd /opt/observium
    sudo ./discovery.php -u
    

    Apache serve /opt/observium/html/ su una vhost interna, accessibile solo dalla LAN, mai esposta su internet pubblica.

    Agenti SNMP sui device

    Su ogni host Linux che voglio monitorare, installo snmpd:

    
    sudo apt install snmpd
    

    In /etc/snmp/snmpd.conf configuro una community string read-only con nome lungo e casuale (mai “public”), e limito l’accesso all’indirizzo del Pi monitoring:

    
    rocommunity SECRETSTRINGLUNGAACASO 203.0.113.10
    sysLocation studio
    sysContact [email protected]
    

    E faccio il bind solo sull’interfaccia che serve, non su 0.0.0.0:

    
    agentAddress udp:203.0.113.20:161
    

    Riavvio:

    
    sudo systemctl restart snmpd
    

    Sugli switch managed configuro la community via web UI o console, sempre v2c con community casuale per il read e v3 con username/password dove l’hardware lo permette. Niente RW community su nessun device, mai.

    Aggiungere device a Observium

    Dal Pi monitoring aggiungo un host:

    
    cd /opt/observium
    sudo ./add_device.php 203.0.113.20 SECRETSTRINGLUNGAACASO v2c
    

    Observium scopre interfacce, sensori, processi e li polla a cadenze diverse (default cinque minuti per i grafici, un minuto per gli alert). Dopo qualche ora la dashboard mostra throughput, errori, sensori di temperatura, e gli alert si attivano sulle soglie predefinite.

    Un caso reale

    Una sera, intorno alle 20:30, ho ricevuto un alert email da Observium per packet loss del 12% sull’interfaccia uplink dello switch principale. Latenza ping verso il gateway saliva oltre i 200 ms a tratti. Sono entrato sulla dashboard e ho visto il grafico storico: il packet loss era iniziato circa un’ora prima, in coincidenza con un picco di traffico verso WAN. Ho controllato il duplex sulla porta: half duplex invece di full. Un negoziato sbagliato dopo un riavvio dello switch del piano sopra. Cambio manuale del duplex a full, riavvio interfaccia, latenza tornata a 1-2 ms. Senza Observium avrei dato la colpa al provider e perso una mezz’ora a fare reload sul router. La cronologia SNMP, in questi casi, vale più di mille tcpdump.

    Cosa funziona bene

    Observium scopre automaticamente quasi tutto: interfacce, VLAN, sensori, processi monitorabili. La storia su RRD è leggerissima e si conserva per anni anche su SSD modesti. L’alerting via mail funziona, è essenziale, e quando un device sparisce ricevo notifica in pochi minuti.

    Limiti

    Il pacchetto community è in modalità “stable but slowly maintained”, e la UI ha sapore 2015. La Professional Edition costa, ma per un homelab la Community basta. SNMP è un protocollo verboso e non particolarmente sicuro: niente community RW, niente esposizione su WAN, e dove possibile SNMPv3 con autenticazione e cifratura.

    In pratica

    SNMP + Observium è la mia base storica di metriche di rete: throughput, errori, sensori. Glances + InfluxDB + Grafana gestiscono le metriche di sistema applicative. Sono due piani diversi che insieme mi danno una visione completa dell’homelab. SNMP non è bello, è efficace, ed è uno dei pochi strumenti che ti permettono di rispondere alla domanda “cosa stava succedendo alla rete tre mesi fa alle 22?” senza dover scrivere nulla in più.


    Immagine generata con Cloudflare Workers AI / FLUX.