Biz JavaScript yordamida Zabbix-da amaliy muammolarni hal qilamiz

Biz JavaScript yordamida Zabbix-da amaliy muammolarni hal qilamiz
Tixon Uskov, Zabbix integratsiya jamoasi muhandisi

Zabbix - bu har qanday ma'lumotni kuzatish uchun ishlatiladigan sozlanishi platforma. Zabbix-ning dastlabki versiyalaridan boshlab, monitoring ma'murlari turli xil skriptlarni ishga tushirish imkoniyatiga ega edilar. harakatlari maqsadli tarmoq tugunlarini tekshirish uchun. Shu bilan birga, skriptlarni ishga tushirish bir qator qiyinchiliklarga olib keldi, jumladan, skriptlarni qo'llab-quvvatlash zarurati, ularni aloqa tugunlari va proksi-serverlarga etkazib berish, shuningdek, turli versiyalarni qo'llab-quvvatlash.

Zabbix uchun JavaScript

2019-yil aprel oyida Zabbix 4.2 JavaScript-ni oldindan qayta ishlash bilan taqdim etildi. Ko'pchilik ma'lumotlarni biror joyda olib, uni hazm qiladigan va Zabbix tushunadigan formatda taqdim etadigan va Zabbix tomonidan saqlash va qayta ishlashga tayyor bo'lmagan ma'lumotlarni qabul qiladigan oddiy tekshiruvlarni amalga oshiradigan skriptlarni yozishdan voz kechish g'oyasidan hayajonlandi. keyin Zabbix va JavaScript vositalari yordamida ushbu ma'lumotlar oqimini qayta ishlang. Zabbix 3.4 da paydo bo'lgan past darajadagi kashfiyotlar va bog'liq elementlar bilan birgalikda biz olingan ma'lumotlarni saralash va boshqarish uchun juda moslashuvchan kontseptsiyaga ega bo'ldik.

Zabbix 4.4 da, JavaScript-da oldindan ishlov berishning mantiqiy davomi sifatida yangi bildirishnoma usuli - Webhook paydo bo'ldi, undan Zabbix bildirishnomalarini uchinchi tomon ilovalari bilan osongina integratsiyalash uchun foydalanish mumkin.

JavaScript va Duktapes

Nima uchun JavaScript va Duktape tanlangan? Tillar va dvigatellar uchun turli xil variantlar ko'rib chiqildi:

  • Lua - Lua 5.1
  • Lua - LuaJIT
  • Javascript - Duktape
  • Javascript - JerryScript
  • O'rnatilgan Python
  • O'rnatilgan Perl

Asosiy tanlov mezonlari keng tarqalganlik, dvigatelni mahsulotga integratsiya qilish qulayligi, kam resurs iste'moli va dvigatelning umumiy ishlashi va ushbu tildagi kodni monitoringga kiritish xavfsizligi edi. Ko'rsatkichlar kombinatsiyasiga asoslanib, JavaScript Duktape dvigatelida g'alaba qozondi.

Biz JavaScript yordamida Zabbix-da amaliy muammolarni hal qilamiz

Tanlash mezonlari va ishlash testlari

Duktape xususiyatlari:

- Standart ECMAScript E5/E5.1
— Duktape uchun Zabbix modullari:

  • Zabbix.log() - turli darajadagi tafsilotlarga ega xabarlarni to'g'ridan-to'g'ri Zabbix Server jurnaliga yozish imkonini beradi, bu esa xatolarni, masalan, Webhook-da, server holati bilan bog'lash imkonini beradi.
  • CurlHttpRequest() - Webhook-dan foydalanishga asoslangan tarmoqqa HTTP so'rovlarini yuborish imkonini beradi.
  • atob() va btoa() - Base64 formatidagi satrlarni kodlash va dekodlash imkonini beradi.

Eslatma. Duktape ACME standartlariga mos keladi. Zabbix skriptning 2015 yilgi versiyasidan foydalanadi. Keyingi o'zgarishlar ahamiyatsiz, shuning uchun ularni e'tiborsiz qoldirish mumkin..

JavaScript sehri

JavaScript-ning barcha sehrlari dinamik matn terish va turlarni taqsimlashda yotadi: string, raqamli va mantiqiy.

