MÄs risinÄm praktiskas problÄmas Zabbix, izmantojot JavaScript
Tihons Uskovs, Zabbix integrÄcijas komandas inženieris
Zabbix ir pielÄgojama platforma, ko izmanto, lai uzraudzÄ«tu jebkÄda veida datus. KopÅ” senÄkajÄm Zabbix versijÄm uzraudzÄ«bas administratoriem ir bijusi iespÄja palaist dažÄdus skriptus, izmantojot IespÄjas mÄrÄ·a tÄ«kla mezglu pÄrbaudÄm. TajÄ paÅ”Ä laikÄ skriptu palaiÅ”ana radÄ«ja vairÄkas grÅ«tÄ«bas, tostarp nepiecieÅ”amÄ«bu atbalstÄ«t skriptus, to piegÄdi saziÅas mezgliem un starpniekserveriem, kÄ arÄ« dažÄdu versiju atbalstu.
JavaScript priekÅ” Zabbix
2019. gada aprÄ«lÄ« tika ieviests Zabbix 4.2 ar JavaScript priekÅ”apstrÄdi. Daudzus cilvÄkus sajÅ«sminÄja ideja atteikties no tÄdu skriptu rakstÄ«Å”anas, kas kaut kur aiznes datus, sagremo tos un nodroÅ”ina Zabbix saprotamÄ formÄtÄ un veic vienkÄrÅ”as pÄrbaudes, kas saÅems datus, kas nav gatavi Zabbix glabÄÅ”anai un apstrÄdei, un pÄc tam apstrÄdÄjiet Å”o datu straumi, izmantojot Zabbix un JavaScript rÄ«kus. SaistÄ«bÄ ar zema lÄ«meÅa atklÄÅ”anas un atkarÄ«giem vienumiem, kas parÄdÄ«jÄs Zabbix 3.4, mÄs ieguvÄm diezgan elastÄ«gu saÅemto datu kÄrtoÅ”anas un pÄrvaldÄ«bas koncepciju.
Zabbix 4.4 versijÄ kÄ loÄ£isks JavaScript priekÅ”apstrÄdes turpinÄjums ir parÄdÄ«jusies jauna paziÅoÅ”anas metode - Webhook, ar kuras palÄ«dzÄ«bu var Ärti integrÄt Zabbix paziÅojumus ar treÅ”o puÅ”u lietojumprogrammÄm.
JavaScript un Duktapes
KÄpÄc tika izvÄlÄti JavaScript un Duktape? Tika apsvÄrtas dažÄdas valodu un dzinÄju iespÄjas:
Lua ā Lua 5.1
Lua ā LuaJIT
Javascript ā Duktape
Javascript ā JerryScript
Iegultais Python
Iegultais Perl
Galvenie atlases kritÄriji bija izplatÄ«ba, dzinÄja integrÄÅ”anas vienkÄrŔība produktÄ, zems resursu patÄriÅÅ” un dzinÄja vispÄrÄjÄ veiktspÄja, kÄ arÄ« koda ievieÅ”anas droŔība Å”ajÄ valodÄ uzraudzÄ«bÄ. Pamatojoties uz rÄdÄ«tÄju kombinÄciju, Duktape dzinÄjÄ uzvarÄja JavaScript.
Zabbix.log() - ļauj rakstÄ«t dažÄdu detalizÄcijas lÄ«meÅu ziÅojumus tieÅ”i Zabbix Server žurnÄlÄ, kas ļauj korelÄt kļūdas, piemÄram, Web aizÄ·erÄ, ar servera stÄvokli.
CurlHttpRequest() - ļauj veikt HTTP pieprasÄ«jumus tÄ«klam, uz kuriem balstÄs Webhook izmantoÅ”ana.
atob() un btoa() - ļauj kodÄt un atÅ”ifrÄt virknes Base64 formÄtÄ.
PIEZÄŖME. Duktape atbilst ACME standartiem. Zabbix izmanto skripta 2015. gada versiju. TurpmÄkÄs izmaiÅas ir nelielas, tÄpÄc tÄs var ignorÄt..
JavaScript maģija
Visa JavaScript burvÄ«ba slÄpjas dinamiskÄ maŔīnrakstÄ«Å”anÄ un veidu atraÅ”anÄ: virkne, ciparu un BÅ«la.
Tas nozÄ«mÄ, ka nav nepiecieÅ”ams iepriekÅ” deklarÄt, kÄda veida mainÄ«gajam ir jÄatgriež vÄrtÄ«ba.
MatemÄtiskajÄs operÄcijÄs funkciju operatoru atgrieztÄs vÄrtÄ«bas tiek pÄrvÄrstas skaitļos. IzÅÄmums Å”ÄdÄm darbÄ«bÄm ir pievienoÅ”ana, jo, ja vismaz viens no terminiem ir virkne, virknes konvertÄÅ”ana tiek piemÄrota visiem terminiem.
PIEZÄŖME. Metodes, kas ir atbildÄ«gas par Å”ÄdÄm transformÄcijÄm, parasti tiek ieviestas objekta vecÄku prototipos, valueOf Šø toString. valueOf izsauc ciparu konvertÄÅ”anas laikÄ un vienmÄr pirms metodes toString. Metode valueOf ir jÄatgriež primitÄ«vas vÄrtÄ«bas, pretÄjÄ gadÄ«jumÄ tÄ rezultÄts tiek ignorÄts.
Objektam tiek izsaukta metode vÄrtÄ«baOF. Ja tÄ netiek atrasta vai neatgriež primitÄ«vu vÄrtÄ«bu, tiek izsaukta metode toString. Ja metode toString nav atrasts, meklÄ valueOf objekta prototipÄ, un viss tiek atkÄrtots, lÄ«dz vÄrtÄ«bas apstrÄde ir pabeigta un visas izteiksmes vÄrtÄ«bas tiek nodotas vienam tipam. Ja objekts realizÄ metodi toString, kas atgriež primitÄ«vu vÄrtÄ«bu, tad tÄ tiek izmantota virknes konvertÄÅ”anai.TomÄr Ŕīs metodes piemÄroÅ”anas rezultÄts ne vienmÄr ir virkne.
PiemÄram, ja objektam 'objekts' metode ir definÄta toString,
`var obj = { toString() { return "200" }}`
Metode toString atgriež tieÅ”i virkni, un, pievienojot virkni ar skaitli, mÄs iegÅ«stam salÄ«mÄtu virkni:
`obj + 1 // '2001'`
`obj + 'a' // ā200a'`
Bet ja pÄrraksti toString, lai metode atgrieztu skaitli, kad objekts tiek pievienots, tiks veikta matemÄtiskÄ darbÄ«ba ar skaitļu konvertÄÅ”anu un iegÅ«ts matemÄtiskÄs saskaitÄ«Å”anas rezultÄts.
Å ajÄ gadÄ«jumÄ, ja veicam pievienoÅ”anu ar virkni, tiek veikta virknes konvertÄÅ”ana, un mÄs iegÅ«stam pielÄ«mÄtu virkni.
`obj + 'a' // ā200a'`
Tas ir iemesls lielam skaitam kļūdu, ko pieļauj iesÄcÄju JavaScript lietotÄji.
Metode toString jÅ«s varat uzrakstÄ«t funkciju, kas palielinÄs objekta paÅ”reizÄjo vÄrtÄ«bu par 1.
Skripta izpilde, ja mainÄ«gais ir vienÄds ar 3, un tas ir arÄ« vienÄds ar 4.
SalÄ«dzinot ar cast (==), metode tiek izpildÄ«ta katru reizi toString ar vÄrtÄ«bas palielinÄÅ”anas funkciju. AttiecÄ«gi ar katru nÄkamo salÄ«dzinÄjumu vÄrtÄ«ba palielinÄs. No tÄ var izvairÄ«ties, izmantojot ne-cast salÄ«dzinÄjumu (===).
SalÄ«dzinÄjums bez tipa lieÅ”anas
PIEZÄŖME. Neizmantojiet cast salÄ«dzinÄjumu bez vajadzÄ«bas.
Sarežģītiem skriptiem, piemÄram, Webhooks ar sarežģītu loÄ£iku, kuriem nepiecieÅ”ams salÄ«dzinÄjums ar tipa apraidi, ieteicams iepriekÅ” uzrakstÄ«t to vÄrtÄ«bu pÄrbaudes, kas atgriež mainÄ«gos un apstrÄdÄ neatbilstÄ«bas un kļūdas.
Webhook Media
2019. gada beigÄs un 2020. gada sÄkumÄ Zabbix integrÄcijas komanda ir aktÄ«vi izstrÄdÄjusi Webhooks un gatavÄs integrÄcijas, kas nÄk ar Zabbix izplatÄ«Å”anu.
JavaScript priekÅ”apstrÄdes parÄdÄ«Å”anÄs ļÄva atteikties no vairuma ÄrÄjo skriptu, un paÅ”laik Zabbix jÅ«s varat iegÅ«t jebkuru vÄrtÄ«bu un pÄrvÄrst to par pilnÄ«gi citu vÄrtÄ«bu.
IepriekÅ”Äja apstrÄde programmÄ Zabbix tiek Ä«stenota ar JavaScript kodu, kas, kompilÄjot baitkodÄ, tiek pÄrveidots par funkciju, kas kÄ parametru izmanto vienu vÄrtÄ«bu vÄrtÄ«ba kÄ virkne (virknÄ var bÅ«t gan cipars, gan skaitlis).
TÄ kÄ izvade ir funkcija, skripta beigÄs ir nepiecieÅ”ams atgrieÅ”anÄs.
KodÄ ir iespÄjams izmantot pielÄgotus makro.
Resursus var ierobežot ne tikai operÄtÄjsistÄmas lÄ«menÄ«, bet arÄ« programmatiski. PriekÅ”apstrÄdes solim ir pieŔķirts ne vairÄk kÄ 10 megabaiti RAM un 10 sekunžu darbÄ«bas laika ierobežojums.
PIEZÄŖME. 10 sekunžu taimauta vÄrtÄ«ba ir diezgan liela, jo nosacÄ«tu tÅ«kstoÅ”iem datu vienumu savÄkÅ”ana 1 sekundÄ saskaÅÄ ar diezgan āsmaguā priekÅ”apstrÄdes scenÄriju var palÄninÄt Zabbix. TÄpÄc nav ieteicams izmantot priekÅ”apstrÄdi, lai izpildÄ«tu pilnvÄrtÄ«gus JavaScript skriptus, izmantojot tÄ sauktos Änu datu elementus (fiktÄ«vos vienumus), kas tiek palaisti tikai priekÅ”apstrÄdes veikÅ”anai..
Varat pÄrbaudÄ«t savu kodu, veicot priekÅ”apstrÄdes testu vai izmantojot utilÄ«tu zabbix_js:
AizstÄt aprÄÄ·inÄto vienumu ar priekÅ”apstrÄdi.
StÄvoklis: IegÅ«stiet no sensora temperatÅ«ru FÄrenheitÄ, lai saglabÄtu to Celsija grÄdos.
IepriekÅ” mÄs izveidojÄm vienumu, kas apkopo temperatÅ«ru FÄrenheita grÄdos. PÄc tam vÄl viens datu vienums (aprÄÄ·inÄts), kas, izmantojot formulu, pÄrvÄrstu pÄc FÄrenheita uz Celsija.
ProblÄmas:
Ir nepiecieÅ”ams dublÄt datu elementus un saglabÄt visas vÄrtÄ«bas datu bÄzÄ.
JÄvienojas par intervÄliem formulÄ aprÄÄ·inÄtajam un izmantotajam datu vienumam "vecÄks" un aprÄÄ·inÄtajam datu vienumam. PretÄjÄ gadÄ«jumÄ aprÄÄ·inÄtais vienums var nonÄkt neatbalstÄ«tÄ stÄvoklÄ« vai aprÄÄ·inÄt iepriekÅ”Äjo vÄrtÄ«bu, kas ietekmÄs uzraudzÄ«bas rezultÄtu ticamÄ«bu.
Viens no risinÄjumiem bija atteikties no elastÄ«giem pÄrbaudes intervÄliem par labu fiksÄtiem intervÄliem, lai nodroÅ”inÄtu, ka aprÄÄ·inÄtais vienums tiek novÄrtÄts pÄc vienuma, kas saÅem datus (mÅ«su gadÄ«jumÄ temperatÅ«ra FÄrenheita grÄdos).
Bet, ja, piemÄram, mÄs izmantojam veidni, lai pÄrbaudÄ«tu lielu skaitu ierÄ«Äu, un pÄrbaude tiek veikta reizi 30 sekundÄs, Zabbix "uzlauž" 29 sekundes, un pÄdÄjÄ sekundÄ sÄk pÄrbaudÄ«t un aprÄÄ·inÄt. Tas rada rindu un ietekmÄ veiktspÄju. TÄpÄc ir ieteicams izmantot fiksÄtus intervÄlus tikai tad, ja tas patieÅ”Äm ir nepiecieÅ”ams.
Å Ä«s problÄmas optimÄlais risinÄjums ir vienas rindas JavaScript priekÅ”apstrÄde, kas pÄrvÄrÅ” FÄrenheita grÄdus pÄc Celsija grÄdiem:
`return (value - 32) * 5 / 9;`
Tas ir Ätri un vienkÄrÅ”i, jums nav jÄveido nevajadzÄ«gi datu vienumi un jÄglabÄ to vÄsture, kÄ arÄ« varat izmantot elastÄ«gus pÄrbaužu intervÄlus.
Bet, ja hipotÄtiskÄ situÄcijÄ ir nepiecieÅ”ams pievienot saÅemto datu elementu, piemÄram, ar jebkuru makro definÄtu konstanti, jÄÅem vÄrÄ, ka parametrs vÄrtÄ«ba izpleÅ”as virknÄ. Virknes pievienoÅ”anas operÄcijÄ divas virknes tiek vienkÄrÅ”i apvienotas vienÄ.
`return (value + "{$EXAMPLE.MACRO}");`
Lai iegÅ«tu matemÄtiskas darbÄ«bas rezultÄtu, iegÅ«to vÄrtÄ«bu veidi ir jÄpÄrvÄrÅ” ciparu formÄtÄ. Å im nolÅ«kam varat izmantot funkciju parseInt(), kas rada veselu skaitli, funkciju parseFloat(), kas veido decimÄldaļu vai funkciju skaits, kas atgriež veselu skaitli vai decimÄldaļu.
2. uzdevums
IegÅ«stiet laiku sekundÄs lÄ«dz sertifikÄta beigÄm.
ProgrammÄ ECMAScript5 date.parse() pieÅem datumu ISO 8601 formÄtÄ (GGGG-MM-DDTHH:mm:ss.sssZ). Tam ir jÄieraida virkne formÄtÄ MMM DD GGGG HH:mm:ss ZZ
problÄma: mÄneÅ”a vÄrtÄ«ba tiek izteikta kÄ teksts, nevis kÄ skaitlis. Datus Å”ÄdÄ formÄtÄ Duktape nepieÅem.
RisinÄjuma piemÄrs:
PirmkÄrt, tiek deklarÄts mainÄ«gais, kas iegÅ«st vÄrtÄ«bu (viss skripts ir mainÄ«go lielumu deklarÄcija, kas ir uzskaitÄ«ti, atdalot tos ar komatiem).
PirmajÄ rindÄ mÄs iegÅ«stam datumu parametrÄ vÄrtÄ«ba un atdaliet to ar atstarpÄm, izmantojot metodi sadalÄ«t. TÄdÄjÄdi mÄs iegÅ«stam masÄ«vu, kurÄ katrs masÄ«va elements, sÄkot ar indeksu 0, atbilst vienam datuma elementam pirms un pÄc atstarpes. sadalÄ«t (0) - mÄnesis, sadalÄ«t (1) - numurs, sadalÄ«t (2) - virkne ar laiku utt. PÄc tam katram datuma elementam var piekļūt ar indeksu masÄ«vÄ.
`var split = value.split(' '),`
Katrs mÄnesis (hronoloÄ£iskÄ secÄ«bÄ) atbilst tÄ pozÄ«cijas indeksam masÄ«vÄ (no 0 lÄ«dz 11). Lai teksta vÄrtÄ«bu pÄrvÄrstu par skaitlisku vÄrtÄ«bu, mÄneÅ”a indeksam tiek pievienota viena vÄrtÄ«ba (jo mÄneÅ”i tiek numurÄti, sÄkot ar 1). Å ajÄ gadÄ«jumÄ izteiksme ar pievienojumu viens tiek Åemta iekavÄs, jo pretÄjÄ gadÄ«jumÄ tiks iegÅ«ta virkne, nevis skaitlis. BeigÄs darÄm ŔķÄle () - izgrieziet masÄ«vu no beigÄm, lai atstÄtu tikai divas rakstzÄ«mes (kas ir svarÄ«gi mÄneÅ”iem ar divciparu skaitli).
Dati iegÅ«tajÄ formÄtÄ ir sekunžu skaits no 1970. gada lÄ«dz noteiktam brÄ«dim nÄkotnÄ. SaÅemtÄ formÄta datus ir gandrÄ«z neiespÄjami izmantot trigeros, jo Zabbix ļauj darboties tikai ar makro {Datums} Šø {Laiks}, kas atgriež datumu un laiku lietotÄjam draudzÄ«gÄ formÄtÄ.
PÄc tam mÄs varam iegÅ«t paÅ”reizÄjo datumu JavaScript formÄtÄ Unix Timestamp un atÅemt to no iegÅ«tÄ sertifikÄta derÄ«guma termiÅa, lai iegÅ«tu milisekundes no Ŕī brīža lÄ«dz sertifikÄta derÄ«guma termiÅa beigÄm.
`now = Date.now();`
MÄs dalÄm saÅemto vÄrtÄ«bu ar tÅ«kstoti, lai iegÅ«tu sekundes Zabbix.
AktivizÄtÄjÄ varat norÄdÄ«t izteiksmi "PÄdÄjais', kam seko ciparu kopa, kas atbilst sekunžu skaitam periodÄ, uz kuru vÄlaties atbildÄt, piemÄram, nedÄļÄs. TÄdÄjÄdi aktivizÄtÄjs paziÅos, ka sertifikÄta derÄ«guma termiÅÅ” beigsies pÄc nedÄļas.
PIEZÄŖME. PievÄrsiet uzmanÄ«bu lietoÅ”anai parseInt() funkcijÄ atgrieÅ”anÄslai pÄrvÄrstu daļskaitli, kas iegÅ«ts, dalot milisekundes, par veselu skaitli. Varat arÄ« izmantot parseFloat() un uzglabÄt daļÄjus datus.