Rydym yn datrys problemau ymarferol yn Zabbix gan ddefnyddio JavaScript

Rydym yn datrys problemau ymarferol yn Zabbix gan ddefnyddio JavaScript
Tikhon Uskov, peiriannydd tîm integreiddio Zabbix

Mae Zabbix yn blatfform y gellir ei addasu a ddefnyddir i fonitro unrhyw fath o ddata. Ers y fersiynau cynharaf o Zabbix, mae gweinyddwyr monitro wedi gallu rhedeg sgriptiau amrywiol trwy Camau Gweithredu ar gyfer gwiriadau ar nodau rhwydwaith targed. Ar yr un pryd, arweiniodd lansiad sgriptiau at nifer o anawsterau, gan gynnwys megis yr angen i gefnogi sgriptiau, eu cyflwyno i nodau cyfathrebu a dirprwyon, yn ogystal â chefnogaeth ar gyfer gwahanol fersiynau.

JavaScript ar gyfer Zabbix

Ym mis Ebrill 2019, cyflwynwyd Zabbix 4.2 gyda rhagbrosesu JavaScript. Roedd llawer o bobl wedi cyffroi ynghylch y syniad o roi’r gorau i ysgrifennu sgriptiau sy’n mynd â data i rywle, ei dreulio a’i ddarparu mewn fformat y mae Zabbix yn ei ddeall, a pherfformio gwiriadau syml a fydd yn derbyn data nad yw’n barod i’w storio a’i brosesu gan Zabbix, a yna prosesu'r llif data hwn gan ddefnyddio offer Zabbix a JavaScript. Ar y cyd â darganfyddiad lefel isel ac eitemau dibynnol a ymddangosodd yn Zabbix 3.4, cawsom gysyniad eithaf hyblyg ar gyfer didoli a rheoli'r data a dderbyniwyd.

Yn Zabbix 4.4, fel parhad rhesymegol o rag-brosesu yn JavaScript, mae dull hysbysu newydd wedi ymddangos - Webhook, y gellir ei ddefnyddio i integreiddio hysbysiadau Zabbix yn hawdd â chymwysiadau trydydd parti.

JavaScript a Duktapes

Pam dewiswyd JavaScript a Duktape? Ystyriwyd opsiynau amrywiol ar gyfer ieithoedd a pheiriannau:

  • Lua - Lua 5.1
  • Lua — LuaJIT
  • Javascript - Duktape
  • Javascript - JerryScript
  • Python wedi'i fewnosod
  • Gwreiddio Perl

Y prif feini prawf dethol oedd mynychder, rhwyddineb integreiddio'r injan i'r cynnyrch, defnydd isel o adnoddau a pherfformiad cyffredinol yr injan, a diogelwch cyflwyno cod yn yr iaith hon i fonitro. Yn seiliedig ar y cyfuniad o ddangosyddion, enillodd JavaScript ar yr injan Duktape.

Rydym yn datrys problemau ymarferol yn Zabbix gan ddefnyddio JavaScript

Meini prawf dethol a phrofi perfformiad

Nodweddion Duktape:

—Safon ECMAScript E5/E5.1
— Modiwlau Zabbix ar gyfer Duktape:

  • Zabbix.log() - yn caniatáu ichi ysgrifennu negeseuon gyda gwahanol lefelau o fanylder yn uniongyrchol i log Gweinydd Zabbix, sy'n ei gwneud hi'n bosibl cydberthyn gwallau, er enghraifft, mewn Webhook, â chyflwr y gweinydd.
  • CurlHttpRequest() - yn caniatáu ichi wneud ceisiadau HTTP i'r rhwydwaith, sy'n seiliedig ar y defnydd o Webhook.
  • atob() a btoa() - yn eich galluogi i amgodio a dadgodio llinynnau yn fformat Base64.

SYLWCH. Mae Duktape yn cydymffurfio â safonau ACME. Mae Zabbix yn defnyddio fersiwn 2015 o'r sgript. Mae newidiadau dilynol yn fân, felly gellir eu hanwybyddu..

Hud JavaScript

Mae holl hud JavaScript yn gorwedd mewn teipio deinamig a chastio teip: llinyn, rhifol, a boolean.

Mae hyn yn golygu nad oes angen datgan ymlaen llaw pa fath y dylai'r newidyn ddychwelyd gwerth.

Mewn gweithrediadau mathemategol, mae'r gwerthoedd a ddychwelir gan weithredwyr ffwythiannau yn cael eu trosi i rifau. Yr eithriad i weithrediadau o'r fath yw adio, oherwydd os yw o leiaf un o'r termau yn llinyn, mae trosi llinyn yn cael ei gymhwyso i bob term.

