Մենք գործնական խնդիրներ ենք լուծում Zabbix-ում՝ օգտագործելով JavaScript

Մենք գործնական խնդիրներ ենք լուծում Zabbix-ում՝ օգտագործելով JavaScript
Տիխոն Ուսկով, Zabbix ինտեգրացիոն թիմի ինժեներ

Zabbix-ը հարմարեցված հարթակ է, որն օգտագործվում է ցանկացած տեսակի տվյալների վերահսկման համար: Zabbix-ի ամենավաղ տարբերակներից ի վեր, մոնիտորինգի ադմինիստրատորները հնարավորություն են ունեցել գործարկել տարբեր սցենարներ միջոցով Գործողություններ թիրախային ցանցի հանգույցների ստուգումների համար: Միևնույն ժամանակ, սկրիպտների գործարկումը հանգեցրեց մի շարք դժվարությունների, այդ թվում՝ սկրիպտներին աջակցելու անհրաժեշտությունը, դրանց առաքումը կապի հանգույցներին և պրոքսիներին, ինչպես նաև տարբեր տարբերակների աջակցություն:

JavaScript Zabbix-ի համար

2019 թվականի ապրիլին Zabbix 4.2-ը ներկայացվեց JavaScript-ի նախնական մշակմամբ: Շատերը ոգևորվեցին այն գաղափարից, որ հրաժարվեն գրել սկրիպտներից, որոնք ինչ-որ տեղ տանում, մարսում և տրամադրում են Zabbix-ին հասկանալի ձևաչափով և կատարել պարզ ստուգումներ, որոնք կստանան տվյալներ, որոնք պատրաստ չեն Zabbix-ի կողմից պահպանման և մշակման համար, և այնուհետև մշակեք այս տվյալների հոսքը՝ օգտագործելով Zabbix և JavaScript գործիքները: Զաբբիքս 3.4-ում հայտնված ցածր մակարդակի հայտնաբերման և կախյալ տարրերի հետ համատեղ մենք ստացանք ստացված տվյալների տեսակավորման և կառավարման բավականին ճկուն հայեցակարգ:

Zabbix 4.4-ում, որպես JavaScript-ում նախնական մշակման տրամաբանական շարունակություն, հայտնվել է ծանուցման նոր մեթոդ՝ Webhook, որը կարելի է օգտագործել Zabbix-ի ծանուցումները երրորդ կողմի հավելվածների հետ հեշտությամբ ինտեգրելու համար։

JavaScript և Duktapes

Ինչու՞ ընտրվեցին JavaScript-ը և Duktape-ը: Դիտարկվել են լեզուների և շարժիչների տարբեր տարբերակներ.

  • Լուա - Լուա 5.1
  • Լուա – ԼուաՋԻԹ
  • Javascript - Duktape
  • Javascript - JerryScript
  • Ներկառուցված Python
  • Ներկառուցված Perl

Ընտրության հիմնական չափանիշներն էին տարածվածությունը, շարժիչի արտադրանքի մեջ ինտեգրվելու հեշտությունը, ռեսուրսների ցածր սպառումը և շարժիչի ընդհանուր կատարումը, ինչպես նաև այս լեզվով ծածկագիրը մոնիտորինգի մեջ ներմուծելու անվտանգությունը: Ցուցանիշների համակցության հիման վրա JavaScript-ը շահեց Duktape շարժիչով:

Մենք գործնական խնդիրներ ենք լուծում Zabbix-ում՝ օգտագործելով JavaScript

Ընտրության չափանիշներ և կատարողականի փորձարկում

Duktape-ի առանձնահատկությունները.

- Ստանդարտ ECMAScript E5/E5.1
— Zabbix մոդուլներ Duktape-ի համար.

  • Zabbix.log() - թույլ է տալիս գրել տարբեր մակարդակներով հաղորդագրություններ ուղղակիորեն Zabbix Server մատյանում, ինչը հնարավորություն է տալիս փոխկապակցել սխալները, օրինակ, Webhook-ում, սերվերի վիճակի հետ:
  • CurlHttpRequest() - թույլ է տալիս կատարել HTTP հարցումներ ցանցին, որի վրա հիմնված է Webhook-ի օգտագործումը:
  • atob() և btoa() - թույլ է տալիս կոդավորել և վերծանել տողերը Base64 ձևաչափով:

