Biz JavaScript istifadə edərək Zabbix-də praktiki problemləri həll edirik

Biz JavaScript istifadə edərək Zabbix-də praktiki problemləri həll edirik
Tixon Uskov, Zabbix inteqrasiya komandası mühəndisi

Zabbix istənilən növ məlumatı izləmək üçün istifadə olunan fərdiləşdirilə bilən platformadır. Zabbix-in ilk versiyalarından bəri monitorinq idarəçiləri müxtəlif skriptləri işlətmək imkanına malikdirlər. Actions hədəf şəbəkə qovşaqlarının yoxlanılması üçün. Eyni zamanda, skriptlərin işə salınması bir sıra çətinliklərə səbəb oldu, o cümlədən skriptlərin dəstəklənməsi, onların rabitə qovşaqlarına və proksilərə çatdırılması, həmçinin müxtəlif versiyaların dəstəklənməsi.

Zabbix üçün JavaScript

2019-cu ilin aprel ayında Zabbix 4.2 JavaScript-in əvvəlcədən işlənməsi ilə təqdim edildi. Bir çox insanlar məlumatları haradansa götürən, onu həzm edən və Zabbix-in başa düşdüyü formatda təmin edən və Zabbix tərəfindən saxlanmağa və emal etməyə hazır olmayan məlumatları qəbul edəcək sadə yoxlamalar aparan skriptlərdən imtina etmək fikrindən həyəcanlandı və sonra Zabbix və JavaScript alətlərindən istifadə edərək bu məlumat axınını emal edin. Zabbix 3.4-də ortaya çıxan aşağı səviyyəli kəşf və asılı maddələrlə birlikdə, alınan məlumatların çeşidlənməsi və idarə edilməsi üçün kifayət qədər çevik bir konsepsiya əldə etdik.

Zabbix 4.4-də, JavaScript-də əvvəlcədən emalın məntiqi davamı olaraq, Zabbix bildirişlərini üçüncü tərəf proqramları ilə asanlıqla inteqrasiya etmək üçün istifadə edilə bilən yeni bildiriş metodu - Webhook meydana çıxdı.

JavaScript və Duktapes

Nə üçün JavaScript və Duktape seçildi? Dillər və mühərriklər üçün müxtəlif variantlar nəzərdən keçirildi:

  • Lua - Lua 5.1
  • Lua - LuaJIT
  • Javascript - Duktape
  • Javascript - JerryScript
  • Daxili Python
  • Daxili Perl

Əsas seçim meyarları üstünlük, mühərrikin məhsula inteqrasiyasının asanlığı, aşağı resurs istehlakı və mühərrikin ümumi performansı və monitorinqə bu dildə kodun daxil edilməsinin təhlükəsizliyi idi. Göstəricilərin birləşməsinə əsasən, JavaScript Duktape mühərrikində qalib gəldi.

Biz JavaScript istifadə edərək Zabbix-də praktiki problemləri həll edirik

Seçim meyarları və performans testi

Duktape xüsusiyyətləri:

- Standart ECMAScript E5/E5.1
— Duktape üçün Zabbix modulları:

  • Zabbix.log() - müxtəlif səviyyəli təfərrüatlı mesajları birbaşa Zabbix Server jurnalına yazmağa imkan verir ki, bu da səhvləri, məsələn, Webhook-da server vəziyyəti ilə əlaqələndirməyə imkan verir.
  • CurlHttpRequest() - Webhook istifadəsinin əsaslandığı şəbəkəyə HTTP sorğuları etməyə imkan verir.
  • atob() və btoa() - Base64 formatında sətirləri kodlaşdırmağa və deşifrə etməyə imkan verir.

Qeyd. Duktape ACME standartlarına uyğundur. Zabbix skriptin 2015-ci il versiyasından istifadə edir. Sonrakı dəyişikliklər cüzidir, buna görə də onlara məhəl qoyula bilməz..

JavaScript sehri

JavaScript-in bütün sehri dinamik tipləmə və tip tökmədə yatır: sətir, rəqəmli və mantiq.

Bu o deməkdir ki, dəyişənin hansı tipə dəyər qaytarmalı olduğunu əvvəlcədən bəyan etmək lazım deyil.

