Procesy
Przegląd
Zabbix składa się z kilku procesów, które współpracują ze sobą, aby monitorować systemy i wysyłać powiadomienia. Każdy proces pełni określoną rolę w infrastrukturze monitorowania.
Procesy podstawowe
- Serwer - centralny proces, który wykonuje odpytywanie i przechwytywanie danych, oblicza wyzwalacze i wysyła powiadomienia do użytkowników.
- agent - zbiera dane z monitorowanych hostów.
- Agent 2 - agent nowej generacji z architekturą opartą na wtyczkach i rozszerzonymi możliwościami.
- proxy - zbiera dane monitorujące z monitorowanych urządzeń w imieniu serwera Zabbix i przesyła informacje do scentralizowanego serwera Zabbix w środowisku rozproszonym.
- Java gateway - umożliwia monitorowanie aplikacji Java.
Aby zapewnić łatwy dostęp do Zabbix z dowolnego miejsca i z dowolnej platformy, udostępniany jest interfejs internetowy. Interfejs jest częścią serwera Zabbix i zwykle (ale niekoniecznie) działa na tym samym fizycznym komputerze co serwer.
Wszystkie informacje konfiguracyjne, a także dane gromadzone przez Zabbix, są przechowywane w bazie danych.
Nagłówek
Nagłówek jest obecny we wszystkich wiadomościach żądań i odpowiedzi między komponentami Zabbix.
Jest wymagany do określenia długości wiadomości, tego, czy jest skompresowana, oraz tego, czy jest to duży pakiet.
Protokół komunikacji Zabbix ma limit rozmiaru pakietu 1 GB na połączenie. Limit 1 GB
jest stosowany zarówno do długości odebranych danych pakietu, jak i do długości danych nieskompresowanych.
Podczas wysyłania konfiguracji do Zabbix proxy limit rozmiaru pakietu jest zwiększany do 4 GB, aby umożliwić
synchronizację dużych konfiguracji. Gdy długość danych przed kompresją przekracza 4 GB, serwer Zabbix automatycznie
zaczyna używać formatu dużego pakietu (flaga 0x04), który zwiększa limit rozmiaru pakietu do 16 GB.
Należy pamiętać, że chociaż format dużego pakietu może być używany do wysyłania dowolnych danych, obecnie tylko synchronizator konfiguracji Zabbix proxy
może obsługiwać pakiety większe niż 1 GB.
Struktura nagłówka
Nagłówek składa się z czterech pól. Wszystkie liczby w nagłówku są sformatowane w kolejności little-endian.
| Field | Size | Size (large packet) |
Description |
|---|---|---|---|
<PROTOCOL> |
4 | 4 | "ZBXD" lub 5A 42 58 44 |
<FLAGS> |
1 | 1 | Flagi protokołu:0x01 - protokół komunikacyjny Zabbix0x02 - kompresja0x04 - duży pakiet |
<DATALEN> |
4 | 8 | Długość danych. |
<RESERVED> |
4 | 8 | Gdy używana jest kompresja (flaga 0x02) - długość nieskompresowanych danychGdy kompresja nie jest używana - 00 00 00 00 |
Przykłady nagłówka
Poniżej znajdują się przykładowe fragmenty kodu pokazujące, jak dodać nagłówek protokołu Zabbix do danych, które chcesz wysłać, aby uzyskać pakiet, który należy wysłać do Zabbix, tak aby został poprawnie zinterpretowany. Te fragmenty kodu zakładają, że rozmiar danych nie przekracza 1 GB, więc nie jest używany format dużego pakietu.
Python
packet = b"ZBXD\1" + struct.pack("<II", len(data), 0) + data
lub
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;
lub
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;
lub
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"