Ми решавамо практичне проблеме у Заббик-у користећи ЈаваСцрипт

Ми решавамо практичне проблеме у Заббик-у користећи ЈаваСцрипт
Тихон Усков, инжењер Заббик интеграционог тима

Заббик је прилагодљива платформа која се користи за праћење било које врсте података. Од најранијих верзија Заббик-а, администратори за надгледање су имали могућност да покрећу различите скрипте преко Акције за провере циљних мрежних чворова. Истовремено, лансирање скрипти довело је до бројних потешкоћа, укључујући потребу за подршком скрипти, њихову испоруку комуникационим чворовима и проксијима, као и подршку за различите верзије.

ЈаваСцрипт за Заббик

У априлу 2019. године представљен је Заббик 4.2 са ЈаваСцрипт препроцесом. Многи људи су се одушевили идејом да одустану од писања скрипти које узимају податке негде, пробављају их и пружају у формату који Заббик разуме, и обављају једноставне провере које ће примати податке који нису спремни за складиштење и обраду од стране Заббик-а, и затим обрадити овај ток података користећи Заббик и ЈаваСцрипт алате. У комбинацији са откривањем ниског нивоа и зависним ставкама које су се појавиле у Заббик-у 3.4, добили смо прилично флексибилан концепт за сортирање и управљање примљеним подацима.

У Заббик-у 4.4, као логичан наставак предобраде у ЈаваСцрипт-у, појавио се нови метод обавештавања – Вебхоок, који се може користити за лаку интеграцију Заббик обавештења са апликацијама трећих страна.

ЈаваСцрипт и Дуктапес

Зашто су изабрани ЈаваСцрипт и Дуктапе? Разматране су различите опције за језике и моторе:

  • Луа - Луа 5.1
  • Луа - ЛуаЈИТ
  • Јавасцрипт - Дуктапе
  • Јавасцрипт – ЈерриСцрипт
  • Ембеддед Питхон
  • Ембеддед Перл

Главни критеријуми избора били су распрострањеност, лакоћа интеграције мотора у производ, ниска потрошња ресурса и укупне перформансе мотора, као и сигурност увођења кода на овом језику у праћење. На основу комбинације индикатора, ЈаваСцрипт је победио на Дуктапе мотору.

Ми решавамо практичне проблеме у Заббик-у користећи ЈаваСцрипт

Критеријуми избора и тестирање перформанси

Карактеристике Дуктапе-а:

— Стандард ЕЦМАСцрипт Е5/Е5.1
— Заббик модули за Дуктапе:

  • Заббик.лог() - омогућава вам да пишете поруке са различитим нивоима детаља директно у дневник Заббик сервера, што омогућава повезивање грешака, на пример, у Вебхооку, са стањем сервера.
  • ЦурлХттпРекуест() - омогућава вам да шаљете ХТТП захтеве мрежи, на којима се заснива употреба Вебхоок-а.
  • атоб() и бтоа() - омогућава вам да кодирате и декодирате низове у Басе64 формату.

НАПОМЕНА. Дуктапе је у складу са АЦМЕ стандардима. Заббик користи верзију скрипте из 2015. Накнадне промене су мале, па се могу занемарити..

ЈаваСцрипт магија

Сва магија ЈаваСцрипт-а лежи у динамичком куцању и преливању типова: стринг, нумерички и логички.

То значи да није потребно унапред декларисати који тип променљиве треба да врати вредност.

У математичким операцијама, вредности које враћају оператори функције се претварају у бројеве. Изузетак од таквих операција је сабирање, јер ако је бар један од термина стринг, конверзија стрингова се примењује на све термине.

НАПОМЕНА. Методе одговорне за такве трансформације се обично имплементирају у родитељске прототипове објекта, Вредност и тоСтринг. Вредност позива се током нумеричке конверзије и увек пре методе тоСтринг. Метод Вредност мора да врати примитивне вредности, иначе се његов резултат игнорише.

Метода се позива на објекту Вредност. Ако се не пронађе или не врати примитивну вредност, позива се метода тоСтринг. Ако метод тоСтринг није пронађено, тражи се Вредност у прототипу објекта, и све се понавља док се обрада вредности не заврши и све вредности у изразу се пребаце на исти тип. Ако објекат имплементира метод тоСтринг, који враћа примитивну вредност, онда се то користи за конверзију стрингова. Међутим, резултат примене ове методе није нужно низ.

На пример, ако је за објекат 'ОБЈ' метода је дефинисана тоСтринг,

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

Метод тоСтринг враћа тачно стринг, а када додајемо стринг са бројем, добијамо залепљени стринг:

`obj + 1 // '2001'` 

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

Али ако препишете тоСтринг, тако да метода враћа број, када се објекат дода, извршиће се математичка операција са нумеричком конверзијом и добиће се резултат математичког сабирања.

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

`obj + 1 // '2001'`

У овом случају, ако извршимо сабирање низом, врши се конверзија стрингова и добијамо залепљени низ.

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

Ово је разлог великог броја грешака почетника ЈаваСцрипт корисника.

Метода тоСтринг можете написати функцију која ће повећати тренутну вредност објекта за 1.

Ми решавамо практичне проблеме у Заббик-у користећи ЈаваСцрипт
Извршење скрипте, под условом да је променљива једнака 3, а такође је једнака 4.

Када се упореди са цаст (==), метод се извршава сваки пут тоСтринг са функцијом повећања вредности. Сходно томе, са сваким наредним поређењем, вредност се повећава. Ово се може избећи коришћењем поређења без преливања (===).

