4 Procesy Zabbix

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 główne

  • Server - 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ą wtyczek i rozszerzonymi możliwościami.
  • Proxy - zbiera dane monitorujące z monitorowanych urządzeń i wysyła informacje do serwera Zabbix.
  • Java gateway - umożliwia monitorowanie aplikacji Java.

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 Zabbix
0x02 - kompresja
0x04 - duży pakiet
<DATALEN> 4 8 Długość danych.
<RESERVED> 4 8 Gdy używana jest kompresja (flaga 0x02) - długość nieskompresowanych danych
Gdy 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"