SYLWCH. Mae'r dulliau sy'n gyfrifol am drawsnewidiadau o'r fath fel arfer yn cael eu gweithredu ym mhrototeipiau rhiant y gwrthrych, gwerthOf и iLlinyn. gwerthOf a elwir yn ystod trosi rhifiadol a bob amser cyn y dull iLlinyn. Dull gwerthOf rhaid dychwelyd gwerthoedd cyntefig, fel arall ei ganlyniad yn cael ei anwybyddu.

Gelwir dull ar wrthrych gwerthOF. Os na chaiff ei ganfod neu os nad yw'n dychwelyd gwerth cyntefig, gelwir y dull iLlinyn. Os bydd y dull iLlinyn heb ei ganfod, chwilio gwerthOf yn y prototeip o'r gwrthrych, ac mae popeth yn cael ei ailadrodd nes bod prosesu'r gwerth wedi'i gwblhau a bod yr holl werthoedd yn y mynegiant yn cael eu bwrw i'r un math. Os yw'r gwrthrych yn gweithredu dull iLlinyn, sy'n dychwelyd gwerth cyntefig, yna mae'n cael ei ddefnyddio ar gyfer trosi llinyn. Fodd bynnag, nid yw canlyniad cymhwyso'r dull hwn o reidrwydd yn llinyn.

Er enghraifft, os ar gyfer gwrthrych 'Amc' dull yn cael ei ddiffinio iLlinyn,

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

метод iLlinyn yn dychwelyd llinyn yn union, ac wrth ychwanegu llinyn gyda rhif, rydym yn cael llinyn wedi'i gludo:

`obj + 1 // '2001'` 

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

Ond os ydych chi'n ailysgrifennu iLlinyn, fel bod y dull yn dychwelyd rhif, pan fydd y gwrthrych yn cael ei ychwanegu, bydd gweithrediad mathemategol gyda throsiad rhifol yn cael ei berfformio a bydd canlyniad adio mathemategol yn cael ei sicrhau.

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

`obj + 1 // '2001'`

Yn yr achos hwn, os ydym yn perfformio adio gyda llinyn, mae trosi llinyn yn cael ei berfformio, ac rydym yn cael llinyn gludo.

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

Dyma'r rheswm dros nifer fawr o gamgymeriadau gan ddefnyddwyr JavaScript newydd.

Y dull iLlinyn gallwch ysgrifennu ffwythiant a fydd yn cynyddu gwerth cerrynt y gwrthrych gan 1.

Rydym yn datrys problemau ymarferol yn Zabbix gan ddefnyddio JavaScript
Cyflawni'r sgript, ar yr amod bod y newidyn yn hafal i 3, a'i fod hefyd yn hafal i 4.

O'i gymharu â chast (==), gweithredir y dull bob tro iLlinyn gyda swyddogaeth cynyddu gwerth. Yn unol â hynny, gyda phob cymhariaeth ddilynol, mae'r gwerth yn cynyddu. Gellir osgoi hyn trwy ddefnyddio cymhariaeth ddi-gast (===).

Rydym yn datrys problemau ymarferol yn Zabbix gan ddefnyddio JavaScript
Cymhariaeth heb castio math

SYLWCH. Peidiwch â Defnyddio Cymhariaeth Cast yn Ddiangen.

Ar gyfer sgriptiau cymhleth, fel Webhooks gyda rhesymeg gymhleth, sy'n gofyn am gymharu â castio math, argymhellir rhag-ysgrifennu gwiriadau ar gyfer y gwerthoedd sy'n dychwelyd newidynnau ac yn trin anghysondebau a gwallau.

Webhook Media

Ar ddiwedd 2019 a dechrau 2020, mae tîm integreiddio Zabbix wedi bod wrthi'n datblygu Webhooks ac integreiddiadau y tu allan i'r bocs sy'n dod gyda dosbarthiad Zabbix.

Rydym yn datrys problemau ymarferol yn Zabbix gan ddefnyddio JavaScript
Dolen i dogfennaeth

