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. Introduzione

Livestatus è l'interfaccia più importante di Checkmk: è il modo più veloce per ottenere tutti i dati degli host e dei servizi monitorati, compresi quelli in tempo reale. Ad esempio, i dati della panoramica vengono recuperati direttamente da questa interfaccia. Poiché vengono letti direttamente dalla RAM, si evita il lento accesso al disco rigido, garantendo così un accesso rapido al monitoraggio senza gravare troppo sul sistema.

Per strutturare i dati, questi sono organizzati in tabelle e colonne. La tabella hosts comprende, ad esempio, le colonne name,state e numerose altre. Ogni riga della tabella hosts rappresenta un host, la tabella services un servizio e così via. In questo modo i dati possono essere ricercati e recuperati in modo semplice.

Questo articolo dovrebbe aiutarti a utilizzare questa interfaccia per le tue query, estensioni e personalizzazioni. Come utente di un'istanza, puoi testare direttamente tutte le query e i comandi contenuti in questo articolo, utilizzando il copia e incolla.

2. Il linguaggio di interrogazione Livestatus (LQL)

2.1. Usare l'LQL nella shell

L'accesso a Livestatus avviene tramite un Unix-Socket utilizzando ilLivestatus Query Language (LQL). La sua sintassi è basata su HTTP.

Tramite la linea di comando ci sono diversi modi per accedere all'interfaccia. Una possibilità è quella di utilizzare i comandi printf e unixcat per inviare un'istruzione al socket. Lo strumento unixcat è già incluso in Checkmk per gli utenti di istanza. Importante: tutti gli input al socket sono sensibili alle maiuscole e minuscole, quindi bisogna sempre rispettarle:

OMD[mysite]:~$ printf "GET hosts\nColumns: name\n" | unixcat ~/tmp/run/live

L'interfaccia si aspetta che tutti i comandi e le intestazioni vengano inseriti in una riga separata. Puoi segnare un'interruzione di riga con \n. In alternativa al comando di cui sopra, puoi anche utilizzare il comando script lq, che ti risparmia un po' di lavoro grazie al completamento automatico di alcuni campi durante l'inserimento:

OMD[mysite]:~$ lq "GET hosts\nColumns: name"

Oppure puoi avviare il flusso di inserimento interattivo e inserire il comando seguito dall'intestazione. Con una riga vuota esegui il comando con la sua intestazione e con un'altra riga termini l'accesso al socket. Nota che nell'esempio, tutto ciò che precede la riga vuota appartiene al comando, mentre tutto ciò che è compreso tra la prima e la seconda riga vuota è la risposta:

OMD[mysite]:~$ lq
GET hosts
Columns: name

myserver123
myserver124
myserver125

OMD[mysite]:~$

I seguenti esempi vengono sempre eseguiti con il comando lq: nel modulo diretto quando la richiesta è breve e come flusso di ingresso per le richieste più lunghe.

Comandi LQL

Nei primi esempi hai già visto il primo dei due comandi: con GET puoi richiamare tutte le tabelle disponibili. Nel riferimento ai comandi puoi trovare un elenco completo, con una descrizione, di tutte letabelle disponibili; questo articolo contiene anche una spiegazione generale sull'uso di Livestatus.

Con COMMAND puoi impartire comandi direttamente al core, ad esempio per impostare un tempo di manutenzione programmata o per disattivare completamente le notifiche. Un elenco di tutti i comandi disponibili si trova in ogni caso nella sezione Comandi.

Intestazioni LQL

Per ogni comando GET puoi inserire varie intestazioni per limitare i risultati di una query, per visualizzare solo colonne specifiche di una tabella e molto altro ancora. Di seguito sono elencate le due intestazioni più importanti:

Intestazione Descrizione

Colonne

La query produrrà solo le colonne specificate.

Filtro

Verranno prodotte solo le voci che soddisfano una condizione specifica.

Un elenco di tutte le intestazioni, ciascuna con una breve descrizione, è disponibilequi.

Mostra le colonne e le tabelle disponibili

Non è possibile ricordare tutte le tabelle e le relative colonne e l'accesso a questo manuale (con i riferimenti nella versione online) potrebbe non essere sempre possibile. Tuttavia, è possibile creare rapidamente una query che fornisca le informazioni desiderate. Per ottenere un elenco di tutte le tabelle disponibili, invia la seguente query ed elimina le righe duplicate nell'output consort. Nell'output si possono visualizzare le prime quattro righe come esempio:

OMD[mysite]:~$ lq "GET columns\nColumns: table" | sort -u
columns
commands
comments
contactgroups

Per una query su tutte le colonne di una tabella devi ovviamente specificarle. Sostituisci hosts con la tabella desiderata. Anche in questo caso le prime quattro righe dell'output possono essere visualizzate come esempio:

OMD[mysite]:~$ lq "GET columns\nFilter: table = hosts\nColumns: name"
accept_passive_checks
acknowledged
acknowledgement_type
action_url

2.2. Usare LQL in Python

Poiché Checkmk si basa molto su Python, gli script in questo linguaggio sono pratici. Il seguente script può essere utilizzato come base per accedere al socket Livestatus:

live_example.py
#!/usr/bin/env python
# Sample program for accessing Livestatus from Python

import json, os, socket

# for local site only: file path to socket
address = "%s/tmp/run/live" % os.getenv("OMD_ROOT")
# for local/remote sites: TCP address/port for Livestatus socket
# address = ("localhost", 6557)

# connect to Livestatus
family = socket.AF_INET if type(address) == tuple else socket.AF_UNIX
sock = socket.socket(family, socket.SOCK_STREAM)
sock.connect(address)

