ጃቫስክሪፕት በመጠቀም በዛቢክስ ውስጥ ተግባራዊ ችግሮችን እንፈታለን።

ጃቫስክሪፕት በመጠቀም በዛቢክስ ውስጥ ተግባራዊ ችግሮችን እንፈታለን።
ቲኮን ኡስኮቭ, Zabbix ውህደት ቡድን መሐንዲስ

Zabbix ማንኛውንም አይነት ውሂብ ለመከታተል የሚያገለግል ሊበጅ የሚችል መድረክ ነው። ከመጀመሪያዎቹ የዛቢክስ ስሪቶች ጀምሮ፣ የክትትል አስተዳዳሪዎች የተለያዩ ስክሪፕቶችን የማሄድ ችሎታ ነበራቸው እርምጃዎች በዒላማው የአውታረ መረብ አንጓዎች ላይ ቼኮች. በተመሳሳይ ጊዜ የስክሪፕት መጀመሩ በርካታ ችግሮችን አስከትሏል፤ ከእነዚህም መካከል ስክሪፕቶችን የመደገፍ አስፈላጊነት፣ ወደ መገናኛ ኖዶች እና ፕሮክሲዎች ማድረስ እንዲሁም ለተለያዩ ስሪቶች ድጋፍ።

ጃቫ ስክሪፕት ለዛቢክስ

በኤፕሪል 2019፣ Zabbix 4.2 ከጃቫ ስክሪፕት ቅድመ ሂደት ጋር አስተዋወቀ። ብዙ ሰዎች መረጃን ወደ አንድ ቦታ የሚወስዱትን ስክሪፕቶች በመተው ፣ በመፍጨት እና ዛቢክስ በሚረዳው ቅርጸት ያቅርቡ እና በዛቢክስ ለማከማቸት እና ለመስራት ዝግጁ ያልሆነ መረጃ የሚቀበሉ ቀላል ቼኮችን በመተው ሀሳብ ተደስተዋል። ከዚያ የዛቢክስ እና ጃቫስክሪፕት መሳሪያዎችን በመጠቀም ይህንን የውሂብ ዥረት ያስኬዱ። በዛቢክስ 3.4 ላይ ከታዩት ዝቅተኛ ደረጃ ግኝቶች እና ጥገኞች እቃዎች ጋር በማጣመር የተቀበለውን ውሂብ ለመደርደር እና ለማስተዳደር በጣም ተለዋዋጭ ጽንሰ-ሀሳብ አግኝተናል።

በ Zabbix 4.4, በጃቫስክሪፕት ውስጥ ቅድመ-ሂደት እንደ ምክንያታዊ ቀጣይነት, አዲስ የማሳወቂያ ዘዴ ታየ - Webhook, የ Zabbix ማሳወቂያዎችን ከሶስተኛ ወገን መተግበሪያዎች ጋር በቀላሉ ለማዋሃድ ሊያገለግል ይችላል.

ጃቫስክሪፕት እና ዱክታፕስ

ጃቫ ስክሪፕት እና ዱክታፔ ለምን ተመረጡ? ለቋንቋዎች እና ሞተሮች የተለያዩ አማራጮች ተወስደዋል-

  • Lua - Lua 5.1
  • Lua - LuaJIT
  • ጃቫስክሪፕት - ዱክታፔ
  • ጃቫስክሪፕት - ጄሪ ስክሪፕት
  • የተከተተ Python
  • የተከተተ ፐርል

ዋናዎቹ የመምረጫ መመዘኛዎች መስፋፋት፣ ኤንጂን ከምርቱ ጋር የመዋሃድ ቀላልነት፣ አነስተኛ የሀብት ፍጆታ እና የሞተሩ አጠቃላይ አፈፃፀም እና በዚህ ቋንቋ ኮድን ወደ ክትትል የማስተዋወቅ ደህንነት። በጠቋሚዎች ጥምር ላይ በመመስረት ጃቫ ስክሪፕት በዱክታፕ ሞተር ላይ አሸንፏል።

ጃቫስክሪፕት በመጠቀም በዛቢክስ ውስጥ ተግባራዊ ችግሮችን እንፈታለን።

የምርጫ መስፈርቶች እና የአፈፃፀም ሙከራዎች

የዱክታፔ ባህሪዎች

