Біз 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-те алдын ала өңдеудің логикалық жалғасы ретінде жаңа хабарландыру әдісі - Webhook пайда болды, оны үшінші тарап қолданбаларымен Zabbix хабарландыруларын оңай біріктіру үшін пайдалануға болады.

JavaScript және Duktapes

Неліктен JavaScript және Duktape таңдалды? Тілдер мен қозғалтқыштардың әртүрлі нұсқалары қарастырылды:

  • Луа - Луа 5.1
  • Луа - ЛуаЖИТ
  • Javascript - Duktape
  • Javascript - JerryScript
  • Енгізілген Python
  • Енгізілген 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 медиасы

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() және бөлшек деректерді сақтау.

Есепті қарау

Ақпарат көзі: www.habr.com

пікір қалдыру