Protocolli di controllo passivi e attivi

Questa sezione fornisce i dettagli del protocollo relativi ai 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/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 invia il risultato al server.

I controlli passivi vengono eseguiti in modo asincrono: non è necessario ricevere la risposta a una richiesta prima che vengano avviati 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à il successivo indirizzo disponibile, 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 Passive check item.
key string yes Item key with expanded macros.
timeout number yes Communication timeout.

Risposta dell'agent

{
  "version": "8.0.0",
  "variant": 2,
  "data": [
    {
      "value": "8.0.0"
    }
  ]
}
Field Type Mandatory Value
version string yes The agent version number.
variant number yes The agent variant (1 - Zabbix agent, 2 - Zabbix agent 2).
data array of object yes Contains the result of the check.
value string no The item value if the check was successful.
error string no The error message if the check was not successful.

Ad esempio, per gli item supportati:

  1. Il server apre una connessione TCP
  2. Il server invia <HEADER><DATALEN>{"request":"passive checks","data":[{"key":"agent.ping","timeout":3}]}
  3. L'agent legge la richiesta e risponde con <HEADER><DATALEN>{"version":"8.0.0","variant":2,"data":[{"value":1}]}
  4. Il server elabora i dati per ottenere il valore, '1' nel nostro caso
  5. La connessione TCP viene chiusa

Per gli item non supportati:

  1. Il server apre una connessione TCP
  2. Il server invia <HEADER><DATALEN>{"request":"passive checks","data":[{"key":"vfs.fs.size[/nono]","timeout":3}]}
  3. L'agent legge la richiesta e risponde con <HEADER><DATALEN>{"version":"8.0.0","variant":2,"data":[{"error":"Unsupported item key."}]}
  4. Il server elabora i dati, cambia lo stato dell'item in non supportato con il messaggio di errore specificato
  5. La connessione TCP viene chiusa
Failover al vecchio protocollo

Per garantire che Zabbix server o proxy possano funzionare con agent delle versioni precedenti alla 7.2, che utilizzano il protocollo in testo semplice, è stato implementato un failover al vecchio protocollo.

