Em pirsgirêkên pratîkî yên li Zabbix bi karanîna JavaScript-ê çareser dikin

Em pirsgirêkên pratîkî yên li Zabbix bi karanîna JavaScript-ê çareser dikin
Tikhon Uskov, Endezyarê tîmê entegrasyona Zabbix

Zabbix platformek xwerû ye ku ji bo şopandina her cûre daneyê tê bikar anîn. Ji ber guhertoyên pêşîn ên Zabbix-ê, rêvebirên çavdêriyê xwedan şiyana ku bi navgîniya nivîsarên cihêreng bixebitin. Actions ji bo kontrolên li ser girêkên torê yên armanc. Di heman demê de, destpêkirina senaryoyan bû sedema gelek zehmetiyan, di nav wan de hewcedariya piştgirîkirina senaryoyan, gihandina wan ji bo girêkên ragihandinê û proxy, û her weha piştgirî ji bo versiyonên cihêreng.

JavaScript ji bo Zabbix

Di Nîsana 2019-an de, Zabbix 4.2 bi pêş-processing JavaScript hate nasandin. Pir kes ji ramana dev ji nivîsandina nivîsarên ku daneyan li cîhek digirin, dihesînin û di formatek ku Zabbix jê fam dike de peyda dikin, û kontrolên hêsan pêk tînin ku dê daneyên ku ji hêla Zabbix ve ji bo hilanîn û pêvajoyê ne amade ne bistînin, û Dûv re vê pêveka daneyê bi karanîna amûrên Zabbix û JavaScript bişopînin. Digel vedîtina nizm û tiştên girêdayî ku di Zabbix 3.4 de xuya bûn, me ji bo veqetandin û birêvebirina daneyên wergirtî têgehek pir maqûl girt.

Di Zabbix 4.4 de, wekî berdewamiyek mentiqî ya pêş-pêvajoya li JavaScriptê, rêbazek ragihandinê ya nû derketiye - Webhook, ku dikare were bikar anîn da ku bi hêsanî agahdariya Zabbix bi serîlêdanên partiya sêyemîn re yek bike.

JavaScript û Duktapes

Çima JavaScript û Duktape hatin hilbijartin? Vebijarkên cûrbecûr ji bo ziman û motoran hatin hesibandin:

  • Lua - Lua 5.1
  • Lua - LuaJIT
  • Javascript - Duktape
  • Javascript - JerryScript
  • Python-a pêvekirî
  • Perl vegirtî

Pîvanên hilbijartinê yên sereke berbelavbûn, hêsankirina entegrasyona motorê di hilberê de, xerckirina çavkaniyê kêm û performansa giştî ya motorê, û ewlehiya danasîna kodê bi vî zimanî di çavdêriyê de bûn. Li ser bingeha berhevoka nîşanan, JavaScript li ser motora Duktape bi ser ket.

Em pirsgirêkên pratîkî yên li Zabbix bi karanîna JavaScript-ê çareser dikin

Pîvanên hilbijartinê û ceribandina performansê

Taybetmendiyên Duktape:

- Standard ECMAScript E5/E5.1
- Modulên Zabbix ji bo Duktape:

  • Zabbix.log() - destûrê dide te ku hûn peyamên bi astên cûda yên hûrgulî rasterast di têketina Pêşkêşkara Zabbix de binivîsin, ku ev yek gengaz dike ku xeletiyan, mînakî, di Webhook de, bi rewşa serverê re têkildar bike.
  • CurlHttpRequest () - destûrê dide te ku hûn daxwazên HTTP ji torê re bikin, ku li ser bingeha karanîna Webhook-ê ye.
  • atob () û btoa () - destûrê dide te ku hûn rêzikên di formata Base64 de şîfre bikin û deşîfre bikin.

NOTE. Duktape bi standardên ACME re tevdigere. Zabbix guhertoya senaryoyê ya 2015-an bikar tîne. Guhertinên paşîn piçûk in, ji ber vê yekê ew dikarin bêne paşguh kirin..

JavaScript Magic

Hemî sêrbaziya JavaScript-ê di nivîsandina dînamîk û avêtina tîpan de ye: string, hejmar, û boolean.

Ev tê wê wateyê ku ne hewce ye ku pêşwext were ragihandin ka guhêrbar divê nirxek bi çi rengî vegerîne.

