Бид JavaScript ашиглан Zabbix дээр практик асуудлуудыг шийддэг

Бид JavaScript ашиглан Zabbix дээр практик асуудлуудыг шийддэг
Тихон Усков, Zabbix нэгтгэлийн багийн инженер

Zabbix бол ямар ч төрлийн өгөгдлийг хянахад ашигладаг, тохируулах боломжтой платформ юм. Zabbix-ийн анхны хувилбаруудаас хойш хяналтын администраторууд янз бүрийн скриптүүдийг ажиллуулах боломжтой болсон. үйл ажиллагаа зорилтот сүлжээний зангилааг шалгах зорилгоор. Үүний зэрэгцээ скриптүүдийг ажиллуулах нь скриптийг дэмжих, холбооны зангилаа болон проксид хүргэх, өөр өөр хувилбаруудыг дэмжих зэрэг олон бэрхшээлийг дагуулсан.

Zabbix-д зориулсан JavaScript

2019 оны 4.2-р сард Zabbix 3.4 нь JavaScript-ийн урьдчилсан боловсруулалттай танилцуулагдсан. Хаа нэгтээ өгөгдөл авч, задаргаа хийж, Zabbix-ийн ойлгодог форматаар хангадаг скрипт бичихээс татгалзаж, Zabbix-ээр хадгалах, боловсруулахад бэлэн биш байгаа өгөгдлийг хүлээн авах энгийн шалгалтуудыг хийх санаа олон хүнийг баярлуулсан. дараа нь Zabbix болон JavaScript хэрэгслийг ашиглан энэ өгөгдлийн урсгалыг боловсруулна. Zabbix XNUMX дээр гарч ирсэн доод түвшний нээлт, хамааралтай зүйлсийн хамт бид хүлээн авсан өгөгдлийг ангилах, удирдах нэлээд уян хатан ойлголттой болсон.

Zabbix 4.4 дээр JavaScript дээр урьдчилан боловсруулалтын логик үргэлжлэл болгон Zabbix мэдэгдлийг гуравдагч талын програмуудтай хялбархан нэгтгэхэд ашиглаж болох Webhook мэдэгдлийн шинэ арга гарч ирэв.

JavaScript болон Duktapes

Яагаад JavaScript болон Duktape сонгосон бэ? Хэл, хөдөлгүүрийн янз бүрийн сонголтыг авч үзсэн.

  • Луа - Луа 5.1
  • Луа - ЛуаЖИТ
  • Javascript - Duktape
  • Javascript - JerryScript
  • Embedded Python
  • Embedded Perl

Сонгон шалгаруулалтын гол шалгуурууд нь тархалт, хөдөлгүүрийг бүтээгдэхүүнд нэгтгэхэд хялбар, бага нөөцийн зарцуулалт, хөдөлгүүрийн ерөнхий гүйцэтгэл, хяналтанд энэ хэл дээрх кодыг нэвтрүүлэх аюулгүй байдал байв. Шалгуур үзүүлэлтүүдийн хослол дээр үндэслэн JavaScript Duktape хөдөлгүүр дээр ялсан.

Бид JavaScript ашиглан Zabbix дээр практик асуудлуудыг шийддэг

Сонгон шалгаруулалтын шалгуур ба гүйцэтгэлийн туршилт

Duktape-ийн онцлогууд:

- Стандарт ECMAScript E5/E5.1
- Duktape-д зориулсан Zabbix модулиуд:

  • Zabbix.log() - өөр өөр түвшний нарийвчлалтай мессежийг Zabbix серверийн бүртгэлд шууд бичих боломжийг олгодог бөгөөд энэ нь жишээлбэл Webhook дээрх алдааг серверийн төлөвтэй уялдуулах боломжийг олгодог.
  • CurlHttpRequest() - Webhook ашиглахад үндэслэсэн сүлжээнд HTTP хүсэлт гаргах боломжийг танд олгоно.
  • atob() болон btoa() - Base64 форматаар мөрүүдийг кодлох, тайлах боломжийг танд олгоно.

ТАЙЛБАР:. Duktape нь ACME стандартад нийцдэг. Zabbix нь скриптийн 2015 хувилбарыг ашигладаг. Дараагийн өөрчлөлтүүд нь бага зэрэг тул тэдгээрийг үл тоомсорлож болно..

