כותרת מס' 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 - פרוטוקול תקשורת Zabbix
0x02 - דחיסה
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

`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"