Bu shuni anglatadiki, o'zgaruvchi qaysi turdagi qiymatni qaytarishi kerakligini oldindan e'lon qilish shart emas.

Matematik operatsiyalarda funktsiya operatorlari tomonidan qaytarilgan qiymatlar raqamlarga aylantiriladi. Bunday amallar uchun istisno qo'shish hisoblanadi, chunki agar shartlardan kamida bittasi satr bo'lsa, barcha shartlarga string konvertatsiyasi qo'llaniladi.

Eslatma. Bunday transformatsiyalar uchun mas'ul bo'lgan usullar odatda ob'ektning asosiy prototiplarida amalga oshiriladi, qiymatiOf и toString. qiymatiOf raqamli konvertatsiya paytida va har doim usuldan oldin chaqiriladi toString. Usul qiymatiOf ibtidoiy qiymatlarni qaytarishi kerak, aks holda uning natijasi e'tiborga olinmaydi.

Usul ob'ektda chaqiriladi qiymatiOF. Agar u topilmasa yoki ibtidoiy qiymatni qaytarmasa, usul chaqiriladi toString. Agar usul toString topilmadi, qidirilmoqda qiymatiOf ob'ekt prototipida va qiymatni qayta ishlash tugaguniga qadar hamma narsa takrorlanadi va ifodadagi barcha qiymatlar bir xil turga aylantiriladi.. Agar ob'ekt usulni amalga oshirsa toString, bu ibtidoiy qiymatni qaytaradi, keyin u satrni o'zgartirish uchun ishlatiladi. Biroq, bu usulni qo'llash natijasi, albatta, satr bo'lishi shart emas.

Masalan, agar ob'ekt uchun 'ob'ekt' usuli aniqlanadi toString,

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

Boshqaruv toString aniq satrni qaytaradi va raqam bilan qatorni qo'shganda biz yopishtirilgan satrni olamiz:

`obj + 1 // '2001'` 

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

Ammo agar siz qayta yozsangiz toString, shunday qilib, usul raqamni qaytaradi, ob'ekt qo'shilganda, sonli konvertatsiya bilan matematik operatsiya bajariladi va matematik qo'shish natijasi olinadi.

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

`obj + 1 // '2001'`

Bunday holda, agar biz satr bilan qo'shishni amalga oshirsak, satr konvertatsiyasi amalga oshiriladi va biz yopishtirilgan qatorni olamiz.

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

Ajam JavaScript foydalanuvchilari tomonidan ko'plab xatolarning sababi shu.

Usul toString ob'ektning joriy qiymatini 1 ga oshiradigan funktsiyani yozishingiz mumkin.

Biz JavaScript yordamida Zabbix-da amaliy muammolarni hal qilamiz
O'zgaruvchi 3 ga, u ham 4 ga teng bo'lishi sharti bilan skriptning bajarilishi.

To'qimalar (==) bilan taqqoslaganda, usul har safar bajariladi toString qiymatni oshirish funktsiyasi bilan. Shunga ko'ra, har bir keyingi taqqoslash bilan qiymat ortadi. Buning oldini olish mumkin bo'lmagan taqqoslash (===).

Biz JavaScript yordamida Zabbix-da amaliy muammolarni hal qilamiz
Turni quyishsiz taqqoslash

Eslatma. Cast solishtirishdan keraksiz foydalanmang.

Murakkab mantiqqa ega bo'lgan Webhooks kabi murakkab skriptlar uchun, o'zgaruvchilarni qaytaradigan va nomuvofiqliklar va xatolarni ko'rib chiqadigan qiymatlarni tekshirishni oldindan yozish tavsiya etiladi.

Webhook media

2019-yil oxiri va 2020-yil boshida Zabbix integratsiya jamoasi Zabbix tarqatilishi bilan birga kelgan Webhooks va tayyor integratsiyalarni faol ravishda ishlab chiqdi.

Biz JavaScript yordamida Zabbix-da amaliy muammolarni hal qilamiz
Havola hujjatlar

