2 Streaming verso sistemi esterni

Panoramica

È possibile trasmettere in streaming i valori degli item e gli eventi da Zabbix a sistemi esterni tramite HTTP (vedere i dettagli del protocollo).

Il filtro dei tag può essere utilizzato per trasmettere in streaming sottoinsiemi di valori degli item o eventi.

Due processi del server Zabbix sono responsabili dello streaming dei dati: connector manager e connector worker. Un item interno di Zabbix zabbix[connector_queue] consente di monitorare il numero di valori accodati nella coda del connettore.

Configurazione

Per configurare lo streaming dei dati verso un sistema esterno sono necessari i seguenti passaggi:

1. Predisporre un sistema remoto per la ricezione dei dati da Zabbix. A questo scopo, sono disponibili i seguenti strumenti:

  • Un esempio di semplice receiver che registra le informazioni ricevute nei file events.ndjson e history.ndjson.
  • Kafka connector for Zabbix server - un server leggero scritto in Go, progettato per inoltrare i valori degli item e gli eventi da un server Zabbix a un broker Kafka.

2. Impostare in Zabbix il numero richiesto di worker del connector regolando il parametro StartConnectors in zabbix_server.conf. Il numero di worker del connector deve corrispondere (o essere superiore, se le sessioni concorrenti sono più di 1) al numero di connector configurati nel frontend di Zabbix. Quindi, riavviare il server Zabbix.

3. Configurare un nuovo connector nel frontend di Zabbix (Administration > General > Connectors) e ricaricare la cache del server con il comando zabbix_server -R config_cache_reload.

I campi obbligatori sono contrassegnati da un asterisco.

Parameter Description
Name Inserire il nome del connector.
Data type Selezionare il tipo di dati da trasmettere in streaming:
Item values - trasmette i valori degli item da Zabbix ai sistemi esterni;
Events - trasmette gli eventi da Zabbix ai sistemi esterni.
URL Inserire l'URL del receiver. Le macro utente sono supportate.
Tag filter Esporta solo i valori degli item o gli eventi che corrispondono al filtro tag. Se non impostato, verrà esportato tutto.
È possibile includere così come escludere tag e valori di tag specifici. È possibile impostare diverse condizioni. La corrispondenza del nome del tag distingue sempre tra maiuscole e minuscole.

Sono disponibili diversi operatori per ciascuna condizione:
Exists - include i nomi di tag specificati;
Equals - include i nomi di tag e i valori specificati (con distinzione tra maiuscole e minuscole);
Contains - include i nomi di tag specificati in cui i valori del tag contengono la stringa inserita (corrispondenza per sottostringa, senza distinzione tra maiuscole e minuscole);
Does not exist - esclude i nomi di tag specificati;
Does not equal - esclude i nomi di tag e i valori specificati (con distinzione tra maiuscole e minuscole);
Does not contain - esclude i nomi di tag specificati in cui i valori del tag contengono la stringa inserita (corrispondenza per sottostringa, senza distinzione tra maiuscole e minuscole).