JavaScript ид шид

JavaScript-ийн бүх ид шид нь динамик бичих, төрөл дамжуулахад оршдог: мөр, тоон болон логик.

Энэ нь хувьсагч ямар төрлийн утгыг буцаах ёстойг урьдчилан зарлах шаардлагагүй гэсэн үг юм.

Математик үйлдлүүдэд функцийн операторуудын буцаасан утгыг тоо болгон хувиргадаг. Ийм үйлдлүүдийн үл хамаарах зүйл нь нэмэх явдал юм, учир нь хэрэв нэр томъёоны ядаж нэг нь тэмдэгт мөр байвал бүх нэр томъёонд стринг хөрвүүлэх үйлдлийг хийнэ.

ТАЙЛБАР:. Ийм өөрчлөлтийг хариуцдаг аргуудыг ихэвчлэн объектын эх загварт хэрэгжүүлдэг. үнэ цэнэ и toString. үнэ цэнэ тоон хөрвүүлэлтийн үед болон үргэлж аргын өмнө дуудагддаг toString. Арга үнэ цэнэ анхдагч утгуудыг буцаах ёстой, эс тэгвээс түүний үр дүнг үл тоомсорлодог.

Объект дээр аргыг дууддаг үнэ цэнэOF. Хэрэв энэ нь олдохгүй эсвэл анхдагч утгыг буцааж өгөхгүй бол аргыг дуудна toString. Хэрэв арга toString олдсонгүй, хайж байна үнэ цэнэ объектын прототипт байгаа бөгөөд утгыг боловсруулж дуустал бүх зүйл давтагдаж, илэрхийлэл дэх бүх утгууд ижил төрөлд шилждэг.. Хэрэв объект нь аргыг хэрэгжүүлдэг бол toString, энэ нь анхдагч утгыг буцаадаг бол энэ нь мөрийг хөрвүүлэхэд ашиглагддаг. Гэхдээ энэ аргыг хэрэглэсний үр дүн нь заавал мөр байх албагүй.

Жишээлбэл, хэрэв объектын хувьд 'obj' аргыг тодорхойлсон toString,

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

Арга toString яг мөрийг буцаадаг бөгөөд тоо бүхий мөрийг нэмэхэд бид наасан тэмдэгт мөрийг авдаг:

`obj + 1 // '2001'` 

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

Гэхдээ хэрэв та дахин бичвэл toString, ингэснээр арга нь тоог буцаана, объектыг нэмэхэд тоон хувиргалт бүхий математик үйлдэл хийгдэж, математик нэмэх үр дүн гарна.

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

`obj + 1 // '2001'`

Энэ тохиолдолд хэрэв бид стрингээр нэмэх үйлдлийг хийвэл стринг хөрвүүлэлт хийгдэж, наасан мөр гарч ирнэ.

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

Энэ нь шинэхэн JavaScript хэрэглэгчдийн олон тооны алдааны шалтгаан юм.

арга toString Та объектын одоогийн утгыг 1-ээр нэмэгдүүлэх функц бичиж болно.

Бид JavaScript ашиглан Zabbix дээр практик асуудлуудыг шийддэг
Хувьсагч нь 3-тай тэнцүү, мөн 4-тэй тэнцүү байх тохиолдолд скриптийн гүйцэтгэл.

Цутгамал (==) -тэй харьцуулах үед арга бүрийг гүйцэтгэдэг toString үнэ цэнийг нэмэгдүүлэх функцтэй. Үүний дагуу дараагийн харьцуулалт бүрд үнэ цэнэ нэмэгддэг. Үүнийг дамжуулаагүй харьцуулалт (===) ашиглан зайлсхийх боломжтой.

Бид JavaScript ашиглан Zabbix дээр практик асуудлуудыг шийддэг
Төрөл цутгахгүйгээр харьцуулах

ТАЙЛБАР:. Шууд харьцуулалтыг шаардлагагүйгээр бүү ашигла.

Төрөл дамжуулалттай харьцуулах шаардлагатай нарийн төвөгтэй логик бүхий Webhooks гэх мэт нарийн төвөгтэй скриптүүдийн хувьд хувьсагчийг буцаадаг утгуудын шалгалтыг урьдчилан бичиж, зөрчил, алдааг зохицуулахыг зөвлөж байна.

Webhook Media

