Мо масъалаҳои амалиро дар Zabbix бо истифода аз JavaScript ҳал мекунем

Мо масъалаҳои амалиро дар Zabbix бо истифода аз JavaScript ҳал мекунем
Тихон Усков, Инженери гурухи интеграционии Zabbix

Zabbix як платформаи танзимшавандаест, ки барои назорати ҳама гуна маълумот истифода мешавад. Аз версияҳои аввалини Zabbix, маъмурони мониторинг қобилияти иҷро кардани скриптҳои гуногунро тавассути Амалиётҳо барои тафтиш дар гиреҳҳои шабакаи мавриди ҳадаф. Ҳамзамон, ба кор андохтани скриптҳо боиси як қатор мушкилот гардид, аз ҷумла зарурати дастгирии скриптҳо, интиқоли онҳо ба гиреҳҳои иртиботӣ ва прокси, инчунин дастгирии версияҳои гуногун.

JavaScript барои Zabbix

Дар моҳи апрели соли 2019, Zabbix 4.2 бо коркарди пешакии JavaScript ҷорӣ карда шуд. Бисёр одамон аз идеяи даст кашидан аз навиштани скриптҳо, ки маълумотро дар ҷое мегиранд, онро ҳазм мекунанд ва дар формате, ки Zabbix мефаҳманд, таъмин мекунанд ва санҷишҳои оддиеро анҷом медиҳанд, ки маълумотеро, ки барои нигоҳдорӣ ва коркард аз ҷониби Zabbix омода нестанд, қабул мекунанд ва пас ин ҷараёни маълумотро бо истифода аз абзорҳои Zabbix ва JavaScript коркард кунед. Дар якҷоягӣ бо кашфи сатҳи паст ва ашёҳои вобастае, ки дар Zabbix 3.4 пайдо шудаанд, мо консепсияи хеле фасеҳ барои ҷудо кардан ва идоракунии маълумоти гирифташударо ба даст овардем.

Дар Zabbix 4.4, ҳамчун идомаи мантиқии коркарди пешакӣ дар JavaScript, усули нави огоҳӣ пайдо шуд - Webhook, ки метавонад барои ба осонӣ пайваст кардани огоҳиномаҳои Zabbix бо замимаҳои тарафи сеюм истифода шавад.

JavaScript ва Duktapes

Чаро JavaScript ва Duktape интихоб шуданд? Вариантҳои гуногун барои забонҳо ва муҳаррикҳо баррасӣ шуданд:

  • Луа - Луа 5.1
  • Луа - LuaJIT
  • Javascript - Duktape
  • Javascript - JerryScript
  • Python дарунсохташуда
  • Perl дарунсохташуда

Меъёрҳои асосии интихоб паҳншавӣ, осонии ҳамгироии муҳаррик ба маҳсулот, истеъмоли ками захираҳо ва кори умумии муҳаррик ва бехатарии ворид кардани код дар ин забон ба мониторинг буданд. Дар асоси омезиши нишондиҳандаҳо, 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

Тамоми ҷодугарии JavaScript дар чопкунии динамикӣ ва кастинги намудҳост: сатр, рақамӣ ва булӣ.

Ин маънои онро дорад, ки пешакӣ эълон кардани кадом навъи тағирёбанда бояд арзишро баргардонад, шарт нест.

Дар амалҳои математикӣ арзишҳое, ки операторони функсия бармегардонанд, ба рақамҳо табдил дода мешаванд. Истиснои чунин амалҳо илова аст, зеро агар ақаллан яке аз истилоҳот сатр бошад, табдили сатр ба ҳама шартҳо татбиқ мешавад.

ШАРҲ. Усулҳое, ки барои чунин тағирот масъуланд, одатан дар прототипҳои волидайни объект татбиқ карда мешаванд, арзишиOf и toString. арзишиOf ҳангоми табдили ададӣ ва ҳамеша пеш аз усул даъват карда мешавад toString. Усул арзишиOf бояд арзишҳои ибтидоиро баргардонанд, вагарна натиҷаи он сарфи назар карда мешавад.

Метод дар объект даъват карда мешавад арзишиOF. Агар он ёфт нашавад ё арзиши ибтидоиро барнагардонад, усул даъват карда мешавад toString. Агар усул toString ёфт нашуд, ҷустуҷӯ арзишиOf дар прототипи объект ва ҳама чиз такрор карда мешавад, то коркарди арзиш ба итмом расад ва ҳамаи арзишҳои ифода ба як намуд партофта шаванд. Агар объект усулеро ба амал барорад toString, ки арзиши ибтидоиро бармегардонад, пас маҳз он барои табдили сатр истифода мешавад. Аммо, натиҷаи татбиқи ин усул ҳатман сатр нест.

Масалан, агар барои объекти 'объект' усул муайян карда шудааст 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 афзояд.

Мо масъалаҳои амалиро дар Zabbix бо истифода аз JavaScript ҳал мекунем
Иҷрои скрипт, ба шарте ки тағирёбанда ба 3 баробар бошад ва он низ ба 4 баробар бошад.

