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"