Di operasyonên matematîkî de, nirxên ku ji hêla operatorên fonksiyonê ve têne vegerandin bi hejmar têne veguheztin. Ji îstîsna van karan zêdekirin e, ji ber ku heke bi kêmanî yek ji şertan rêzek be, veguhertina rêzikê li ser hemî şertan tê sepandin.

NOTE. Rêbazên ku ji bo veguherînên weha berpirsiyar in bi gelemperî di prototîpên dêûbav ên tiştan de têne bicîh kirin, nirxOf и toString. nirxOf di dema veguhertina hejmarî de û her dem berî rêbazê tê gotin toString. Awa nirxOf divê nirxên primitive vegerîne, wekî din encama wê nayê paşguh kirin.

Rêbazek li ser objeyekê tê gotin valueOF. Ger ew neyê dîtin an nirxek primitive venegere, rêbaz tê gotin toString. Heke rêbaz toString nehate dîtin, lêgerîn nirxOf di prototîpa objektê de, û her tişt tê dubare kirin heya ku pêvajoyek nirxê qediya û hemî nirxên di îfadeyê de bi heman celebê têne avêtin.. Ger obje rêbazek pêk tîne toString, ku nirxek seretayî vedigerîne, wê hingê ew e ku ji bo veguheztina rêzikê tê bikar anîn. Lêbelê, encama sepandina vê rêbazê ne hewce ye ku rêzek e.

Mînakî, heke ji bo objektê 'tişt' rêbaz hatiye diyarkirin toString,

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

Method toString tam rêzek vedigerîne, û dema ku rêzek bi jimarekê re lê zêde bike, em rêzek zeliqandî distînin:

`obj + 1 // '2001'` 

`obj + 'a' // ‘200a'`

Lê heke hûn ji nû ve binivîsin toString, da ku rêbaz jimareyek vegerîne, dema ku tişt were zêdekirin, dê operasyonek matematîkî ya bi veguheztina hejmarî were kirin û dê encama lêzêdekirina matematîkî were bidestxistin.

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

`obj + 1 // '2001'`

Di vê rewşê de, heke em lêzêdekirina bi xêzekê pêk bînin, veguheztinek têl tê kirin, û em têlekek zeliqandî distînin.

`obj + 'a' // ‘200a'`

Sedema hejmareke mezin a xeletiyên bikarhênerên JavaScript-ê yên nûjen ev e.

Rêbaz toString hûn dikarin fonksiyonek binivîsin ku dê nirxa heyî ya bi 1 zêde bike.

Em pirsgirêkên pratîkî yên li Zabbix bi karanîna JavaScript-ê çareser dikin
Pêkanîna senaryoyê, bi şertê ku guhêrbar 3 be, û ew jî bibe 4.

Dema ku bi kastek (==) re were berhev kirin, rêbaz her carê tête darve kirin toString bi fonksiyona zêdekirina nirxê. Li gorî vê yekê, bi her berhevdana paşîn re, nirx zêde dibe. Ev dikare bi karanîna berhevdana ne-cast (===) were dûr kirin.

Em pirsgirêkên pratîkî yên li Zabbix bi karanîna JavaScript-ê çareser dikin
Berawirdkirin bêyî avêtina tîpan

NOTE. Berawirdkirina Cast Bêhewce Bi kar neynin.

Ji bo skrîptên tevlihev, wek Webhookên bi mantiqê tevlihev, ku hewcedarî berhevdana bi tîpa rijandinê ye, tê pêşniyar kirin ku ji bo nirxên ku guherbaran vedigerînin û nakokî û xeletiyan bi rê ve dibin kontrolên pêşîn binivîsin.

Webhook Media

Di dawiya sala 2019-an û destpêka 2020-an de, tîmê entegrasyona Zabbix bi rengek çalak Webhooks û entegrasyonên derveyî yên ku bi belavkirina Zabbix re têne pêşve xistin.

Em pirsgirêkên pratîkî yên li Zabbix bi karanîna JavaScript-ê çareser dikin
Girêdana bi belgekirin