Rhagbrosesu

  • Roedd dyfodiad rhagbrosesu yn JavaScript yn ei gwneud hi'n bosibl rhoi'r gorau i'r mwyafrif o sgriptiau allanol, ac ar hyn o bryd yn Zabbix gallwch gael unrhyw werth a'i drosi i werth hollol wahanol.
  • Mae rhagbrosesu yn Zabbix yn cael ei weithredu gan god JavaScript, sydd, o'i lunio i god beit, yn cael ei drawsnewid yn swyddogaeth sy'n cymryd gwerth sengl fel paramedr gwerth fel llinyn (gall llinyn gynnwys digid a rhif).
  • Gan fod yr allbwn yn ffwythiant, mae angen ar ddiwedd y sgript dychwelyd.
  • Mae'n bosibl defnyddio macros wedi'u teilwra yn y cod.
  • Gall adnoddau fod yn gyfyngedig nid yn unig ar lefel y system weithredu, ond hefyd yn rhaglennol. Rhoddir uchafswm o 10 megabeit o RAM i'r cam rhagbrosesu a therfyn amser rhedeg o 10 eiliad.

Rydym yn datrys problemau ymarferol yn Zabbix gan ddefnyddio JavaScript

SYLWCH. Mae gwerth terfyn amser o 10 eiliad yn eithaf llawer, oherwydd gall casglu miloedd amodol o eitemau data mewn 1 eiliad yn ôl senario rhagbrosesu braidd yn “drwm” arafu Zabbix. Felly, ni argymhellir defnyddio rhagbrosesu i weithredu sgriptiau JavaScript llawn trwy'r elfennau data cysgodol fel y'u gelwir (eitemau ffug), sy'n cael eu rhedeg yn unig i berfformio rhagbrosesu.

Gallwch wirio'ch cod trwy'r prawf rhagbrosesu neu ddefnyddio'r cyfleustodau 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`

Tasgau ymarferol

Gorchwyl 1

Disodli'r eitem a gyfrifwyd gyda rhagbrosesu.

Cyflwr: Cael y tymheredd yn Fahrenheit o'r synhwyrydd i storio yn Celsius.

