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 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"