4 Zabbix-Prozesse

Übersicht

Zabbix besteht aus mehreren Prozessen, die zusammenarbeiten, um Systeme zu überwachen und Benachrichtigungen zu senden. Jeder Prozess hat eine spezifische Rolle in der Überwachungsinfrastruktur.

Kernprozesse

  • Server - der zentrale Prozess, der Daten abfragt und entgegennimmt, Auslöser berechnet und Benachrichtigungen an Benutzer sendet.
  • Agent - sammelt Daten von überwachten Hosts.
  • Agent 2 - ein Agent der neuen Generation mit Plugin-Architektur und erweiterten Funktionen.
  • Proxy - sammelt Überwachungsdaten von überwachten Geräten und sendet die Informationen an den Zabbix Server.
  • Java gateway - ermöglicht die Überwachung von Java-Anwendungen.

Überschrift

Der Header ist in allen Anfrage- und Antwortnachrichten zwischen Zabbix-Komponenten vorhanden.
Er wird benötigt, um die Nachrichtenlänge zu bestimmen, ob die Nachricht komprimiert ist oder nicht und ob es sich um ein großes Paket handelt oder nicht.

Das Zabbix-Kommunikationsprotokoll hat pro Verbindung ein Paketgrößenlimit von 1 GB. Das Limit von 1 GB
gilt sowohl für die Länge der empfangenen Paketdaten als auch für die Länge der unkomprimierten Daten.

Beim Senden der Konfiguration an den Zabbix-Proxy wird das Paketgrößenlimit auf 4 GB erhöht, um
die Synchronisierung großer Konfigurationen zu ermöglichen. Wenn die Datenlänge vor der Komprimierung 4 GB überschreitet, verwendet der Zabbix-Server automatisch
das große Paketformat (0x04-Flag), wodurch das Paketgrößenlimit auf 16 GB erhöht wird.

Beachten Sie, dass das große Paketformat zwar zum Senden beliebiger Daten verwendet werden kann, derzeit jedoch nur der Zabbix-Proxy
configuration syncer Pakete verarbeiten kann, die größer als 1 GB sind.

Headerstruktur

Der Header besteht aus vier Feldern. Alle Zahlen im Header sind im Little-Endian-Format dargestellt.

Field Size Size
(large packet)
Description
<PROTOCOL> 4 4 "ZBXD" oder 5A 42 58 44
<FLAGS> 1 1 Protokoll-Flags:
0x01 - Zabbix-Kommunikationsprotokoll
0x02 - Komprimierung
0x04 - großes Paket
<DATALEN> 4 8 Datenlänge.
<RESERVED> 4 8 Bei Verwendung von Komprimierung (Flag 0x02) - die Länge der unkomprimierten Daten
Wenn keine Komprimierung verwendet wird - 00 00 00 00

Header-Beispiele

Hier sind einige Codeausschnitte, die zeigen, wie Sie dem zu sendenden Datenpaket den Zabbix-Protokoll-Header hinzufügen, um das Paket zu erhalten, das Sie an Zabbix senden sollten, damit es korrekt interpretiert wird. Diese Codeausschnitte gehen davon aus, dass die Daten nicht größer als 1 GB sind, sodass das Format für große Pakete nicht verwendet wird.

Python
packet = b"ZBXD\1" + struct.pack("<II", len(data), 0) + data

oder

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;

oder

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;

oder

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"