# send our request and let Livestatus know we're done
sock.sendall(str.encode("GET status\nOutputFormat: json\n"))
sock.shutdown(socket.SHUT_WR)

# receive the reply as a JSON string
chunks = []
while len(chunks) == 0 or chunks[-1] != "":
    data = sock.recv(4096)
    chunks.append(str(data.decode("utf-8")))
sock.close()
reply = "".join(chunks)

# print the parsed reply
print(json.loads(reply))

2.3. Usare l'API di Livestatus

Checkmk fornisce un'API per i linguaggi di programmazione Python, Perl e C++ che semplifica l'accesso a Livestatus. Per ogni linguaggio è disponibile un codice di esempio che ne spiega l'utilizzo. I percorsi di questi esempi si trovano nel capitolo File e directory.

3. Query semplici

3.1. Interrogazione di colonne (Colonne)

Negli esempi che abbiamo visto finora, sono state interrogate TUTTE le informazioni di TUTTI gli host. In pratica, però, è probabile che si abbia bisogno solo di colonne specifiche. Con l'intestazione Columns, già menzionata, l'output può essere limitato a questa colonna. I nomi delle singole colonne saranno separati da un semplice carattere vuoto.

OMD[mysite]:~$ lq "GET hosts\nColumns: name address"
myserver123;192.168.0.42
myserver234;192.168.0.73

Come si può vedere, in una riga i singoli valori sono separati da un punto e virgola.

Importante: se si utilizzano queste intestazioni, l'intestazione viene soppressa nell'output, che può essere reinserito nell'output con l'intestazione ColumnHeaders.

3.2. Impostazione di un semplice filtro

Per limitare la query a righe specifiche, le colonne possono essere filtrate per contenuti specifici. Se si vogliono cercare solo i servizi con uno stato specifico, questo può essere ottenuto con un filtro:

OMD[mysite]:~$ lq "GET services\nColumns: host_name description state\nFilter: state = 2"
myserver123;Filesystem /;2
myserver234;ORA MYINST Processes;2

Nell'esempio verranno cercati tutti i servizi con stato CRIT e verranno visualizzati il nome dell'host, la descrizione del servizio e il suo stato. Questi filtri possono ovviamente essere combinati e limitati ai servizi con statoCRIT e che non sono ancora stati confermati:

OMD[mysite]:~$ lq "GET services\nColumns: host_name description state\nFilter: state = 2\nFilter: acknowledged = 0"
myserver234;Filesystem /;2

Come si può vedere, è possibile filtrare anche per colonne che non sono elencate in Columns.

Operatori ed espressioni regolari

Finora sono stati filtrati solo i numeri corrispondenti. Il risultato intermedio di una query può essere ricercato anche per "meno di" con i numeri o per stringhe di caratteri. Gli operatori disponibili si trovano nel capitolo Operatoridel riferimento del comando. In questo modo puoi, ad esempio, filtrare per espressioni regolari nelle colonne:

OMD[mysite]:~$ lq "GET services\nColumns: host_name description state\nFilter: description ~~ exchange database|availability"
myserver123;Exchange Database myinst1;1
myserver123;Exchange Availability Service;0
myserver234;Exchange Database myinst3;0

Con l'operatore giusto puoi cercare nelle colonne in vari modi. Livestatus interpreterà sempre un'espressione come "può apparire in qualsiasi punto della colonna", a patto che non sia stata definita diversamente. Indica l'inizio di una riga con, ad esempio, il carattere ^ e la fine di una riga con il carattere $. Un elenco completo di tutti i caratteri speciali delle espressioni regolari di Checkmk è disponibile nell'articolo dedicato alle espressioni regolari.

3.3. Ordinare l'output (OrderBy)

Puoi utilizzare l'intestazione OrderBy per ordinare l'output in base al contenuto di qualsiasi colonna o anche ai valori di qualsiasi chiave del dizionario. Questo ti permette di creare un elenco alfabetico di tutti gli host, ad esempio:

OMD[mysite]:~$ lq "GET hosts\nColumns: name\nOrderBy: name"
ahost
anotherhost
yetanotherhost

