Zabbix 进程

概述

Zabbix 由多个协同工作的进程组成,用于监控系统并发送通知。每个进程在监控基础架构中都承担着特定的职责。

核心进程

  • 服务器 - 执行数据轮询和捕获的核心进程,计算触发器,并向用户发送通知。
  • agent - 从被监控的主机收集数据。
  • Agent 2 - 具有插件架构和增强功能的新一代 agent。
  • proxy - 从受监控设备收集监控数据,并将信息发送到 Zabbix 服务器。
  • Java 网关 - 使能够监控 Java 应用程序。

标题

该头部存在于 Zabbix 组件之间的所有请求和响应消息中。
它用于确定消息长度、是否已压缩,以及是否为大数据包。

Zabbix 通信协议对每个连接的报文大小限制为 1GB。该限制同时适用于接收到的数据包长度和未压缩的数据长度。

在向 Zabbix proxy 发送配置时,数据包大小限制会增加到 4GB,以便同步大型配置。当压缩前的数据长度超过 4GB 时,Zabbix 服务器会自动开始使用大数据包格式(0x04 标志),这会将数据包大小限制提高到 16GB。

请注意,虽然大数据包格式可用于发送任何数据,但目前只有 Zabbix proxy 配置同步器能够处理大于 1GB 的数据包。

头部结构

头部由四个字段组成。头部中的所有数字均采用小端格式。

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"