- መደበኛ ECMAScript E5/E5.1
- የዛቢክስ ሞጁሎች ለዱክታፔ፡

  • Zabbix.log () - የተለያዩ የዝርዝሮች ደረጃዎችን በቀጥታ ወደ ዛቢክስ አገልጋይ ሎግ እንዲጽፉ ይፈቅድልዎታል ፣ ይህም ስህተቶችን ለማዛመድ ያስችላል ፣ ለምሳሌ በዌብ መንጠቆ ውስጥ ከአገልጋይ ሁኔታ ጋር።
  • CurlHttpጥያቄ() - የዌብሆክ አጠቃቀም የተመሰረተበት ወደ አውታረ መረቡ የኤችቲቲፒ ጥያቄዎችን እንዲያደርጉ ይፈቅድልዎታል።
  • atob() እና btoa() - ሕብረቁምፊዎችን በBase64 ቅርጸት እንዲመሰክሩ እና እንዲፈቱ ያስችልዎታል።

ማስታወሻ. ዱክታፔ የACME መስፈርቶችን ያሟላል። ዛቢቢክስ የ2015 የስክሪፕቱን ስሪት ይጠቀማል። ቀጣይ ለውጦች ትንሽ ናቸው, ስለዚህ ችላ ሊባሉ ይችላሉ..

ጃቫስክሪፕት አስማት

ሁሉም የጃቫ ስክሪፕት አስማት በተለዋዋጭ መተየብ እና በመተየብ ላይ ነው፡ ሕብረቁምፊ፣ ቁጥር እና ቡሊያን።

ይህ ማለት ተለዋዋጭ ምን ዓይነት እሴት መመለስ እንዳለበት አስቀድሞ ማወጅ አስፈላጊ አይደለም.

በሂሳብ ስራዎች ውስጥ በተግባራዊ ኦፕሬተሮች የተመለሱት ዋጋዎች ወደ ቁጥሮች ይቀየራሉ. ለእንደዚህ አይነት ስራዎች ልዩነቱ መደመር ነው፣ ምክንያቱም ከቃላቶቹ ቢያንስ አንዱ ሕብረቁምፊ ከሆነ የሕብረቁምፊ ልወጣ በሁሉም ውሎች ላይ ይተገበራል።

ማስታወሻ. ለእንደዚህ ዓይነቶቹ ለውጦች ተጠያቂ የሆኑት ዘዴዎች ብዙውን ጊዜ በእቃው የወላጅ ምሳሌዎች ውስጥ ይተገበራሉ ፣ ዋጋ и ቶሪንግ. ዋጋ በቁጥር ልወጣ ወቅት እና ሁልጊዜ ከስልቱ በፊት ተብሎ ይጠራል ቶሪንግ. ዘዴ ዋጋ የጥንት እሴቶችን መመለስ አለበት, አለበለዚያ ውጤቱ ችላ ይባላል.

አንድ ዘዴ በአንድ ነገር ላይ ይባላል ዋጋ. ካልተገኘ ወይም ጥንታዊ እሴት ካልተመለሰ, ዘዴው ይባላል ቶሪንግ. ዘዴው ከሆነ ቶሪንግ አልተገኘም, ፍለጋ ዋጋ በእቃው ምሳሌ ውስጥ ፣ እና የእሴቱ ሂደት እስኪጠናቀቅ ድረስ ሁሉም ነገር ይደገማል እና በገለፃው ውስጥ ያሉት ሁሉም እሴቶች ወደ ተመሳሳይ ዓይነት ይጣላሉ።. እቃው ዘዴን ተግባራዊ ካደረገ ቶሪንግ, እሱም ጥንታዊ እሴትን የሚመልስ, ከዚያም ለሕብረቁምፊ ልወጣ የሚያገለግል ነው. ነገር ግን, ይህንን ዘዴ የመተግበር ውጤት የግድ ሕብረቁምፊ አይደለም.

ለምሳሌ ለዕቃ ከሆነነገርዘዴው ይገለጻል። ቶሪንግ,

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

ዘዴ ቶሪንግ በትክክል አንድ ሕብረቁምፊ ይመልሳል፣ እና ሕብረቁምፊ ከቁጥር ጋር ስንጨምር፣ የተጣበቀ ሕብረቁምፊ እናገኛለን፡

`obj + 1 // '2001'` 

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

ግን እንደገና ከፃፉ ቶሪንግ, ስለዚህ ዘዴው ቁጥርን ይመልሳል, እቃው ሲጨመር, የቁጥር ቅየራ ያለው የሂሳብ ስራ ይከናወናል እና የሒሳብ መጨመር ውጤቱም ይገኛል.

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

