4 Zabbix procesi

Pārskats

Zabbix sastāv no vairākiem procesiem, kas darbojas kopā, lai uzraudzītu sistēmas un nosūtītu paziņojumus. Katram procesam uzraudzības infrastruktūrā ir noteikta loma.

Pamata procesi

  • Server - centrālais process, kas veic datu aptauju un uztveršanu, aprēķina trigerus un nosūta paziņojumus lietotājiem.
  • Agent - apkopo datus no uzraudzītajiem hosts.
  • Agent 2 - jaunās paaudzes aģents ar spraudņu arhitektūru un paplašinātām iespējām.
  • Proxy - apkopo uzraudzības datus no uzraudzītajām ierīcēm un nosūta informāciju uz Zabbix serveri.
  • Java gateway - nodrošina Java lietojumprogrammu uzraudzību.

Virsraksts

Galvene ir iekļauta visos pieprasījuma un atbildes ziņojumos starp Zabbix komponentēm.
Tā ir nepieciešama, lai noteiktu ziņojuma garumu, to, vai tas ir saspiests, un to, vai tas ir liels pakotnes formāts.

Zabbix saziņas protokolam ir 1 GB pakotnes lieluma ierobežojums vienam savienojumam. 1 GB ierobežojums
tiek piemērots gan saņemtās pakotnes datu garumam, gan nesaspiesto datu garumam.

Nosūtot konfigurāciju uz Zabbix starpniekserveris, pakotnes lieluma ierobežojums tiek palielināts līdz 4 GB, lai ļautu
sinhronizēt lielas konfigurācijas. Ja datu garums pirms saspiešanas pārsniedz 4 GB, Zabbix serveris automātiski
sāk izmantot lielas pakotnes formātu (0x04 karodziņš), kas palielina pakotnes lieluma ierobežojumu līdz 16 GB.

Ņemiet vērā, ka, lai gan lielas pakotnes formātu var izmantot jebkuru datu nosūtīšanai, pašlaik tikai Zabbix starpniekservera
konfigurācijas sinhronizētājs var apstrādāt pakotnes, kas ir lielākas par 1 GB.

Galvenes struktūra

Galvene sastāv no četriem laukiem. Visi skaitļi galvenē ir formatēti kā little-endian.

Field Size Size
(large packet)
Description
<PROTOCOL> 4 4 "ZBXD" vai 5A 42 58 44
<FLAGS> 1 1 Protokola karodziņi:
0x01 - Zabbix sakaru protokols
0x02 - saspiešana
0x04 - liels pakotnes izmērs
<DATALEN> 4 8 Datu garums.
<RESERVED> 4 8 Ja tiek izmantota saspiešana (0x02 karodziņš) - nesaspiesto datu garums
Ja saspiešana netiek izmantota - 00 00 00 00

Galvenes piemēri

Šeit ir daži koda fragmenti, kas parāda, kā pievienot Zabbix protokola galveni datiem, kurus vēlaties nosūtīt, lai iegūtu paketi, kas jānosūta uz Zabbix, lai tā tiktu interpretēta pareizi. Šie koda fragmenti pieņem, ka datu apjoms nav lielāks par 1 GB, tāpēc lielās paketes formāts netiek izmantots.

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

vai

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;

vai

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;

vai

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"