Riyazi əməliyyatlarda funksiya operatorları tərəfindən qaytarılan dəyərlər ədədlərə çevrilir. Bu cür əməliyyatların istisnası əlavədir, çünki şərtlərdən ən azı biri sətirdirsə, bütün şərtlərə sətir çevrilməsi tətbiq edilir.

Qeyd. Bu cür çevrilmələrə cavabdeh olan üsullar adətən obyektin ana prototiplərində həyata keçirilir, dəyər и toString. dəyər ədədi çevirmə zamanı və həmişə metoddan əvvəl çağırılır toString. Metod dəyər primitiv dəyərləri qaytarmalıdır, əks halda onun nəticəsi nəzərə alınmır.

Obyektdə metod çağırılır dəyəriOF. Əgər tapılmazsa və ya primitiv qiymət qaytarmırsa, metod çağırılır toString. Əgər üsul toString tapılmadı, axtarılır dəyər obyektin prototipində və dəyərin işlənməsi tamamlanana və ifadədəki bütün dəyərlər eyni tipə köçürülənə qədər hər şey təkrarlanır.. Obyekt metodu həyata keçirirsə toString, ibtidai dəyəri qaytarır, sonra simli çevrilmə üçün istifadə olunur. Bununla belə, bu metodun tətbiqinin nəticəsi mütləq simli deyil.

Məsələn, əgər obyekt üçün 'obj' metodu müəyyən edilmişdir toString,

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

Metod toString tam olaraq bir sətir qaytarır və nömrə ilə bir sətir əlavə edərkən, yapışdırılmış bir sətir alırıq:

`obj + 1 // '2001'` 

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

Ancaq yenidən yazsanız toString, belə ki, metod ədədi qaytarsın, obyekt əlavə edildikdə, ədədi çevrilmə ilə riyazi əməliyyat yerinə yetiriləcək və riyazi toplamanın nəticəsi alınacaq.

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

`obj + 1 // '2001'`

Bu halda sətirlə toplama yerinə yetirsək, sətir çevrilməsi həyata keçirilir və yapışdırılmış sim alırıq.

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

Bu, təcrübəsiz JavaScript istifadəçilərinin çoxlu sayda səhvlərinin səbəbidir.

Metod toString obyektin cari dəyərini 1 artıracaq funksiya yaza bilərsiniz.

Biz JavaScript istifadə edərək Zabbix-də praktiki problemləri həll edirik
Dəyişən 3-ə bərabər, onun da 4-ə bərabər olması şərti ilə skriptin icrası.

Tökmə (==) ilə müqayisə edildikdə, metod hər dəfə yerinə yetirilir toString dəyər artımı funksiyası ilə. Müvafiq olaraq, hər bir sonrakı müqayisə ilə dəyər artır. Qeyri-cast müqayisədən (===) istifadə etməklə bunun qarşısını almaq olar.

Biz JavaScript istifadə edərək Zabbix-də praktiki problemləri həll edirik
Tip tökmə olmadan müqayisə

Qeyd. Ehtiyac olmadan Cast Müqayisəsindən istifadə etməyin.

Mürəkkəb məntiqə malik Webhooks kimi mürəkkəb skriptlər üçün, növ tökmə ilə müqayisə tələb olunur, dəyişənləri qaytaran və uyğunsuzluqları və səhvləri idarə edən dəyərlər üçün yoxlamaları əvvəlcədən yazmaq tövsiyə olunur.

Webhook Media

2019-cu ilin sonu və 2020-ci ilin əvvəlində Zabbix inteqrasiya komandası Zabbix paylanması ilə gələn Webhooks və qutudan kənar inteqrasiyaları fəal şəkildə inkişaf etdirir.

Biz JavaScript istifadə edərək Zabbix-də praktiki problemləri həll edirik
Bağlantı sənədlər