`obj + 1 // '2001'`

በዚህ ሁኔታ, በሕብረቁምፊ መደመርን ከሠራን, የሕብረቁምፊ መለዋወጥ ይከናወናል, እና የተጣበቀ ሕብረቁምፊ እናገኛለን.

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

ይህ ጀማሪ ጃቫስክሪፕት ተጠቃሚዎች ብዙ ቁጥር ስህተቶች ምክንያት ነው.

ዘዴው ቶሪንግ የነገሩን ወቅታዊ ዋጋ በ1 የሚጨምር ተግባር መፃፍ ይችላሉ።

ጃቫስክሪፕት በመጠቀም በዛቢክስ ውስጥ ተግባራዊ ችግሮችን እንፈታለን።
የስክሪፕቱ አፈፃፀም፣ ተለዋዋጭው ከ 3 ጋር እኩል ከሆነ እና ከ 4 ጋር እኩል ነው።

ከካስት (==) ጋር ሲወዳደር ስልቱ በእያንዳንዱ ጊዜ ይከናወናል ቶሪንግ ከዋጋ መጨመር ተግባር ጋር. በዚህ መሠረት, በእያንዳንዱ ቀጣይ ንጽጽር, ዋጋው ይጨምራል. ይህ የ cast ያልሆነ ንፅፅርን በመጠቀም ማስቀረት ይቻላል (===)።

ጃቫስክሪፕት በመጠቀም በዛቢክስ ውስጥ ተግባራዊ ችግሮችን እንፈታለን።
ንጽጽር ያለ አይነት መውሰድ

ማስታወሻ. የCast ንጽጽርን ሳያስፈልግ አይጠቀሙ.

ከተወሳሰበ አመክንዮ ጋር እንደ Webhooks ላሉ ውስብስብ ስክሪፕቶች ከአይነት መውሰድ ጋር ማወዳደር ለሚፈልጉ ተለዋዋጮችን የሚመልሱ እና አለመጣጣሞችን እና ስህተቶችን የሚያስተናግዱ እሴቶችን አስቀድሞ መፃፍ ይመከራል።

Webhook ሚዲያ

በ2019 መገባደጃ እና በ2020 መጀመሪያ ላይ የዛቢክስ ውህደት ቡድን ከዛቢክስ ስርጭት ጋር የሚመጡትን Webhooks እና ከሳጥን ውጪ ውህደቶችን በንቃት እየሰራ ነው።

ጃቫስክሪፕት በመጠቀም በዛቢክስ ውስጥ ተግባራዊ ችግሮችን እንፈታለን።
አገናኝ ወደ ሰነዶች

ቅድመ-ሂደት

  • በጃቫስክሪፕት ውስጥ የቅድመ-ሂደት ሂደት መምጣት አብዛኛዎቹን ውጫዊ ስክሪፕቶች ለመተው አስችሏል ፣ እና በአሁኑ ጊዜ በዛቢክስ ውስጥ ማንኛውንም እሴት ማግኘት እና ወደ ፍጹም የተለየ እሴት መለወጥ ይችላሉ።
  • በዛቢክስ ውስጥ ቅድመ-ሂደት በጃቫ ስክሪፕት ኮድ ይተገበራል ፣ ወደ ባይትኮድ ሲጠናቀር አንድ ነጠላ እሴት እንደ መለኪያ ወደ ሚወስድ ተግባር ይቀየራል። ዋጋ እንደ ሕብረቁምፊ (ሕብረቁምፊ ሁለቱንም አሃዝ እና ቁጥር ሊይዝ ይችላል).
  • ውጤቱ ተግባር ስለሆነ በስክሪፕቱ መጨረሻ ላይ ያስፈልጋል መመለሾ.
  • በኮዱ ውስጥ ብጁ ማክሮዎችን መጠቀም ይቻላል.
  • ሀብቶች በስርዓተ ክወና ደረጃ ብቻ ሳይሆን በፕሮግራም ሊገደቡ ይችላሉ. የቅድመ-ሂደቱ ደረጃ ከፍተኛው 10 ሜጋባይት ራም እና የ10 ሰከንድ የሩጫ ጊዜ ተመድቧል።

ጃቫስክሪፕት በመጠቀም በዛቢክስ ውስጥ ተግባራዊ ችግሮችን እንፈታለን።

