====== 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 **[[http://www.hardened-php.net/suhosin/|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: {{ping_cacti.png?350}} 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 **{{ping_latency.pl.txt|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: {{cacti_graph_template.png?180|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: **[[http://forums.cacti.net/about11288.html|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 [[http://docs.cacti.net/usertemplate:data:host_mib:diskio|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 [[http://bugs.cacti.net/view.php?id=2533|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 **[[https://serverfault.com/questions/441897/how-to-calculate-cpu-based-on-raw-cpu-ticks-in-snmp|How to calculate CPU % based on raw CPU ticks in SNMP]]**. Una soluzione è quella proposta dall'utente **Instigater** nel **[[https://forums.cacti.net/viewtopic.php?p=190739|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 [[https://forums.cacti.net/download/file.php?id=20704|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**.