Նշում. Duktape-ը համապատասխանում է ACME ստանդարտներին: Zabbix-ն օգտագործում է սցենարի 2015թ. Հետագա փոփոխությունները չնչին են, ուստի դրանք կարելի է անտեսել:.

JavaScript Magic

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-ով:

Մենք գործնական խնդիրներ ենք լուծում Zabbix-ում՝ օգտագործելով JavaScript
Սցենարի կատարումը՝ պայմանով, որ փոփոխականը հավասար է 3-ի, և այն նույնպես հավասար է 4-ի։

Կաղապարի (==) հետ համեմատելիս մեթոդն իրականացվում է ամեն անգամ toString արժեքի բարձրացման ֆունկցիայով։ Համապատասխանաբար, յուրաքանչյուր հաջորդ համեմատության դեպքում արժեքը մեծանում է: Սրանից կարելի է խուսափել՝ օգտագործելով ոչ նկարահանված համեմատությունը (===):

Մենք գործնական խնդիրներ ենք լուծում Zabbix-ում՝ օգտագործելով JavaScript
Համեմատություն առանց տեսակի ձուլման

Նշում. Մի օգտագործեք դերասանների համեմատությունը անհարկի.

Բարդ սկրիպտների համար, ինչպիսիք են բարդ տրամաբանությամբ Webhooks-ը, որոնք պահանջում են համեմատություն տիպի casting-ի հետ, խորհուրդ է տրվում նախապես գրել այն արժեքների ստուգումները, որոնք վերադարձնում են փոփոխականները և կարգավորում անհամապատասխանություններն ու սխալները:

Webhook Media

2019-ի վերջին և 2020-ի սկզբին Zabbix-ի ինտեգրման թիմը ակտիվորեն զարգացնում է Webhooks-ը և զարդանախշերի ինտեգրումները, որոնք գալիս են Zabbix բաշխման հետ:

Մենք գործնական խնդիրներ ենք լուծում Zabbix-ում՝ օգտագործելով JavaScript
Հղում դեպի փաստաթղթեր

Նախամշակումը

  • JavaScript-ում նախնական մշակման հայտնվելը հնարավորություն տվեց հրաժարվել արտաքին սկրիպտներից, և ներկայումս Zabbix-ում կարող եք ստանալ ցանկացած արժեք և այն փոխարկել բոլորովին այլ արժեքի:
  • Zabbix-ում նախնական մշակումն իրականացվում է JavaScript կոդով, որը, երբ կոմպիլացվում է բայթկոդի մեջ, վերածվում է ֆունկցիայի, որն ընդունում է մեկ արժեք որպես պարամետր: արժեք որպես տող (տողը կարող է պարունակել և՛ թվանշան, և՛ թիվ)։
  • Քանի որ ելքը ֆունկցիա է, սկրիպտի վերջում պահանջվում է վերադարձնել.
  • Կոդում հնարավոր է օգտագործել մաքսային մակրոներ։
  • Ռեսուրսները կարող են սահմանափակվել ոչ միայն օպերացիոն համակարգի մակարդակով, այլև ծրագրային առումով: Նախամշակման փուլին հատկացվում է առավելագույնը 10 մեգաբայթ օպերատիվ հիշողություն և 10 վայրկյան գործարկման ժամկետ:

Մենք գործնական խնդիրներ ենք լուծում Zabbix-ում՝ օգտագործելով JavaScript

Նշում. 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

Փոխարինեք հաշվարկված տարրը նախնական մշակմամբ:

ՎիճակըՍտացեք ջերմաստիճանը Fahrenheit-ով սենսորից՝ Ցելսիուսով պահելու համար:

Նախկինում մենք կստեղծեինք մի նյութ, որը հավաքում է ջերմաստիճանը Ֆարենհեյթի աստիճաններով: Դրանից հետո մեկ այլ տվյալների տարր (հաշվարկված), որը բանաձևի միջոցով փոխակերպում է Ֆարենհեյթը Ցելսիուսի:

