2 Controlli degli agenti passivi e attivi
Panoramica
Questa sezione fornisce dettagli sui controlli passivi e attivi eseguiti da Zabbix agent e Zabbix agent 2.
Zabbix utilizza un protocollo di comunicazione basato su JSON per comunicare con gli agent.
I protocolli di Zabbix agent e Zabbix agent 2 sono stati unificati a partire da Zabbix 7.0. La differenza tra le richieste e le risposte di Zabbix agent e Zabbix agent 2 è espressa dal valore del tag "variant".
Controlli passivi
Un controllo passivo è una semplice richiesta di dati.
Il server o il proxy Zabbix richiede alcuni dati (ad esempio, il carico della CPU) e l'agent Zabbix restituisce il risultato al server.
I controlli passivi vengono eseguiti in modo asincrono: non è necessario ricevere la risposta a una richiesta prima di avviare altri controlli.
Anche la risoluzione DNS è asincrona.
Il poller dell'agent tenterà di connettersi a tutti gli indirizzi restituiti dalla ricerca DNS.
In questo modo, se un indirizzo IP non è raggiungibile, il poller proverà l'indirizzo disponibile successivo, aumentando la probabilità di una connessione riuscita.
Questo miglioramento si applica sia al server Zabbix sia al proxy.
La concorrenza massima dei controlli asincroni è 1000 (definita da MaxConcurrentChecksPerPoller).
Il numero di poller asincroni dell'agent è definito dal parametro StartAgentPollers.
Richiesta del server
Per la definizione dell'intestazione e della lunghezza dei dati, fare riferimento ai dettagli del protocollo.
{
"request": "passive checks",
"data": [
{
"key": "agent.version",
"timeout": 3
}
]
}
| Field | Type | Mandatory | Value | |
|---|---|---|---|---|
| request | string | yes | "passive checks" |
|
| data | array of object | yes | Item del controllo passivo. | |
| key | string | yes | Chiave dell'item con macro espanse. | |
| timeout | number | yes | Timeout di comunicazione. | |
Risposta dell'agent
{
"version": "7.0.0",
"variant": 2,
"data": [
{
"value": "7.0.0"
}
]
}
| Field | Type | Mandatory | Value | |
|---|---|---|---|---|
| version | string | yes | Numero di versione dell'agent. | |
| variant | number | yes | Variante dell'agent (1 - Zabbix agent, 2 - Zabbix agent 2). | |
| data | array of object | yes | Contiene il risultato del controllo. | |
| value | string | no | Valore dell'item se il controllo è riuscito. | |
| error | string | no | Messaggio di errore se il controllo non è riuscito. | |
Ad esempio, per gli item supportati:
- Il server apre una connessione TCP
- Il server invia <HEADER><DATALEN>{"request":"passive checks","data":[{"key":"agent.ping","timeout":3}]}
- L'agent legge la richiesta e risponde con <HEADER><DATALEN>{"version":"7.0.0","variant":2,"data":[{"value":1}]}
- Il server elabora i dati per ottenere il valore, nel nostro caso '1'
- La connessione TCP viene chiusa
Per gli item non supportati:
- Il server apre una connessione TCP
- Il server invia <HEADER><DATALEN>{"request":"passive checks","data":[{"key":"vfs.fs.size[/nono]","timeout":3}]}
- L'agent legge la richiesta e risponde con <HEADER><DATALEN>{"version":"7.0.0","variant":2,"data":[{"error":"Unsupported item key."}]}
- Il server elabora i dati e modifica lo stato dell'item in non supportato con il messaggio di errore specificato
- La connessione TCP viene chiusa
Failover al protocollo precedente
Per garantire che Zabbix server o proxy possano funzionare con agent delle versioni precedenti alla 7.0, che utilizzano il protocollo in testo semplice, è stato implementato il failover al protocollo precedente.
I controlli passivi vengono eseguiti utilizzando il protocollo JSON (versione 7.0 e successive) dopo un riavvio o quando viene modificata la configurazione dell'interfaccia. Se non viene ricevuto alcun JSON valido in risposta (l'agent ha inviato "ZBX_NOTSUPPORTED"), Zabbix memorizzerà nella cache dell'interfaccia l'utilizzo del protocollo precedente e ritenterà il controllo inviando solo la chiave dell'item.
Si noti che ogni ora Zabbix server/proxy proverà nuovamente a utilizzare il nuovo protocollo con tutte le interfacce, tornando al protocollo precedente se necessario.
Controlli attivi
I controlli attivi richiedono un'elaborazione più complessa. L'agent deve prima recuperare dal server/proxy un elenco di item e/o comandi remoti per l'elaborazione indipendente.
I server/proxy da cui ottenere i controlli attivi sono elencati nel parametro 'ServerActive' del file di configurazione dell'agent. La frequenza con cui vengono richiesti questi controlli è impostata dal parametro 'RefreshActiveChecks' nello stesso file di configurazione. Tuttavia, se l'aggiornamento dei controlli attivi non riesce, viene ritentato dopo 60 secondi predefiniti.
A partire da Zabbix 6.4, l'agent (in modalità attiva) non riceve più dal server/proxy una copia completa della configurazione una volta ogni due minuti (impostazione predefinita). Invece, per ridurre il traffico di rete e l'utilizzo delle risorse, viene eseguita una sincronizzazione incrementale della configurazione ogni 5 secondi (impostazione predefinita), durante la quale il server/proxy fornisce una copia completa della configurazione solo se l'agent non l'ha ancora ricevuta oppure se è cambiato qualcosa nella configurazione dell'host, nelle macro globali o nelle espressioni regolari globali.
L'agent invia quindi periodicamente i nuovi valori al server (o ai server). Se l'agent ha ricevuto comandi remoti da eseguire, verrà inviato anche il risultato dell'esecuzione. Si noti che l'esecuzione di comandi remoti su un agent attivo è supportata a partire da Zabbix agent 7.0.
Se un agent si trova dietro un firewall, si può prendere in considerazione l'utilizzo esclusivo dei controlli attivi, poiché in questo caso non sarebbe necessario modificare il firewall per consentire le connessioni in ingresso iniziali.
Ottenere l'elenco degli item
Richiesta dell'agent
La richiesta dei controlli attivi viene utilizzata per ottenere i controlli attivi che devono essere elaborati dall'agent. Questa richiesta viene inviata dall'agent all'avvio e successivamente agli intervalli RefreshActiveChecks.
{
"request": "active checks",
"host": "Zabbix server",
"host_metadata": "mysql,nginx",
"interface": "zabbix.server.lan",
"ip": "159.168.1.1",
"port": 12050,
"version": "7.0.0",
"variant": 2,
"config_revision": 1,
"session": "e3dcbd9ace2c9694e1d7bbd030eeef6e"
}
| Field | Type | Mandatory | Value |
|---|---|---|---|
| request | string | yes | active checks |
| host | string | yes | Nome dell'host. |
| host_metadata | string | no | Valore del parametro di configurazione HostMetadata o della metrica HostMetadataItem. |
| interface | string | no | Valore del parametro di configurazione HostInterface o della metrica HostInterfaceItem. |
| ip | string | no | Primo indirizzo IP del parametro di configurazione ListenIP, se impostato. |
| port | number | no | Valore del parametro di configurazione ListenPort, se impostato e diverso dalla porta di ascolto predefinita dell'agent. |
| version | string | yes | Numero di versione dell'agent. |
| variant | number | yes | Variante dell'agent (1 - Zabbix agent, 2 - Zabbix agent 2). |
| config_revision | number | no | Identificatore della configurazione per la sincronizzazione incrementale della configurazione. |
| session | string | no | Identificatore della sessione per la sincronizzazione incrementale della configurazione. |
Risposta del server
La risposta dei controlli attivi viene inviata dal server all'agent dopo l'elaborazione della richiesta dei controlli attivi.
{
"response": "success",
"config_revision": 2,
"data": [
{
"key": "system.uptime",
"itemid": 1234,
"delay": "10s",
"lastlogsize": 0,
"mtime": 0
},
{
"key": "agent.version",
"itemid": 5678,
"delay": "10m",
"lastlogsize": 0,
"mtime": 0,
"timeout": "30s"
}
],
"commands": [
{
"command": "df -h --output=source,size / | awk 'NR>1 {print $2}'",
"id": 1324,
"wait": 1
}
]
}
| Field | Type | Mandatory | Value | |
|---|---|---|---|---|
| response | string | yes | success | failed |
|
| info | string | no | Informazioni sull'errore in caso di errore. | |
| data | array of objects | no | Item dei controlli attivi. Omesso se la configurazione dell'host non è cambiata. | |
| key | string | no | Chiave dell'item con macro espanse. | |
| itemid | number | no | Identificatore dell'item. | |
| delay | string | no | Intervallo di aggiornamento dell'item. Gli intervalli flessibili/di pianificazione sono supportati sia da Zabbix agent sia da Zabbix agent 2 a partire da Zabbix 7.0. |
|
| lastlogsize | number | no | lastlogsize dell'item. | |
| mtime | number | no | mtime dell'item. | |
| timeout | string | no | Timeout dell'item. | |
| refresh_unsupported | number | no | Intervallo di aggiornamento degli item non supportati. | |
| regexp | array of objects | no | Espressioni regolari globali. | |
| name | string | no | Nome dell'espressione regolare globale. | |
| expression | string | no | Espressione regolare globale. | |
| expression_type | number | no | Tipo di espressione regolare globale. | |
| exp_delimiter | string | no | Delimitatore dell'espressione regolare globale. | |
| case_sensitive | number | no | Impostazione della distinzione tra maiuscole e minuscole dell'espressione regolare globale. | |
| commands | array of objects | no | Comandi remoti da eseguire. Inclusi se l'esecuzione di un comando remoto è stata attivata da un'operazione di un'azione o dall'esecuzione manuale di uno script. L'esecuzione di comandi remoti su un agent attivo è supportata a partire da Zabbix agent 7.0. Gli agent attivi meno recenti ignoreranno tutti i comandi remoti inclusi nella risposta del server ai controlli attivi. | |
| command | string | no | Comando remoto. | |
| id | number | no | Identificatore del comando remoto. | |
| wait | number | no | Modalità di esecuzione del comando remoto ("0" (nowait) per i comandi provenienti dalle operazioni delle azioni; "1" (wait) per i comandi provenienti dall'esecuzione manuale di uno script). | |
| timeout | number | no | Timeout di esecuzione del comando remoto nella configurazione di server/proxy. | |
| config_revision | number | no | Identificatore della configurazione per la sincronizzazione incrementale della configurazione. Omesso se la configurazione dell'host non è cambiata. Incrementato se la configurazione dell'host è cambiata. | |
Il server deve rispondere con esito positivo.
Ad esempio:
- L'agent apre una connessione TCP
- L'agent richiede l'elenco dei controlli
- Il server risponde con un elenco di item e comandi remoti da eseguire
- L'agent analizza la risposta
- La connessione TCP viene chiusa
- L'agent avvia la raccolta periodica dei dati ed esegue i comandi remoti (supportato a partire da Zabbix agent 7.0)
Tenere presente che i dati di configurazione (sensibili) potrebbero diventare disponibili a soggetti che hanno accesso alla porta trapper del server Zabbix quando si utilizza un controllo attivo. Ciò è possibile perché chiunque può fingersi un agent attivo e richiedere i dati di configurazione degli item; l'autenticazione non viene eseguita a meno che non si utilizzino le opzioni di crittografia.
Invio dei dati raccolti
Invio da parte dell'agent
La richiesta di dati dell'agent contiene i valori degli item raccolti e i valori dei comandi remoti eseguiti (se presenti).
{
"request": "agent data",
"data": [
{
"id": 1,
"itemid": 5678,
"value": "7.0.0",
"clock": 1712830783,
"ns": 76808644
},
{
"id": 2,
"itemid": 1234,
"value": "69672",
"clock": 1712830783,
"ns": 77053975
}
],
"commands": [
{
"id": 1324,
"value": "16G"
}
],
"session": "8495cd52070e6ca52b371f29c8574165",
"host": "Zabbix server",
"version": "7.0.0",
"variant": 2
}
| Field | Type | Mandatory | Value | |
|---|---|---|---|---|
| request | string | yes | agent data |
|
| data | array of objects | yes | Valori degli item. | |
| id | number | yes | Identificatore del valore (contatore incrementale utilizzato per verificare la presenza di valori duplicati in caso di problemi di rete). | |
| itemid | number | yes | Identificatore dell'item. | |
| value | string | no | Valore dell'item. | |
| lastlogsize | number | no | lastlogsize dell'item. | |
| mtime | number | no | mtime dell'item. | |
| state | number | no | Stato dell'item. | |
| source | string | no | Origine del registro eventi del valore. | |
| eventid | number | no | eventid del registro eventi del valore. | |
| severity | number | no | Gravità del registro eventi del valore. | |
| timestamp | number | no | timestamp del registro eventi del valore. | |
| clock | number | yes | Timestamp del valore (secondi dall'Epoch). | |
| ns | number | yes | Nanosecondi del timestamp del valore. | |
| commands | array of objects | no | Risultato dell'esecuzione dei comandi remoti. L'esecuzione dei comandi remoti su un agent attivo è supportata a partire da Zabbix agent 7.0. Gli agent attivi meno recenti ignoreranno tutti i comandi remoti inclusi nella risposta del server dei controlli attivi. | |
| id | number | no | Identificatore del comando remoto. | |
| value | string | no | Risultato dell'esecuzione del comando remoto se l'esecuzione è riuscita. | |
| error | string | no | Messaggio di errore dell'esecuzione del comando remoto se l'esecuzione non è riuscita. | |
| session | string | yes | Identificatore univoco della sessione generato ogni volta che viene avviato l'agent (lungo 32 cifre esadecimali). | |
| host | string | yes | Nome dell'host. | |
| version | string | yes | Numero di versione dell'agent. | |
| variant | number | yes | Variante dell'agent (1 - Zabbix agent, 2 - Zabbix agent 2). | |
A ogni valore viene assegnato un ID virtuale. L'ID del valore è un semplice contatore crescente, univoco all'interno di una sessione dati (identificata dal token di sessione). Questo ID viene utilizzato per scartare i valori duplicati che potrebbero essere inviati in ambienti con connettività scarsa.
Risposta del server
La risposta ai dati dell'agent viene inviata dal server all'agent dopo l'elaborazione della richiesta di dati dell'agent.
{
"response": "success",
"info": "processed: 2; failed: 0; total: 2; seconds spent: 0.003534"
}
| Field | Type | Mandatory | Value |
|---|---|---|---|
| response | string | yes | success | failed |
| info | string | yes | Risultati dell'elaborazione degli item. |
Se l'invio di alcuni valori non riesce sul server (ad esempio perché l'host o l'item è stato disabilitato o eliminato), l'agent non tenterà nuovamente di inviare tali valori.
Ad esempio:
- L'agent apre una connessione TCP
- L'agent invia un elenco di valori
- Il server elabora i dati e invia lo stato
- La connessione TCP viene chiusa
Il messaggio di errore verrà troncato a 2048 caratteri sul server.
Messaggio heartbeat
L'agent invia
Il messaggio heartbeat viene inviato da un agent attivo al server/proxy Zabbix ogni HeartbeatFrequency secondi (configurato nel file di configurazione di Zabbix agent/agent 2).
Viene utilizzato per monitorare la disponibilità dei controlli attivi.
{
"request": "active check heartbeat",
"host": "Zabbix server",
"heartbeat_freq": 60,
"version": "7.0.0",
"variant": 2
}
| Campo | Tipo | Obbligatorio | Valore |
|---|---|---|---|
| request | string | sì | active check heartbeat |
| host | string | sì | Il nome dell'host. |
| heartbeat_freq | number | sì | La frequenza heartbeat dell'agent (parametro di configurazione HeartbeatFrequency). |
| version | string | sì | Il numero di versione dell'agent. |
| variant | number | sì | La variante dell'agent (1 - Zabbix agent, 2 - Zabbix agent 2). |
Risposta di reindirizzamento
Quando un host è stato riassegnato, il server può indicare all'agent di reindirizzare il proprio heartbeat (e i successivi controlli attivi) a un altro proxy o a un'altra istanza del server.
{
"response": "failed",
"redirect": {
"revision": 2,
"address": "192.0.2.1:10055"
}
}
| Campo | Tipo | Obbligatorio | Valore | |
|---|---|---|---|---|
| response | string | sì | success | failed |
|
| redirect | object | sì | Istruzioni per il reindirizzamento. | |
| revision | number | sì | Identificatore della revisione della configurazione. | |
| address | string | sì | Indirizzo del server/proxy di destinazione. | |
Protocollo XML precedente
Zabbix accetterà fino a 16 MB di dati XML codificati in Base64, ma un singolo valore decodificato non deve superare i 64 KB; in caso contrario, verrà troncato a 64 KB durante la decodifica.