![]() |
This is a machine translation based on the English version of the article. It might or might not have already been subject to text preparation. If you find errors, please file a GitHub issue that states the paragraph that has to be improved. |
1. Introduzione
Il monitoraggio delle attività che vengono elaborate regolarmente o on demand, così come dei processi in esecuzione permanente, può essere effettuato, ad esempio, analizzando i file di log o di stato. Tuttavia, ciò comporta spesso uno sforzo aggiuntivo, poiché spesso è necessario leggere grandi volumi di dati per estrarre poche informazioni.
Per ridurre questo sforzo, Checkmk offre la possibilità a un programma agente di scrivere l'output direttamente in un file in formato agente Checkmk. Memorizzato nella cosiddetta directory di spool, l'agente raccoglie tutti questi file e ne integra il contenuto nell'output dell'agente. Il metodo che utilizza la directory di spool è utile, ad esempio, per
l'analisi regolare dei file di log,
il monitoraggio dei backup automatici,
la creazione e il controllo delle statistiche di utilizzo da un database,
quando il plug-in
mk-job
non è sufficiente per il controllo dei cronjob,lo sviluppo di controlli propri per testare l'output del campione.
In Checkmk, la directory di spool è supportata dagli agenti nei seguenti operatori: Windows, Linux, AIX, FreeBSD, OpenWrt e Solaris.
Per assicurarti di poter utilizzare questa funzione senza problemi, ci sono alcuni punti da tenere a mente.
2. Percorsi delle directory dei file
Il percorso predefinito della directory di spool è /var/lib/check_mk_agent/spool/
su Linux e altri file system Unix e C:\ProgramData\checkmk\agent\spool\
su Windows. Per Linux e Unix puoi personalizzare il percorso della directory madre con la regola Agent rules > Installation paths for agent files (Linux, UNIX) e l'opzione Base directory for variable data (caches, state files) disponibile.
Se stai lavorando su un host in fase di monitoraggio, puoi filtrare la directory di spool configurata dall'output dell'agente:
user@host:~$ check_mk_agent | grep SpoolDirectory
SpoolDirectory: /var/lib/check_mk_agent/spool
Checkmk utilizza un'unica directory di spool, che per impostazione predefinita è di proprietà di root
. Non sono previste directory multiple con proprietari diversi. Tuttavia, è possibile creare file di spool (inizialmente vuoti) nella directory di spool e rendere proprietario un altro utente, che può quindi sovrascrivere il contenuto del suo file.
3. Nomi e contenuti dei file
I file di spool possono contenere testo in qualsiasi formato processato da Checkmk. I file vengono aggiunti l'uno all'altro nell'ordine presente nella directory di spool. L'estensione del file utilizzata non ha importanza.
Se vuoi utilizzare uno schema numerico per l'ordinamento, fai precedere il nome del file da un trattino basso (_
), poiché i nomi dei file che iniziano con dei numeri servono come controllo dell'età. I file che iniziano con un punto vengono ignorati.
Per evitare confusione nel contenuto dei file concatenati, ogni file di spool deve iniziare con un'intestazione di sezione, cioè con un numero di pagine.
iniziare con un'intestazione di sezione, cioè una riga racchiusa tra
<<<
e>>>
, anche se nel file viene utilizzato solo il formato check locale,essere terminata con una nuova linea.
Quindi, un check locale che fornisce immediatamente un servizio può avere il seguente aspetto:
<<<local>>>
0 "Spool Test Dummy" - This static service is always OK
Allo stesso modo, puoi eliminare le uscite che richiedono un plug-in di controllo sul lato Checkmk:
<<<waterlevels>>>
rainbarrel 376
pond 15212
pool 123732
3.1. Terminazione della sezione piggyback
Se utilizzi delle sezioni piggyback in un file, termina questo file con la riga <<<<>>>>
. Questo è l'unico modo per garantire che se l'ordine di lettura cambia, l'output successivo a quello piggyback venga riassegnato all'host stesso.
4. Controllo dell'età dei file
Se un programma è in grado di scrivere correttamente sul suo file di uscita, tutto va bene, indipendentemente dal fatto che il processo sia andato a buon fine o meno. Ma cosa succede se un programma si interrompe prima di scrivere sul disco o se un errore del file system impedisce la scrittura di nuovi file?
In questa situazione hai la possibilità di anteporre al nome del file un numero intero, ad esempio 600MyCronjob
. In questo caso il numero sarà interpretato come l'età massima del file in secondi. Se il file è più vecchio, sarà ignorato dall'agente Checkmk e il servizio associato passerà allo stato SCONOSCIUTO a causa dell'output mancante. Nell'esempio di un file chiamato 3900_hourly_cleaner.txt
, il numero è stato scelto in modo appropriato per un cronjob che viene eseguito ogni ora e per il quale si prevede un tempo di esecuzione inferiore a cinque minuti.
5. Un esempio pratico
Supponiamo di gestire un servizio in cui gli utenti effettuano il log in e il log out. Nei file di log del servizio, troverai righe dei seguenti tre tipi:
21/Oct/2022:12:42:09 User harrihirsch logged in from 12.34.56.78
21/Oct/2022:12:42:23 User zoezhang logged out after 10 min idle
21/Oct/2022:13:00:00 Current user count: 739
Il processo non scrive la riga con Current user count
dopo ogni login/logout, ma a intervalli fissi. Se il numero di righe del file di log è abbastanza basso da poter essere letto rapidamente, puoi programmare un check locale. Questo check legge ogni volta l'intero file di log riga per riga e imposta sempre il conteggio degli utenti al valore visualizzato alle occorrenze della riga Current user count
. Alle occorrenze delle righe logged in
e logged out
aumenta o diminuisce il conteggio degli utenti. Alla fine, il check stampa una riga simile alla seguente:
1 "Frobolator User Count" count=1023 Watch out! Limit nearly used up.
Man mano che il servizio diventa più popolare, il check locale viene eseguito sempre più a lungo, finché a un certo punto questa soluzione, e anche l'esecuzione come plug-in asincrono dell'agente, non è più praticabile. È qui che l'uso corretto della directory di spool può aumentare notevolmente l'efficienza dell'esecuzione del check. Nei prossimi paragrafi, ti mostreremo come modificare il programma agente che ha fornito il check locale in modo che faccia un uso efficace della directory di spool.
Innanzitutto, il programma non deve terminare se stesso quando raggiunge la fine del file, ma scrivere un file di spool che contenga lo stato attuale del servizio quando il file di log viene valutato completamente:
<<<local>>>
2 "Frobolator User Count" count=1200 Maximum number of users reached!
Quindi lascia che il tuo programma attenda per un certo periodo di tempo - pochi secondi o diversi minuti, a seconda della frequenza delle nuove voci di log - e che valuti solo le nuove righe aggiunte e ricalcoli lo stato. Se i numeri sono cambiati, riscriverà il file di spool.
Per rilevare un eventuale crash di questo programma, dovresti nominare il file di spool di conseguenza, ad esempio 1800_frobolator.txt
- se 30 minuti senza aggiornare il file di spool indicano problemi con il servizio o il programma di valutazione.
Invece della directory del plugin dell'agente, avvia il programma come daemon utilizzando le opzioni del tuo sistema operativo. Presta attenzione al riavvio automatico, se il programma si blocca o viene terminato. Molte applicazioni server offrono anche l'opzione di inviare l'output del log a un altro programma, invece o in aggiunta alla scrittura dei normali file di log. Utilizzare questo meccanismo per uno script di valutazione che scrive file di spool è una buona idea.
6. Alcuni punti da considerare
La lettura dei file può presentare altre insidie rispetto al normale avvio dei processi da parte dell'agente. Considera i seguenti punti per un funzionamento senza problemi.
6.1. Set di caratteri
Checkmk si aspetta che l'output dell'agente sia esclusivamente codificato UTF-8 (senza Byte Order Mark / BOM) con una semplice newline (0x0A
o \n
) come interruzione di riga. Nel peggiore dei casi, le deviazioni possono portare a un output dell'agente che non può essere letto oltre il primo carattere di un file di spool non correttamente formattato. In particolare, ciò significa che:
Soprattutto nei sistemi Windows e Linux più vecchi, assicurati che i file di spool non siano scritti con la codifica Windows 1250-1258 o ISO 8859. Se ciò è inevitabile, assicurati che venga utilizzata solo l'intersezione con UTF-8 - de facto ASCII a 7 bit.
Soprattutto nei sistemi Windows più recenti, assicurati che i file di spool non siano scritti con la codifica UTF-16 utilizzata come standard.
In particolare, i linguaggi di script su Windows spesso scrivono automaticamente questa sequenza di caratteri, che indica la codifica utilizzata, nei file di output. Nell'output dell'agente, impedisce a
<<<
di apparire all'inizio di una riga.Usa l'interruzione di riga di Unix (
0x0A
o\n
). Anche Windows spesso usa la stringaCRLF
(0x0D 0x0A
o\r\n
).
Se un file di spool causa un comportamento indesiderato, esamina le prime righe con un editor esadecimale:
0xFF 0xFE
indica un file codificato UTF-16: in questo caso, modifica gli script in modo da ottenere l'output in UTF-8.0xEF 0xBB 0xBF
indica UTF-8 con BOM: in questo caso è solitamente sufficiente scrivere il file senza BOM in futuro.
6.2. Soft link e named pipe
In linea di principio, i file nella directory di spool possono essere anche soft link o named pipe. Va notato che il controllo dell'età tramite i nomi dei file non funziona in questo caso perché viene valutata l'età del soft link o della named pipe stessa e non l'età dei dati scritti. Per le named pipe, devi anche assicurarti che il processo che scrive sulla pipe fornisca sempre i dati. Se non vengono forniti, l'agente Checkmk aspetterà per sempre e alla fine andrà in timeout.
Se devi permettere a utenti non privilegiati di scrivere sui file di spool, crea dei file vuoti per questi utenti e imposta la loro proprietà di conseguenza. Questi utenti possono poi impostare un soft link da soli o scrivere direttamente sul file di spool.
6.3. Blocco e buffering
Quando si scrivono programmi lunghi che scrivono più righe di stato su un file di spool, si è tentati di aprire la scrittura del file di output all'avvio del programma. Tuttavia, in questo caso il file rimarrà completamente vuoto fino a quando il buffer di scrittura non verrà svuotato e scritto nella destinazione e rimarrà incompleto fino a quando il programma di scrittura non avrà chiuso il file. Lo stesso vale se un file viene bloccato esclusivamente per la durata di una lunga operazione di scrittura.
Per questo motivo, dovresti scrivere sul file di output solo quando l'intero contenuto da scrivere è disponibile, oppure scrivere su un file temporaneo che poi copierai nella directory di spool - o ancora, utilizzare cat
per trasferire il contenuto di un file temporaneo a uno esistente nella directory di spool.
6.4. Mantenere una panoramica
Un altro problema può verificarsi quando diversi programmi cercano di scrivere su file con lo stesso nome. Con molti file di spool, è facile perdere traccia di quale programma scrive effettivamente su quale file di spool. In particolare, se un file di spool non formattato correttamente rende inutilizzabile una parte dell'output del programma agente, questo è molto fastidioso e può comportare una lunga ricerca.
Puoi mantenere l'ordine creando un file con lo stesso nome, preceduto da un punto, per ogni file di spool, che contenga informazioni sul lavoro e un contatto, se applicabile. Il contenuto di questo file nascosto non viene trasferito.