Ми решавамо практичне проблеме у Заббик-у користећи ЈаваСцрипт
Поређење без ливења типа

НАПОМЕНА. Немојте непотребно да користите поређење Цаст.

За сложене скрипте, као што су Вебхоокс са сложеном логиком, које захтевају поређење са преливањем типова, препоручује се да унапред напишете провере за вредности које враћају променљиве и обрађују недоследности и грешке.

Вебхоок Медиа

Крајем 2019. и почетком 2020., Заббик тим за интеграцију је активно развијао Вебхоокс и готове интеграције које долазе са Заббик дистрибуцијом.

Ми решавамо практичне проблеме у Заббик-у користећи ЈаваСцрипт
Линк до документација

Предобрада

  • Појава препроцесирања у ЈаваСцрипт-у омогућила је напуштање већине спољних скрипти, а тренутно у Заббик-у можете добити било коју вредност и претворити је у потпуно другу вредност.
  • Претходну обраду у Заббик-у имплементира ЈаваСцрипт код, који се, када се компајлира у бајт код, претвара у функцију која узима једну вредност као параметар вредност као стринг (низ може да садржи и цифру и број).
  • Пошто је излаз функција, на крају скрипте је обавезан повратак.
  • Могуће је користити прилагођене макрое у коду.
  • Ресурси се могу ограничити не само на нивоу оперативног система, већ и програмски. Корак претпроцесирања има највише 10 мегабајта РАМ-а и временско ограничење од 10 секунди.

Ми решавамо практичне проблеме у Заббик-у користећи ЈаваСцрипт

НАПОМЕНА. Вредност временског ограничења од 10 секунди је прилично велика, јер прикупљање условних хиљада ставки података у 1 секунди према прилично „тешком“ сценарију претпроцесирања може успорити Заббик. Због тога се не препоручује коришћење претпроцесирања за извршавање пуноправних ЈаваСцрипт скрипти кроз такозване елементе података у сенци (лажне ставке), који се покрећу само да би се извршила претходна обрада.

Можете проверити свој код кроз тест препроцесирања или помоћу услужног програма заббик_јс:

`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 секунди, Заббик „хакује” 29 секунди, а у последњој секунди почиње да проверава и рачуна. Ово ствара ред чекања и утиче на перформансе. Због тога се препоручује коришћење фиксних интервала само ако је то заиста неопходно.

У овом проблему, оптимално решење је једнолинијска ЈаваСцрипт предобрада која претвара степене Фаренхајта у степене Целзијуса:

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

Брзо је и лако, не морате да креирате непотребне ставке података и да водите историју о њима, а такође можете да користите флексибилне интервале за провере.

Ми решавамо практичне проблеме у Заббик-у користећи ЈаваСцрипт

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

Али, ако је у хипотетичкој ситуацији потребно додати примљени елемент података, на пример, са било којом константом дефинисаном у макроу, мора се узети у обзир да параметар вредност шири у низ. У операцији сабирања низова, два низа се једноставно комбинују у један.

Ми решавамо практичне проблеме у Заббик-у користећи ЈаваСцрипт

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

Да бисте добили резултат математичке операције, потребно је конвертовати типове добијених вредности у нумерички формат. За ово можете користити функцију парсеИнт(), који производи цео број, функцију парсеФлоат(), који производи децималу или функцију број, који враћа цео број или децимални број.

Задатак 2

Добијте време у секундама до краја сертификата.

Стање: услуга издаје датум истека сертификата у формату „12. фебруар 12:33:56 2022 ГМТ“.

У ЕЦМАСцрипт5 Дате.парсе () прихвата датум у ИСО 8601 формату (ГГГГ-ММ-ДДТХХ:мм:сс.сссЗ). На њега је потребно бацити стринг у формату МММ ДД ГГГГ ЧЧ:мм:сс ЗЗ

проблем: Вредност месеца је изражена као текст, а не као број. Дуктапе не прихвата податке у овом формату.

Пример решења:

  • Пре свега, декларише се променљива која узима вредност (цела скрипта је декларација променљивих које су наведене одвојене зарезима).

  • У првом реду добијамо датум у параметру вредност и одвојите га размацима користећи метод сплит. Тако добијамо низ, где сваки елемент низа, почевши од индекса 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),`

  • Од добијених вредности формирамо низ у ИСО формату уобичајеним додавањем низова у одговарајућем редоследу.

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

Подаци у резултујућем формату су број секунди од 1970. до неке тачке у будућности. Готово је немогуће користити податке у примљеном формату у окидачима, јер Заббик омогућава рад само са макроима {Датум} и {Време}, који враћају датум и време у формату прилагођеном кориснику.

  • Затим можемо добити тренутни датум у ЈаваСцрипт-у у Уник формату временске ознаке и одузети га од резултирајућег датума истека сертификата да бисмо добили број милисекунди од сада до истека сертификата.

`now = Date.now();`

  • Добиту вредност делимо са хиљаду да бисмо добили секунде у Заббик-у.

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

У покретачу можете навести израз 'последњи' након чега следи скуп цифара који одговара броју секунди у периоду на који желите да одговорите, на пример, у недељама. Дакле, окидач ће обавестити да сертификат истиче за недељу дана.

НАПОМЕНА. Обратите пажњу на употребу парсеИнт() у функцији повратакда претворите разломак који настаје дељењем милисекунди у цео број. Такође можете користити парсеФлоат() и чувају фракционе податке.

Погледајте извештај

Извор: ввв.хабр.цом

Додај коментар