כותרת מס' 6
הכותרת קיימת בכל הודעות הבקשה והתגובה בין רכיבי Zabbix. נדרש לקבוע את אורך ההודעה, אם היא דחוסה או לא, אם היא חבילה גדולה או לא.
לפרוטוקול התקשורת של Zabbix יש מגבלת גודל מנות של 1GB לכל חיבור. הגבלה של 1GB מוחל הן על אורך נתוני החבילה שהתקבלו והן על אורך הנתונים הלא דחוסים.
בעת שליחת תצורה ל-Proxy Zabbix, מגבלת גודל החבילה גדלה ל-4GB כדי לאפשר סנכרון תצורות גדולות. כאשר אורך הנתונים לפני הדחיסה עולה על 4GB, שרת Zabbix באופן אוטומטי מתחיל להשתמש בפורמט החבילות הגדולות (דגל 0x04) שמגדיל את מגבלת גודל החבילה ל-16GB.
שים לב שבעוד שניתן להשתמש בפורמט מנות גדול לשליחת כל נתונים, כרגע רק פרוקסי Zabbix סינכרון התצורה יכול להתמודד עם מנות שגודלן עולה על 1GB.
הכותרת מורכבת מארבעה שדות. כל המספרים בכותרת מעוצבים כ- little-endian.
שדה | גודל | גודל (חבילה גדולה) |
תיאור |
---|---|---|---|
<PROTOCOL> |
4 | 4 | "ZBXD" או 5A 42 58 44 |
<FLAGS> |
1 | 1 | דגלים של פרוטוקול:0x01 - פרוטוקול תקשורת Zabbix0x02 - דחיסה0x04 - חבילה גדולה |
<DATALEN> |
4 | 8 | אורך נתונים. |
<RESERVED> |
4 | 8 | כאשר נעשה שימוש בדחיסה (דגל 0x02 ) - אורך הנתונים הלא דחוסיםכאשר לא נעשה שימוש בדחיסה - 00 00 00 00 |
הנה כמה קטעי קוד שמראים כיצד להוסיף את כותרת פרוטוקול Zabbix לנתונים שברצונך לשלוח לפי הסדר כדי להשיג את החבילה עליך לשלוח ל-Zabix כדי שתפורש נכון. קטעי הקוד האלה נניח שהנתונים אינם גדולים מ-1GB, ולכן לא נעשה שימוש בפורמט החבילות הגדולות.
packet = b"ZBXD\1" + struct.pack("<II", len(data), 0) + נתונים
אוֹ
def zbx_create_header(plain_data_size, compressed_data_size=ללא):
פרוטוקול = b"ZBXD"
דגלים = 0x01
אם compressed_data_size הוא None:
datalen = plain_data_size
שמור = 0
אַחֵר:
דגלים |= 0x02
datalen = compressed_data_size
שמור = plain_data_size
return protocol + struct.pack("<BII", flags, datalen, שמור)
packet = zbx_create_header(len(data)) + נתונים
$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";
$flags שלי = 0x01;
$הדאטלן שלי;
$שמורה שלי;
if (!defined($compressed_data_size))
{
$datalen = $plain_data_size;
$reserved = 0;
}
אַחֵר
{
$flags |= 0x02;
$datalen = $compressed_data_size;
$reserved = $plain_data_size;
}
החזר $פרוטוקול . chr($flags) . pack("(II)<", $datalen, $reserved);
}
my $packet = zbx_create_header(length($data)) . $data;
`php $packet = "ZBXD\1" . pack("VV", strlen($data), 0) . $data;
אוֹ
`` `php
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;
}
אַחֵר
{
$flags |= 0x02;
$datalen = $compressed_data_size;
$reserved = $plain_data_size;
}
החזר $פרוטוקול . chr($flags) . pack("VV", $datalen, $reserved);
}
$packet = zbx_create_header(strlen($data)) . $data;
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"