Checkmk
to checkmk.com
Important

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. Perché i controlli locali?

Checkmk monitora già molti tipi di dati rilevanti utilizzando un gran numero di plug-in di controllo standard. Tuttavia, ogni ambiente IT è unico, per cui spesso possono sorgere esigenze molto specifiche. Con i check locali hai la possibilità di estendere l'agente Checkmk sull'host di destinazione per creare in modo semplice e veloce i tuoi servizi.

Questi plug-in di controllo locali si differenziano per un aspetto significativo dagli altri controlli: il calcolo di uno stato avviene direttamente nell'host su cui vengono recuperati i dati. In questo modo non è necessaria la complessa creazione di controlli in Python e la scelta del linguaggio di codifica per gli script è completamente libera.

2. Scrivere un semplice check locale

2.1. Creazione dello script

Un controllo locale può essere scritto in qualsiasi linguaggio di programmazione supportato dallo stato dell'host di destinazione. Lo script deve essere costruito in modo che ogni controllo produca una riga di stato composta da quattro parti. Ecco un esempio:

0 "My service" myvalue=73 My output text which may contain spaces

Le quattro parti sono separate da spazi vuoti e hanno il seguente significato:

Esempio di valore Significato Descrizione

0

Stato

Lo stato del servizio viene indicato con un numero: 0 per OK, 1 per WARN, 2 per CRIT e 3 per SCONOSCIUTO. In alternativa, lo stato può essere calcolato dinamicamente: il numero viene sostituito da P.

"My service"

Nome del servizio

Il nome del servizio come mostrato in Checkmk, nell'output del controllo tra doppi apici.

myvalue=73;65;75

Valore e metriche

Valori metrici dei dati. Per maggiori informazioni sulla costruzione dei valori, consulta il capitolo sulle metriche. In alternativa è possibile inserire un segno meno se il controllo non produce metriche.

My output text which may contain spaces

Dettagli sullo stato

I dettagli dello stato come saranno mostrati in Checkmk. Questa parte può contenere anche degli spazi vuoti.

Tra le quattro parti di questo output deve sempre esserci esattamente uno spazio (ASCII 0x20). All'interno dei dettagli dello stato, gli spazi possono essere utilizzati in qualsiasi ordine.

Important

Eventuali deviazioni dalle specifiche appena descritte possono funzionare, ma non devono. Le versioni future di Checkmk potrebbero applicare questo formato di output e ignorare i check locali che si discostano.

Se non sei sicuro di un possibile output, puoi semplicemente testarlo scrivendo un piccolo script con il comando echo. Inserisci l'output che vuoi testare nel comando echo. Il nostro esempio utilizza le virgolette doppie all'esterno, poiché le variabili all'interno (variabili d'ambiente e quelle impostate nello script) vengono valutate. Di conseguenza, devi racchiudere le virgolette per il nome del servizio con \ in modo che questi caratteri non vengano interpretati dalla shell come la fine e l'inizio di una stringa (e quindi rimossi dall'output):

mylocalcheck
#!/bin/bash
echo "0 \"My 1st service\" - This static service is always OK"

Per gli host Windows, lo script avrà un aspetto molto simile a questo:

mylocalcheck.bat
@echo off
echo 0 "My 1st service" - This static service is always OK

Entrambi gli script producono lo stesso risultato nell'output:

0 "My 1st service" - This static service is always OK

Per Checkmk è importante solo l'output, non il modo in cui è stato creato.

A proposito: puoi scrivere un numero qualsiasi di output in uno script. Ogni linea di output avrà il proprio servizio creato in Checkmk. Pertanto, non sono ammessi caratteri di newline nell'output, a meno che non siano mascherati, ad esempio per un output multilinea in Checkmk.

Il modo in cui è possibile verificare se lo script locale verrà invocato correttamente dall'agente è illustrato nell'analisi degli errori.

Important

