Tunatatua matatizo ya vitendo katika Zabbix kwa kutumia JavaScript

Tunatatua matatizo ya vitendo katika Zabbix kwa kutumia JavaScript
Tikhon Uskov, mhandisi wa timu ya ushirikiano ya Zabbix

Zabbix ni jukwaa linaloweza kubinafsishwa ambalo hutumika kufuatilia aina yoyote ya data. Tangu matoleo ya awali ya Zabbix, wasimamizi wa ufuatiliaji wamekuwa na uwezo wa kuendesha hati mbalimbali kupitia Vitendo kwa ukaguzi kwenye nodi za mtandao zinazolengwa. Wakati huo huo, uzinduzi wa hati ulisababisha shida kadhaa, pamoja na hitaji la kuunga mkono hati, uwasilishaji wao kwa nodi za mawasiliano na proksi, na vile vile usaidizi wa matoleo tofauti.

JavaScript ya Zabbix

Mnamo Aprili 2019, Zabbix 4.2 ilianzishwa kwa uchakataji wa awali wa JavaScript. Watu wengi walifurahishwa na wazo la kuacha maandishi ambayo huchukua data mahali fulani, kuichimba na kuitoa katika muundo ambao Zabbix anaelewa, na kufanya ukaguzi rahisi ambao utapokea data ambayo haiko tayari kuhifadhiwa na kusindika na Zabbix, na kisha uchakata utiririshaji huu wa data kwa kutumia zana za Zabbix na JavaScript. Kwa pamoja na ugunduzi wa kiwango cha chini na vipengee tegemezi vilivyoonekana katika Zabbix 3.4, tulipata dhana inayoweza kunyumbulika kwa urahisi ya kupanga na kudhibiti data iliyopokelewa.

Katika Zabbix 4.4, kama mwendelezo wa kimantiki wa usindikaji wa awali katika JavaScript, njia mpya ya arifa imeonekana - Webhook, ambayo inaweza kutumika kuunganisha kwa urahisi arifa za Zabbix na programu za watu wengine.

JavaScript na Duktapes

Kwa nini JavaScript na Duktape zilichaguliwa? Chaguzi anuwai za lugha na injini zilizingatiwa:

  • Lua - Lua 5.1
  • Lua - LuaJIT
  • Javascript - Duktape
  • Javascript - JerryScript
  • Chatu iliyopachikwa
  • Iliyopachikwa Perl

Vigezo kuu vya uteuzi vilikuwa kuenea, urahisi wa kuunganishwa kwa injini kwenye bidhaa, matumizi ya chini ya rasilimali na utendaji wa jumla wa injini, na usalama wa kuanzisha msimbo katika ufuatiliaji wa lugha hii. Kulingana na mchanganyiko wa viashiria, JavaScript ilishinda kwenye injini ya Duktape.

Tunatatua matatizo ya vitendo katika Zabbix kwa kutumia JavaScript

Vigezo vya uteuzi na upimaji wa utendaji

Vipengele vya Duktape:

- Kawaida ECMAScript E5/E5.1
- Moduli za Zabbix za Duktape:

  • Zabbix.log() - inakuwezesha kuandika ujumbe na viwango tofauti vya maelezo moja kwa moja kwenye logi ya Zabbix Server, ambayo inafanya uwezekano wa kuunganisha makosa, kwa mfano, katika Webhook, na hali ya seva.
  • CurlHttpRequest() - inakuwezesha kufanya maombi ya HTTP kwenye mtandao, ambayo matumizi ya Webhook inategemea.
  • atob() na btoa() - hukuruhusu kusimba na kusimbua masharti katika umbizo la Base64.

NOTE. Duktape inatii viwango vya ACME. Zabbix hutumia toleo la 2015 la hati. Mabadiliko yanayofuata ni madogo, kwa hivyo yanaweza kupuuzwa..

Uchawi wa JavaScript

Ujanja wote wa JavaScript upo katika uchapaji unaobadilika na utumaji wa aina: kamba, nambari, na boolean.

Hii ina maana kwamba si lazima kutangaza mapema ni aina gani kigezo kinapaswa kurudisha thamani.