Pêş-pêvajo kirin

  • Hatina pêş-processing di JavaScript-ê de hişt ku meriv dev ji piraniya nivîsarên derveyî berde, û naha li Zabbix hûn dikarin her nirxek bistînin û wê veguherînin nirxek bi tevahî cûda.
  • Pêş-pêvajoya li Zabbix ji hêla koda JavaScript-ê ve tête bicîh kirin, ku dema ku di nav bytecode de tête berhev kirin, vediguhere fonksiyonek ku nirxek yekane wekî parametre digire. giranî wek xêzekê (rêzek dikare hem jimarek û hem jî jimarek hebe).
  • Ji ber ku encam fonksiyonek e, di dawiya nivîsê de pêdivî ye vegera.
  • Di kodê de gengaz e ku meriv makroyên xwerû bikar bîne.
  • Çavkanî ne tenê di asta pergala xebitandinê de, lê di heman demê de bi bername jî têne sînorkirin. Pêngava pêşdibistanê herî zêde 10 megabayt RAM û sînorê dema xebitandinê 10 çirke tê veqetandin.

Em pirsgirêkên pratîkî yên li Zabbix bi karanîna JavaScript-ê çareser dikin

NOTE. Nirxa demê ya 10 çirkeyan pir pir e, ji ber ku berhevkirina bi hezaran daneyên şertî di 1 çirkeyê de li gorî senaryoyek pêşdibistanê "giran" dikare Zabbix hêdî bike. Ji ber vê yekê, nayê pêşniyar kirin ku meriv pêşdibistanê bikar bîne da ku nivîsarên JavaScript-ên tam bi navgîniya hêmanên daneya siyê (tiştên dummy) yên ku tenê ji bo pêkanîna pêş-processing têne xebitandin, bi kar bînin..

