Table of Contents
Cacti - sistema di monitoraggio
Account: Dopo aver installato il pacchetto Debian, si accede all'interfaccia web http://hostname/cacti/ con le credenziali admin/admin. È possibile attivare un account guest senza password che abbia accesso in sola visualizzazione dei grafici. Dal menu User Management si deve abilitare l'utente guest, quindi dal menu Settings, Authentication si sceglie guest come utente Guest User.
Per eccedere come utente guest basta puntare il browser su http://hostname/cacti/graph_view.php, mentre per avere la richiesta di login si punta solo alla directory /cacti/.
Per resettare la password di admin bisogna collegarsi al database cacti ed eseguire:
UPDATE user_auth SET password=md5('admin') WHERE username='admin';
ATTENZIONE: prima di creare un grafico si deve aggiungere il device da cui il grafico dipende. Un device sarà identificato almeno dall'hostname, inoltre - se si sceglie il tipo di device tra quelli predefiniti - saranno disponibili automaticamente alcuni data source e graph template che aiuteranno a creare i grafici.
Ad ogni modo, anche se non esistono data source e graph template predefiniti per un determinato device, sarà possibile crearne di presonalizzati ed ottenere i grafici.
Ogni device ha uno status che viene mostrato nella schermata dei device stessi. Lo status può assumere valore Enabled, Disabled, Up, Down, Recovering e Unknown. Fare attenzione perché se il device entra in status Down (ad esempio se è attivo SNMP e l'host non risponde), tutti i grafici ad esso correlati non vengono più aggiornati.
Bug Debian Lenny
Debian Lenny installa Cacti 0.8.7b e rrdtool 1.3.1. La procedura di installazione imposta però Cacti ad usare rrdtool versione 1.0.x. L'anteprima dei grafici non funziona e nei log di Apache si legge l'errore:
ERROR: I don't understand ':11:40 To 2010/08/27 11:11:40\c' in command: 'COMMENT:From 2010/08/26 11:11:40 To 2010/08/27 11:11:40\c'.
Per fortuna è sufficiente impostare la versione 1.2.x in Settings, General.
PHP memory_limit in Debian Squeeze
Pare che con le impostazioni predefinite del PHP, il poller di Cacti generi continuamente i seguenti errori in syslog (pare non fatali, perché comunque i dati vengono acquisiti):
suhosin[11124]: ALERT - script tried to disable memory_limit by setting it to a negative value -1 bytes which is not allowed (attacker 'REMOTE_ADDR not set', file 'unknown')
Il codice di Cacti cerca di allocare 512 Mb, l'impostazione predefinita in /etc/php5/cli/php.ini
sarebbe senza limiti (-1), ma probabilmente l'estensione Suhosin impedisce l'allocazione.
Bisogna impostare un memory_limit = 512M
o superiore. Con valori inferiori si ottiene l'errore:
suhosin[11679]: ALERT - script tried to increase memory_limit to 536870912 bytes which is above the allowed value (attacker 'REMOTE_ADDR not set', file '/usr/share/cacti/site/poller.php', line 210) suhosin[11682]: ALERT - script tried to increase memory_limit to 536870912 bytes which is above the allowed value (attacker 'REMOTE_ADDR not set', file '/usr/share/cacti/site/cmd.php', line 64)
Grafico personalizzato per ping
Si vuole ottenere un grafico di questo tipo:
In pratica il round-trip time e il packet loss riassunte in un unico grafico. La prima grandezza è visualizzata come semplice grafico (in blu), mentre la parcentuale di pacchetti persi è rappresentata dal colore di sfondo del grafico: dal bianco della situazione ottimale fino al rosso della situazione più critica.
Device
Anzitutto dalla sezione Management si aggiunge il Device a cui il grafico si riferisce. Per il ping conviene associare il grafico al localhost su cui gira Cacti piuttosto che all'host remoto da monitorare. Questo perché Cacti mette il device in status Down quando non riesce a leggere qualche Data Source ad esso associato (ad esempio un valore SNMP). Se il device è Down non viene effettuato il ping e il grafico non riporta il 100% di pacchetti persi.
Data Input Method
Per l'acquisizione dei dati si utilizza uno script Perl, purtroppo non fornito con Cacti. Lo script è stato messo in /usr/local/bin/ping_latency.pl
, quindi in Cacti si aggiunge una voce in Data Input Methods. Nella definizione del metodo ovviamente si deve indicare il percorso dello script, il numero dei parametri in input e il numero dei parametri in output (devono essere inviati su STDOUT in un'unica riga nel formato parametro:valore, separati da spazi).
Data Template
Dalla sezione Templates, Data templates si crea un data template. Qui si indica come archiviare i dati acquisiti dal metodo (script) dichiarato in precedenza. In particolare si indicano tutti i parametri necessari agli rrdtools, come gli intervalli di acquisizione, il range di valori accettabili, il tipo di grandezza (contatore, numero…
Questi valori verrano utilizzati anche per creare l'archivio RRA alla prima acquisizione del dato (vedere man rrdcreate). Tuttavia, se si modifica qualche parametro - ad esempio i limiti min/max del dato - l'archivio non viene ricreato, eventualmente si può eliminare il file dalla directory /var/lib/cacti/rra/
e aspettare che venga generato nuovamente.
Graph Template
Bisogna definire l'aspetto del grafico definendo un Graph Template. Fare riferimento agli rrdtools per capire la sintassi (in particolare le man page di rrdgraph, rrdgraph_data e rrdgraph_rpn). Realizzare il grafico di cui sopra è abbastanza complicato, qui riportiamo la schermata di configurazione del template e la corrispondente riga di comando rrd che viene eseguita:
/usr/bin/rrdtool graph - \ --imgformat=PNG \ --start=-108000 \ --end=-300 \ --title="Rigacci.org - Ping" \ --base=1000 \ --height=120 \ --width=500 \ --upper-limit=10 \ --lower-limit=0 \ --vertical-label="Round-Trip ms" \ --slope-mode \ DEF:a="/usr/share/cacti/site/rra/rigacci_org_round_trip_164.rrd":packet_loss:AVERAGE \ DEF:b="/usr/share/cacti/site/rra/rigacci_org_round_trip_164.rrd":round_trip:AVERAGE \ CDEF:cdefb=a,0,3,LIMIT,UN,UNKN,INF,IF \ CDEF:cdefd=a,3,10,LIMIT,UN,UNKN,INF,IF \ CDEF:cdeff=a,10,25,LIMIT,UN,UNKN,INF,IF \ CDEF:cdefh=a,25,50,LIMIT,UN,UNKN,INF,IF \ CDEF:cdefj=a,50,75,LIMIT,UN,UNKN,INF,IF \ CDEF:cdefba=a,75,100,LIMIT,UN,UNKN,INF,IF \ COMMENT:"Packet Loss % \n" \ AREA:cdefb#FFFFFF:"0-3% " \ AREA:b#0000AA:"Round-Trip Time ms\n" \ AREA:cdefd#FFF200:"3-10% ":STACK \ GPRINT:b:AVERAGE:"Average\:%8.2lf %s\n" \ AREA:cdeff#FFAB00:"10-25% ":STACK \ GPRINT:b:MAX:"Maximum\:%8.2lf %s\n" \ AREA:cdefh#FF7D00:"25-50% ":STACK \ GPRINT:b:LAST:"Current\:%8.2lf %s\n" \ AREA:cdefj#FF5700:"50-75%\n":STACK \ AREA:cdefba#FF0000:"75-100% ":STACK \ COMMENT:"Graph Updated\: Thu 26 Jul 17\:35\:02 CEST 2007"
Durante la creazione del grafico può essere necessario fare riferimento a delle CDEF Function, cioè a dei valori calcolati invece che ai valori rilevati dall'Input Method. In tal caso si deve creare la CDEF in Cacti, dal menu Management, Graph Management, CDEFs. Per poter mettere nel grafico la perdita di pacchetti nei vari colori, si sono definite 6 diverse funzioni, di cui questa è la prima denominata Pkt Loss - 00% to 03%:
cdef=CURRENT_DATA_SOURCE,0,3,LIMIT,UN,UNKN,INF,IF
Per una spiegazione delle CDEF e del linguaggio relativo fare sempre riferimento agli rrdtools.
New Graph
Finalmente si può creare un nuovo grafico dal menu Create, New Graphs: grazie alle informazioni introdotte in precedenza una procedura guidata propone i grafici supportati dal device. Anche dal menu Management, Graph Management si può aggiungere un grafico, ma con una procedura meno automatizzata. Se il Data Input Method richiede dei parametri, questi devono essere specificati in questo passaggio.
Non è necessario aver definito la Data source perché questa viene creata contestualmente al grafico. Anzi, se la Data Source esiste già, verrà duplicata.
Interrogazione via SNMP
Se il tipo di host è di tipo Generic SNMP-Enabled Host questa è l'interrogazione che viene fatta via SNMP:
19:00:01.657463 IP 10.0.1.2.1108 > 10.3.1.2.161: GetNextRequest(21) .0.1 19:00:01.660346 IP 10.3.1.2.161 > 10.0.1.2.1108: GetResponse(21) noSuchName@1 .0.1=
Grafici dello spazio disco occupato
Vedi: Using Data Queries and Data Input Methods.
Come fare per aggiungere velocemente grafici dello spazio occupato su disco? Ci sarebbero due soluzioni generiche (sconsigliate):
- Creare un grafico basato sul template SNMP - Generic OID Template. Si deve però scoprire quale è esattamente l'OID da graficare cercandolo con
snmpwalk(1)
. L'OID potrebbe tuttavia cambiare se si montano/smontano altre partizioni. - Si potrebbe definire un Data Input Method, cioè uno script che riceve come parametro (Input Field) il nome della partizione da monitorare e restituisce il valore. Lo script potrebbe utilizzare SNMP o altri metodi a piacimento.
La soluzione migliore prevista da Cacti è tuttavia diversa, consente di scegliere la partizione da un elenco e automaticamente viene determinato quele Data Template e Graph Template utilizzare. Il tutto si realizza tramite una Data Query. Una Data Query è uno di script oppure una interrogazione SNMP che restituisce un elenco di chiavi univoche e le associa ai rispettivi OID automaticamente.
Ad esempio la Data Query SNMP - Get Mounted Partitions esegue uno script che determina tutte le partizioni montate su un server SNMP. Internamente utilizza qualcosa di simile a snmpwalk:
snmpwalk -v2c -c public 127.0.0.1 HOST-RESOURCES-MIB::hrStorage
Si deve preventivamente associare all'host la data query opportuna:
- Dal menu Devices si sceglie l'host interessato e nella sezione Associated Data Queries si aggiunge la query SNMP - Get Mounted Partitions.
- Cliccando su Create Graphs for this Host sarà possibile scegliere una delle partizioni trovate dalla data query e creare un grafico per essa.
NOTA 1: Esiste anche la Data Query ucd/net - Get Monitored Partitions, ma va ad interrogare un MIB che nel nostro caso non restituisce informazioni.
NOTA 2: Nel caso in cui si vuole monitorare lo stesso host Linux su cui gira Cacti, la Data Query Unix - Get Mounted Partitions probabilmente è più adatta perché riporta solo le partizioni fisiche montate, con il punto di montaggio e il nome del device. Ovviamente non funziona in remoto via SNMP.
"Get Mounted Partitions" vs "Get Monitored Partitions"
Cacti fornisce due diverse Data Query per monitorare lo spazio occupato sul disco:
- SNMP - Get Mounted Partitions
- Net-SNMP - Get Monitored Partitions
Le due query si basano su altrettanti script che vanno a interrogare OID diversi:
Script Cacti | MIB OID (numeric) | Radice MIB (textual) |
---|---|---|
cacti/resource/snmp_queries/host_disk.xml | .1.3.6.1.2.1.25.2.3.1.1 | HOST-RESOURCES-MIB::hrStorage |
cacti/resource/snmp_queries/net-snmp_disk.xml | .1.3.6.1.4.1.2021.9.1.1 | UCD-SNMP-MIB::dskTable |
Risulta che la prima forma sia supportata sia su Debian 10 che CentOS 7, mentre la seconda forma non lo è su CentOS. In Cacti, aprendo la schermata del Device Management, è possibile verificare nella sezione Associated Data Queries quali delle due query sono state attivate per l'host ed eventualmente se hanno dato esito negativo (viene indicato [0 Items, 0 Rows] come risultato della query).
Cache di valori errati
Può accadere che Cacti ad un certo punto non aggiorni più correttamente un grafico. Se SNMP restituisce valori giusti mentre il file RRD contiene valori sballati potrebbe essere che si è corrotto qualche valore nella cache di Cacti.
Per il debug aiutarsi con View Poller Cache dal menu System Utilities.
Per calcolare correttamente alcuni valori (ad esempio per convertire lo spazio disco da blocchi a byte) Cacti richiede via SNMP altri parametri, ad esempio lo hrStorageAllocationUnits
. Questi parametri vengono memorizzati in modo permanente nel database. Nel caso dovessero risultare corrotti è sufficiente aggiornare il risultato della data query: dal menu Devices si sceglie l'host interessato, nella sezione Associated Data Queries si clicca su Verbose Query.
A partire dalla versione 0.8.7g c'è anche lo script rebuild_poller_cache.php che dovrebbe sistemare le cose:
cd /usr/share/cacti/cli php ./rebuild_poller_cache.php -d
Modifica parametri archivio RRD
Una delle cose più comuni è aver sbagliato il limite massimo di un dato, ad esempio si è tarato l'archivio per un traffico di rete da 10 Mbit e si vuol passare a 100 Mbit. In tal caso il comando per aggiustare l'archivio è:
rrdtool tune archive.rrd --maximum traffic_in:100000000 rrdtool tune archive.rrd --maximum traffic_out:100000000
Modifica contenuto archivio RRD
Per modificare il contenuto di un archivio RRD è possibile fare il dump in formato XML, editare il file e quindi fare il restore da tale file:
rrdtool dump /var/lib/cacti/rra/archive.rrd > archive.xml vi archive.xml rm /var/lib/cacti/rra/archive.rrd rrdtool restore archive.xml /var/lib/cacti/rra/archive.rrd
Attenzione a ripristinare i permessi originali dell'archivio rrd.
Grafico attività disco
Si può utilizzare il template Disk I/O Usage, testato sulla versione 0.8.7g, sebbene sia dichiarato per la 0.8.7d. Qui una copia dell'archivio: diskio087d.tar.gz.
- Dall'archivio estrarre il file
disk_io.xml
e copiarlo in/usr/share/cacti/resource/snmp_queries
. - Estrarre il file
cacti087d_data_query_snmp_-_get_disk_io.xml
e importarlo nell'interfaccia web: Console ⇒ Import Templates. - Aprire il device (host) interessato e cliccare su Add Data Query ⇒ SNMP - Get Disk IO.
- Aggiungere un grafico per quell'host, indicando il disco o la partizione da monitorare.
Migrazione di Cacti su altro host
Si vuole migrare l'intera installazione tra due host che hanno la stessa versione di Cacti e MySQL. Queste le operazioni necessarie:
- Installare il pacchetto cacti sul nuovo host, seguire la procedura di installazione Debian in modo che venga creato il database ed eseguire la procedura di setup via web (questo secondo passaggio non è strettamente necessario, in quanto il restore del database sovrascrive tutte le impostazioni).
- Fermare il cronjob
/etc/cron.d/cacti
sull'host vecchio e sul nuovo. - Effettuare il dump del database cacti (le credenziali si trovano in
/etc/cacti/debian.php
):mysqldump -u cacti -p cacti > cacti.dump
- Copiare tutti i file in
/var/lib/cacti/rra/
sul nuovo server mantenendo i permessi. - Effettuare il restore del database sul nuovo server (per le credenziali vedi sopra):
mysql -u cacti -p cacti < cacti.dump
- Ripristinare il cronjob sul nuovo host.
Problema con nsExtendOutput1Line
Le estensioni SNMP ottenute con il parametro extend di /etc/snmp/snmpd.conf
creano qualche problema in Cacti, almeno con la versione 0.8.8a di Debian 7 Wheezy.
Quando viene creata il Data Template si deve indicare il parametro OID che deve essere qualcosa del tipo:
NET-SNMP-EXTEND-MIB::nsExtendOutput1Line."pm2.5"
Purtroppo la pagina web di Cacti aggiunge dei backslash alle doppie virgolette, quindi il parametro viene memorizzato male nel database. Ecco come cercare le chiavi sbagliate nel database:
SELECT * FROM data_input_data WHERE VALUE LIKE '%nsExtendOutput1Line%'; SELECT local_data_id, arg1 FROM poller_item WHERE arg1 LIKE '%nsExtendOutput1Line%';
Questo un esempio di come correggere (modificare ovviamente il valore e gli ID):
UPDATE data_input_data SET VALUE = 'NET-SNMP-EXTEND-MIB::nsExtendOutput1Line."pm2.5"' WHERE data_input_field_id = 6 AND data_template_data_id = 178; UPDATE poller_item SET arg1 = 'NET-SNMP-EXTEND-MIB::nsExtendOutput1Line."pm2.5"' WHERE local_data_id = 103;
Problema con UTF-8
Alcuni caratteri speciali (ad esmempio il simbolo di grado Celsius) non vengono mostrati nei grafici RRD. Secondo questo bug report si tratta della funzione escapeshellarg()
di PHP invocata senza aver prima invocato un opportuno setlocale()
. Come workaround si consiglia di aggiungere tale chiamata di funzione nel file /usr/share/cacti/site/lib/auth.php
, ma per una installazione Debian ha più senso aggiungerlo nel file /etc/cacti/debian.php
.
Percentuale CPU e multi-core
L'installazione predefinita di Cacti mette a disposizione il template di grafico ucd/net - CPU Usage, che si basa sui seguenti OIDs:
- 1.3.6.1.4.1.2021.11.50.0 ⇒ ssCpuRawUser
- 1.3.6.1.4.1.2021.11.51.0 ⇒ ssCpuRawNice
- 1.3.6.1.4.1.2021.11.52.0 ⇒ ssCpuRawSystem
Il risultato è abbastanza approssimativo, anzitutto perché mancano alcune metriche (ad esempio ssCpuRawKernel, ssCpuRawInterrupt, ecc.), ma soprattutto non tiene conto dei sitemi multiprocessore o dei processori multicore. In effetti il valore complessivo ottenuto andrebbe diviso per il numero totale di CPU del sistema, altrimenti si ottiene un valore sovrastimato del carico percentuale. Vedere in proposito il post How to calculate CPU % based on raw CPU ticks in SNMP.
Una soluzione è quella proposta dall'utente Instigater nel forum di Cacti, si basa sui seguenti OIDs:
- 1.3.6.1.4.1.2021.11.50.0 ⇒ ssCpuRawUser
- 1.3.6.1.4.1.2021.11.51.0 ⇒ ssCpuRawNice
- 1.3.6.1.4.1.2021.11.52.0 ⇒ ssCpuRawSystem
- 1.3.6.1.4.1.2021.11.53.0 ⇒ ssCpuRawIdle
- 1.3.6.1.4.1.2021.11.54.0 ⇒ ssCpuRawWait
- 1.3.6.1.4.1.2021.11.55.0 ⇒ ssCpuRawKernel
- 1.3.6.1.4.1.2021.11.56.0 ⇒ ssCpuRawInterrupt
- 1.3.6.1.4.1.2021.11.61.0 ⇒ ssCpuRawSoftIRQ
inoltre sono definite due funzioni CDEFs che si occupano di normalizzare il valore rispetto al numero di CPU:
- Full ucd/net CPU Usage - Get percentage
- Full ucd/net CPU Usage - Total CPU Usage
Il file con il template cacti_graph_template_ucdnet_-_full_cpu_usage.zip ha però un bug, l'Item #12 usa la funzione CDEF sbagliata: Total CPU Usage invece di Get percentage.
Il template include le seguenti due funzioni CDEF:
Full ucd/net CPU Usage - Get percentage cdef=CURRENT_DATA_SOURCE,ALL_DATA_SOURCES_NODUPS,/,100,* Full ucd/net CPU Usage - Total CPU Usage cdef=ALL_DATA_SOURCES_NODUPS,h,-,ALL_DATA_SOURCES_NODUPS,/,100,*
La prima calcola la percentuale di ciascuna grandezza rispetto alla somma di tutte le altre (somma che include anche Idle, quindi ottiene effettivamente una percentuale). La seconda funzione esegue la somma di tutte le grandezze, quindi sottrae l'ottava (contrassegnata dalla lettera h, si tratta del tempo Idle) e calcola la percentuale rispetto alla somma di tutte. Questo produce la percentuale totale dell'uso della CPU. Tutti i calcoli producono una percentuale corretta rispetto al numero di CPU.