Zabbixプロセス

概要

Zabbix は、システムを監視し、通知を送信するために連携して動作する複数のプロセスで構成されています。各プロセスは、監視インフラストラクチャ内で特定の役割を担っています。

コアプロセス

  • サーバー - データのポーリングとトラッピングを行い、トリガーを計算し、ユーザーに通知を送信する中核プロセスです。
  • エージェント - 監視対象のホストからデータを収集します。
  • Agent 2 - プラグインアーキテクチャと強化された機能を備えた新世代のエージェントです。
  • プロキシ - 監視対象デバイスから監視データを収集し、その情報を Zabbix サーバーに送信します。
  • Javaゲートウェイ - Javaアプリケーションの監視を可能にします。

ヘッダー

ヘッダーは、Zabbixコンポーネント間のすべてのリクエストおよびレスポンスメッセージに含まれます。
これは、メッセージ長、圧縮されているかどうか、大きなパケットかどうかを判定するために必要です。

Zabbix通信プロトコルでは、1接続あたりのパケットサイズ上限は1GBです。この1GBの上限は、受信したパケットデータ長と非圧縮データ長の両方に適用されます。

Zabbixプロキシに設定を送信する場合、サイズの大きい設定を同期できるように、パケットサイズ上限は4GBに引き上げられます。圧縮前のデータ長が4GBを超えると、Zabbixサーバーは自動的に大きなパケット形式(0x04フラグ)の使用を開始し、パケットサイズ上限は16GBに拡張されます。

大きなパケット形式は任意のデータ送信に使用できますが、現時点で1GBを超えるパケットを処理できるのはZabbixプロキシの設定同期機能のみです。

ヘッダー構造

ヘッダーは4つのフィールドで構成されます。ヘッダー内のすべての数値はリトルエンディアン形式で表されます。

Field Size Size
(large packet)
Description
<PROTOCOL> 4 4 "ZBXD" または 5A 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"