Процессы Zabbix

Обзор

Zabbix состоит из нескольких процессов, которые работают вместе для мониторинга систем и отправки уведомлений. Каждый процесс выполняет свою определенную роль в инфраструктуре мониторинга.

Основные процессы

  • Server - центральный процесс, который выполняет опрос и прием данных, вычисляет триггеры и отправляет уведомления пользователям.
  • Agent - собирает данные с контролируемых узлов сети.
  • Agent 2 - агент нового поколения с архитектурой на основе плагинов и расширенными возможностями.
  • Proxy - собирает данные мониторинга с контролируемых устройств и отправляет информацию на сервер Zabbix.
  • Java gateway - обеспечивает мониторинг Java-приложений.

Заголовок

Заголовок присутствует во всех сообщениях запроса и ответа между компонентами Zabbix.
Он необходим для определения длины сообщения, того, сжато оно или нет, а также является ли оно большим пакетом.

Протокол обмена данными Zabbix имеет ограничение на размер пакета 1 ГБ на одно соединение. Ограничение в 1 ГБ
применяется как к длине полученных данных пакета, так и к длине несжатых данных.

При отправке конфигурации на прокси Zabbix ограничение на размер пакета увеличивается до 4 ГБ, чтобы обеспечить
синхронизацию больших конфигураций. Когда длина данных до сжатия превышает 4 ГБ, сервер Zabbix автоматически
начинает использовать формат большого пакета (флаг 0x04), который увеличивает ограничение на размер пакета до 16 ГБ.

Обратите внимание, что хотя формат большого пакета можно использовать для отправки любых данных, в настоящее время только синхронизатор конфигурации прокси Zabbix может обрабатывать пакеты размером более 1 ГБ.

Структура заголовка

Заголовок состоит из четырех полей. Все числа в заголовке представлены в формате little-endian.

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, чтобы он был корректно интерпретирован. В этих фрагментах кода предполагается, что размер данных не превышает 1 ГБ, поэтому формат большого пакета не используется.

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"