نقوم بحل المشكلات العملية في Zabbix باستخدام JavaScript

نقوم بحل المشكلات العملية في Zabbix باستخدام JavaScript
تيخون أوسكوفمهندس فريق تكامل Zabbix

Zabbix هو نظام أساسي قابل للتخصيص يستخدم لمراقبة أي نوع من البيانات. منذ الإصدارات الأولى من Zabbix ، كان لدى مسؤولي المراقبة القدرة على تشغيل البرامج النصية المختلفة عبر الإجراءات للتحقق من عقد الشبكة المستهدفة. في الوقت نفسه ، أدى إطلاق البرامج النصية إلى عدد من الصعوبات ، بما في ذلك الحاجة إلى دعم البرامج النصية ، وتسليمها إلى عقد الاتصال والوكلاء ، بالإضافة إلى دعم الإصدارات المختلفة.

جافا سكريبت ل Zabbix

في أبريل 2019 ، تم تقديم Zabbix 4.2 مع معالجة JavaScript المسبقة. تحمس الكثير من الأشخاص لفكرة التخلي عن كتابة البرامج النصية التي تأخذ البيانات في مكان ما ، وتهضمها وتوفرها بتنسيق يفهمه Zabbix ، وإجراء فحوصات بسيطة ستتلقى البيانات غير الجاهزة للتخزين والمعالجة بواسطة Zabbix ، و ثم قم بمعالجة دفق البيانات هذا باستخدام أدوات Zabbix و JavaScript. بالتزامن مع الاكتشاف منخفض المستوى والعناصر التابعة التي ظهرت في Zabbix 3.4 ، حصلنا على مفهوم مرن إلى حد ما لفرز وإدارة البيانات المستلمة.

في Zabbix 4.4 ، كاستمرار منطقي للمعالجة المسبقة في JavaScript ، ظهرت طريقة إعلام جديدة - Webhook ، والتي يمكن استخدامها لدمج إشعارات Zabbix بسهولة مع تطبيقات الطرف الثالث.

جافا سكريبت و Duktapes

لماذا تم اختيار JavaScript و Duktape؟ تم النظر في خيارات مختلفة للغات والمحركات:

  • Lua - Lua 5.1 تحديث
  • لوا - لوجيت
  • جافا سكريبت - Duktape
  • جافا سكريبت - JerryScript
  • مضمن بيثون
  • جزءا لا يتجزأ من لغة بيرل

كانت معايير الاختيار الرئيسية هي الانتشار ، وسهولة دمج المحرك في المنتج ، وانخفاض استهلاك الموارد والأداء العام للمحرك ، وسلامة إدخال رمز بهذه اللغة في المراقبة. بناءً على مجموعة المؤشرات ، فازت JavaScript بمحرك Duktape.

نقوم بحل المشكلات العملية في Zabbix باستخدام JavaScript

معايير الاختيار واختبار الأداء

ميزات Duktape:

- معيار ECMAScript E5 / E5.1
- وحدات Zabbix لـ Duktape:

  • Zabbix.log () - يسمح لك بكتابة رسائل بمستويات مختلفة من التفاصيل مباشرة في سجل خادم Zabbix ، مما يجعل من الممكن ربط الأخطاء ، على سبيل المثال ، في Webhook ، بحالة الخادم.
  • CurlHttpRequest () - يسمح لك بإجراء طلبات HTTP للشبكة ، والتي يعتمد عليها استخدام Webhook.
  • atob () و btoa () - يسمحان لك بترميز وفك تشفير السلاسل بتنسيق Base64.

ملاحظة. يتوافق Duktape مع معايير ACME. يستخدم Zabbix إصدار 2015 من البرنامج النصي. التغييرات اللاحقة طفيفة ، لذا يمكن تجاهلها..

سحر جافا سكريبت

يكمن كل سحر JavaScript في الكتابة الديناميكية وكتابة النوع: سلسلة ، رقمية ، ومنطقية.

هذا يعني أنه ليس من الضروري الإعلان مسبقًا عن نوع المتغير الذي يجب أن يُرجع قيمة.

في العمليات الحسابية ، يتم تحويل القيم التي يتم إرجاعها بواسطة عوامل التشغيل إلى أرقام. الاستثناء لمثل هذه العمليات هو الإضافة ، لأنه إذا كان أحد المصطلحات على الأقل عبارة عن سلسلة ، فسيتم تطبيق تحويل السلسلة على جميع المصطلحات.

