User Tools

Site Tools


doc:appunti:linux:sa:cacti

This is an old revision of the document!


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:

Console, Graph Templates

/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):

  1. 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.
  2. 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 sa automaticamente 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:

  1. Dal menu Devices si sceglie l'host interessato e nella sezione Associated Data Queries si aggiunge la query SNMP - Get Mounted Partitions.
  2. 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.

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.

  1. Dall'archivio estrarre il file disk_io.xml e copiarlo in /usr/share/cacti/resource/snmp_queries.
  2. Estrarre il file cacti087d_data_query_snmp_-_get_disk_io.xml e importarlo nell'interfaccia web: ConsoleImport Templates.
  3. Aprire il device (host) interessato e cliccare su Add Data QuerySNMP - Get Disk IO.
  4. 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.

doc/appunti/linux/sa/cacti.1480328272.txt.gz · Last modified: 2016/11/28 11:17 by niccolo