Katika shughuli za hisabati, thamani zinazorejeshwa na waendeshaji kazi hubadilishwa kuwa nambari. Isipokuwa kwa shughuli kama hizo ni nyongeza, kwa sababu ikiwa angalau moja ya masharti ni kamba, ubadilishaji wa kamba hutumiwa kwa masharti yote.

NOTE. Njia zinazohusika na mabadiliko kama haya kawaida hutekelezwa katika prototypes za mzazi wa kitu, thamaniOf ΠΈ kwaString. thamaniOf inayoitwa wakati wa ubadilishaji wa nambari na kila wakati kabla ya njia kwaString. Njia thamaniOf lazima irudishe maadili ya awali, vinginevyo matokeo yake yatapuuzwa.

Mbinu inaitwa kwenye kitu thamaniOF. Ikiwa haijapatikana au hairejeshi thamani ya primitive, njia inaitwa kwaString. Ikiwa mbinu kwaString haipatikani, inatafuta thamaniOf katika mfano wa kitu, na kila kitu kinarudiwa hadi usindikaji wa thamani ukamilike na maadili yote katika usemi yanatupwa kwa aina moja.. Ikiwa kitu kinatumia njia kwaString, ambayo hurejesha thamani ya awali, basi ndiyo inayotumika kwa ubadilishaji wa kamba. Hata hivyo, matokeo ya kutumia njia hii si lazima kamba.

Kwa mfano, ikiwa kwa kitu 'kitu' mbinu imefafanuliwa kwaString,

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

njia kwaString inarudisha kamba haswa, na tunapoongeza kamba na nambari, tunapata kamba iliyotiwa glasi:

`obj + 1 // '2001'` 

`obj + 'a' // β€˜200a'`

Lakini ukiandika upya kwaString, ili njia irudishe nambari, wakati kitu kinapoongezwa, operesheni ya hisabati yenye ubadilishaji wa nambari itafanywa na matokeo ya kuongeza hisabati yatapatikana.

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

`obj + 1 // '2001'`

Katika kesi hii, ikiwa tunafanya nyongeza kwa kamba, ubadilishaji wa kamba unafanywa, na tunapata kamba ya glued.

`obj + 'a' // β€˜200a'`

Hii ndiyo sababu ya idadi kubwa ya makosa ya watumiaji wa novice JavaScript.

Mbinu kwaString unaweza kuandika kazi ambayo itaongeza thamani ya sasa ya kitu kwa 1.

Tunatatua matatizo ya vitendo katika Zabbix kwa kutumia JavaScript
Utekelezaji wa hati, mradi tofauti ni sawa na 3, na pia ni sawa na 4.

Ikilinganishwa na kutupwa (==), njia hiyo inatekelezwa kila wakati kwaString na utendaji wa ongezeko la thamani. Ipasavyo, kwa kila ulinganisho unaofuata, thamani huongezeka. Hii inaweza kuepukwa kwa kutumia ulinganisho usio wa kutupwa (===).

Tunatatua matatizo ya vitendo katika Zabbix kwa kutumia JavaScript
Kulinganisha bila aina akitoa

NOTE. Usitumie Ulinganisho wa Cast Bila Lazima.

Kwa maandishi changamano, kama vile Webhooks yenye mantiki changamano, ambayo yanahitaji kulinganisha na aina ya utumaji, inashauriwa kuandika ukaguzi wa awali wa thamani ambazo hurejesha vigeuzo na kushughulikia kutofautiana na makosa.

Vyombo vya habari vya Webhook

Mwishoni mwa mwaka wa 2019 na mwanzoni mwa 2020, timu ya ujumuishaji ya Zabbix imekuwa ikitengeneza viunganishi vya Webhook na nje ya kisanduku ambavyo huja na usambazaji wa Zabbix.

Tunatatua matatizo ya vitendo katika Zabbix kwa kutumia JavaScript
Unganisha na nyaraka