Hûn dikarin koda xwe bi ceribandina pêşdibistanê an jî bi karanîna karûbar kontrol bikin 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`

Karên pratîkî

Armanc 1

Tiştek hesabkirî bi pêşprocessing veguherîne.

Rewş: Germahiya li Fahrenheit ji senzorê bistînin da ku li Celsius hilînin.

Berê, em ê babetek biafirînin ku germahiyê bi dereceyên Fahrenheit berhev dike. Piştî wê, daneyek din (hesabkirî) ku dê bi karanîna formula Fahrenheit-ê veguherîne Celsius.

Pirsgirêkên:

  • Pêdivî ye ku hêmanên daneyê dubare bikin û hemî nirxan di databasê de hilînin.
  • Pêdivî ye ku hûn li ser navberên ji bo daneya "dêûbav" ku di formulê de tê hesibandin û bikar anîn, û ji bo daneya hesabkirî li hev bikin. Wekî din, dibe ku hêmana hesabkirî têkeve rewşek bê piştgirî an nirxek berê hesab bike, ku dê bandorê li pêbaweriya encamên çavdêriyê bike.

Yek çareserî ev bû ku ji navberên kontrolê yên maqûl dûr bikevin di berjewendiya navberên sabît de da ku pê ewle bibin ku tiştê hesabkirî piştî tiştê ku daneyê distîne (di rewşa me de, germahî bi dereceyên Fahrenheit) were nirxandin.

Lê heke, bo nimûne, em şablonê bikar bînin da ku hejmareke mezin a amûran kontrol bikin, û kontrol her 30 çirkeyan carekê tê kirin, Zabbix 29 saniyeyan "hak" dike, û di saniyeya paşîn de ew dest bi kontrol û hesabkirinê dike. Ev rêzek çêdike û bandorê li performansê dike. Ji ber vê yekê, tê pêşniyar kirin ku meriv navberên sabît tenê heke bi rastî hewce be bikar bînin.

Di vê pirsgirêkê de, çareseriya çêtirîn pêşprocessingek JavaScript-a yek-xêz e ku dereceyên Fahrenheit vediguhezîne dereceyên Celsius:

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

Ew zû û hêsan e, hûn ne hewce ne ku hûn hêmanên daneya nehewce biafirînin û li ser wan dîrokek bihêlin, û her weha hûn dikarin navberên maqûl ên ji bo kontrolê bikar bînin.

Em pirsgirêkên pratîkî yên li Zabbix bi karanîna JavaScript-ê çareser dikin

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

Lê, heke di rewşek hîpotezîkî de pêdivî ye ku hêmana daneya wergirtî were zêdekirin, mînakî, bi her domdarek ku di makroyê de hatî destnîşan kirin, divê were hesibandin ku pîvan giranî di nav rêzekê de berfireh dibe. Di operasyonek lêzêdekirina rêzê de, du rêz bi tenê di yek de têne hev kirin.

Em pirsgirêkên pratîkî yên li Zabbix bi karanîna JavaScript-ê çareser dikin

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

Ji bo bidestxistina encama xebatek matematîkî, pêdivî ye ku celebên nirxên ku hatine wergirtin veguhezînin forma hejmarî. Ji bo vê yekê hûn dikarin fonksiyonê bikar bînin parseInt(), ku yekjimarek, fonksiyonek çêdike parseFloat(), ku dehiyek, an fonksiyonek çêdike jimare, ya ku jimareyek yekjimar an dehiyek vedigerîne.

Kar 2

Heta dawiya sertîfîkayê wextê di çirkeyan de bistînin.

Rewş: karûbarek tarîxek qedandina sertîfîkayê bi forma "12 Reşemî 12:33:56 2022 GMT" dide.

Di ECMAScript5 de date.parse() dîrokek di formata ISO 8601 de (YYYY-MM-DDTHH:mm:ss.sssZ) qebûl dike. Pêdivî ye ku meriv rêzek jê re bi forma MMM DD YYYY HH:mm:ss ZZ biavêje

pirsgirêka: Nirxa mehê wekî nivîsê tê diyar kirin, ne wekî jimare. Daneyên di vê formatê de ji hêla Duktape ve nayê pejirandin.

Mînak Çareseriyê:

  • Berî her tiştî, guhêrbarek ku nirxek digire tê ragihandin (tevahiya skrîptê danezana guhêrbaran e ku ji hêla koman ve têne veqetandin têne navnîş kirin).

  • Di rêza yekem de em tarîxê di pîvanê de digirin giranî û wê bi mekanan bi karanîna rêbazê veqetînin qelişandin. Bi vî rengî, em rêzek distînin, ku her hêmanek rêzê, ku ji nîşana 0-ê dest pê dike, bi hêmanek tarîxê ya berî û piştî cîhek re têkildar e. parçekirin(0) - meh, parçekirin(1) -hejmar, parçekirin(2) - xêzek bi demê re, hwd. Piştî wê, her hêmanek tarîxê dikare ji hêla indexê ve di rêzê de were gihîştin.

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

  • Her meh (bi rêza kronolojîk) bi nîşaneya pozîsyona wê ya di rêzê de (ji 0 heta 11) re têkildar e. Ji bo veguheztina nirxek nivîsê bo nirxek jimareyî, yek li nîşana mehê tê zêdekirin (ji ber ku meh ji 1-ê dest pê dikin têne hejmartin). Di vê rewşê de, îfadeya bi lêzêdekirina yek di nav kevanan de tê girtin, ji ber ku wekî din dê rêzek were bidestxistin, ne hejmarek. Di dawiyê de em dikin kêl() - rêzê ji dawiyê qut bikin da ku tenê du tîpan bihêlin (ku bi mehan bi jimareyek du-hejmar girîng e).

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

  • Em bi lêzêdekirina adetî ya rêzikan di rêza guncan de ji nirxên wergirtî rêzek di formata ISO de ava dikin.

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

Daneyên di forma encam de ji 1970-an heya hin xalên pêşerojê hejmara saniyeyan e. Hema hema ne gengaz e ku meriv daneyan di formata wergirtî de di tetikan de bikar bîne, ji ber ku Zabbix dihêle hûn tenê bi makroyan re bixebitin. {Rojek} и {Dem}, ku tarîx û demjimêr di forma bikarhêner-heval de vedigerînin.

  • Dûv re em dikarin tarîxa heyî ya JavaScript-ê di forma Unix Timestamp de bistînin û wê ji tarîxa qedandina sertîfîkayê ya ku derketiye jê derxin da ku ji nuha heya ku sertîfîka biqede, hejmara milî çirkeyan bistînin.

`now = Date.now();`

  • Em nirxa wergirtî bi hezarî dabeş dikin da ku di Zabbix de saniyeyan bistînin.

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

Di tetikê de, hûn dikarin îfadeya 'dawîn' li pey komek jimare ye ku bi hejmara saniyeyan re di heyama ku hûn dixwazin bersivê bidin re têkildar e, mînakî, di hefteyan de. Bi vî rengî, tetik dê agahdar bike ku sertîfîka di hefteyekê de qediya.

NOTE. Bala xwe bidin ser karanînê parseInt() di fonksiyonê de vegeraji bo ku jimareya perçeyî ya ku ji dabeşkirina milîçirkeyan pêk tê veguhezîne jimarek tev. Hûn jî dikarin bikar bînin parseFloat() û daneyên perçeyî hilînin.

Rapor temaşe bikin

Source: www.habr.com

Add a comment