Processi di Zabbix
Panoramica
Zabbix è composto da diversi processi che lavorano insieme per monitorare i sistemi e inviare notifiche. Ogni processo ha un ruolo specifico nell'infrastruttura di monitoraggio.
Processi principali
- Server - il processo centrale che esegue il polling e la raccolta tramite trap dei dati, calcola i trigger e invia notifiche agli utenti.
- agent - raccoglie i dati dagli host monitorati.
- Agent 2 - un agent di nuova generazione con architettura a plugin e funzionalità avanzate.
- proxy - raccoglie i dati di monitoraggio dai dispositivi monitorati e invia le informazioni al server Zabbix.
- Java gateway - consente il monitoraggio delle applicazioni Java.
Intestazione
L'intestazione è presente in tutti i messaggi di richiesta e risposta tra i componenti di Zabbix.
È necessaria per determinare la lunghezza del messaggio, se è compresso o meno, e se si tratta o meno di un pacchetto di grandi dimensioni.
Il protocollo di comunicazione di Zabbix ha un limite di dimensione del pacchetto di 1 GB per connessione. Il limite di 1 GB
si applica sia alla lunghezza dei dati del pacchetto ricevuto sia alla lunghezza dei dati non compressi.
Quando si invia la configurazione a Zabbix proxy, il limite di dimensione del pacchetto viene aumentato a 4 GB per consentire
la sincronizzazione di configurazioni di grandi dimensioni. Quando la lunghezza dei dati prima della compressione supera i 4 GB, Zabbix server avvia automaticamente
l'uso del formato di pacchetto di grandi dimensioni (flag 0x04), che aumenta il limite di dimensione del pacchetto a 16 GB.
Si noti che, sebbene il formato di pacchetto di grandi dimensioni possa essere usato per inviare qualsiasi dato, attualmente solo il sincronizzatore di configurazione di Zabbix proxy
è in grado di gestire pacchetti più grandi di 1 GB.
Struttura dell'intestazione
L'intestazione è composta da quattro campi. Tutti i numeri nell'intestazione sono formattati in little-endian.
| Field | Size | Size (large packet) |
Description |
|---|---|---|---|
<PROTOCOL> |
4 | 4 | "ZBXD" o 5A 42 58 44 |
<FLAGS> |
1 | 1 | Flag del protocollo:0x01 - protocollo di comunicazione Zabbix0x02 - compressione0x04 - large packet |
<DATALEN> |
4 | 8 | Lunghezza dei dati. |
<RESERVED> |
4 | 8 | Quando viene usata la compressione (flag 0x02) - la lunghezza dei dati non compressiQuando la compressione non viene usata - 00 00 00 00 |
Esempi di header
Ecco alcuni frammenti di codice che mostrano come aggiungere l'header del protocollo Zabbix ai dati che si desidera inviare, in modo da ottenere il pacchetto da inviare a Zabbix affinché venga interpretato correttamente. Questi frammenti di codice presuppongono che i dati non siano più grandi di 1 GB, quindi non viene usato il formato per pacchetti di grandi dimensioni.
Python
packet = b"ZBXD\1" + struct.pack("<II", len(data), 0) + data
oppure
def zbx_create_header(plain_data_size, compressed_data_size=None):
protocol = b"ZBXD"
flags = 0x01
if compressed_data_size is None:
datalen = plain_data_size
reserved = 0
else:
flags |= 0x02
datalen = compressed_data_size
reserved = plain_data_size
return protocol + struct.pack("<BII", flags, datalen, reserved)
packet = zbx_create_header(len(data)) + data
Perl
my $packet = "ZBXD\1" . pack("(II)<", length($data), 0) . $data;
oppure
sub zbx_create_header($;$)
{
my $plain_data_size = shift;
my $compressed_data_size = shift;
my $protocol = "ZBXD";
my $flags = 0x01;
my $datalen;
my $reserved;
if (!defined($compressed_data_size))
{
$datalen = $plain_data_size;
$reserved = 0;
}
else
{
$flags |= 0x02;
$datalen = $compressed_data_size;
$reserved = $plain_data_size;
}
return $protocol . chr($flags) . pack("(II)<", $datalen, $reserved);
}
my $packet = zbx_create_header(length($data)) . $data;
PHP
$packet = "ZBXD\1" . pack("VV", strlen($data), 0) . $data;
oppure
function zbx_create_header($plain_data_size, $compressed_data_size = null)
{
$protocol = "ZBXD";
$flags = 0x01;
if (is_null($compressed_data_size))
{
$datalen = $plain_data_size;
$reserved = 0;
}
else
{
$flags |= 0x02;
$datalen = $compressed_data_size;
$reserved = $plain_data_size;
}
return $protocol . chr($flags) . pack("VV", $datalen, $reserved);
}
$packet = zbx_create_header(strlen($data)) . $data;
Bash
datalen=$(printf "%08x" ${#data})
datalen="\\x${datalen:6:2}\\x${datalen:4:2}\\x${datalen:2:2}\\x${datalen:0:2}"
printf "ZBXD\1${datalen}\0\0\0\0%s" "$data"