Per le condizioni sono disponibili due tipi di calcolo:
And/Or - tutte le condizioni devono essere soddisfatte; le condizioni con lo stesso nome di tag verranno raggruppate dalla condizione Or;
Or - è sufficiente che sia soddisfatta una sola condizione.
Type of information Selezionare il tipo di informazione (numeric (unsigned), numeric (float), character, ecc.) in base al quale filtrare i valori degli item che il connector deve trasmettere in streaming.
Questo campo è disponibile se Data type è impostato su "Item values".
HTTP authentication Selezionare l'opzione di autenticazione:
None - non viene utilizzata alcuna autenticazione;
Basic - viene utilizzata l'autenticazione di base;
NTLM - viene utilizzata l'autenticazione NTLM (Windows NT LAN Manager);
Kerberos - viene utilizzata l'autenticazione Kerberos (vedere anche: Configuring Kerberos with Zabbix);
Digest - viene utilizzata l'autenticazione Digest;
Bearer - viene utilizzata l'autenticazione Bearer.
Username Inserire il nome utente (fino a 255 caratteri). Le macro utente sono supportate.
Questo campo è disponibile se HTTP authentication è impostato su "Basic", "NTLM", "Kerberos" o "Digest".
Password Inserire la password dell'utente (fino a 255 caratteri). Le macro utente sono supportate.
Questo campo è disponibile se HTTP authentication è impostato su "Basic", "NTLM", "Kerberos" o "Digest".
Bearer token Inserire il token Bearer. Le macro utente sono supportate.
Questo campo è disponibile ed è obbligatorio se HTTP authentication è impostato su "Bearer".
Advanced configuration Fare clic sull'etichetta Advanced configuration per visualizzare le opzioni di configurazione avanzata (vedere sotto).
Max records per message Specificare il numero massimo di valori o eventi che possono essere trasmessi in streaming all'interno di un messaggio.
Concurrent sessions Selezionare il numero di processi mittente da eseguire per questo connector. È possibile specificare fino a 100 sessioni; il valore predefinito è "1".
Attempts Numero di tentativi per lo streaming dei dati. È possibile specificare fino a 5 tentativi; il valore predefinito è "1".
Attempt interval Specificare per quanto tempo il connector deve attendere dopo un tentativo non riuscito di trasmettere i dati in streaming. È possibile specificare fino a 10s; il valore predefinito è "5s".
Questo campo è disponibile se Attempts è impostato su "2" o più.
I tentativi non riusciti sono quelli in cui la connessione non è stata stabilita oppure in cui il codice di risposta HTTP non è 200, 201, 202, 203, 204. I nuovi tentativi vengono attivati in caso di errori di comunicazione o quando il codice di risposta HTTP non è 200, 201, 202, 203, 204, 400, 401, 403, 404, 405, 415, 422. I reindirizzamenti vengono seguiti, quindi 302 -> 200 è una risposta positiva; mentre 302 -> 503 attiverà un nuovo tentativo.
Timeout Specificare il timeout del messaggio (1-60 secondi, predefinito - 5 secondi).
I suffissi temporali sono supportati, ad esempio 30s, 1m. Le macro utente sono supportate.
HTTP proxy È possibile specificare un HTTP proxy da utilizzare nel seguente formato:
[protocol://][username[:password]@]proxy.example.com[:port]
Le macro utente sono supportate.

Il prefisso facoltativo protocol:// può essere utilizzato per specificare protocolli proxy alternativi (il supporto del prefisso del protocollo è stato aggiunto in cURL 7.21.7). Se non viene specificato alcun protocollo, il proxy verrà trattato come un HTTP proxy. Per impostazione predefinita, verrà utilizzata la porta 1080.

Se HTTP proxy è specificato, il proxy sovrascriverà le variabili di ambiente relative al proxy come http_proxy, HTTPS_PROXY. Se non è specificato, il proxy non sovrascriverà le variabili di ambiente relative al proxy. Il valore inserito viene passato così com'è, senza alcun controllo di validità.
È anche possibile inserire un indirizzo proxy SOCKS. Se si specifica il protocollo errato, la connessione non riuscirà e l'item diventerà unsupported.

Si noti che con HTTP proxy è supportata solo l'autenticazione semplice.
SSL verify peer Selezionare la casella per verificare il certificato SSL del web server.
Il certificato del server verrà prelevato automaticamente dalla posizione dell'autorità di certificazione (CA) a livello di sistema. È possibile sovrascrivere la posizione dei file CA utilizzando il parametro di configurazione del server o proxy Zabbix SSLCALocation.
SSL verify host Selezionare la casella per verificare che il campo Common Name o il campo Subject Alternate Name del certificato del web server corrisponda.
Questo imposta l'opzione cURL CURLOPT_SSL_VERIFYHOST.
SSL certificate file Nome del file del certificato SSL utilizzato per l'autenticazione del client. Il file del certificato deve essere in formato PEM1. Le macro utente sono supportate.
Se il file del certificato contiene anche la chiave privata, lasciare vuoto il campo SSL key file. Se la chiave è cifrata, specificare la password nel campo SSL key password. La directory che contiene questo file è specificata dal parametro di configurazione del server o proxy Zabbix SSLCertLocation.
SSL key file Nome del file della chiave privata SSL utilizzato per l'autenticazione del client. Il file della chiave privata deve essere in formato PEM1. Le macro utente sono supportate.
La directory che contiene questo file è specificata dal parametro di configurazione del server o proxy Zabbix SSLKeyLocation.
SSL key password Password del file della chiave privata SSL. Le macro utente sono supportate.
Description Inserire la descrizione del connector.
Enabled Selezionare la casella per abilitare il connector.

Quando il connector Kafka è configurato con un elenco separato da virgole di indirizzi bootstrap broker (ad esempio Kafka.URL=kafka1.example.com:9093,kafka2.example.com:9093), il client Kafka si connette al broker o ai broker che rispondono per primi e utilizza i relativi metadati del cluster. Se l'elenco contiene indirizzi di cluster Kafka diversi, verrà utilizzato solo il cluster che risponde più rapidamente e gli altri indirizzi verranno registrati come non disponibili; di conseguenza, all'avvio potrebbero comparire avvisi come il seguente anche se il connector è connesso:

kafka cluster connected, but broker(s) "kafka1.example.com:9093, kafka2.example.com:9093" unavailable; will retry on message send if active brokers fail 

In alcuni ambienti (reti private, reti di container o configurazioni DNS/hosts non standard) i nomi host o gli IP possono risolversi in indirizzi di loopback (ad esempio 127.0.0.1/localhost) oppure essere normalizzati dal client, il che può rendere tali avvisi fuorvianti. Per ridurre la confusione, assicurarsi che tutti gli indirizzi Kafka.URL appartengano allo stesso cluster Kafka, verificare la risoluzione DNS dall'host del connector e gli advertised.listeners dei broker, e preferire indirizzi che si risolvono nell'indirizzo pubblicizzato dal broker.

Protocollo

La comunicazione tra il server e il receiver avviene tramite HTTP utilizzando REST API, NDJSON, "Content-Type: application/x-ndjson".

Per maggiori dettagli, vedere Protocollo di esportazione JSON delimitato da newline.

Richiesta del server

Esempio di streaming dei valori degli item:

POST /v1/history HTTP/1.1
Host: localhost:8080
Accept: */*
Accept-Encoding: deflate, gzip, br, zstd
Content-Length: 628
Content-Type: application/x-ndjson

{"host":{"host":"Zabbix server","name":"Zabbix server"},"groups":["Zabbix servers"],"item_tags":[{"tag":"foo","value":"test"}],"itemid":44457,"name":"foo","clock":1673454303,"ns":800155804,"value":0,"type":3}
{"host":{"host":"Zabbix server","name":"Zabbix server"},"groups":["Zabbix servers"],"item_tags":[{"tag":"foo","value":"test"}],"itemid":44457,"name":"foo","clock":1673454303,"ns":832290669,"value":1,"type":3}
{"host":{"host":"Zabbix server","name":"Zabbix server"},"groups":["Zabbix servers"],"item_tags":[{"tag":"bar","value":"test"}],"itemid":44458,"name":"bar","clock":1673454303,"ns":867770366,"value":123,"type":3}

Esempio di streaming degli eventi:

POST /v1/events HTTP/1.1
Host: localhost:8080
Accept: */*
Accept-Encoding: deflate, gzip, br, zstd
Content-Length: 333
Content-Type: application/x-ndjson

{"clock":1673454303,"ns":800155804,"value":1,"eventid":5,"name":"trigger for foo being 0","severity":0,"hosts":[{"host":"Zabbix server","name":"Zabbix server"}],"groups":["Zabbix servers"],"tags":[{"tag":"foo_trig","value":"test"},{"tag":"foo","value":"test"}]}
{"clock":1673454303,"ns":832290669,"value":0,"eventid":6,"p_eventid":5}
Risposta del receiver

La risposta è composta dal codice di stato della risposta HTTP e dal payload JSON. Il codice di stato della risposta HTTP deve essere "200", "201", "202", "203" o "204" per le richieste gestite correttamente; per le richieste non riuscite, qualsiasi altro codice.

Esempio di successo:

localhost:8080/v1/history": HTTP/1.1 200 OK
Date: Wed, 11 Jan 2023 16:40:30 GMT
Content-Length: 0

Esempio con errori:

localhost:8080/v1/history": HTTP/1.1 422 Unprocessable Entity
Content-Type: application/json
Date: Wed, 11 Jan 2023 17:07:36 GMT
Content-Length: 55

{"error":"invalid character '{' after top-level value"}