Kuandaa

  • Ujio wa usindikaji wa awali katika JavaScript ulifanya iwezekane kuacha hati nyingi za nje, na kwa sasa katika Zabbix unaweza kupata thamani yoyote na kuibadilisha kuwa thamani tofauti kabisa.
  • Usindikaji wa awali katika Zabbix unatekelezwa na msimbo wa JavaScript, ambao, unapokusanywa kuwa bytecode, hubadilishwa kuwa kazi ambayo inachukua thamani moja kama parameta. thamani kama kamba (kamba inaweza kuwa na tarakimu na nambari).
  • Kwa kuwa pato ni kazi, mwisho wa hati inahitajika kurudi.
  • Inawezekana kutumia macros maalum katika msimbo.
  • Rasilimali zinaweza kupunguzwa sio tu katika kiwango cha mfumo wa uendeshaji, lakini pia kwa utaratibu. Hatua ya uchakataji imepewa upeo wa megabaiti 10 za RAM na kikomo cha muda wa kukimbia cha sekunde 10.

Tunatatua matatizo ya vitendo katika Zabbix kwa kutumia JavaScript

NOTE. Thamani ya muda wa kuisha ya sekunde 10 ni nyingi sana, kwa sababu kukusanya maelfu ya vipengee vya data kwa masharti katika sekunde 1 kulingana na hali ya usindikaji "nzito" inaweza kupunguza kasi ya Zabbix. Kwa hivyo, haipendekezwi kutumia usindikaji wa awali kutekeleza hati kamili za JavaScript kupitia kinachojulikana kama vipengee vya data ya kivuli (vitu vya dummy), ambavyo huendeshwa tu kufanya usindikaji wa mapema..

