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
          ако је compressed_data_size None:
          len podataka = plain_data_size
          reserved = 0
          else:
          flags |= 0x02
          len podataka = compressed_data_size
          reserved = plain_data_size
          return protocol + struct.pack("<BII", flags, len podataka, 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"