I controlli passivi vengono eseguiti usando il protocollo JSON (7.0 e versioni successive) dopo il riavvio o quando la configurazione dell'interfaccia viene modificata.
Se non viene ricevuta alcuna risposta JSON valida (l'agent ha inviato "ZBX_NOTSUPPORTED"), Zabbix memorizzerà nella cache l'interfaccia come vecchio protocollo e ritenterà il controllo inviando solo la chiave dell'item.

Si noti che ogni ora Zabbix server/proxy proverà nuovamente a lavorare con il nuovo protocollo con tutte le interfacce, tornando al vecchio protocollo 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, il tentativo viene ripetuto 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'uso delle risorse, viene eseguita una sincronizzazione incrementale della configurazione ogni 5 secondi (impostazione predefinita), in base alla 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. Se l'agent ha ricevuto dei 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 il firewall, potresti prendere in considerazione l'uso esclusivo dei controlli attivi, perché in questo caso non sarebbe necessario modificare il firewall per consentire le connessioni iniziali in ingresso.

Ottenere l'elenco degli item

Richiesta dell'agent

La richiesta di active checks viene utilizzata per ottenere gli active checks da elaborare da agent.
Questa richiesta viene inviata dall'agent all'avvio e poi a intervalli di RefreshActiveChecks.

{
  "request": "active checks",
  "host": "Zabbix server",
  "host_metadata": "mysql,nginx",
  "interface": "zabbix.server.lan",
  "ip": "159.168.1.1",
  "port": 12050,
  "version": "8.0.0",
  "variant": 2,
  "config_revision": 1,
  "session": "e3dcbd9ace2c9694e1d7bbd030eeef6e"
}
Field Type Mandatory Value
request string yes active checks
host string yes Host name.
host_metadata string no The configuration parameter HostMetadata or HostMetadataItem metric value.
interface string no The configuration parameter HostInterface or HostInterfaceItem metric value.
ip string no The configuration parameter ListenIP first IP if set.
port number no The configuration parameter ListenPort value if set and not default agent listening port.
version string yes The agent version number.
variant number yes The agent variant (1 - Zabbix agent, 2 - Zabbix agent 2).
config_revision number no Configuration identifier for incremental configuration sync.
session string no Session identifier for incremental configuration sync.

Risposta del server

La risposta degli active checks viene inviata dal server a agent dopo l'elaborazione della richiesta di active checks.

{
  "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 Error information in case of failure.
data array of objects no Active check items. Omitted if host configuration is unchanged.
key string no Item key with expanded macros.
itemid number no Item identifier.
delay string no Item update interval.
Flexible/scheduling intervals are supported by both Zabbix agent and Zabbix agent 2 since Zabbix 7.0.
lastlogsize number no Item lastlogsize.
mtime number no Item mtime.
timeout string no Item timeout.
refresh_unsupported number no Unsupported item refresh interval.
regexp array of objects no Global regular expressions.
name string no Global regular expression name.
expression string no Global regular expression.
expression_type number no Global regular expression type.
exp_delimiter string no Global regular expression delimiter.
case_sensitive number no Global regular expression case sensitivity setting.
commands array of objects no Remote commands to execute. Included if remote command execution has been triggered by an action operation or manual script execution. Note that remote command execution on an active agent is supported since Zabbix agent 7.0. Older active agents will ignore any remote commands included in the active checks server response.
command string no Remote command.
id number no Remote command identifier.
wait number no Remote command mode of execution ("0" (nowait) for commands from action operations; "1" (wait) for commands from manual script execution).
timeout number no Remote command execution timeout in server/proxy configuration.
config_revision number no Configuration identifier for incremental configuration sync. Omitted if host configuration is unchanged. Incremented if host configuration is changed.

Il server deve rispondere con success.

Ad esempio:

  1. Agent apre una connessione TCP
  2. Agent richiede l'elenco dei check
  3. Server risponde con un elenco di item e dei comandi remoti da eseguire
  4. Agent analizza la risposta
  5. La connessione TCP viene chiusa
  6. Agent avvia la raccolta periodica dei dati ed esegue i comandi remoti (supportato da Zabbix agent 7.0)

Si noti che i dati di configurazione (sensibili) possono diventare disponibili a soggetti che hanno accesso alla porta trapper del server Zabbix quando si utilizza un active check. Questo è possibile perché chiunque può fingersi un active agent e richiedere i dati di configurazione degli item; l'autenticazione non viene eseguita a meno che non si utilizzino opzioni di crittografia.

Invio dei dati raccolti

Agent invia

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": "8.0.0",
  "variant": 2
}
Field Type Mandatory Value
request string yes agent data
data array of objects yes Valori degli item.
id number yes L'identificatore del valore (contatore incrementale usato per verificare valori duplicati in caso di problemi di rete).
itemid number yes L'identificatore dell'item.
value string no Il valore dell'item.
lastlogsize number no Il lastlogsize dell'item.
mtime number no Il mtime dell'item.
state number no Lo stato dell'item.
source string no La sorgente del registro eventi del valore.
eventid number no L'eventid del registro eventi del valore.
severity number no La severity del registro eventi del valore.
timestamp number no Il timestamp del registro eventi del valore.
clock number yes Il timestamp del valore (secondi dall'Epoch).
ns number yes I nanosecondi del timestamp del valore.
commands array of objects no Risultato dell'esecuzione dei comandi remoti. Si noti che l'esecuzione di comandi remoti su un agent attivo è supportata da Zabbix agent 7.0. Gli agent attivi precedenti ignoreranno eventuali comandi remoti inclusi nella risposta del server ai controlli attivi.
id number no Identificatore del comando remoto.
value string no Risultato dell'esecuzione del comando remoto se l'esecuzione è andata a buon fine.
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 l'agent viene avviato (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 singola sessione di dati (identificata dal token di sessione). Questo ID viene usato per scartare i valori duplicati che potrebbero essere inviati in ambienti con connettività scarsa.

Risposta del server

La risposta dei 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é host o item sono stati disabilitati o eliminati), l'agent non ritenterà l'invio di tali valori.

Ad esempio:

  1. L'agent apre una connessione TCP
  2. L'agent invia un elenco di valori
  3. Il server elabora i dati e invia lo stato indietro
  4. La connessione TCP viene chiusa

Il messaggio di errore verrà troncato a 2048 simboli sul lato server.

Messaggio heartbeat

Agent invia

Il messaggio heartbeat viene inviato da un agent attivo a 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": "8.0.0",
  "variant": 2
}
Field Type Mandatory Value
request string yes active check heartbeat
host string yes Il nome dell'host.
heartbeat_freq number yes La frequenza heartbeat dell'agent (parametro di configurazione HeartbeatFrequency).
version string yes Il numero di versione dell'agent.
variant number yes 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'altra istanza di proxy o server.

  {
    "response": "failed",
    "redirect": {
      "revision": 2,
      "address": "192.0.2.1:10055"
    }
  }
Field Type Mandatory Value
response string yes success | failed
redirect object yes Istruzioni di reindirizzamento.
revision number yes Identificatore della revisione della configurazione.
address string yes Indirizzo di destinazione di server/proxy.

Vecchio protocollo XML

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.