ملاحظة. عادة ما يتم تنفيذ الطرق المسؤولة عن مثل هذه التحولات في النماذج الأولية للكائن ، قيمة ال и إلى سلسلة. قيمة ال يتم استدعاؤها أثناء التحويل العددي ودائمًا قبل الطريقة إلى سلسلة. طريقة قيمة ال يجب أن تُرجع قيمًا أولية ، وإلا فسيتم تجاهل نتيجتها.

طريقة تسمى على كائن قيمة ال. إذا لم يتم العثور عليها أو لم تُرجع قيمة أولية ، فسيتم استدعاء الطريقة إلى سلسلة. إذا كانت الطريقة إلى سلسلة غير موجود ، البحث قيمة ال في النموذج الأولي للكائن ، ويتكرر كل شيء حتى تكتمل معالجة القيمة ويتم تحويل جميع القيم الموجودة في التعبير إلى نفس النوع. إذا كان الكائن يطبق طريقة إلى سلسلة، والتي تُرجع قيمة أولية ، فهي تُستخدم لتحويل السلسلة. ومع ذلك ، فإن نتيجة تطبيق هذه الطريقة ليست بالضرورة سلسلة.

على سبيل المثال ، إذا لـ object 'الكائناتتم تعريف طريقة ' إلى سلسلة,

`var obj = { toString() { return "200" }}` 

طريقة إلى سلسلة إرجاع سلسلة بالضبط ، وعند إضافة سلسلة برقم ، نحصل على سلسلة ملتصقة:

`obj + 1 // '2001'` 

`obj + 'a' // ‘200a'`

ولكن إذا أعدت الكتابة إلى سلسلة، بحيث تقوم الطريقة بإرجاع رقم ، عند إضافة الكائن ، سيتم إجراء عملية حسابية مع تحويل رقمي وسيتم الحصول على نتيجة الجمع الرياضي.

`var obj = { toString() { return 200 }}` 

`obj + 1 // '2001'`

في هذه الحالة ، إذا أجرينا إضافة بسلسلة ، فسيتم إجراء تحويل سلسلة ، ونحصل على سلسلة ملتصقة.

`obj + 'a' // ‘200a'`

هذا هو سبب وجود عدد كبير من الأخطاء من قبل مستخدمي JavaScript المبتدئين.

طريقة إلى سلسلة يمكنك كتابة دالة من شأنها زيادة القيمة الحالية للكائن بمقدار 1.

نقوم بحل المشكلات العملية في Zabbix باستخدام JavaScript
تنفيذ النص بشرط أن يكون المتغير 3 ويساوي 4.

عند المقارنة مع فريق التمثيل (==) ، يتم تنفيذ الطريقة في كل مرة إلى سلسلة مع وظيفة زيادة القيمة. وفقًا لذلك ، مع كل مقارنة لاحقة ، تزداد القيمة. يمكن تجنب ذلك باستخدام المقارنة غير المصبوب (===).

نقوم بحل المشكلات العملية في Zabbix باستخدام JavaScript
مقارنة بدون نوع الصب

ملاحظة. لا تستخدم مقارنة المصبوب دون داع.

بالنسبة للبرامج النصية المعقدة ، مثل Webhooks ذات المنطق المعقد ، والتي تتطلب المقارنة مع كتابة النوع ، يوصى بالكتابة مسبقًا لعمليات التحقق من القيم التي ترجع المتغيرات وتعالج التناقضات والأخطاء.

ويب هوك ميديا

في أواخر عام 2019 وأوائل عام 2020 ، عمل فريق تكامل Zabbix بنشاط على تطوير Webhooks والتكاملات الجاهزة التي تأتي مع توزيع Zabbix.

نقوم بحل المشكلات العملية في Zabbix باستخدام JavaScript
رابط ل الوثائق

تجهيزها

  • أتاح ظهور المعالجة المسبقة في JavaScript التخلي عن معظم البرامج النصية الخارجية ، وفي الوقت الحالي في Zabbix يمكنك الحصول على أي قيمة وتحويلها إلى قيمة مختلفة تمامًا.
  • يتم تنفيذ المعالجة المسبقة في Zabbix عن طريق كود JavaScript ، والذي يتم تحويله ، عند تحويله إلى رمز ثانوي ، إلى وظيفة تأخذ قيمة واحدة كمعامل قيمنا كسلسلة (يمكن أن تحتوي السلسلة على رقم ورقم).
  • نظرًا لأن الإخراج عبارة عن وظيفة ، في نهاية البرنامج النصي مطلوب عائد أعلى.
  • من الممكن استخدام وحدات الماكرو المخصصة في التعليمات البرمجية.
  • يمكن أن تكون الموارد محدودة ليس فقط على مستوى نظام التشغيل ، ولكن أيضًا بشكل برمجي. يتم تخصيص 10 ميغا بايت كحد أقصى لخطوة المعالجة المسبقة ووقت تشغيل بحد أقصى 10 ثوانٍ.

