Биз JavaScript аркылуу Zabbix'те практикалык маселелерди чечебиз

Биз JavaScript аркылуу Zabbix'те практикалык маселелерди чечебиз
Тихон Усков, Zabbix интеграциялоо тобунун инженери

Zabbix – бул ар кандай маалыматтарды көзөмөлдөө үчүн колдонулган өзгөчөлөштүрүлүүчү платформа. Zabbixтин эң алгачкы версияларынан бери мониторинг администраторлору ар кандай скрипттерди иштетүү мүмкүнчүлүгүнө ээ болушкан. Иш-аракеттер максаттуу тармак түйүндөрүн текшерүү үчүн. Ошол эле учурда скрипттерди ишке киргизүү бир катар кыйынчылыктарга алып келди, анын ичинде скрипттерди колдоо зарылчылыгы, аларды байланыш түйүндөрүнө жана проксилерге жеткирүү, ошондой эле ар кандай версияларды колдоо.

Zabbix үчүн JavaScript

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

Zabbix 4.4те, JavaScriptте алдын ала иштетүүнүн логикалык уландысы катары, Zabbix эскертмелерин үчүнчү тараптын тиркемелери менен оңой интеграциялоо үчүн колдонула турган жаңы кабарлоо ыкмасы - Webhook пайда болду.

JavaScript жана Duktapes

Эмне үчүн JavaScript жана Duktape тандалган? Тилдер жана кыймылдаткычтар үчүн ар кандай варианттар каралды:

  • Луа - Луа 5.1
  • Lua - LuaJIT
  • Javascript - Duktape
  • Javascript - JerryScript
  • Камтылган Python
  • Embedded Perl

Негизги тандоо критерийлери таралышы, кыймылдаткычты продуктуга интеграциялоонун жөнөкөйлүгү, ресурстун аз чыгымдалышы жана кыймылдаткычтын жалпы иштеши жана мониторингге бул тилдеги кодду киргизүүнүн коопсуздугу болгон. Көрсөткүчтөрдүн айкалышынын негизинде JavaScript Duktape кыймылдаткычында утуп алды.

Биз JavaScript аркылуу Zabbix'те практикалык маселелерди чечебиз

Тандоо критерийлери жана натыйжалуулугун текшерүү

Duktape өзгөчөлүктөрү:

— Стандарт ECMAScript E5/E5.1
- Duktape үчүн Zabbix модулдары:

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

ЭСКЕРТҮҮ. Duktape ACME стандарттарына ылайык келет. Zabbix сценарийдин 2015 версиясын колдонот. Кийинки өзгөрүүлөр анча чоң эмес, ошондуктан аларга көңүл бурбай коюуга болот..

JavaScript сыйкыр

JavaScriptтин бардык сыйкырлары динамикалык терүүдө жана типти кастингде жатат: сап, сандык жана логикалык.

Бул өзгөрмө кайсы түрдөгү маанини кайтарышы керек экенин алдын ала жарыялоонун кереги жок дегенди билдирет.

Математикалык операцияларда функция операторлору тарабынан кайтарылган маанилер сандарга айланат. Мындай операциялардан бөтөн нерсе кошумча болуп саналат, анткени терминдердин жок дегенде бири сап болсо, сапты конверсиялоо бардык шарттарга колдонулат.

ЭСКЕРТҮҮ. Мындай трансформациялар үчүн жооптуу методдор, адатта, объекттин негизги прототиптеринде ишке ашырылат, valueOf и toString. valueOf сандык өзгөртүү учурунда жана ар дайым ыкма алдында чакырылат toString. Метод valueOf примитивдүү маанилерди кайтарышы керек, антпесе анын натыйжасы этибарга алынбайт.

Метод объектке чакырылат valueOF. Эгерде ал табылбаса же примитивдик маанини кайтарбаса, метод чакырылат toString. Эгерде метод toString табылган жок, издейт valueOf объекттин прототипинде жана баары маанини иштетүү аяктаганга чейин кайталанат жана туюнтмадагы бардык баалуулуктар бир түргө чыгарылат. Эгерде объект бир методду ишке ашырса 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ге жогорулата турган функцияны жаза аласыз.