Ҳангоми муқоиса бо cast (==), усул ҳар дафъа иҷро карда мешавад toString бо функсияи афзоиши арзиш. Мутаносибан, бо ҳар як муқоисаи минбаъда, арзиш меафзояд. Инро метавон бо истифода аз муқоисаи ғайрирасмӣ пешгирӣ кард (===).

Мо масъалаҳои амалиро дар Zabbix бо истифода аз JavaScript ҳал мекунем
Муқоиса бидуни кастинги навъи

ШАРҲ. Муқоисаи Castро бе зарурат истифода набаред.

Барои скриптҳои мураккаб, аз қабили Webhooks бо мантиқи мураккаб, ки муқоиса бо casting навъиро талаб мекунанд, тавсия дода мешавад, ки чекҳоро барои арзишҳое, ки тағирёбандаҳоро бармегардонанд ва номувофиқатӣ ва хатогиҳоро коркард мекунанд, пешакӣ нависед.

Media Webhook

Дар охири соли 2019 ва аввали соли 2020, дастаи ҳамгироии Zabbix фаъолона Webhooks ва ҳамгироии берун аз қуттӣ, ки бо тақсимоти Zabbix меояд, таҳия кардааст.

Мо масъалаҳои амалиро дар Zabbix бо истифода аз JavaScript ҳал мекунем
Истинод ба ҳуҷҷатҳо

Коркарди пешакӣ

  • Пайдоиши коркарди пешакӣ дар JavaScript имкон дод, ки аксари скриптҳои беруна даст кашед ва дар айни замон дар Zabbix шумо метавонед дилхоҳ арзишро ба даст оред ва онро ба арзиши комилан дигар табдил диҳед.
  • Коркарди пешакӣ дар Zabbix тавассути коди JavaScript амалӣ карда мешавад, ки ҳангоми тартиб додан ба байткод ба функсия табдил дода мешавад, ки арзиши ягонаро ҳамчун параметр мегирад арзиши ҳамчун сатр (сатр метавонад ҳам рақам ва ҳам рақамро дар бар гирад).
  • Азбаски баромад функсия аст, дар охири скрипт талаб карда мешавад бозгашт.
  • Дар код макросҳои фармоиширо истифода бурдан мумкин аст.
  • Захираҳо метавонанд на танҳо дар сатҳи системаи амалиётӣ, балки ба таври барномавӣ маҳдуд карда шаванд. Дар марҳилаи коркарди пешакӣ ҳадди аксар 10 мегабайт RAM ва маҳдудияти вақти кор 10 сония ҷудо карда мешавад.

Мо масъалаҳои амалиро дар Zabbix бо истифода аз JavaScript ҳал мекунем

ШАРҲ. Қимати тайм-охири 10 сония хеле зиёд аст, зеро ҷамъоварӣ кардани ҳазорҳо ададҳои шартӣ дар 1 сония тибқи сенарияи коркарди пешакии “вазнин” метавонад 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

Ҷузъи ҳисобшударо бо коркарди пешакӣ иваз кунед.

Ҳолати: Ҳароратро дар Фаренгейт аз сенсор барои нигоҳдорӣ дар Celsius гиред.

Пештар, мо ашёе меофаридем, ки ҳароратро дар дараҷаҳои Фаренгейт ҷамъ мекунад. Пас аз он, як ҷузъи дигари маълумот (ҳисобшуда), ки бо истифода аз формула Фаренгейтро ба Celsius табдил медиҳад.

Масъалаҳо:

  • Барои такрор кардани унсурҳои додаҳо ва нигоҳ доштани ҳама арзишҳо дар базаи маълумот зарур аст.
  • Шумо бояд дар бораи фосилаҳо барои банди маълумоти "волид", ки дар формула ҳисоб ва истифода бурда мешавад, ва барои банди маълумоти ҳисобшуда мувофиқа кунед. Дар акси ҳол, ашёи ҳисобшуда метавонад ба ҳолати дастгирӣнашаванда дохил шавад ё арзиши қаблиро ҳисоб кунад, ки ба эътимоднокии натиҷаҳои мониторинг таъсир мерасонад.

Як роҳи ҳалли он аз фосилаҳои тағйирпазири санҷиш ба манфиати фосилаҳои муқарраршуда дур шудан буд, то боварӣ ҳосил шавад, ки ашёи ҳисобшуда пас аз ашёе, ки маълумотро қабул мекунад, арзёбӣ мешавад (дар ҳолати мо, ҳарорат дар дараҷаҳои Фаренгейт).

Аммо агар, масалан, мо аз қолаб барои тафтиши шумораи зиёди дастгоҳҳо истифода кунем ва санҷиш дар ҳар 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 GMT" медиҳад.

Дар ECMAScript5 date.parse() санаро дар формати ISO 8601 (YYYY-MM-DDTHH:mm:ss.sssZ) қабул мекунад. Ба он сатрро дар формати ММ ДД ЙЙЙ СС:мм:сс ЗЗ партофтан лозим аст.

проблема: Қимати моҳ ҳамчун рақам ифода карда мешавад, на ҳамчун рақам. Маълумот дар ин формат аз ҷониби 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() ва нигоҳ доштани маълумоти касрӣ.

Ҳисоботро тамошо кунед

Манбаъ: will.com

Илова Эзоҳ