ማስታወሻ. የ10 ሰከንድ ጊዜ ማብቂያ ዋጋ በጣም ብዙ ነው፣ ምክንያቱም ሁኔታዊ በሺዎች የሚቆጠሩ የውሂብ ንጥሎችን በ1 ሰከንድ ውስጥ “ከባድ” በሆነ ቅድመ ሂደት ሁኔታ መሰብሰብ ዛቢክስን ሊያዘገየው ይችላል። ስለዚህ፣ ሙሉ የጃቫ ስክሪፕት ስክሪፕቶችን ለማስፈጸም ቅድመ-ሂደትን ለመጠቀም ጥላ ዳታ ኤለመንቶች በሚባሉት (ዱሚ ንጥሎች) በኩል እንዲሰራ አይመከርም።.

ኮድዎን በቅድመ-ሂደት ሙከራ ወይም መገልገያውን በመጠቀም ማረጋገጥ ይችላሉ። 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

የተሰላው ንጥል ነገር በቅድመ-ሂደት ይተኩ።

ሁኔታበሴልሺየስ ውስጥ ለማከማቸት የሙቀት መጠኑን በፋራናይት ከሴንሰሩ ያግኙ።

ከዚህ በፊት የሙቀት መጠኑን በዲግሪ ፋራናይት የሚሰበስብ ዕቃ እንፈጥራለን። ከዚያ በኋላ፣ ቀመር በመጠቀም ፋራናይትን ወደ ሴልሺየስ የሚቀይር ሌላ የውሂብ ንጥል (የተሰላ)።

ችግሮች:

  • የውሂብ ክፍሎችን ማባዛት እና ሁሉንም እሴቶች በመረጃ ቋቱ ውስጥ ማከማቸት አስፈላጊ ነው.
  • በቀመር ውስጥ የሚሰላው እና ጥቅም ላይ የሚውለው የ "ወላጅ" የውሂብ ንጥል እና ለተሰላው የውሂብ ንጥል ክፍተቶች ላይ መስማማት አለብዎት. ያለበለዚያ ፣ የተሰላው ንጥል ወደማይደገፍ ሁኔታ ሊሄድ ወይም የቀደመውን ዋጋ ማስላት ይችላል ፣ ይህም የክትትል ውጤቶችን አስተማማኝነት ይነካል ።

አንዱ መፍትሔ ከተለዋዋጭ የፍተሻ ክፍተቶች በመራቅ ቋሚ ክፍተቶችን በመደገፍ የተሰላው እቃ መረጃውን ከተቀበለው እቃ በኋላ መገምገሙን ለማረጋገጥ (በእኛ ሁኔታ የሙቀት መጠኑ በዲግሪ ፋራናይት)።

ነገር ግን ለምሳሌ ብዙ ቁጥር ያላቸውን መሳሪያዎች ለመፈተሽ አብነቱን ከተጠቀምን እና ቼኩ በየ 30 ሰከንድ አንድ ጊዜ ይከናወናል, Zabbix "hacks" ለ 29 ሰከንድ, እና በመጨረሻው ሰከንድ መፈተሽ እና ማስላት ይጀምራል. ይህ ወረፋ ይፈጥራል እና አፈፃፀሙን ይጎዳል። ስለዚህ, በትክክል አስፈላጊ ከሆነ ብቻ ቋሚ ክፍተቶችን መጠቀም ይመከራል.

በዚህ ችግር ውስጥ፣ ጥሩው መፍትሄ ዲግሪ ፋራናይትን ወደ ዲግሪ ሴልሺየስ የሚቀይር ባለአንድ መስመር ጃቫስክሪፕት ቅድመ ሂደት ነው።

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

ፈጣን እና ቀላል ነው፣ አላስፈላጊ የውሂብ ንጥሎችን መፍጠር እና በእነሱ ላይ ታሪክ ማስቀመጥ አያስፈልግዎትም፣ እና እንዲሁም ተለዋዋጭ ክፍተቶችን ለቼኮች መጠቀም ይችላሉ።

ጃቫስክሪፕት በመጠቀም በዛቢክስ ውስጥ ተግባራዊ ችግሮችን እንፈታለን።

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

ነገር ግን ፣ በግምታዊ ሁኔታ ውስጥ የተቀበለውን የውሂብ አካል ማከል አስፈላጊ ከሆነ ፣ ለምሳሌ ፣ በማክሮው ውስጥ ከተገለጸው ማንኛውም ቋሚ ጋር ፣ ግቤቱ ግምት ውስጥ መግባት አለበት። ዋጋ ወደ ገመድ ይሰፋል. በሕብረቁምፊ መደመር ክዋኔ፣ ሁለት ገመዶች በቀላሉ ወደ አንድ ይጣመራሉ።