Биз JavaScript аркылуу Zabbix'те практикалык маселелерди чечебиз
Сценарийдин аткарылышы, өзгөрмө 3кө барабар болсо, ал дагы 4кө барабар.

Тизмеге (==) салыштырганда, ыкма ар бир жолу аткарылат toString наркты жогорулатуу функциясы менен. Демек, ар бир кийинки салыштыруу менен, маани өсөт. Муну тышкы салыштыруу (===) колдонуу менен болтурбоого болот.

Биз JavaScript аркылуу Zabbix'те практикалык маселелерди чечебиз
Типти кастингсиз салыштыруу

ЭСКЕРТҮҮ. Тышкы экранга чыгарууну салыштырууну керексиз колдонбоңуз.

Типти кастинг менен салыштырууну талап кылган татаал логикасы бар Webhooks сыяктуу татаал скрипттер үчүн өзгөрмөлөрдү кайтарган жана дал келбөөчүлүктөрдү жана каталарды чечүүчү маанилерди текшерүүнү алдын ала жазуу сунушталат.

Webhook Media

2019-жылдын аягында жана 2020-жылдын башында, Zabbix интеграциялык командасы Zabbix бөлүштүрүү менен келген Webhooks жана кутудан тышкаркы интеграцияларды активдүү иштеп чыгууда.

Биз JavaScript аркылуу Zabbix'те практикалык маселелерди чечебиз
-га шилтеме берген барактар документтештирүү

Алдын-ала иштетүү

  • JavaScript'те алдын ала иштетүүнүн пайда болушу көпчүлүк тышкы скрипттерден баш тартууга мүмкүндүк берди жана учурда Zabbixте сиз каалаган маанини алып, аны такыр башка мааниге айландырсаңыз болот.
  • Zabbixте алдын ала иштетүү JavaScript коду менен ишке ашырылат, ал байткодго компиляцияланганда параметр катары бир маанини алган функцияга айландырылат Наркы сап катары (сап цифраны да, санды да камтышы мүмкүн).
  • Чыгуу функция болгондуктан, скрипттин аягында талап кылынат кайра.
  • Коддо ыңгайлаштырылган макросторду колдонууга болот.
  • Ресурстар операциялык системанын деңгээлинде гана эмес, программалык жактан да чектелиши мүмкүн. Алдын ала иштетүү кадамына максималдуу 10 мегабайт оперативдик эс жана 10 секунддун иштөө убактысынын чеги бөлүнөт.

Биз JavaScript аркылуу Zabbix'те практикалык маселелерди чечебиз

ЭСКЕРТҮҮ. 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;`

Бул тез жана оңой, сизге керексиз маалымат элементтерин түзүүнүн жана алар боюнча тарыхты сактоонун кереги жок, ошондой эле текшерүүлөр үчүн ийкемдүү интервалдарды колдоно аласыз.

Биз JavaScript аркылуу Zabbix'те практикалык маселелерди чечебиз

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

Бирок, гипотетикалык кырдаалда алынган маалымат элементин кошуу керек болсо, мисалы, макродо аныкталган ар кандай константа менен, бул параметрди эске алуу керек. Наркы сапка кеңейет. Сапты кошуу операциясында эки сап жөн эле бир сапка бириктирилет.

Биз JavaScript аркылуу Zabbix'те практикалык маселелерди чечебиз

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

Математикалык операциянын натыйжасын алуу үчүн, алынган маанилердин түрлөрүн сандык форматка которуу керек. Бул үчүн сиз функцияны колдоно аласыз parseInt(), ал бүтүн санды, функцияны чыгарат parseFloat(), ондук санды же функцияны чыгарат сан, ал бүтүн же ондук санды кайтарат.

тапшырма 2

Сертификаттын аягына чейин секунданын ичинде убакыт алыңыз.

Шарт: кызмат "12-февраль 12:33:56 2022 GMT" форматында сертификаттын жарактуулук мөөнөтүн чыгарат.

ECMAScript5те date.parse() ISO 8601 форматындагы датаны кабыл алат (ЖЖЖЖ-АА-ККЖ:мм:ss.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() жана бөлчөк маалыматтарды сактоо.

Баяндаманы көрүү

Source: www.habr.com

Комментарий кошуу