Implicitamente, l'output è ordinato in ordine crescente (asc) come previsto. Tuttavia, puoi anche specificare esplicitamente l'ordinamento desiderato e annullarlo specificando desc`:

OMD[mysite]:~$ lq "GET hosts\nColumns: name\nOrderBy: name desc"
yetanotherhost
anotherhost
ahost

Con query un po' più lunghe e con un ordinamento basato, ad esempio, sui dati relativi alle prestazioni, è possibile creare interessanti elenchi. Nell'esempio seguente, gli host vengono visualizzati in ordine decrescente in base al loro tempo di attività:

OMD[mysite]:~$  lq "GET services\nColumns: host_name performance_data\nFilter: description = Uptime\nOrderBy: performance_data.uptime desc"
anotherhost;uptime|249531.1
yetanotherhost;uptime|149142.3
ahost;uptime|48959

4. Query complesse

4.1. Filtri per gli elenchi

Alcune colonne di una tabella non restituiscono un solo valore, ma un intero elenco. Per poter cercare efficacemente in questo elenco, in questi casi gli operatori hanno un'altra funzione. Un elenco completo degli operatori si trova in Operatori per gli elenchi. Ad esempio, l'operatore >= ha la funzione "contiene". Con questo operatore puoi, ad esempio, cercare contatti specifici:

OMD[mysite]:~$ lq "GET hosts\nColumns: name address contacts\nFilter: contacts >= hhirsch"
myserver123;192.168.0.42;hhirsch,hhirsch,mfrisch
myserver234;192.168.0.73;hhirsch,wherrndorf

Come si può vedere nell'esempio precedente, i contatti saranno elencati, separati da virgole, nella colonna contacts. Questo permette di distinguerli chiaramente in quanto non sono l'inizio di un'altra colonna. Una caratteristica speciale dell'operatore di uguaglianza è che controlla se un elenco è vuoto:

OMD[mysite]:~$ lq "GET hosts\nColumns: name contacts\nFilter: contacts ="
myserver345;
myserver456;

4.2. Combinare i filtri

In precedenza sono già stati combinati diversi filtri. Sembra intuitivo che i dati debbano passare attraverso tutti i filtri per essere mostrati. I filtri saranno quindi collegati dall'operatore logico e. Per collegare particolari filtri con un logico o, alla fine della stringa del filtro codifica un o: seguito da un numero intero. Il contatore specifica quante delle ultime righe possono essere combinate con un or. In questo modo è possibile formare dei gruppi e combinarli a seconda delle esigenze. Ecco un semplice esempio: qui vengono combinati due filtri in modo da mostrare tutti i servizi che hanno lo statoWARN o SCONOSCIUTO:

OMD[mysite]:~$ lq
GET services
Columns: host_name description state
Filter: state = 1
Filter: state = 3
Or: 2

myserver123;Log /var/log/messages;1
myserver123;Interface 3;1
myserver234;Bonding Interface SAN;3

OMD[mysite]:~$

Il risultato di una combinazione può anche essere negato o i gruppi possono essere combinati a loro volta in altri gruppi. Nell'esempio, vengono mostrati tutti i servizi il cui stato non è OK e la cui descrizione inizia con Filesystem o che hanno uno stato diverso da SCONOSCIUTO:

OMD[mysite]:~$ lq
GET services
Columns: host_name description state
Filter: state = 3
Filter: description ~ Filesystem
And: 2
Filter: state = 0
Or: 2
Negate:

myserver123;Log /var/log/messages;1
myserver123;Interface 3;1
myserver234;Filesystem /media;2
myserver234;Filesystem /home;2

4.3. Specificare un formato di output

Il formato di output può essere specificato in due modi: un metodo consiste nel ridefinire i separatori utilizzati nell'output standard; l'altro metodo consiste nell'output conforme ai formati Python o JSON.

Personalizzazione di csv

Come già descritto, puoi personalizzare con precisione il formato di output standard csv (minuscolo!) e definire il modo in cui i singoli elementi devono essere separati l'uno dall'altro. Checkmk riconosce quattro diversi separatori per strutturare i dati. Dopo i due punti, codifica un valore ASCII standard appropriato in modo che il filtro sia strutturato come segue:

Separators: 10 59 44 124

Questi separatori hanno le seguenti funzioni:

  1. Separatore per i set di dati: 10 (interruzione di riga)

  2. Separatore per le colonne di un set di dati: 59 (punto e virgola)

  3. Separatore per gli elementi di un elenco: 44 (virgola)

  4. Separatore per gli elementi di un elenco di servizi: 124 (barra verticale)

Ciascuno di questi valori può essere selezionato per strutturare l'output nel modo desiderato. Nell'esempio seguente le singole colonne di un set di dati sono state separate con un tabulatore (9) anziché con un punto e virgola (59):

OMD[mysite]:~$ lq
GET services
Columns: host_name description state
Filter: description ~ Filesystem
Separators: 10 9 44 124

myserver123     Filesystem /opt     0
myserver123     Filesystem /var/some/path       1
myserver123     Filesystem /home        0

Importante: l'ordine dei separatori è fisso e non può essere modificato.

Cambiare i formati di output

Oltre a produrre output in csv, Livestatus può anche produrre output in altri formati. Questi hanno il vantaggio di essere più semplici e puliti da analizzare nei linguaggi di programmazione superiori. Di conseguenza, gli output possono essere codificati nei seguenti formati:

Formato Descrizione

Python

Genera un output come elenco compatibile con 2.x. Il testo è formattato in Unicode.

python3

Genera l'output come elenco e, nel farlo, tiene conto delle modifiche del tipo di dati, ad esempio la conversione automatica del testo in Unicode.

json

L'output sarà generato come un elenco, ma verrà utilizzato solo un formato compatibile con json.

CSV

Formatta l'output in conformità con RFC-4180.

csv

Vedi personalizzazione di csv. Questo è il formato standard se non viene specificato altro ed è basato sul formato CSV ufficiale.

Non confondere il formato CSV Format con il formato csv-output di Livestatus, che viene utilizzato se non è stato specificato alcun formato di output. Una corretta codifica di maiuscole/minuscole è quindi assolutamente essenziale. Per la personalizzazione, alla fine specifica OutputFormat invece di Separator:

OMD[mysite]:~$ lq
GET services
Columns: host_name description state
Filter: description ~ Filesystem
OutputFormat: json

[["myserver123","Filesystem /opt",0]
["myserver123","Filesystem /var/some/path",1]
["myserver123","Filesystem /home",0]]

5. Recupero delle statistiche (Stats)

5.1. Introduzione

Ci sono situazioni in cui non ti interessa lo stato di un singolo servizio o di un gruppo di servizi. Molto più importante è il numero di servizi con uno stato WARN o il numero di database monitorati. Livestatus è in grado di generare ed emettere statistiche con Stats.

5.2. I numeri

Overview riceve i suoi dati recuperando le statistiche di host, servizi ed eventi attraverso Livestatus e visualizzandole nell'interfaccia di Checkmk. Con l'accesso diretto a Livestatus puoi produrre il tuo riepilogo personale:

OMD[mysite]:~$ lq
GET services
Stats: state = 0
Stats: state = 1
Stats: state = 2
Stats: state = 3

34506;124;54;20

Inoltre, tali statistiche possono essere combinate con tutti i filtri.

5.3. Raggruppamento

Le statistiche possono essere combinate anche con and/or. Le intestazioni si chiamano StatsAnd o StatsOr. Usa StatsNegate se l'output deve essere annullato. Nell'esempio verrà mostrato il numero totale di host (l'iniziale Stats) e in aggiunta verrà mostrato il numero di host contrassegnati come stale e che non sono elencati in un tempo di manutenzione programmata (le statistiche 2 e 3 sono collegate con un "AND" logico):

OMD[mysite]:~$ lq
GET hosts
Stats: state >= 0
Stats: staleness >= 3
Stats: scheduled_downtime_depth = 0
StatsAnd: 2

734;23

Non lasciarti confondere dalle varie opzioni per combinare i risultati dei filtri e delle statistiche: mentre tutti gli host che soddisfano le condizioni saranno visualizzati utilizzando l'intestazioneFilter con l'intestazione, con le statistiche l'output sarà la somma della frequenza con cui il filtro Stats viene applicato.

5.4. Minimo, massimo, media, ecc.

È anche possibile eseguire dei calcoli sui valori e, ad esempio, produrre un valore medio o un valore massimo. Un elenco completo di tutti gli operatori possibili è disponibile qui.

Nell'esempio seguente, l'output elenca i tempi medi, minimi e massimi richiesti dai plug-in di controllo dell'host per calcolare lo stato:

OMD[mysite]:~$ lq
GET services
Filter: host_name = myserver123
Stats: avg execution_time
Stats: max execution_time
Stats: min execution_time

0.0107628;0.452087;0.008593

I calcoli con le metriche sono gestiti in modo un po' speciale. Anche in questo caso sono disponibili tutte le funzioni di Stats-header, che però vengono applicate singolarmente a tutte le metriche di un servizio. Ad esempio, nel seguente esempio le metriche dell'utilizzo della CPU di un gruppo di host verranno sommate:

OMD[mysite]:~$ lq
GET services
Filter: description ~ CPU utilization
Filter: host_groups >= cluster_a
Stats: sum perf_data

guest=0.000000 steal=0.000000 system=34.515000 user=98.209000 wait=23.008000

6. Limitare un'uscita (Limite)

Il numero di righe di un output può essere limitato intenzionalmente. Questo può essere utile se, ad esempio, vuoi solo vedere se riesci a ottenere una risposta a una query di Livestatus, ma vuoi evitare di ottenere un output di più pagine:

OMD[mysite]:~$  lq "GET hosts\nColumns: name\nLimit: 3"
myserver123
myserver234
myserver345

Nota che questo limite funziona anche quando è combinato con altre intestazioni: se ad esempio con Stat conti quanti host hanno uno stato dell'host UP e limiti l'output a 10, verranno presi in considerazione solo i primi 10 host.

7. Limiti di tempo (Timelimit)

Non solo il numero di righe da emettere può essere limitato, ma anche il tempo massimo di esecuzione di una query. Questa opzione può evitare che una query di Livestatus blocchi per sempre una connessione se si blocca per qualche motivo. Il limite di tempo specifica il tempo massimo in secondi che una query è autorizzata a processare:

OMD[mysite]:~$ lq "GET hosts\nTimelimit: 1"

8. Attivare le intestazioni delle colonne (ColumnHeaders)

Con ColumnHeaders è possibile aggiungere all'output i nomi delle colonne, che normalmente vengono soppressi per semplificare il processo:

OMD[mysite]:~$  lq "GET hosts\nColumns name address groups\nColumnHeaders: on"
name;address;groups
myserver123;192.168.0.42;cluster_a,headnode
myserver234;192.168.0.43;cluster_a
myserver345;192.168.0.44;cluster_a

9. Autorizzazioni (AuthUser)

Se vuoi rendere disponibili degli script basati sul Livestatus, l'utente dovrebbe vedere solo i dati per i quali è autorizzato. Checkmk fornisce l'intestazione AuthUser per questa funzione, con la restrizione che non può essere utilizzata nelle tabelle seguenti:

  • columns

  • commands

  • contacts

  • contactgroups

  • eventconsolerules

  • eventconsolestatus

  • status

  • timeperiods

Al contrario, questa intestazione può essere utilizzata in tutte le tabelle che accedono alle tabelle hostso services. L'autorizzazione di un utente dipende dai suoi gruppi di contatto.

In questo modo una query produrrà solo i dati che il contatto è autorizzato a vedere. Nota qui la differenza tra le impostazioni dei permessi di strict e loose:

OMD[mysite]:~$ lq "GET services\nColumns: host_name description contacts\nAuthUser: hhirsch"
myserver123;Uptime;hhirsch
myserver123;TCP Connections;hhirsch
myserver123;CPU utilization;hhrisch,kkleber
myserver123;File /etc/resolv.conf;hhirsch
myserver123;Kernel Context Switches;hhrisch,kkleber
myserver123;File /etc/passwd;hhirsch
myserver123;Filesystem /home;hhirsch
myserver123;Kernel Major Page Faults;hhrisch
myserver123;Kernel Process Creations;hhirsch
myserver123;CPU load;hhrisch,kkleber

10. Ritardi temporali (Wait)

Con l'intestazione Wait puoi creare query per specifici set di dati senza dover sapere se i prerequisiti per i dati sono stati soddisfatti. Questo può essere utile quando, ad esempio, hai bisogno di dati di confronto per una specifica situazione di errore, ma non vuoi sottoporre il sistema a un carico continuo e non necessario. Le informazioni verranno quindi recuperate solo quando sono realmente necessarie.

Un elenco completo delle intestazioni di attesa è disponibile qui.

Nell'esempio che segue, il servizio Disk IO SUMMARY per un server ESXi verrà emesso non appena lo stato del servizio CPU load cambia in una specifica VM CRIT. Con l'intestazione WaitTimeout la query verrà eseguita se la condizione non è stata soddisfatta dopo 10000 millisecondi. In questo modo si evita che la connessione Livestatus rimanga bloccata per molto tempo:

OMD[mysite]:~$ lq
GET services
WaitObject: myvmserver CPU load
WaitCondition: state = 2
WaitTrigger: state
WaitTimeout: 10000
Filter: host_name = myesxserver
Filter: description = Disk IO SUMMARY
Columns: host_name description plugin_output

myesxserver;Disk IO SUMMARY;OK - Read: 48.00 kB/s, Write: 454.54 MB/s, Latency: 1.00 ms

Un'altra applicazione è quella di combinare questa funzione con un comando. Puoi emettere un comando e recuperare i risultati non appena sono disponibili. Nell'esempio seguente vogliamo interrogare e visualizzare i dati attuali di un servizio. A tal fine, prima verrà inviato il comando e poi verrà emessa una query che controlla se i dati del servizio Check_MK sono più recenti rispetto a quelli di un determinato momento. Non appena la precondizione è soddisfatta, verrà emesso lo stato del servizio Memory.

OMD[mysite]:~$ lq "COMMAND [$(date +%s)] SCHEDULE_FORCED_SVC_CHECK;myserver;Check_MK;$(date
+%s)"
OMD[mysite]:~$ lq
GET services
WaitObject: myserver Check_MK
WaitCondition: last_check >= 1517914646
WaitTrigger: check
Filter: host_name = myserver
Filter: description = Memory
Columns: host_name description state

myserver;Memory;0

Importante: nota che la marca temporale utilizzata in last_checknell'esempio DEVE essere sostituita con una appropriata, altrimenti la condizione sarà sempre soddisfatta e l'output sarà prodotto immediatamente.

11. Fusi orari (Localtime)

Molti ambienti di monitoraggio interrogano host e servizi a livello globale. In questi casi si può rapidamente creare una situazione di istanze di monitoraggio distribuite che lavorano in fusi orari diversi. Poiché Checkmk utilizza il tempo Unix, che è indipendente dai fusi orari, questo non dovrebbe essere un problema.

Se tuttavia un server è assegnato a un fuso orario errato, questa differenza può essere compensata con l'intestazione Localtime. Fornisci anche l'ora corrente alla query. Checkmk arrotonderà autonomamente alla mezz'ora successiva e si regolerà per la differenza. Puoi fornire l'ora automaticamente se richiami direttamente la query:

OMD[mysite]:~$ lq "GET hosts\nColumns: name last_check\nFilter: name = myserver123\nLocaltime: $(date +%s)"
myserver123;1511173526

Altrimenti fornisci il risultato di date +%s se vuoi utilizzare il flusso di input:

OMD[mysite]:~$ lq
GET hosts
Columns: name last_check
Filter: name = myserver123
Localtime: 1511173390

myserver123;Memory;1511173526

12. Codici di stato (ResponseHeader)

Se scrivi un'API probabilmente vorrai ricevere un codice di stato come risposta, in modo da poter processare meglio l'output. L'header ResponseHeader supporta i valori off (Standard) e fixed16 e con questi fornisce un messaggio di stato lungo esattamente 16 byte nella prima riga della risposta. In caso di errore, le righe successive conterranno una descrizione completa del codice di errore. Sono quindi molto utili anche per cercare l'errore nei risultati della query.

Il report di stato nella prima riga combina i seguenti elementi:

  • Byte 1-3: il codice di stato. La tabella completa dei codici possibili è disponibile qui.

  • Byte 4: Un semplice carattere vuoto (carattere ASCII: 32).

  • Byte 5-15: La lunghezza della risposta effettiva come numero intero. I byte non necessari sono riempiti da caratteri vuoti.

  • Byte 16: Un carattere di avanzamento riga (carattere ASCII: 10)

Nel seguente esempio verrà eseguita una query errata in cui un filtro è stato erroneamente codificato con il nome di una colonna.

OMD[mysite]:~$ lq "GET hosts\nName: myserver123\nResponseHeader: fixed16"
400          33
Columns: undefined request header

Importante: in caso di errore, il formato di uscitaè sempre un messaggio di errore in modulo testo, indipendentemente da eventuali adattamenti.

13. Mantenere viva una connessione (KeepAlive)

In particolare con gli script che stabiliscono una connessione Livestatus attraverso larete, potresti voler mantenere il canale aperto per risparmiare l'overhead generato dalla ripetuta creazione della connessione. Puoi ottenere questo risultato con l'intestazione KeepAlive e in questo modo sei in grado di riservare un canale. A proposito: dopo un comando, una connessione Livestatus rimane sempre aperta. Non è necessario inserire un'intestazione aggiuntiva per questo.

Importante: poiché il canale è bloccato per gli altri processi per tutta la durata della connessione, può diventare un problema se non ci sono altre connessioni disponibili per l'uso. Gli altri processi devono quindi aspettare che si liberi una connessione. Nella configurazione standard Checkmk tiene pronte 20 connessioni - aumenta il numero massimo di queste connessioni se necessario conSetup > General > Global Settings > Monitoring Core > Maximum concurrent Livestatus connections.

Combina sempre KeepAlive con l'opzione Response headerper poter distinguere correttamente le singole risposte:

OMD[mysite]:~$ lq
GET hosts
ResponseHeader: fixed16
Columns: name
KeepAlive: on

200          33
myserver123
myserver234
myserver345
GET services
ResponseHeader: fixed16
Columns: host_name description last_check
Filter: description = Memory

200          58
myserver123;Memory;1511261122
myserver234;Memory;1511261183

Assicurati che non ci sia una riga vuota tra la prima risposta e la seconda richiesta. Non appena un'intestazione viene omessa da una query, dopo l'output successivo la connessione verrà chiusa come di consueto dalla riga vuota.

14. Recupero dei log

14.1. Panoramica

Con la tabella log di Livestatus hai accesso diretto alla cronologia del nucleo di monitoraggio, in modo da poter filtrare comodamente con l'LQL alla ricerca di eventi particolari. Le tabelle di disponibilità, ad esempio, saranno generate con l'aiuto di queste tabelle. Per migliorare la panoramica e limitare una query in modo tematico, hai accesso alle seguenti classi di registro:

Classe Descrizione

0

Tutti i messaggi non coperti da altre classi

1

Avvisi relativi a host e servizi

2

Eventi importanti del programma

3

Notifiche

4

Controlli passivi

5

Comandi esterni

6

Inserimento dello stato iniziale o attuale (es. dopo una rotazione del log)

7

Modifiche allo stato del programma

Utilizzando queste classi di log puoi già limitare molto bene il tipo di voce che deve essere mostrata. Inoltre, il periodo di tempo preso in considerazione nella query sarà limitato. Questo è importante perché altrimenti verrà cercata l'intera cronologia dell'istanza, il che potrebbe logicamente frenare il sistema a causa del flusso di informazioni.

Un'ulteriore restrizione ragionevole dell'output sono le (Columns) che devono essere mostrate per una voce. Nell'esempio seguente cercheremo tutte le notifiche che sono state logorate nell'ultima ora:

OMD[mysite]:~$ lq "GET log\nFilter: class = 3\nFilter: time >= $$(date +%s)-3600\nColumns: host_name service_description time state"
myserver123;Memory;1511343365;0
myserver234;CPU load;1511343360;3
myserver123;Memory;1511343338;2
myserver234;CPU load;1511342512;0

Importante: assicurati che nella modalità interattiva del flusso di voci non sia possibile utilizzare nessuna delle variabili utilizzate nell'esempio e limita sempre le query a un periodo di tempo.

14.2. Configurazione della cronologia di monitoraggio

È possibile influenzare la rotazione dei file e le loro dimensioni massime. Inoltre, puoi specificare quante righe di un file devono essere lette prima che Checkmk si interrompa. Tutto questo può influire sulle prestazioni delle tue query, a seconda della struttura dell'istanza. Sono disponibili i seguenti tre parametri che possono essere trovati e personalizzati in Setup > General > Global Settings > Monitoring Core:

Nome Descrizione

History log rotation: Regular interval of rotations

Qui si può definire entro quale periodo di tempo la cronologia deve essere continuata in un nuovo file.

History log rotation: Rotate by size (Limit of the size)

Indipendentemente dal periodo di tempo, qui viene definita la dimensione massima di un file. La dimensione rappresenta un compromesso tra la velocità di lettura e gli IO possibili.

Maximum number of parsed lines per log file

Quando il numero di righe specificato è stato letto, la lettura del file si interrompe. In questo modo si evitano i time-out se per qualche motivo il file diventa molto grande.

15. Controllare la disponibilità

Con la tabella statehist puoi interrogare i dati grezzi sulla disponibilità di host e servizi e quindi avere accesso a tutte le informazioni utilizzate dalla visualizzazione della disponibilità dell'interfaccia. Inserisci sempre un periodo di tempo, altrimenti verranno cercati tutti i log disponibili, il che può comportare un carico pesante per il sistema. Valgono anche le seguenti specifiche aggiuntive:

  • L'intervallo di tempo in cui un host/servizio ha avuto un particolare stato può essere indicato sia come tempo assoluto che come tempo Unix, oltre che come percentuale relativa e percentuale del periodo di tempo richiesto.

  • Nei periodi in cui un host/servizio non è stato monitorato, lo stato sarà -1.

Controllare se, quando e per quanto tempo un host/servizio è stato monitorato è possibile in Checkmk grazie al log dello stato iniziale. In questo modo non solo puoi vedere quale stato esisteva in un momento specifico, ma puoi anche capire se era effettivamente monitorato in quel momento.Importante: questo log è attivo anche con un Nagios-Core, ma può essere disattivato:

~/etc/nagios/nagios.d/logging.cfg
log_initial_states=0

Nell'esempio che segue si può vedere come appaiono la ricerca di una percentuale di allocazione e i tempi assoluti per un particolare stato. Le ultime 24 ore sono state specificate come periodo di tempo e la ricerca è limitata alla disponibilità di un servizio su un particolare host:

OMD[mysite]:~$ lq
GET statehist
Columns: host_name service_description
Filter: time >= 1511421739
Filter: time < 1511436139
Filter: host_name = myserver123
Filter: service_description = Memory
Stats: sum duration_ok
Stats: sum duration_warning
Stats: sum duration_critical
Stats: sum duration_part_ok
Stats: sum duration_part_warning
Stats: sum duration_part_critical

myserver123;Memory;893;0;9299;0.0620139;0;0.645764

Il modo in cui è possibile recuperare un elenco completo delle colonne disponibili è spiegato in modo più dettagliato nel riferimento al comando.

16. Variabili in Livestatus

In diversi punti dell'interfaccia Checkmk puoi utilizzare delle variabili per effettuare assegnazioni basate sul contesto. Alcuni di questi dati sono recuperabili anche su Livestatus. Poiché queste variabili devono essere risolte, le disponibilità di queste colonne sono duplicate in una tabella: una volta come voce letterale e una volta in cui la variabile è stata sostituita con il valore appropriato. Un esempio di questo tipo è la colonna notes_url che visualizza un URL con la variabile:

OMD[mysite]:~$ lq "GET hosts\nColumns: name notes_url"
myserver123;https://mymonitoring/heute/wiki/doku.php?id=hosts:$HOSTNAME$

Tuttavia, se al posto di questa si interroga la colonna note_url_expanded, si riceverà il valore effettivo della macro:

OMD[mysite]:~$ lq "GET hosts\nColumns: name notes_url_expanded"
myserver123;https://mymonitoring/heute/wiki/doku.php?id=hosts:myserver123

17. Usare Livestatus in rete

17.1. Connessioni via TCP/IP

Per accedere a Livestatus tramite la rete, puoi collegare il socket Unix del processo live status a una porta TCP. In questo modo puoi eseguire script su macchine remote e raccogliere i dati direttamente da dove devono essere elaborati.

Quando un sito è spento, l'accesso via TCP può essere abilitato con il comandoomd:

OMD[mysite]:~$ omd config set LIVESTATUS_TCP on

Una volta avviato il sito, Livestatus via TCP è solitamente attivo sulla porta predefinita 6557. Per i server Checkmk con più siti che utilizzano Livestatus via TCP, viene scelta la porta più alta non utilizzata.

Tutte le impostazioni, come la porta e gli indirizzi IP autorizzati, possono essere configurate tramite omd config. In alternativa, queste impostazioni possono essere effettuate nel setup. In Checkmk la crittografia SSL della comunicazione Livestatus è abilitata di default:

Livestatus configuration in Setup.
Configurazione di Livestatus nel Setup

Test della connessione SSL locale

Livestatus utilizza un certificato generato automaticamente al momento della creazione del sito. Questo certificato si trova nel file var/ssl/ca-certificates.crt insieme a tutti gli altri certificati CA di cui il sito si fida. Affinché lo strumento a riga di comando openssl s_client sia in grado di convalidare il certificato utilizzato dal server Livestatus, questo file deve essere progettato come Certificate Authority File.

Abbiamo accorciato notevolmente l'output della chiamata al comando, […​] mostra le omissioni:

OMD[mysite]:~$ openssl s_client -CAfile var/ssl/ca-certificates.crt -connect localhost:6557
CONNECTED(00000003)
Can't use SSL_get_servername
depth=1 CN = Site 'mysite' local CA
verify return:1
depth=0 CN = mysite
verify return:1
---
Certificate chain
 0 s:CN = mysite
   i:CN = Site 'mysite' local CA
 1 s:CN = Site 'mysite' local CA
   i:CN = Site 'mysite' local CA
---
Server certificate
[...]
    Start Time: 1664965470
    Timeout   : 7200 (sec)
    Verify return code: 0 (ok)
    Extended master secret: no
    Max Early Data: 0
---
read R BLOCK

Non appena non ci sono altri output, puoi inviare comandi LQL in modo interattivo e terminare l'interazione con una riga vuota (premendo due volte il tasto return). Se questo funziona, puoi anche inviare le query Livestatus in modalità pipe e utilizzare il parametro aggiuntivo -quiet per sopprimere l'output di debug:

OMD[mysite]:~$ echo -e "GET hosts\nColumns: name\n\n" | \
    openssl s_client -quiet  -CAfile var/ssl/ca-certificates.crt -connect localhost:6557
Can't use SSL_get_servername
depth=1 CN = Site 'mysite' local CA
verify return:1
depth=0 CN = mysite
verify return:1
myserver23
myserver42
myserver123
myserver124

L'output che precede i quattro nomi host viene scritto su STDERR dal comando openssl. Può essere soppresso aggiungendo 2>/dev/null.

Accesso remoto a Livestatus

Se accedi a Livestatus da macchine remote, non devi utilizzare l'intero elenco dei certificati di cui si fida l'istanza Checkmk su quelle macchine, ma devi leggere il certificato della CA del sito solo dal setup.

Per farlo, vai su Global Settings > Site management > Trusted certificate authorities for SSL. Qui puoi copiare e incollare il certificato utilizzato dalla CA del sito. Copia il testo completo del primo certificato sotto Content of CRT/PEM file in un file - nel nostro esempio usiamo /tmp/mysite_ca.pem.

Display of the site CA's certificate in the Setup.
Visualizzazione del certificato della CA del sito nel Setup

Se l'host remoto è stato abilitato all'accesso a Livestatus, le interrogazioni di Livestatus tramite script saranno possibili con questo file di certificato:

user@host:~$ echo -e "GET hosts\nColumns: name\n\n" | \
    openssl s_client -quiet  -CAfile /tmp/mysite_ca.pem -connect cmkserver:6557

Nota: il file di certificato non fornisce l'autenticazione, ma garantisce solo la crittografia del trasporto! La protezione dell'accesso è regolata esclusivamente dagli indirizzi IP autorizzati ad accedere alla porta di Livestatus.

Livestatus con stunnel

Se vuoi rendere disponibile la porta remota crittografata di Livestatus come porta locale non crittografata, puoi utilizzare il programma stunnel.

/etc/stunnel/cmk_myremotesite.conf
[pinning client]
client = yes
accept = 0.0.0.0:6557
connect = <myremotesiteip>:6557
verifyPeer = yes
CAfile = /etc/stunnel/myremotesite.pem

Dopo il riavvio di stunnel, l'accesso in chiaro alla porta locale sarà possibile.

user@host:~$ echo -e "GET hosts\nColumns: name\n\n" | nc localhost 6557

SSL negli script

Se vuoi utilizzare degli script per accedere a Livestatus tramite SSL, evita di utilizzare openssl s_client. Lo scopo principale di questo strumento è quello di testare l'instaurazione di una connessione e di eseguire il debug delle catene di certificati. Per vedere se l'output previsto è completo in caso di fallimento della connessione, ti consigliamo di valutare l'intestazione della risposta. Un'API ben curata che supporta l'SSL e la valutazione dell'intestazione è quella per Python, che si trova all'indirizzo share/doc/check_mk/livestatus/api/python. Altre API adatte sono elencate nel capitolo relativo a File e directory.

17.2. Connessioni via SSH

Se è necessario accedere a Livestatus dall'esterno della rete locale, la protezione dell'accesso basata solo sugli indirizzi IP potrebbe non essere pratica. Il modo più semplice per ottenere un accesso autenticato è utilizzare la Secure Shell.

Con SSH, puoi passare un comando che verrà eseguito sul server remoto:

user@host:~$ ssh mysite@myserver 'lq "GET hosts\nColumns: name"'
myserver123
myserver234

In alternativa, puoi inoltrare la porta di Livestatus all'host su cui stai lavorando tramite un tunnel SSH:

user@host:~$ ssh -L 6557:localhost:6557 mysite@myserver

Se la connessione è stata stabilita, in una seconda sessione della console puoi verificare se l'accesso con openssl s_client è possibile:

user@host:~$ openssl s_client -CAfile /tmp/mysite_ca.pem -connect localhost:6557

Se il test ha successo, qualsiasi script che hai scritto per l'accesso diretto alla rete di Livestatus può essere utilizzato su localhost.

18. Comandi di impostazione

18.1. Panoramica

Livestatus può essere utilizzato non solo per interrogare i dati, ma anche per impartire comandi direttamente al core (CMC o Nagios). Un comando corretto include sempre una marca temporale, che può essere qualsiasi cosa. Poiché verrà utilizzata anche nei log per tracciare l'ora del processo, è consigliabile inserire l'ora nel modo più preciso possibile. I comandi con una marca temporale mancante verranno scartati, senza emettere un messaggio di errore e con una semplice immissione nel file cmc.log!

Affinché l'orario sia il più preciso possibile, si consiglia di non impostare il comando nel flusso di input, ma di inviarlo direttamente. In questo caso è possibile accedere alle variabili e fornire l'ora attuale:

OMD[mysite]:~$ lq "COMMAND [$(date +%s)] DISABLE_NOTIFICATIONS"

Questo formato funziona sia con il Nagios-Core in Checkmk Raw che con il CMC nelle edizioni commerciali. Tuttavia, nei due core i comandi si sovrappongono solo in parte. Un elenco completo dei comandi per il Nagios-Core si trova direttamente sul sito web diNagios, mentre i comandi disponibili per il CMC si trovano nelriferimento dei comandi.

18.2. Caratteristiche speciali di Nagios

Nell'elenco dei comandi la sintassi ha il seguente modulo:

#!/bin/sh
# This is a sample shell script showing how you can submit the CHANGE_CUSTOM_HOST_VAR command
# to Nagios.  Adjust variables to fit your environment as necessary.

now=`date +%s`
commandfile='/usr/local/nagios/var/rw/nagios.cmd'

/bin/printf "[%lu] CHANGE_CUSTOM_HOST_VAR;host1;_SOMEVAR;SOMEVALUE\n" $now > $commandfile

Come hai imparato, Checkmk utilizza un formato molto più semplice per l'emissione dei comandi. Per rendere il formato di Nagios compatibile con Checkmk, è sufficiente che il comando, la data e l'ora e, ove applicabile, le variabili:

OMD[mysite]:~$ lq "COMMAND [$(date +%s)] CHANGE_CUSTOM_HOST_VAR;host1;_SOMEVAR;SOMEVALUE"

19. File e directory

Percorso Funzione

~/tmp/run/live

Il socket Unix attraverso il quale vengono inviate le richieste e i comandi.

~/bin/lq

Script di comando per semplificare l'invio di query e comandi all'Unix-Socket nel Livestatus.

~/var/log/cmc.log

Il file di log del CMC, in cui sono documentate le query e i comandi insieme ad altri dati.

~/var/check_mk/core/history

Il file di log del CMC, in cui vengono inseriti tutti i cambiamenti che si verificano durante l'esecuzione del core, ad es. i cambiamenti di stato di un host/servizio.

~/var/check_mk/core/archive/

I file di log di history sono archiviati qui. Questi verranno letti solo se necessario.

~/var/log/nagios.log

Il file di log di Nagios-Core, in cui vengono documentate le query e i comandi insieme ad altri dati.

~/var/nagios/archive/

I file di log di history vengono archiviati qui. Questi verranno letti solo se necessario.

~/share/doc/check_mk/livestatus/LQL-examples/

In questa directory si trovano diversi esempi di query Livestatus che puoi provare. Gli esempi si basano sul comando script lq - es: lq < 1.lql

~/share/doc/check_mk/livestatus/api/python

l'API per Python si trova in questa directory, così come una serie di esempi. Leggi anche README in questa directory.

~/share/doc/check_mk/livestatus/api/perl

L'API per Perl si trova qui. Anche qui c'è una directory README. Gli esempi di utilizzo si trovano nella sottodirectory examples.

~/share/doc/check_mk/livestatus/api/c++

Ci sono anche esempi di codice per il linguaggio di programmazione C++. Anche il codice dell'API si trova qui in un modulo non compilato, in modo che tu possa avere una visione ottimale delle funzionalità dell'API.

In questa pagina