Ние решаваме практични проблеми во 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
  • Луа - ЛуаЈИТ
  • 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 Magic

Целата магија на JavaScript лежи во динамичното пишување и кастинг на типови: стринг, нумерички и бул.

Ова значи дека не е неопходно однапред да се декларира каков тип променливата треба да врати вредност.

Во математичките операции, вредностите вратени од операторите на функции се претвораат во бројки. Исклучок од таквите операции е собирањето, бидејќи ако барем еден од поимите е низа, конверзија на низа се применува на сите поими.

ЗАБЕЛЕШКА. Методите одговорни за таквите трансформации обично се имплементираат во матичните прототипови на објектот, вредностОд и toString. вредностОд повикани при нумеричка конверзија и секогаш пред методот toString. Метод вредностОд мора да враќа примитивни вредности, инаку неговиот резултат се игнорира.

Методот се повикува на објект вредност НА. Ако не се најде или не врати примитивна вредност, се повикува методот 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.

Ние решаваме практични проблеми во Zabbix користејќи JavaScript
Извршување на сценариото, под услов променливата да е еднаква на 3, а исто така е еднаква на 4.

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

Ние решаваме практични проблеми во Zabbix користејќи JavaScript
Споредба без тип кастинг

ЗАБЕЛЕШКА. Не користете споредба на актерите непотребно.

За сложени скрипти, како што се Webhooks со сложена логика, кои бараат споредба со типот кастинг, се препорачува однапред да се напишат проверки за вредностите што враќаат променливи и се справуваат со недоследности и грешки.

Webhook Media

Кон крајот на 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

Заменете ја пресметаната ставка со претходна обработка.

Состојба: Земете ја температурата во Фаренхајти од сензорот за складирање во Целзиусови.

Претходно, ќе создадеме ставка што ја собира температурата во степени Фаренхајтови. После тоа, друга податочна ставка (пресметана) што би го конвертирала Фаренхајтот во Целзиусови со помош на формула.

Проблеми:

  • Неопходно е да се дуплираат елементи на податоци и да се зачуваат сите вредности во базата на податоци.
  • Мора да се договорите за интервалите за податочната ставка „родител“ што се пресметува и користи во формулата и за пресметаната ставка со податоци. Во спротивно, пресметаната ставка може да оди во неподдржана состојба или да пресмета претходна вредност, што ќе влијае на веродостојноста на резултатите од следењето.

Едно решение беше да се оддалечиме од флексибилните интервали за проверка во корист на фиксни интервали за да се осигура дека пресметаната ставка се оценува по ставката што ги прима податоците (во нашиот случај, температурата во степени Фаренхајтови).

Но, ако, на пример, го користиме шаблонот за проверка на голем број уреди, а проверката се врши еднаш на 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 датум.parse() прифаќа датум во ISO 8601 формат (ГГГГ-ММ-ДДТТХ:мм:сс.ссЗ). Неопходно е да се фрли низа на неа во формат 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

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