Əvvəlcədən işləmə

  • JavaScript-də əvvəlcədən emalın yaranması əksər xarici skriptlərdən imtina etməyə imkan verdi və hazırda Zabbix-də siz istənilən dəyəri əldə edə və onu tamamilə fərqli bir dəyərə çevirə bilərsiniz.
  • Zabbix-də əvvəlcədən işləmə JavaScript kodu ilə həyata keçirilir, bayt koduna tərtib edildikdə, parametr kimi tək bir dəyər qəbul edən funksiyaya çevrilir. dəyər sətir kimi (sətirdə həm rəqəm, həm də rəqəm ola bilər).
  • Çıxış bir funksiya olduğundan, skriptin sonunda tələb olunur qayıtmaq.
  • Kodda xüsusi makrolardan istifadə etmək mümkündür.
  • Resurslar yalnız əməliyyat sistemi səviyyəsində deyil, həm də proqram baxımından məhdudlaşdırıla bilər. Əvvəlcədən işləmə mərhələsinə maksimum 10 meqabayt RAM və 10 saniyəlik işləmə müddəti ayrılır.

Biz JavaScript istifadə edərək Zabbix-də praktiki problemləri həll edirik

Qeyd. 10 saniyəlik fasilə dəyəri olduqca böyükdür, çünki kifayət qədər “ağır” əvvəlcədən emal ssenarisinə uyğun olaraq 1 saniyə ərzində minlərlə şərti məlumat elementinin toplanması Zabbix-i ləngidə bilər. Buna görə də, tam hüquqlu JavaScript skriptlərini yerinə yetirmək üçün əvvəlcədən emaldan istifadə etmək tövsiyə edilmir, onlar kölgə məlumat elementləri (dummy elementlər) adlanır və yalnız əvvəlcədən emal etmək üçün işə salınır..