نقوم بحل المشكلات العملية في Zabbix باستخدام JavaScript

ملاحظة. تعد قيمة المهلة البالغة 10 ثوانٍ كثيرة جدًا ، لأن جمع الآلاف من عناصر البيانات الشرطية في ثانية واحدة وفقًا لسيناريو معالجة مسبقة "ثقيل" يمكن أن يبطئ Zabbix. لذلك ، لا يوصى باستخدام المعالجة المسبقة لتنفيذ نصوص JavaScript كاملة من خلال ما يسمى بعناصر بيانات الظل (عناصر وهمية) ، والتي يتم تشغيلها فقط لأداء المعالجة المسبقة.

يمكنك التحقق من الكود الخاص بك من خلال اختبار المعالجة المسبقة أو استخدام الأداة المساعدة zabbix_js:

`zabbix_js -s *script-file -p *input-param* [-l log-level] [-t timeout]`

`zabbix_js -s script-file -i input-file [-l log-level] [-t timeout]`

`zabbix_js -h`

`zabbix_js -V`

مهام عملية

مهمة 1

استبدل العنصر المحسوب بالمعالجة المسبقة.

حالة: احصل على درجة الحرارة بالفهرنهايت من المستشعر لتخزينها في درجة مئوية.

في السابق ، كنا ننشئ عنصرًا يجمع درجة الحرارة بالدرجات فهرنهايت. بعد ذلك ، عنصر بيانات آخر (محسوب) من شأنه تحويل الفهرنهايت إلى درجة مئوية باستخدام صيغة.

مشاكل:

  • من الضروري تكرار عناصر البيانات وتخزين جميع القيم في قاعدة البيانات.
  • يجب أن توافق على الفواصل الزمنية لعنصر البيانات "الأصل" الذي يتم حسابه واستخدامه في الصيغة ، ولصنف البيانات المحسوب. خلاف ذلك ، قد ينتقل العنصر المحسوب إلى حالة غير مدعومة أو يحسب قيمة سابقة ، مما سيؤثر على موثوقية نتائج المراقبة.

كان أحد الحلول هو الابتعاد عن فترات الفحص المرنة لصالح فترات زمنية ثابتة لضمان تقييم العنصر المحسوب بعد العنصر الذي يتلقى البيانات (في حالتنا ، درجة الحرارة بالدرجات فهرنهايت).

ولكن إذا استخدمنا ، على سبيل المثال ، القالب لفحص عدد كبير من الأجهزة ، ويتم إجراء الفحص مرة واحدة كل 30 ثانية ، يقوم Zabbix "بالتسلل" لمدة 29 ثانية ، وفي الثانية الأخيرة يبدأ الفحص والحساب. يؤدي هذا إلى إنشاء قائمة انتظار ويؤثر على الأداء. لذلك ، يوصى باستخدام فترات زمنية ثابتة فقط إذا كان ذلك ضروريًا حقًا.

في هذه المشكلة ، الحل الأمثل هو معالجة JavaScript من سطر واحد يحول درجات فهرنهايت إلى درجات مئوية:

`return (value - 32) * 5 / 9;`

إنه سريع وسهل ، ولا تحتاج إلى إنشاء عناصر بيانات غير ضرورية والاحتفاظ بمحفوظات عليها ، ويمكنك أيضًا استخدام فترات زمنية مرنة لإجراء عمليات التحقق.

نقوم بحل المشكلات العملية في Zabbix باستخدام JavaScript

`return (parseInt(value) + parseInt("{$EXAMPLE.MACRO}"));`

ولكن ، إذا كان من الضروري في موقف افتراضي إضافة عنصر البيانات المستلمة ، على سبيل المثال ، مع أي ثابت محدد في الماكرو ، فيجب مراعاة أن المعلمة قيمنا يتوسع في سلسلة. في عملية إضافة السلسلة ، يتم دمج سلسلتين في سلسلة واحدة.

نقوم بحل المشكلات العملية في Zabbix باستخدام JavaScript

`return (value + "{$EXAMPLE.MACRO}");`