Se viene utilizzato il core di Nagios (sempre nel Checkmk Raw), i seguenti caratteri speciali non sono ammessi nel nome del servizio:
`;~!$%^&*|\'"<>?,()=
Se questi caratteri sono ancora presenti nei nomi del servizio, vengono semplicemente rimossi in Checkmk.

Nelle edizioni commerciali con Checkmk Micro Core (CMC), il punto e virgola (;) non è consentito nel nome. Il simbolo del dollaro ($) viene visualizzato solo se viene evaso con un backslash (\).

Quanto segue si applica a tutte le versioni: Se nel nome del servizio compaiono delle virgolette singole, il servizio non verrà trovato dal riconoscimento del servizio!

2.2. Distribuire lo script

Una volta che lo script è stato scritto, può essere distribuito ai nomi host appropriati. Il percorso utilizzato dipende dal sistema operativo. Un elenco dei nomi dei percorsi si trova in File e directory qui sotto.

Non dimenticare di rendere lo script eseguibile sui sistemi Unix. Il percorso mostrato in questo esempio è per Linux:

root@linux# chmod +x /usr/lib/check_mk_agent/local/mylocalcheck

Se utilizzi l'Agent Bakery, lo script può essere distribuito con una procedura rule-based. Per maggiori informazioni sulla creazione di regole, consulta il capitolo Distribuzione tramite Agent Bakery.

2.3. Aggiungere il servizio al monitoraggio

Ad ogni invocazione dell'agente Checkmk, anche il check locale contenuto nello script verrà eseguito e aggiunto all'output dell'agente. Anche la scoperta del servizio funziona automaticamente come per gli altri servizi:

localchecks services

Una volta aggiunto il servizio al monitoraggio e attivate le modifiche, l'implementazione del servizio auto-creato con l'aiuto di un check locale sarà completa. Se dovesse sorgere un problema durante la scoperta del servizio, l'analisi degli errori può essere d'aiuto.

3. Funzioni estese

3.1. Metriche

Con un check locale è possibile impostare anche le metriche. Per attivarle, il valore del check deve sempre restituire P. Poi lo stato verrà calcolato da Checkmk.

La sintassi generale per questi dati è la seguente:

metricname=value;warn;crit;min;max

dove value è il valore corrente, warn e crit impostano le soglie (superiori) e min e max fissano l'intervallo di valori - ad esempio in questo modo:

count=73;80;90;0;100

Tutti i valori sono separati da un punto e virgola. Tutti i valori, ad eccezione di value, sono facoltativi. Se un valore non è richiesto, il campo rimane vuoto o viene omesso alla fine, come nel caso di warn, crit e max:

count=42;;;0

Nota: nelle edizioni commerciali i valori di min e max possono essere impostati, ma solo per motivi di compatibilità. Limitare il grafico associato a un certo intervallo di valori non ha alcun effetto nelle edizioni commerciali.

3.2. Nome della metrica

Devi prestare particolare attenzione alla scelta dell'identificativo di questa metrica, che nell'esempio qui riportato si chiama metricname. Ti consigliamo di anteporre il prefisso all'identificativo per evitare sovrapposizioni con metriche già presenti in Checkmk.

Quindi, ad esempio, invece di chiamare semplicemente "corrente" una metrica che rappresenta il numero di richieste in attesa in una coda che stai monitorando, ti consigliamo di usare un identificatore più chiaro con un prefisso, ad esempio: mycompany_current_requests.

Se dovessi scegliere un identificatore che esiste già in Checkmk, la rappresentazione delle metriche nei grafici verrebbe sovrascritta con le definizioni già esistenti.

Naturalmente, puoi anche riutilizzare intenzionalmente una metrica esistente in Checkmk. Ad esempio, per la metrica della corrente elettrica puoi semplicemente utilizzare l'identificatorecurrent nel tuo check locale. In caso di dubbio, però, dovrai cercare da solo la definizione di questa metrica in ~/lib/python3/cmk/gui/plugins/metric.

OMD[mysite]:~$ grep -r -A 4 'metric_info\["current"\]' ./lib/python3/cmk/gui/plugins/metrics/

3.3. Metriche multiple

È anche possibile ottenere l'output di più metriche, separate dal carattere "pipe" |, ad esempio in questo modo:

count1=42|count2=23

Attenzione: Negli host Windows devi anteporre un caret (^) alla pipe nello script, in modo che non venga interpretata.

mylocalcheck.bat
@echo off
echo 0 "My 2nd service" count1=42^|count2=23 A service with 2 graphs

Un output completo con due metriche sarà simile a questo:

root@linux# /usr/lib/check_mk_agent/local/mylocalcheck
0 "My 2nd service" count1=42|count2=23 A service with 2 graphs

Dopo aver incluso il nuovo servizio nel monitoraggio, vedrai il testo dello stato del servizio nel campo Summary dell'elenco dei servizi. Dopo aver fatto clic sul servizio, verrà visualizzata la pagina con i dettagli del servizio. Le metriche sono mostrate nel campo Details e sotto di esso vedrai i grafici del servizio generati automaticamente da Checkmk:

localchecks graphs2

3.4. Calcolo dinamico dello stato

Nei capitoli precedenti hai imparato come impostare i valori di soglia per le metriche e come visualizzarli nei grafici. Il passo successivo è quello di utilizzare queste soglie per calcolare dinamicamente lo stato del servizio. Checkmk offre esattamente queste opzioni per estendere un check locale.

Se inserisci la lettera P invece di un numero nel primo campo dell'output che determina lo stato, lo stato del servizio verrà calcolato in base alla soglia fornita.

L'output sarà quindi simile a questo:

root@linux# /usr/lib/check_mk_agent/local/mylocalcheck
P "My 1st dynamic service" count=40;30;50 Result is computed from two threshold values
P "My 2nd dynamic service" - Result is computed with no values

... e la visualizzazione in un servizio sarà come questa:

localchecks dynsrv

La visualizzazione differisce in due punti da quella vista in precedenza:

  • Per i servizi nello stato WARN o CRIT, il sito Summary del servizio mostra tutte le informazioni importanti sulle metriche (nome, valore, soglie). Ciò significa che puoi sempre vedere come questo stato è stato calcolato da un valore. Per tutti gli altri stati, le informazioni sulle metriche sono visualizzate solo nel campo Details.

  • Se non è stata superata alcuna metrica, lo stato del servizio sarà sempre OK.

3.5. Soglie superiori e inferiori

Alcuni parametri hanno non solo una soglia superiore ma anche una soglia inferiore. Un esempio è l'umidità. In questi casi, il check locale ha la possibilità di passare due valori di soglia per gli stati WARN e CRIT, separati da due punti e che rappresentano rispettivamente il valore di soglia inferiore e superiore.

La sintassi generale è la seguente:

metricname=value;warn_lower:warn_upper;crit_lower:crit_upper

... e nell'esempio è così:

root@linux# /usr/lib/check_mk_agent/local/mylocalcheck
P "My 3rd service" humidity=37;40:60;30:70 A service with lower and upper thresholds

... e nella visualizzazione di un servizio si presenta così:

localchecks lower

Se ti interessa solo la soglia inferiore, tralascia i campi della soglia superiore:

root@linux# /usr/lib/check_mk_agent/local/mylocalcheck
P "My 4th dynamic service" count_lower=37;40:;30: A service with lower thresholds only

Con questo output, specifichi che il servizio deve diventare WARN se il valore è inferiore a 40 e CRIT se è inferiore a 30: quindi, al valore specificato di 37, il servizio otterrà lo stato WARN.

3.6. Uscite su più righe

È disponibile anche l'opzione di distribuire un output su più righe. Poiché Checkmk viene eseguito in ambiente Linux, puoi utilizzare la sequenza Escape '\n' per forzare un'interruzione di riga. Anche se a causa del linguaggio di script il backslash stesso deve essere evaso, verrà interpretato correttamente da Checkmk:

root@linux# /usr/lib/check_mk_agent/local/mylocalcheck
P "My service" humidity=37;40:60;30:70 My service output\nA line with details\nAnother line with details

Nei dettagli del servizio, queste righe aggiuntive saranno visibili sotto la dicitura Summary:

localchecks srv details

3.7. Esecuzione asincrona e cache dell'output

L'output dei controlli locali, come quello dei plug-in dell'agente, può essere memorizzato nella cache. Questo può essere necessario se uno script ha un tempo di elaborazione più lungo. Tale script viene eseguito in modo asincrono e solo in un intervallo di tempo definito e l'ultimo output viene memorizzato nella cache. Se l'agente viene interrogato di nuovo prima della scadenza del tempo, utilizza questa cache per il check locale e lo restituisce nell'output dell'agente.

Nota: la cache è disponibile solo per AIX, FreeBSD, Linux, OpenWrt e Windows.

Configurazione di Linux

In Linux o in un altro sistema operativo Unix, qualsiasi plug-in può essere eseguito in modo asincrono. Per un check locale, la configurazione necessaria è molto simile a quella di un plug-in. A tal fine, crea una sottodirectory chiamata per il numero di secondi in cui vuoi che l'output venga memorizzato nella cache e inserisci il tuo script in quella sottodirectory.

Nell'esempio seguente, il check locale verrà eseguito solo ogni 10 minuti (600 secondi):

root@linux# /usr/lib/check_mk_agent/local/600/mylocalcheck
2 "My cached service" count=4 Some output of a long running script

I dati in cache vengono scritti in una directory cache.

Per un servizio che fornisce dati in cache, le informazioni specifiche della cache vengono aggiunte alla visualizzazione del servizio:

localchecks srv cached

Configurazione di Windows

Anche in Windows la configurazione è analoga a quella di un plug-in. Invece di utilizzare una sottodirectory speciale come in Linux & Co, le opzioni vengono impostate in un file di configurazione:

C:\ProgramData\checkmk\agent\check_mk.user.yml
local:
    enabled: yes
    execution:
        - pattern     : $CUSTOM_LOCAL_PATH$\mylocalcheck.bat
          async       : yes
          run         : yes
          cache_age   : 600

Come puoi vedere sopra, in Windows puoi configurare separatamente l'esecuzione asincrona (con async) e l'intervallo di tempo (con cache_age).

In alternativa, su Windows puoi anche effettuare la configurazione nell'agent bakery.

4. Distribuzione tramite l'Agent bakery

Se stai già utilizzando l'Agent bakery, puoi distribuire gli script con i check locali a diversi host anche in questo modo.

Per farlo, crea prima la directory custom sul server Checkmk come utente dell'istanza Checkmk sotto ~/local/share/check_mk/agents/ e in essa una sottodirectory per ogni pacchetto di check locali:

OMD[mysite]:~$ cd ~/local/share/check_mk/agents
OMD[mysite]:~$ ~/local/share/check_mk/agents$ mkdir -p custom/mycustompackage/lib/local/

La directory del pacchetto nell'esempio precedente è mycustompackage. Sotto di essa, la directory lib contrassegna lo script come plug-in di controllo o come check locale. La successiva directory local alloca quindi il file in modo esplicito. Inserisci lo script con il check locale in questa directory.

Importante: Su Linux, puoi configurare l'esecuzione asincrona in modo analogo a quanto descritto nel capitolo precedente, creando una directory sotto custom/mycustompackage/lib/local/ con il numero di secondi dell'intervallo di esecuzione e collocandovi lo script. In Windows, puoi utilizzare i set di regole Set execution mode for plugins and local checks e Set cache age for plugins and local checks. Questi e altri set di regole per i check locali in Windows si trovano nell'agent bakery all'indirizzo Agent rules > Windows Agent.

Nell'ambiente di configurazione di Checkmk, la directory dei pacchetti mycustompackage verrà visualizzata come una nuova opzione: apri Setup > Agents > Windows, Linux, Solaris, AIX, crea una nuova regola con Agents > Agent rules > Generic options > Deploy custom files with agent e seleziona il pacchetto appena creato:

localchecks custom

Checkmk integrerà quindi autonomamente il check locale nel pacchetto di installazione per il sistema operativo appropriato. Dopo aver attivato le modifiche e aver infornato l'agente, la configurazione sarà completa. Ora gli agenti devono solo essere distribuiti.

5. Analisi degli errori

5.1. Testare lo script

Se incontri dei problemi con uno script scritto da te, devi controllare le seguenti potenziali fonti di errore:

  • Lo script si trova nella directory corretta?

  • Lo script è eseguibile e i permessi di accesso sono corretti? Questo è particolarmente importante se non stai eseguendo l'agente o lo script sotto root o l'account LocalSystem.

  • L'output è conforme alla sintassi indicata? L'output del check locale deve essere conforme alla sintassi descritta nei capitoli Creazione dello script e Funzioni estese, altrimenti non è possibile garantire un'esecuzione priva di errori.

    I problemi e gli errori possono sorgere in particolare quando un check locale è destinato a svolgere un'attività che richiede un vero e proprio plug-in di controllo, ad esempio quando l'output del check locale stesso contiene un header di sezione o la definizione di un nome host utilizzato per il trasporto di dati piggyback.

Tip

In Linux, quando lo script dell'agente o il plug-in viene richiamato direttamente in una shell, potrebbero essere disponibili variabili d'ambiente diverse rispetto a quando viene richiamato dall'Agent Controller dell'agente Checkmk. In Windows, anche l'Agent Controller viene eseguito sotto l'account LocalSystem, ma la chiamata nel terminale viene effettuata sotto un normale user o amministratore. Oltre alle variabili d'ambiente, questo può significare che mancano i permessi. Per poter analizzare l'output dello script dell'agente il più vicino possibile alle condizioni in cui viene richiamato l'agente Checkmk, dovresti utilizzare l'Agent Controller in modalità dump, se possibile.

5.2. Testare l'output dell'agente sull'host di destinazione

Se lo script è corretto, è possibile eseguire l'agente sull'host. Con i sistemi operativi Unix come Linux, BSD, ecc. è disponibile il comando seguente. Con l'opzione -A è possibile specificare il numero di righe aggiuntive da visualizzare dopo un hit. Questo numero può essere personalizzato in base al numero di righe di output previste:

root@linux# cmk-agent-ctl dump | grep -v grep | grep -A2 "<<<local"
<<<local:sep(0)>>>
P "My service" humidity=37;40:60;30:70 My service output\nA line with details\nAnother line with details
cached(1618580356,600) 2 "My cached service" count=4 Some output of a long running script

Nell'ultima riga, puoi riconoscere un servizio cache dalle informazioni precedenti di cache con l'intervallo di tempo Unix corrente e l'intervallo di esecuzione in secondi.

In Windows, con PowerShell e la Cmdlet Select-String puoi ottenere un risultato molto simile a quello ottenuto con il comando grep in Linux. Nel comando seguente, le due cifre dietro il parametro Context determinano il numero di righe da emettere prima e dopo l'hit:

PS C:\Program Files (x86)\checkmk\service> ./cmk-agent-ctl.exe dump | Select-String -Pattern "<<<local" -Context 0,3
> <<<local:sep(0)>>>
  0 "My 1st service" - This static service is always OK

  cached(1618580520,600) 1 "My cached service on Windows" count=4 Some output of a long running script
Tip

A seconda dell'ambiente, del linguaggio di programmazione utilizzato, della versione di Windows e di altre condizioni, in Windows ci si trova spesso di fronte al set di caratteri UTF-16. Inoltre, è frequente la combinazione di Carriage Return e Line Feed per le interruzioni di riga. Tuttavia, Checkmk, in quanto applicazione Linux, si aspetta UTF-8 e Line Feed semplici senza se e senza ma. Il nostro articolo sulla directory di spool include un capitolo che spiega la risoluzione dei problemi legati al set di caratteri.

5.3. Test dell'output dell'agente Checkmk sul server Checkmk

Come ultimo passo, il processo di output dello script può essere testato sul server Checkmk con il comando cmk - una volta per la scoperta del servizio:

OMD[mysite]:~$ cmk -IIv --detect-plugins=local mycmkserver
Discovering services and host labels on: mycmkserver
mycmkserver:
...
+ EXECUTING DISCOVERY PLUGINS (1)
  2 local
SUCCESS - Found 2 services, no host labels

... e anche il processo dell'output del servizio con un comando simile:

OMD[mysite]:~$ cmk -nv --detect-plugins=local mycmkserver
Checkmk version 2.0.0p2
+ FETCHING DATA
...
+ PARSE FETCHER RESULTS
Received no piggyback data
My cached service    Some output of a long running script(!!), Cache generated 6 minutes 52 seconds ago, Cache interval: 10 minutes 0 seconds, Elapsed cache lifespan: 68.71%
My service           My service output\, humidity: 37.00 (warn/crit below 40.00/30.00)(!)

Per entrambi i comandi abbiamo accorciato l'output delle righe non rilevanti per questo tema.

Se ci sono errori in un check locale, Checkmk li identificherà nell'output del servizio. Questo vale anche per le metriche errate, per le informazioni false o incomplete nell'output dello script o per uno stato del servizio non valido. Questi messaggi di errore dovrebbero aiutare a identificare rapidamente gli errori in uno script.

6. File e directory

6.1. Directory degli script sull'host di destinazione

Nome del percorso Sistema operativo

/usr/check_mk/lib/local/

AIX

/usr/local/lib/check_mk_agent/local/

FreeBSD

/usr/lib/check_mk_agent/local/

HP-UX, Linux, OpenBSD, OpenWrt e Solaris

%ProgramData%\checkmk\agent\local

Windows

6.2. Directory cache sull'host di destinazione

I dati della cache delle singole sezioni, compresa la sezione local, vengono archiviati qui e aggiunti nuovamente all'agente ad ogni esecuzione, finché i dati sono validi.

Nome del percorso Sistema operativo

/tmp/check_mk/cache/

AIX

/var/run/check_mk/cache/

FreeBSD

/var/lib/check_mk_agent/cache/

Linux, OpenWrt e Solaris

In questa pagina