Sidebar

Zabbix Summit 2022
Register for Zabbix Summit 2022

5 ヘッダー

概要

ヘッダーは、Zabbix コンポーネント間のすべての要求および応答メッセージに存在します。 ヘッダーの情報からメッセージの長さ、圧縮されているかどうか、大きなパケットであるかどうかを判断できます。

Zabbix 通信プロトコルには、接続ごとに 1GB のパケット サイズ制限があります。 受信パケットのデータ長、圧縮前のデータ長ともに1GBの制限が適用されます。

構成を Zabbix プロキシに送信する場合、大きな構成を同期できるように、パケット サイズの制限が 4 GB に増加します。 圧縮前のデータ長が 4GB を超えると、Zabbix サーバーは自動的に大きなパケット形式 (0x04 フラグ) を使用して起動し、パケット サイズの制限を 16GB に増やします。

任意のデータの送信に大きなパケット形式を使用できますが、現在、1GB を超えるパケットを処理できるのは Zabbix プロキシ構成シンカーのみであることに注意してください。

構造

ヘッダーは 4 つのフィールドで構成されます。 ヘッダー内のすべての数値は、リトルエンディアンとしてフォーマットされています。

フィールド サイズ サイズ
(ラージパケット)
説明
<PROTOCOL> 4 4 "ZBXD" または 5A 42 58 44
<FLAGS> 1 1 Protocol フラグ:
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"