للحصول على نتيجة عملية حسابية ، من الضروري تحويل أنواع القيم التي تم الحصول عليها إلى تنسيق رقمي. لهذا يمكنك استخدام الوظيفة parseInt ()، والتي تنتج عددًا صحيحًا ، وظيفة parseFloat ()، والتي تنتج رقمًا عشريًا أو دالة عدد، والتي تُرجع عددًا صحيحًا أو عشريًا.

تحدي 2

احصل على الوقت بالثواني حتى نهاية الشهادة.

حالة: تصدر خدمة تاريخ انتهاء صلاحية الشهادة بالتنسيق "12 فبراير 12:33:56 2022 بتوقيت جرينتش".

في ECMAScript5 Date.parse () يقبل تاريخًا بتنسيق ISO 8601 (YYYY-MM-DDTHH: mm: ss.sssZ). من الضروري إرسال سلسلة إليه بالتنسيق MMM DD YYYY HH: mm: ss ZZ

مشكلة: يتم التعبير عن قيمة الشهر كنص وليس كرقم. لا تقبل Duktape البيانات بهذا التنسيق.

مثال على الحل:

  • بادئ ذي بدء ، يتم التصريح عن متغير يأخذ قيمة (النص بأكمله عبارة عن إعلان عن المتغيرات التي يتم سردها مفصولة بفواصل).

  • في السطر الأول نحصل على التاريخ في المعلمة قيمنا وفصلها بمسافات باستخدام الطريقة انقسم. وهكذا ، نحصل على مصفوفة ، حيث كل عنصر من عناصر المصفوفة ، بدءًا من الفهرس 0 ، يتوافق مع عنصر تاريخ واحد قبل وبعد مسافة. تقسيم (0) - شهر، تقسيم (1) - رقم، تقسيم (2) - سلسلة مع الوقت ، إلخ. بعد ذلك ، يمكن الوصول إلى كل عنصر من عناصر التاريخ بواسطة فهرس في المصفوفة.

`var split = value.split(' '),`

  • يتوافق كل شهر (بالترتيب الزمني) مع فهرس موقعه في المصفوفة (من 0 إلى 11). لتحويل قيمة نصية إلى قيمة رقمية ، تتم إضافة قيمة إلى فهرس الشهر (لأن الأشهر مرقمة بدءًا من 1). في هذه الحالة ، يتم أخذ التعبير مع إضافة واحد بين قوسين ، لأنه بخلاف ذلك سيتم الحصول على سلسلة ، وليس رقمًا. في النهاية نقوم به شريحة() - قص المصفوفة من النهاية لتترك حرفين فقط (وهو أمر مهم لأشهر برقم مكون من رقمين).

`MONTHS_LIST = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],`

`month_index = ('0' + (MONTHS_LIST.indexOf(split[0]) + 1)).slice(-2),`

  • نشكل سلسلة بتنسيق ISO من القيم التي تم الحصول عليها عن طريق إضافة السلاسل المعتادة بالترتيب المناسب.

`ISOdate = split[3] + '-' + month_index + '-' + split[1] + 'T' + split[2],`

البيانات في التنسيق الناتج هي عدد الثواني من 1970 إلى نقطة ما في المستقبل. يكاد يكون من المستحيل استخدام البيانات بالتنسيق المستلم في المشغلات ، لأن Zabbix يسمح لك بالعمل فقط مع وحدات الماكرو {تاريخ} и {وقت}، والتي تعرض التاريخ والوقت بتنسيق سهل الاستخدام.

  • يمكننا بعد ذلك الحصول على التاريخ الحالي في JavaScript بتنسيق Unix Timestamp وطرحه من تاريخ انتهاء صلاحية الشهادة الناتج للحصول على عدد المللي ثانية من الآن حتى انتهاء صلاحية الشهادة.

`now = Date.now();`

  • نقسم القيمة المستلمة على ألف للحصول على ثانية في Zabbix.

`return parseInt((Date.parse(ISOdate) - now) / 1000);`

في المشغل ، يمكنك تحديد التعبير "آخر"متبوعًا بمجموعة من الأرقام التي تتوافق مع عدد الثواني في الفترة التي تريد الرد عليها ، على سبيل المثال ، بالأسابيع. وبالتالي ، سيُعلم المشغل بانتهاء صلاحية الشهادة في غضون أسبوع.

ملاحظة. انتبه إلى الاستخدام parseInt () فى مهمة عائد أعلىلتحويل العدد الكسري الناتج عن قسمة ميلي ثانية إلى عدد صحيح. تستطيع ايضا استخذام parseFloat () وتخزين البيانات الجزئية.

مشاهدة التقرير

المصدر: www.habr.com

إضافة تعليق