Unaweza kuangalia msimbo wako kupitia jaribio la kuchakata mapema au kutumia matumizi 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`

Kazi za vitendo

Kazi 1

Badilisha kipengee kilichohesabiwa na usindikaji wa awali.

Hali: Pata halijoto katika Fahrenheit kutoka kihisia ili kuhifadhi katika Selsiasi.

Hapo awali, tungeunda kipengee ambacho hukusanya halijoto katika digrii Fahrenheit. Baada ya hapo, kipengee kingine cha data (kilichohesabiwa) ambacho kinaweza kubadilisha Fahrenheit hadi Celsius kwa kutumia fomula.

Shida:

  • Inahitajika kurudia vitu vya data na kuhifadhi maadili yote kwenye hifadhidata.
  • Ni lazima ukubaliane kuhusu vipindi vya kipengee cha data "mzazi" ambacho kinakokotolewa na kutumika katika fomula, na kwa kipengee cha data kilichokokotwa. Vinginevyo, kipengee kilichokokotwa kinaweza kwenda katika hali isiyotumika au kukokotoa thamani ya awali, ambayo itaathiri kutegemewa kwa matokeo ya ufuatiliaji.

Suluhisho mojawapo lilikuwa ni kuondokana na vipindi vya ukaguzi vinavyoweza kunyumbulika ili kupendelea vipindi vilivyowekwa ili kuhakikisha kuwa kipengee kilichokokotwa kinatathminiwa baada ya kipengee kinachopokea data (kwa upande wetu, halijoto katika nyuzi Fahrenheit).

Lakini ikiwa, kwa mfano, tunatumia template kuangalia idadi kubwa ya vifaa, na hundi inafanywa mara moja kila sekunde 30, Zabbix "hacks" kwa sekunde 29, na kwa pili ya mwisho huanza kuangalia na kuhesabu. Hii hutengeneza foleni na kuathiri utendakazi. Kwa hivyo, inashauriwa kutumia vipindi vilivyowekwa tu ikiwa ni muhimu sana.

Katika shida hii, suluhisho bora ni uchakataji wa JavaScript wa mstari mmoja ambao hubadilisha digrii Fahrenheit hadi digrii Celsius:

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

Ni haraka na rahisi, huna haja ya kuunda vipengee vya data visivyohitajika na kuweka historia juu yao, na unaweza pia kutumia vipindi vinavyobadilika kwa ukaguzi.

Tunatatua matatizo ya vitendo katika Zabbix kwa kutumia JavaScript

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

Lakini, ikiwa katika hali ya dhahania ni muhimu kuongeza kipengee cha data kilichopokelewa, kwa mfano, na maelezo yoyote ya mara kwa mara katika macro, ni lazima izingatiwe kuwa parameter. thamani inapanuka hadi kuwa kamba. Katika operesheni ya kuongeza kamba, nyuzi mbili zinaunganishwa tu kuwa moja.

Tunatatua matatizo ya vitendo katika Zabbix kwa kutumia JavaScript

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

Ili kupata matokeo ya operesheni ya hisabati, ni muhimu kubadilisha aina za maadili yaliyopatikana kuwa muundo wa nambari. Kwa hili unaweza kutumia kazi parseInt(), ambayo hutoa nambari kamili, kitendakazi parseFloat(), ambayo hutoa desimali, au kitendakazi idadi, ambayo hurejesha nambari kamili au desimali.

Jukumu la 2

Pata muda kwa sekunde hadi mwisho wa cheti.

Hali: huduma inatoa tarehe ya mwisho wa matumizi ya cheti katika umbizo la "Feb 12 12:33:56 2022 GMT".

Katika ECMAScript5 tarehe.changanua() inakubali tarehe katika umbizo la ISO 8601 (YYYY-MM-DDTHH:mm:ss.sssZ). Ni muhimu kuitupia kamba katika umbizo la MMM DD YYYY HH:mm:ss ZZ.

tatizo: Thamani ya mwezi inaonyeshwa kama maandishi, sio nambari. Data katika umbizo hili haikubaliwi na Duktape.

Mfano wa suluhisho:

  • Kwanza kabisa, kigezo kinatangazwa ambacho kinachukua thamani (hati nzima ni tamko la viambishi ambavyo vimeorodheshwa kutengwa na koma).

  • Katika mstari wa kwanza tunapata tarehe katika parameter thamani na kuitenganisha na nafasi kwa kutumia njia kupasuliwa. Kwa hivyo, tunapata safu, ambapo kila kipengele cha safu, kuanzia index 0, inalingana na kipengele kimoja cha tarehe kabla na baada ya nafasi. mgawanyiko (0) - mwezi, mgawanyiko (1) - nambari, mgawanyiko (2) - kamba na wakati, nk Baada ya hayo, kila kipengele cha tarehe kinaweza kupatikana kwa index katika safu.

`var split = value.split(' '),`

  • Kila mwezi (kwa mpangilio wa wakati) inalingana na faharisi ya nafasi yake katika safu (kutoka 0 hadi 11). Ili kubadilisha thamani ya maandishi kwa thamani ya nambari, moja huongezwa kwenye faharasa ya mwezi (kwa sababu miezi imehesabiwa kuanzia 1). Katika kesi hii, usemi na kuongeza moja huchukuliwa kwenye mabano, kwa sababu vinginevyo kamba itapatikana, sio nambari. Mwishoni tunafanya kipande() - kata safu kutoka mwisho ili kuacha wahusika wawili tu (ambayo ni muhimu kwa miezi na nambari ya tarakimu mbili).

`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),`

  • Tunaunda kamba katika muundo wa ISO kutoka kwa maadili yaliyopatikana kwa kuongeza kawaida ya kamba kwa mpangilio unaofaa.

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

Data katika umbizo linalotokana ni idadi ya sekunde kutoka 1970 hadi wakati fulani katika siku zijazo. Karibu haiwezekani kutumia data katika muundo uliopokelewa katika vichochezi, kwa sababu Zabbix hukuruhusu kufanya kazi na macros tu. {Tarehe} ΠΈ {Muda}, ambayo hurejesha tarehe na wakati katika umbizo linalofaa mtumiaji.

  • Kisha tunaweza kupata tarehe ya sasa katika JavaScript katika umbizo la Unix Timestamp na kuiondoa kwenye tarehe ya mwisho ya cheti inayotokana ili kupata idadi ya milisekunde kuanzia sasa hadi cheti kitakapoisha.

`now = Date.now();`

  • Tunagawanya thamani iliyopokelewa kwa elfu moja ili kupata sekunde katika Zabbix.

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

Katika kichochezi, unaweza kutaja usemi 'mwisho' ikifuatiwa na seti ya tarakimu zinazolingana na idadi ya sekunde katika kipindi unachotaka kujibu, kwa mfano, katika wiki. Kwa hivyo, kichochezi kitaarifu kwamba cheti kinaisha baada ya wiki.

NOTE. Makini na matumizi parseInt() katika utendaji kurudikubadilisha nambari ya sehemu inayotokana na mgawanyiko wa milisekunde hadi nambari kamili. Unaweza pia kutumia parseFloat() na kuhifadhi data ya sehemu.

Tazama ripoti

Chanzo: mapenzi.com

Kuongeza maoni