Problems:

  • Անհրաժեշտ է կրկնօրինակել տվյալների տարրերը և պահպանել բոլոր արժեքները տվյալների բազայում:
  • Դուք պետք է համաձայնեցնեք «ծնող» տվյալների տարրի ընդմիջումները, որոնք հաշվարկվում և օգտագործվում են բանաձևում, և հաշվարկված տվյալների կետի համար: Հակառակ դեպքում, հաշվարկված նյութը կարող է անցնել չաջակցվող վիճակի կամ հաշվարկել նախորդ արժեքը, ինչը կազդի մոնիտորինգի արդյունքների հուսալիության վրա:

Լուծումներից մեկը ճկուն ստուգման միջակայքներից հեռանալն էր՝ հօգուտ ֆիքսված ինտերվալների՝ ապահովելու համար, որ հաշվարկված նյութը գնահատվում է տվյալներ ստացող նյութից հետո (մեր դեպքում՝ ջերմաստիճանը Fahrenheit-ով):

Բայց եթե, օրինակ, շաբլոնով ստուգում ենք մեծ թվով սարքեր, իսկ ստուգումը կատարվում է 30 վայրկյանը մեկ, Zabbix-ը «կոտրում է» 29 վայրկյան, իսկ վերջին վայրկյանին սկսում է ստուգել ու հաշվարկել։ Սա ստեղծում է հերթ և ազդում աշխատանքի վրա: Ուստի խորհուրդ է տրվում օգտագործել ֆիքսված ընդմիջումներ միայն այն դեպքում, եթե դա իսկապես անհրաժեշտ է:

Այս խնդրի դեպքում օպտիմալ լուծումը մեկ տողով JavaScript-ի նախնական մշակումն է, որը փոխակերպում է Ֆարենհեյթի աստիճանները Ցելսիուսի աստիճանների.

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

Դա արագ և հեշտ է, ձեզ հարկավոր չէ ավելորդ տվյալների տարրեր ստեղծել և դրանց վրա պատմություն պահել, ինչպես նաև ստուգումների համար կարող եք օգտագործել ճկուն միջակայքեր:

Մենք գործնական խնդիրներ ենք լուծում Zabbix-ում՝ օգտագործելով JavaScript

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

Բայց, եթե հիպոթետիկ իրավիճակում անհրաժեշտ է ավելացնել ստացված տվյալների տարրը, օրինակ, մակրոյում սահմանված որևէ հաստատունով, ապա պետք է հաշվի առնել, որ պարամետրը. արժեք ընդարձակվում է լարային: Լարի ավելացման գործողության մեջ երկու տող ուղղակի միավորվում են մեկի մեջ:

Մենք գործնական խնդիրներ ենք լուծում Zabbix-ում՝ օգտագործելով JavaScript

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

Մաթեմատիկական գործողության արդյունք ստանալու համար անհրաժեշտ է ստացված արժեքների տեսակները վերածել թվային ձևաչափի: Դրա համար կարող եք օգտագործել գործառույթը parseInt(), որը արտադրում է ամբողջ թիվ, ֆունկցիա parseFloat (), որն արտադրում է տասնորդական կամ ֆունկցիա թիվ, որը վերադարձնում է ամբողջ կամ տասնորդական:

2 խնդիր

Ստացեք ժամանակը վայրկյաններով մինչև վկայագրի ավարտը:

ՎիճակըԾառայությունը թողարկում է վկայագրի գործողության ժամկետը «Փետրվարի 12 12:33:56 2022 GMT» ձևաչափով:

ECMAScript5-ում date.parse() ընդունում է ամսաթիվ ISO 8601 ձևաչափով (ՏՏՏՏ-ԱՄ-ՕՏՏՏՀ:մմ:սս.սսսԶ): Դրա վրա անհրաժեշտ է շղթա ուղարկել MMM DD YYYY HH:mm:ss 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 () և պահել կոտորակային տվյալներ.

Դիտեք ռեպորտաժը

Source: www.habr.com

Добавить комментарий