Yn flaenorol, byddem yn creu eitem sy'n casglu'r tymheredd mewn graddau Fahrenheit. Ar ôl hynny, eitem ddata arall (wedi'i gyfrifo) a fyddai'n trosi Fahrenheit i Celsius gan ddefnyddio fformiwla.

Problemau:

  • Mae angen dyblygu elfennau data a storio'r holl werthoedd yn y gronfa ddata.
  • Mae'n rhaid i chi gytuno ar y cyfnodau ar gyfer yr eitem ddata "rhiant" sy'n cael ei gyfrifo a'i defnyddio yn y fformiwla, ac ar gyfer yr eitem ddata a gyfrifwyd. Fel arall, gall yr eitem gyfrifiadurol fynd i gyflwr heb ei gynnal neu gyfrifo gwerth blaenorol, a fydd yn effeithio ar ddibynadwyedd y canlyniadau monitro.

Un ateb oedd symud i ffwrdd o gyfnodau gwirio hyblyg o blaid cyfnodau sefydlog i sicrhau bod yr eitem a gyfrifwyd yn cael ei gwerthuso ar ôl yr eitem sy'n derbyn y data (yn ein hachos ni, y tymheredd mewn graddau Fahrenheit).

Ond os, er enghraifft, rydym yn defnyddio'r templed i wirio nifer fawr o ddyfeisiau, a bod y gwiriad yn cael ei berfformio unwaith bob 30 eiliad, mae Zabbix yn "hacio" am 29 eiliad, ac ar yr eiliad olaf mae'n dechrau gwirio a chyfrifo. Mae hyn yn creu ciw ac yn effeithio ar berfformiad. Felly, argymhellir defnyddio cyfnodau sefydlog dim ond os yw'n wirioneddol angenrheidiol.

Yn y broblem hon, yr ateb gorau posibl yw rhagbrosesu JavaScript un llinell sy'n trosi graddau Fahrenheit i raddau Celsius:

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

Mae'n gyflym ac yn hawdd, nid oes angen i chi greu eitemau data diangen a chadw hanes arnynt, a gallwch hefyd ddefnyddio cyfnodau hyblyg ar gyfer gwiriadau.

Rydym yn datrys problemau ymarferol yn Zabbix gan ddefnyddio JavaScript

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

Ond, os mewn sefyllfa ddamcaniaethol mae angen ychwanegu'r elfen data a dderbyniwyd, er enghraifft, gydag unrhyw gysonyn a ddiffinnir yn y macro, rhaid ystyried bod y paramedr gwerth yn ehangu i linyn. Mewn gweithrediad adio llinyn, mae dau linyn yn cael eu cyfuno'n un.

Rydym yn datrys problemau ymarferol yn Zabbix gan ddefnyddio JavaScript

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

I gael canlyniad gweithrediad mathemategol, mae angen trosi'r mathau o'r gwerthoedd a gafwyd i fformat rhifol. Ar gyfer hyn gallwch ddefnyddio'r swyddogaeth parseInt(), sy'n cynhyrchu cyfanrif, swyddogaeth parseFloat(), sy'n cynhyrchu degol, neu ffwythiant nifer, sy'n dychwelyd cyfanrif neu ddegol.

Tasg 2

Sicrhewch yr amser mewn eiliadau tan ddiwedd y dystysgrif.

Cyflwr: mae gwasanaeth yn cyhoeddi dyddiad dod i ben tystysgrif yn y fformat "Chwe 12 12:33:56 2022 GMT".

Yn ECMAScript5 dyddiad.parse() yn derbyn dyddiad mewn fformat ISO 8601 (BBBB-MM-DDTHH:mm:ss.sssZ). Mae angen bwrw llinyn iddo yn y fformat MMM DD BBBB HH:mm:ss ZZ

problem: Mynegir y gwerth mis fel testun, nid fel rhif. Nid yw Duktape yn derbyn data yn y fformat hwn.

Enghraifft o ddatrysiad:

  • Yn gyntaf oll, mae newidyn yn cael ei ddatgan sy'n cymryd gwerth (mae'r sgript gyfan yn ddatganiad o newidynnau sy'n cael eu rhestru wedi'u gwahanu gan atalnodau).

  • Yn y llinell gyntaf rydym yn cael y dyddiad yn y paramedr gwerth a'i wahanu â bylchau gan ddefnyddio'r dull rhannu. Felly, rydym yn cael arae, lle mae pob elfen o'r arae, gan ddechrau ar fynegai 0, yn cyfateb i un elfen dyddiad cyn ac ar ôl gofod. hollti(0) - mis, hollti(1) - rhif, hollti(2) - llinyn gydag amser, ac ati. Wedi hynny, gellir cyrchu pob elfen o'r dyddiad trwy fynegai yn yr arae.

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

  • Mae pob mis (mewn trefn gronolegol) yn cyfateb i'r mynegai o'i safle yn yr arae (o 0 i 11). I drosi gwerth testun yn werth rhifol, ychwanegir un at y mynegai mis (oherwydd bod misoedd wedi'u rhifo gan ddechrau ar 1). Yn yr achos hwn, cymerir y mynegiant gydag ychwanegu un mewn cromfachau, oherwydd fel arall bydd llinyn yn cael ei sicrhau, nid rhif. Ar y diwedd rydym yn gwneud tafell () - torrwch yr arae o'r diwedd i adael dau nod yn unig (sy'n bwysig am fisoedd gyda rhif dau ddigid).

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

  • Rydym yn ffurfio llinyn mewn fformat ISO o'r gwerthoedd a gafwyd trwy ychwanegu llinynnau arferol yn y drefn briodol.

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

Y data yn y fformat canlyniadol yw nifer yr eiliadau o 1970 i ryw adeg yn y dyfodol. Mae bron yn amhosibl defnyddio data yn y fformat a dderbyniwyd mewn sbardunau, oherwydd mae Zabbix yn caniatáu ichi weithredu gyda macros yn unig {Dyddiad} и {Amser}, sy'n dychwelyd y dyddiad a'r amser mewn fformat hawdd ei ddefnyddio.

  • Yna gallwn gael y dyddiad cyfredol yn JavaScript mewn fformat Unix Timestamp a'i dynnu o ddyddiad dod i ben y dystysgrif sy'n deillio o hynny i gael nifer y milieiliadau o nawr hyd nes y daw'r dystysgrif i ben.

`now = Date.now();`

  • Rydyn ni'n rhannu'r gwerth a dderbyniwyd â mil i gael eiliadau yn Zabbix.

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

Yn y sbardun, gallwch chi nodi'r ymadrodd 'diwethaf' ac yna set o ddigidau sy'n cyfateb i nifer yr eiliadau yn y cyfnod yr ydych am ymateb iddo, er enghraifft, mewn wythnosau. Felly, bydd y sbardun yn hysbysu bod y dystysgrif yn dod i ben mewn wythnos.

SYLWCH. Rhowch sylw i'r defnydd parseInt() mewn swyddogaeth dychwelydi drosi'r rhif ffracsiynol sy'n deillio o rannu milieiliadau i gyfanrif. Gallwch hefyd ddefnyddio parseFloat() a storio data ffracsiynol.

Gwylio'r adroddiad

Ffynhonnell: hab.com

Ychwanegu sylw