Kodunuzu əvvəlcədən emal testi və ya yardım proqramından istifadə edərək yoxlaya bilərsiniz 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`

Praktik tapşırıqlar

Tapşırıq 1

Hesablanmış elementi əvvəlcədən emal ilə əvəz edin.

Vəziyyət: Selsi üzrə saxlamaq üçün sensordan temperaturu Fahrenheit ilə alın.

Əvvəllər biz temperaturu Fahrenheit dərəcələrində toplayan bir element yaradırdıq. Bundan sonra, bir düsturdan istifadə edərək Fahrenheit-i Selsiyə çevirəcək başqa bir məlumat elementi (hesablanmış).

Problemləri:

  • Məlumat elementlərini dublikat etmək və bütün dəyərləri verilənlər bazasında saxlamaq lazımdır.
  • Düsturda hesablanan və istifadə olunan "ana" məlumat elementi və hesablanmış məlumat elementi üçün intervallarla razılaşmalısınız. Əks halda, hesablanmış element dəstəklənməyən vəziyyətə keçə və ya əvvəlki dəyəri hesablaya bilər ki, bu da monitorinq nəticələrinin etibarlılığına təsir göstərəcək.

Çözümlərdən biri, hesablanan elementin məlumatları qəbul edən maddədən sonra qiymətləndirilməsini təmin etmək üçün çevik yoxlama intervallarından sabit intervalların xeyrinə uzaqlaşmaq idi (bizim vəziyyətimizdə, Farenheit dərəcəsində olan temperatur).

Amma, məsələn, çoxlu sayda cihazı yoxlamaq üçün şablondan istifadə ediriksə və yoxlama hər 30 saniyədə bir həyata keçirilirsə, Zabbix 29 saniyə ərzində "hack" edir və son saniyədə yoxlamaya və hesablamağa başlayır. Bu növbə yaradır və performansa təsir edir. Buna görə də, yalnız həqiqətən zəruri olduqda sabit intervallardan istifadə etmək tövsiyə olunur.

Bu problemdə optimal həll Fahrenheit dərəcələrini Selsi dərəcələrinə çevirən bir sətirli JavaScript-in əvvəlcədən işlənməsidir:

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

Bu, sürətli və asandır, sizə lazımsız məlumat elementləri yaratmağa və onlarda tarixçə saxlamağa ehtiyac yoxdur, həmçinin yoxlamalar üçün çevik intervallardan istifadə edə bilərsiniz.

Biz JavaScript istifadə edərək Zabbix-də praktiki problemləri həll edirik

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

Lakin, hipotetik vəziyyətdə alınan məlumat elementini, məsələn, makroda müəyyən edilmiş hər hansı bir sabitlə əlavə etmək lazımdırsa, nəzərə alınmalıdır ki, parametr dəyər sətir şəklində genişlənir. Simli əlavə əməliyyatında iki sətir sadəcə olaraq birləşir.

Biz JavaScript istifadə edərək Zabbix-də praktiki problemləri həll edirik

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

Riyazi əməliyyatın nəticəsini əldə etmək üçün alınan dəyərlərin növlərini ədədi formata çevirmək lazımdır. Bunun üçün funksiyadan istifadə edə bilərsiniz parseInt(), tam ədədi, funksiyanı əmələ gətirir parseFloat(), ondalık və ya bir funksiya yaradan nömrətam və ya onluq qaytaran .

Tapşırıq 2

Sertifikatın sonuna qədər vaxtı saniyələrlə əldə edin.

Vəziyyət: xidmət "12 fevral 12:33:56 2022 GMT" formatında sertifikatın bitmə tarixi verir.

ECMAScript5-də date.parse() ISO 8601 formatında tarixi qəbul edir (YYYY-AA-GGTH:mm:ss.sssZ). Ona AMM GG YYYY HH:mm:ss ZZ formatında sətir atmaq lazımdır.

problem: Ayın dəyəri rəqəm kimi deyil, mətn kimi ifadə edilir. Bu formatdakı məlumatlar Duktape tərəfindən qəbul edilmir.

Həll nümunəsi:

  • Hər şeydən əvvəl, dəyər qəbul edən dəyişən elan edilir (bütün skript vergüllə ayrılmış dəyişənlərin elanıdır).

  • Birinci sətirdə parametrdə tarixi alırıq dəyər və metoddan istifadə edərək boşluqlarla ayırın parçalanması. Beləliklə, biz bir massiv alırıq, burada 0 indeksindən başlayaraq massivin hər bir elementi boşluqdan əvvəl və sonra bir tarix elementinə uyğun gəlir. bölün (0) - ay, bölün (1) - nömrə, bölün (2) - vaxtı olan sətir və s. Bundan sonra tarixin hər bir elementinə massivdə indekslə daxil olmaq olar.

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

  • Hər ay (xronoloji ardıcıllıqla) massivdəki mövqeyinin indeksinə uyğun gəlir (0-dan 11-ə qədər). Mətn dəyərini ədədi dəyərə çevirmək üçün ay indeksinə bir əlavə edilir (çünki aylar 1-dən başlayaraq nömrələnir). Bu zaman bir əlavəsi ilə ifadə mötərizədə alınır, çünki əks halda rəqəm deyil, sətir alınacaq. Sonda edirik dilim() - yalnız iki simvol buraxmaq üçün massivi sonundan kəsin (bu, iki rəqəmli nömrə ilə aylar üçün vacibdir).

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

  • Alınan dəyərlərdən müvafiq qaydada sətirlərin adi əlavə edilməsi ilə ISO formatında bir sətir düzəldirik.

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

Nəticə formatındakı məlumatlar 1970-ci ildən gələcək bir nöqtəyə qədər olan saniyələrin sayıdır. Alınan formatda məlumatları triggerlərdə istifadə etmək demək olar ki, mümkün deyil, çünki Zabbix yalnız makrolarla işləməyə imkan verir. {Tarix} и {Vaxt}, istifadəçi dostu formatda tarix və vaxtı qaytaran.

  • Daha sonra Unix Timestamp formatında JavaScript-də cari tarixi əldə edə və sertifikatın müddəti bitənə qədər millisaniyələrin sayını əldə etmək üçün nəticədə əldə edilən sertifikatın bitmə tarixindən çıxa bilərik.

`now = Date.now();`

  • Zabbix-də saniyə əldə etmək üçün alınan dəyəri minə bölürük.

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

Tətikdə ' ifadəsini təyin edə bilərsinizsonuncu' ardınca cavab vermək istədiyiniz müddətdə saniyələrin sayına uyğun gələn rəqəmlər dəsti gəlir, məsələn, həftələrlə. Beləliklə, trigger sertifikatın müddəti bir həftə sonra başa çatması barədə məlumat verəcəkdir.

Qeyd. İstifadəsinə diqqət yetirin parseInt() funksiyasında qayıtmaqmillisaniyələrin bölünməsi nəticəsində yaranan kəsr ədədini tam ədədə çevirmək üçün. Siz də istifadə edə bilərsiniz parseFloat() və fraksiya məlumatları saxlayır.

Hesabata baxın

Mənbə: www.habr.com

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