ጃቫስክሪፕት በመጠቀም በዛቢክስ ውስጥ ተግባራዊ ችግሮችን እንፈታለን።

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

የሂሳብ ስራን ውጤት ለማግኘት የተገኙትን የእሴቶች ዓይነቶች ወደ የቁጥር ቅርጸት መለወጥ አስፈላጊ ነው. ለዚህም ተግባሩን መጠቀም ይችላሉ parseInt()ኢንቲጀር፣ ተግባር ያመነጫል። parseFloat(), እሱም አስርዮሽ ወይም ተግባርን ይፈጥራል ቁጥርኢንቲጀር ወይም አስርዮሽ የሚመልስ።

ተግባር 2

የምስክር ወረቀቱ መጨረሻ ድረስ በሰከንዶች ውስጥ ጊዜውን ያግኙ።

ሁኔታአንድ አገልግሎት በ"ፌብሩዋሪ 12 12፡33፡56 2022 ጂኤምቲ" ቅርጸት የምስክር ወረቀት የሚያበቃበትን ቀን ይሰጣል።

በECMAScript5 date.parse() ቀንን በ ISO 8601 ቅርጸት ይቀበላል (ዓዓዓ-ወወ-ዲዲኤችኤች፡ሚሜ፡ss.sssZ)። ሕብረቁምፊ ወደ እሱ በMMM DD ዓዓዓዓ ኤችኤች፡mm፡ss ZZ ቅርጸት መጣል አስፈላጊ ነው።

ችግር: የወሩ ዋጋ እንደ ቁጥር ሳይሆን እንደ ጽሑፍ ነው የሚገለጸው. በዚህ ቅርጸት ያለው ውሂብ በዱክታፔ ተቀባይነት የለውም።

የመፍትሄ ምሳሌ:

  • በመጀመሪያ ደረጃ አንድ እሴት የሚወስድ ተለዋዋጭ ይገለጻል (ሙሉው ስክሪፕት በነጠላ ሰረዝ የተዘረዘሩ የተለዋዋጮች መግለጫ ነው)።

  • በመጀመሪያው መሾመር ውስጥ ቀኑን በፓራሜትር ውስጥ እናገኛለን ዋጋ እና ዘዴውን በመጠቀም ከቦታዎች ጋር ይለያዩት ሰነጠቀ. ስለዚህ፣ እያንዳንዱ የድርድር አካል፣ ከጠቋሚ 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 በማክሮዎች ብቻ እንዲሠሩ ይፈቅድልዎታል። {ቀን} и {ጊዜ}ቀኑን እና ሰዓቱን ለተጠቃሚ ምቹ በሆነ ቅርጸት የሚመልስ።

  • ከዚያ የአሁኑን ቀን በጃቫ ስክሪፕት በዩኒክስ ታይምስ ማህተም ፎርማት ማግኘት እና ከተገኘው የምስክር ወረቀት ማብቂያ ቀን ቀንስ የምስክር ወረቀቱ እስኪያልቅ ድረስ የሚሊሰከንዶችን ቁጥር ለማግኘት እንችላለን።

`now = Date.now();`

  • በ Zabbix ውስጥ ሰከንዶች ለማግኘት የተቀበለውን ዋጋ በሺህ እናካፋለን።

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

ቀስቅሴ ውስጥ፣ የሚለውን አገላለጽ መግለጽ ትችላለህየመጨረሻምላሽ መስጠት በሚፈልጉት ጊዜ ውስጥ ከሰከንዶች ብዛት ጋር የሚዛመድ የአሃዞች ስብስብ ይከተላል፣ ለምሳሌ በሳምንታት ውስጥ። ስለዚህ ቀስቅሴው የምስክር ወረቀቱ በአንድ ሳምንት ውስጥ እንደሚያልቅ ያሳውቃል።

ማስታወሻ. ለአጠቃቀም ትኩረት ይስጡ parseInt() ተግባር ውስጥ መመለስከሚሊሰከንዶች ክፍፍል የሚመጣውን ክፍልፋይ ቁጥር ወደ ኢንቲጀር ለመቀየር። እንዲሁም መጠቀም ይችላሉ parseFloat() እና ክፍልፋይ ውሂብ ያከማቹ.

ዘገባውን ይመልከቱ

ምንጭ: hab.com

አስተያየት ያክሉ