Oldindan ishlov berish

  • JavaScript-da oldindan ishlov berishning paydo bo'lishi ko'pgina tashqi skriptlardan voz kechishga imkon berdi va hozirda Zabbix-da siz istalgan qiymatni olishingiz va uni butunlay boshqa qiymatga aylantirishingiz mumkin.
  • Zabbix-da oldindan ishlov berish JavaScript kodi bilan amalga oshiriladi, u bayt-kodga kompilyatsiya qilinganda parametr sifatida bitta qiymatni qabul qiladigan funktsiyaga aylanadi. qiymati satr sifatida (satrda raqam ham, raqam ham bo'lishi mumkin).
  • Chiqish funksiya bo'lgani uchun skript oxirida talab qilinadi Qaytish.
  • Kodda maxsus makroslardan foydalanish mumkin.
  • Resurslar nafaqat operatsion tizim darajasida, balki dasturiy jihatdan ham cheklanishi mumkin. Oldindan ishlov berish bosqichida maksimal 10 megabayt operativ xotira va 10 soniya ishlash muddati ajratiladi.

Biz JavaScript yordamida Zabbix-da amaliy muammolarni hal qilamiz

Eslatma. 10 sekundlik kutish vaqti juda ko'p, chunki "og'ir" oldindan ishlov berish stsenariysi bo'yicha 1 soniya ichida shartli minglab ma'lumotlar elementlarini yig'ish Zabbixni sekinlashtirishi mumkin. Shuning uchun, faqat oldindan ishlov berish uchun ishlaydigan soyali ma'lumotlar elementlari (so'qmoqli elementlar) orqali to'liq huquqli JavaScript skriptlarini bajarish uchun oldindan ishlov berishdan foydalanish tavsiya etilmaydi..

Kodni oldindan ishlov berish testi yoki yordamchi dastur yordamida tekshirishingiz mumkin 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`

Amaliy topshiriqlar

Maqsad 1

Hisoblangan elementni oldindan ishlov berish bilan almashtiring.

Vaziyat: Selsiy bo'yicha saqlash uchun sensordan Farengeytdagi haroratni oling.

Ilgari biz haroratni Farengeyt darajasida to'playdigan element yaratardik. Shundan so'ng, formuladan foydalanib, Farengeytni Selsiyga aylantiradigan boshqa ma'lumotlar elementi (hisoblangan).

Muammolar:

  • Ma'lumotlar elementlarini takrorlash va barcha qiymatlarni ma'lumotlar bazasida saqlash kerak.
  • Formulada hisoblangan va foydalaniladigan "ota-ona" ma'lumotlar elementi va hisoblangan ma'lumotlar elementi uchun intervallarni kelishib olishingiz kerak. Aks holda, hisoblangan element qo'llab-quvvatlanmaydigan holatga o'tishi yoki oldingi qiymatni hisoblashi mumkin, bu esa monitoring natijalarining ishonchliligiga ta'sir qiladi.

Yechimlardan biri, hisoblangan element ma'lumotlarni qabul qiladigan elementdan keyin baholanishini ta'minlash uchun moslashuvchan tekshirish oraliqlaridan qat'iy belgilangan intervallar foydasiga o'tish edi (bizning holatda, Farengeyt darajasidagi harorat).

Ammo, masalan, biz shablonni ko'p sonli qurilmalarni tekshirish uchun ishlatsak va tekshirish har 30 soniyada bir marta amalga oshirilsa, Zabbix 29 soniya davomida "hack" qiladi va oxirgi soniyada u tekshirish va hisoblashni boshlaydi. Bu navbat hosil qiladi va ishlashga ta'sir qiladi. Shuning uchun, agar u haqiqatan ham zarur bo'lsa, qattiq intervallarni ishlatish tavsiya etiladi.

Ushbu muammoda optimal yechim Farengeyt graduslarini Selsiy gradusiga o'zgartiradigan bir qatorli JavaScript-ni oldindan ishlov berishdir:

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

Bu tez va oson, keraksiz maʼlumotlar elementlarini yaratish va ularda tarixni saqlash shart emas, shuningdek, tekshirishlar uchun moslashuvchan intervallardan foydalanishingiz mumkin.

Biz JavaScript yordamida Zabbix-da amaliy muammolarni hal qilamiz

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

Ammo, agar faraziy vaziyatda qabul qilingan ma'lumotlar elementini, masalan, makroda aniqlangan har qanday konstanta bilan qo'shish kerak bo'lsa, bu parametrni hisobga olish kerak. qiymati qatorga kengayadi. Satr qo'shish amaliyotida ikkita satr oddiygina bittaga birlashtiriladi.

Biz JavaScript yordamida Zabbix-da amaliy muammolarni hal qilamiz

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

Matematik operatsiya natijasini olish uchun olingan qiymatlarning turlarini raqamli formatga aylantirish kerak. Buning uchun funksiyadan foydalanishingiz mumkin parseInt(), bu butun sonni, funktsiyani hosil qiladi parseFloat(), bu kasr yoki funktsiyani hosil qiladi soni, bu butun son yoki kasrni qaytaradi.

Vazifa 2

Sertifikat tugaguniga qadar vaqtni soniyalarda oling.

Vaziyat: xizmat sertifikatning amal qilish muddatini "12-fevral 12:33:56 2022 GMT" formatida chiqaradi.

ECMAScript5 da date.parse() ISO 8601 formatidagi sanani qabul qiladi (YYYY-AA-GKS: mm:ss.sssZ). Unga MMM DD YYYY HH:mm:ss ZZ formatida satr chiqarish kerak.

muammo: Oy qiymati raqam sifatida emas, matn sifatida ifodalanadi. Ushbu formatdagi ma'lumotlar Duktape tomonidan qabul qilinmaydi.

Yechim misoli:

  • Avvalo, qiymat qabul qiladigan o'zgaruvchi e'lon qilinadi (butun skript vergul bilan ajratilgan o'zgaruvchilar deklaratsiyasidir).

  • Birinchi qatorda parametrdagi sanani olamiz qiymati va uni usul yordamida bo'shliqlar bilan ajrating Split. Shunday qilib, biz massivni olamiz, bu erda 0 indeksdan boshlanadigan massivning har bir elementi bo'sh joydan oldin va keyin bitta sana elementiga mos keladi. ajratish (0) - oy, ajratish (1) - raqam, ajratish (2) - vaqt ko'rsatilgan satr va hokazo. Shundan so'ng, sananing har bir elementiga massivdagi indeks orqali kirish mumkin.

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

  • Har oy (xronologik tartibda) uning massivdagi o'rni indeksiga (0 dan 11 gacha) mos keladi. Matn qiymatini raqamli qiymatga aylantirish uchun oy indeksiga bittasi qo'shiladi (chunki oylar 1 dan boshlab raqamlangan). Bunda bir qo'shilgan ifoda qavs ichida olinadi, chunki aks holda raqam emas, satr olinadi. Oxirida qilamiz tilim() - faqat ikkita belgi qoldirish uchun massivni oxiridan kesib oling (bu ikki xonali raqam bilan oylar uchun muhim).

`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),`

  • Olingan qiymatlardan odatiy qatorlarni tegishli tartibda qo'shish orqali ISO formatida qator hosil qilamiz.

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

Olingan formatdagi ma'lumotlar 1970 yildan boshlab kelajakdagi bir nuqtagacha bo'lgan soniyalar sonidir. Qabul qilingan formatdagi ma'lumotlarni triggerlarda ishlatish deyarli mumkin emas, chunki Zabbix faqat makrolar bilan ishlashga imkon beradi. {Sana} и {Vaqt}, bu foydalanuvchi uchun qulay formatda sana va vaqtni qaytaradi.

  • Keyin biz JavaScript-dagi joriy sanani Unix Timestamp formatida olishimiz va sertifikatning amal qilish muddati tugashigacha bo'lgan millisekundlar sonini olish uchun olingan sertifikatning amal qilish muddatidan ayirishimiz mumkin.

`now = Date.now();`

  • Zabbix-da soniyalarni olish uchun olingan qiymatni mingga ajratamiz.

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

Triggerda siz ' ifodasini belgilashingiz mumkinoxirgi' ortidan siz javob bermoqchi bo'lgan davrdagi soniyalar soniga mos keladigan raqamlar to'plami, masalan, haftalar. Shunday qilib, trigger sertifikatning amal qilish muddati bir hafta ichida tugashi haqida xabar beradi.

Eslatma. Foydalanishga e'tibor bering parseInt() funktsiyada Qaytishmillisekundlarning bo'linishi natijasida hosil bo'lgan kasr sonni butun songa aylantirish uchun. Siz ham foydalanishingiz mumkin parseFloat() va kasr ma'lumotlarini saqlash.

Hisobotni tomosha qilish

Manba: www.habr.com

a Izoh qo'shish