2019 оны сүүл ба 2020 оны эхээр Zabbix интеграцийн баг нь Zabbix түгээлттэй хамт ирдэг Webhooks болон бэлэн бус интеграцийг идэвхтэй хөгжүүлж байна.

Бид JavaScript ашиглан Zabbix дээр практик асуудлуудыг шийддэг
Холбоос баримт бичиг

Урьдчилан боловсруулалт

  • JavaScript дээр урьдчилан боловсруулалт гарч ирснээр ихэнх гадаад скриптүүдээс татгалзах боломжтой болсон бөгөөд одоогоор Zabbix дээр та ямар ч утгыг авч, огт өөр утга руу хөрвүүлэх боломжтой болсон.
  • Zabbix-д урьдчилсан боловсруулалтыг JavaScript кодоор гүйцэтгэдэг бөгөөд үүнийг байт код болгон хөрвүүлэхдээ нэг утгыг параметр болгон авдаг функц болгон хувиргадаг. үнэ цэнэ тэмдэгт мөр болгон (мөрт цифр болон тоо хоёуланг нь агуулж болно).
  • Гаралт нь функц учраас скриптийн төгсгөлд байх шаардлагатай буцах.
  • Коддоо захиалгат макро ашиглах боломжтой.
  • Нөөцийг зөвхөн үйлдлийн системийн түвшинд төдийгүй программын хувьд хязгаарлаж болно. Урьдчилсан боловсруулалтын үе шатанд дээд тал нь 10 мегабайт RAM, 10 секундын ажиллах хугацаа хуваарилагдсан.

Бид JavaScript ашиглан Zabbix дээр практик асуудлуудыг шийддэг

ТАЙЛБАР:. "Хүнд" урьдчилсан боловсруулалтын хувилбарын дагуу 10 секундын дотор нөхцөлт мянга мянган өгөгдлийн зүйлийг цуглуулах нь Zabbix-ийг удаашруулж болзошгүй тул 1 секундын завсарлагын утга нь маш их юм. Тиймээс, зөвхөн урьдчилсан боловсруулалтыг гүйцэтгэхийн тулд ажилладаг сүүдрийн өгөгдлийн элементүүд гэж нэрлэгддэг (дамми зүйлүүд) дамжуулан бүрэн хэмжээний 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;`

Энэ нь хурдан бөгөөд хялбар бөгөөд та шаардлагагүй өгөгдлийн зүйл үүсгэх, тэдгээрт түүх хөтлөх шаардлагагүй бөгөөд шалгалтын уян хатан интервалыг ашиглах боломжтой.

Бид JavaScript ашиглан Zabbix дээр практик асуудлуудыг шийддэг

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

Гэхдээ хэрэв таамаглалын нөхцөлд хүлээн авсан өгөгдлийн элементийг, жишээлбэл, макронд тодорхойлогдсон аливаа тогтмолыг нэмэх шаардлагатай бол энэ параметрийг анхаарч үзэх хэрэгтэй. үнэ цэнэ тэмдэгт мөр болж тэлдэг. Мөр нэмэх үйлдэлд хоёр мөрийг зүгээр л нэг болгож нэгтгэдэг.

Бид JavaScript ашиглан Zabbix дээр практик асуудлуудыг шийддэг

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

Математик үйлдлийн үр дүнг авахын тулд олж авсан утгуудын төрлийг тоон формат руу хөрвүүлэх шаардлагатай. Үүний тулд та функцийг ашиглаж болно parseInt(), бүхэл тоо, функц үүсгэдэг parseFloat(), энэ нь аравтын бутархай буюу функц үүсгэдэг тоо, бүхэл тоо эсвэл аравтын тоог буцаана.

Даалгавар 2

Сертификат дуусах хүртэлх хугацааг секундээр аваарай.

Нөхцөл байдал: үйлчилгээ нь "Feb 12 12:33:56 2022 GMT" форматаар гэрчилгээний хүчинтэй байх хугацааг гаргадаг.

ECMAScript5 дээр date.parse() ISO 8601 форматтай огноог хүлээн зөвшөөрдөг (ЖЖЖ-АА-ӨГӨӨ:мм:сс.sssZ). Түүнд ММХ ӨГӨӨ ӨӨӨӨ:мм:сс 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

сэтгэгдэл нэмэх