6 Заглавље

Преглед

Заглавље је присутно у свим порукама захтева и одговора између Zabbix компоненти. Потребно је одредити дужину поруке, да ли је компримована или не, да ли је велики пакет или не.

Zabbix комуникациони протокол има ограничење величине пакета од 1GB по конекцији. Ограничење од 1GB примењује се и на дужину примљеног пакета података и на дужину некомпримованих података.

Приликом слања конфигурације на Zabbix прокси, ограничење величине пакета се повећава на 4GB да би се то омогућило синхронизовање великих конфигурација. Када дужина података пре компресије пређе 4GB, Zabbix сервер аутоматски почиње да користи формат великог пакета (0x04 flag) који повећава ограничење величине пакета на 16GB.

Имајте на уму да иако се велики формат пакета може користити за слање било каквих података, тренутно само Zabbix прокси конфигурациони синхронизатор може да обрађује пакете који су већи од 1GB.

Структура

Заглавље се састоји од четири поља. Сви бројеви у заглављу су форматирани у формату little-endian.

Field Size Size
(large packet)
Description
<PROTOCOL> 4 4 "ZBXD" или 5А 42 58 44
< FLAGS > 1 1 Заставице протокола:
0x01 - Zabbix комуникациони протокол
0x02 - компресија
0x04 - велики пакет
<DATALEN> 4 8 Дужина података.
<RESERVED> 4 8 Када се користи компресија (заставица 0x02) - дужина некомпримованих података
Када се компресија не користи - 00 00 00 00

Примери

Ево неких исечака кода који показују како додати заглавље Zabbix протокола подацима које желите да пошаљете да бисте добили пакет који треба да пошаљете Zabbix-у како би се исправно интерпретирао. Ови исечци кода претпостављају да подаци нису већи од 1GB, тако да се формат великог пакета не користи.

Python
packet = b"ZBXD\1" + struct.pack("<II", len(data), 0) + data

или

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;

или

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;

или

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"