РСшаСм практичСскиС Π·Π°Π΄Π°Ρ‡ΠΈ Π² Zabbix с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ JavaScript

РСшаСм практичСскиС Π·Π°Π΄Π°Ρ‡ΠΈ Π² Zabbix с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ JavaScript
Π’ΠΈΡ…ΠΎΠ½ Усков, ΠΈΠ½ΠΆΠ΅Π½Π΅Ρ€ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ ΠΈΠ½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΠΈ Zabbix

Zabbix β€” кастомизируСмая ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ°, которая ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³Π° Π»ΡŽΠ±Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ…. Π‘ самых Ρ€Π°Π½Π½ΠΈΡ… вСрсий Zabbix Ρƒ администраторов ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³Π° Π±Ρ‹Π»Π° Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ скрипты Ρ‡Π΅Ρ€Π΅Π· Actions для ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΎΠΊ Π½Π° Ρ†Π΅Π»Π΅Π²Ρ‹Ρ… ΡƒΠ·Π»Π°Ρ… сСти. ΠŸΡ€ΠΈ этом запуск скриптов ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΠ» ΠΊ возникновСнию ряда слоТностСй, Π² Ρ‚ΠΎΠΌ числС Ρ‚Π°ΠΊΠΈΡ…, ΠΊΠ°ΠΊ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΡΡ‚ΡŒ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΈ скриптов, ΠΈΡ… доставки Π½Π° ΡƒΠ·Π»Ρ‹ связи ΠΈ прокси, Π° Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΈ Ρ€Π°Π·Π½Ρ‹Ρ… вСрсий.

JavaScript для Zabbix

Π’ Π°ΠΏΡ€Π΅Π»Π΅ 2019 Π³ΠΎΠ΄Π° Π±Ρ‹Π» прСдставлСн Zabbix 4.2 с Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ ΠΏΡ€Π΅Π΄ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Π½Π° JavaScript. МногиС Π·Π°Π³ΠΎΡ€Π΅Π»ΠΈΡΡŒ ΠΈΠ΄Π΅Π΅ΠΉ ΠΎΡ‚ΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ ΠΎΡ‚ написания скриптов, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π³Π΄Π΅-Ρ‚ΠΎ Π·Π°Π±ΠΈΡ€Π°ΡŽΡ‚ Π΄Π°Π½Π½Ρ‹Π΅, ΠΏΠ΅Ρ€Π΅Π²Π°Ρ€ΠΈΠ²Π°ΡŽΡ‚ ΠΈΡ… ΠΈ ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‚ ΡƒΠΆΠ΅ Π² понятном для Zabbix Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅, Π° Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ простыС ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±ΡƒΠ΄ΡƒΡ‚ ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ΡŒ Π½Π΅Π³ΠΎΡ‚ΠΎΠ²Ρ‹Π΅ для хранСния ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Zabbix Π΄Π°Π½Π½Ρ‹Π΅, Π° ΠΏΠΎΡ‚ΠΎΠΌ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ этот ΠΏΠΎΡ‚ΠΎΠΊ Π΄Π°Π½Π½Ρ‹Ρ… с использованиСм срСдств Zabbix ΠΈ JavaScript. Π’ связкС с Π½ΠΈΠ·ΠΊΠΎΡƒΡ€ΠΎΠ²Π½Π΅Π²Ρ‹ΠΌ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠ΅Π½ΠΈΠ΅ΠΌ ΠΈ зависимыми элСмСнтами Π΄Π°Π½Π½Ρ‹Ρ…, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ появились Π² Zabbix 3.4, ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΎΡΡŒ достаточно гибкая концСпция для сортировки ΠΈ управлСния ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹ΠΌΠΈ Π΄Π°Π½Π½Ρ‹ΠΌΠΈ.

Π’ Zabbix 4.4, ΠΊΠ°ΠΊ логичСскоС ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ΅Π½ΠΈΠ΅ ΠΏΡ€Π΅Π΄ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Π½Π° JavaScript, появился Π½ΠΎΠ²Ρ‹ΠΉ способ оповСщСния β€” Webhook, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ для простой ΠΈΠ½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΠΈ ΠΎΠΏΠΎΠ²Π΅Ρ‰Π΅Π½ΠΈΠΉ Zabbix со сторонними прилоТСниями.

JavaScript ΠΈ Duktape

ΠŸΠΎΡ‡Π΅ΠΌΡƒ Π±Ρ‹Π»ΠΈ Π²Ρ‹Π±Ρ€Π°Π½Ρ‹ ΠΈΠΌΠ΅Π½Π½ΠΎ JavaScript ΠΈ Duktape? Π Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Π»ΠΈΡΡŒ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Ρ‹ языков ΠΈ Π΄Π²ΠΈΠΆΠΊΠΎΠ²:

  • Lua – Lua 5.1
  • Lua – LuaJIT
  • Javascript – Duktape
  • Javascript – JerryScript
  • Embedded Python
  • Embedded Perl

ΠžΡΠ½ΠΎΠ²Π½Ρ‹ΠΌΠΈ критСриями Π²Ρ‹Π±ΠΎΡ€Π° Π±Ρ‹Π»ΠΈ Ρ€Π°ΡΠΏΡ€ΠΎΡΡ‚Ρ€Π°Π½Π΅Π½Π½ΠΎΡΡ‚ΡŒ, простота ΠΈΠ½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΠΈ Π΄Π²ΠΈΠΆΠΊΠ° Π² ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚, Π½ΠΈΠ·ΠΊΠΎΠ΅ ΠΏΠΎΡ‚Ρ€Π΅Π±Π»Π΅Π½ΠΈΠ΅ рСсурсов ΠΈ общая ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ Π΄Π²ΠΈΠΆΠΊΠ°, ΠΈ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡ‚ΡŒ внСдрСния ΠΊΠΎΠ΄Π° Π½Π° этом языкС Π² ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³. По совокупности ΠΏΠΎΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ ΠΏΠΎΠ±Π΅Π΄ΠΈΠ» JavaScript Π½Π° Π΄Π²ΠΈΠΆΠΊΠ΅ Duktape.

РСшаСм практичСскиС Π·Π°Π΄Π°Ρ‡ΠΈ Π² Zabbix с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ JavaScript

ΠšΡ€ΠΈΡ‚Π΅Ρ€ΠΈΠΈ Π²Ρ‹Π±ΠΎΡ€Π° ΠΈ performance testing

ΠžΡΠΎΠ±Π΅Π½Π½ΠΎΡΡ‚ΠΈ Duktape:

β€” Π‘Ρ‚Π°Π½Π΄Π°Ρ€Ρ‚ ECMAScript E5/E5.1
β€” ΠœΠΎΠ΄ΡƒΠ»ΠΈ Zabbix для Duktape:

  • Zabbix.log() β€” позволяСт Π²ΠΏΠΈΡΠ°Ρ‚ΡŒ нСпосрСдствСнно Π² Π»ΠΎΠ³ Zabbix Server сообщСния с Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹ΠΌ ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ Π΄Π΅Ρ‚Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ, Ρ‡Ρ‚ΠΎ обСспСчиваСт Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΡΠΎΠΏΠΎΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ ошибки, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π² Webhook с состояниСм сСрвСра.
  • CurlHttpRequest() β€” позволяСт Π΄Π΅Π»Π°Ρ‚ΡŒ HTTP-запросы Π² ΡΠ΅Ρ‚ΡŒ, Π½Π° Ρ‡Π΅ΠΌ основано ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Webhook.
  • atob() ΠΈ btoa() β€” позволяСт ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΈ Π΄Π΅ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ строки Π² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ Base64.

ΠŸΠ Π˜ΠœΠ•Π§ΠΠΠ˜Π•. Duktape соотвСтствуСт стандартам ACME. Π’ Zabbix ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ вСрсия скрипта 2015 Π³ΠΎΠ΄Π°. ΠŸΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ измСнСния Π½Π΅Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹, поэтому ΠΈΡ… ΠΌΠΎΠΆΠ½ΠΎ ΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ.

Магия JavaScript

Вся магия JavaScript Π·Π°ΠΊΠ»ΡŽΡ‡Π΅Π½Π° Π² динамичСской Ρ‚ΠΈΠΏΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΈ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ΠΈΠΈ Ρ‚ΠΈΠΏΠΎΠ²: строковых, числовых ΠΈ логичСских.

Π­Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ Π·Π°Ρ€Π°Π½Π΅Π΅ ΠΎΠ±ΡŠΡΠ²Π»ΡΡ‚ΡŒ ΠΊΠ°ΠΊΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ° пСрСмСнная Π΄ΠΎΠ»ΠΆΠ½Π° Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Ρ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅.

ΠŸΡ€ΠΈ матСматичСских опСрациях значСния, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‚ΡΡ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π°ΠΌΠΈ-функциями, ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΡŽΡ‚ΡΡ Π² числа. Π˜ΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΠΈΠ· Ρ‚Π°ΠΊΠΈΡ… ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ β€” слоТСниС, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ, Ссли хотя Π±Ρ‹ ΠΎΠ΄Π½ΠΎ ΠΈΠ· слагаСмых являСтся строкой, ΠΊΠΎ всСм слагаСмым примСняСтся строковоС ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅.

ΠŸΠ Π˜ΠœΠ•Π§ΠΠΠ˜Π•. ΠœΠ΅Ρ‚ΠΎΠ΄Ρ‹, ΠΎΡ‚Π²Π΅Ρ‡Π°ΡŽΡ‰ΠΈΠ΅ Π·Π° Ρ‚Π°ΠΊΠΈΠ΅ прСобразования, ΠΊΠ°ΠΊ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ, Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Ρ‹ Π² Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΈΡ… ΠΏΡ€ΠΎΡ‚ΠΎΡ‚ΠΈΠΏΠ°Ρ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ², valueOf ΠΈ toString. valueOf вызываСтся ΠΏΡ€ΠΈ числСнном ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠΈ ΠΈ всСгда ΠΏΠ΅Ρ€Π΅Π΄ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ toString. ΠœΠ΅Ρ‚ΠΎΠ΄ valueOf обязан Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Ρ‚ΡŒ ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²Π½Ρ‹Π΅ значСния, ΠΈΠ½Π°Ρ‡Π΅ Π΅Π³ΠΎ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ игнорируСтся.

Для ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° вызываСтся ΠΌΠ΅Ρ‚ΠΎΠ΄ valueOF. Если ΠΎΠ½ Π½Π΅ Π½Π°ΠΉΠ΄Π΅Π½ ΠΈΠ»ΠΈ Π½Π΅ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²Π½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, вызываСтся ΠΌΠ΅Ρ‚ΠΎΠ΄ toString. Если ΠΌΠ΅Ρ‚ΠΎΠ΄ toString Π½Π΅ Π½Π°ΠΉΠ΄Π΅Π½, производится поиск valueOf Π² ΠΏΡ€ΠΎΡ‚ΠΎΡ‚ΠΈΠΏΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°, ΠΈ всС повторяСтся Π΄ΠΎ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ значСния ΠΈ привСдСния всСх Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ Π² Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΈ ΠΊ ΠΎΠ΄Π½ΠΎΠΌΡƒ Ρ‚ΠΈΠΏΡƒ. Если для ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½ ΠΌΠ΅Ρ‚ΠΎΠ΄ 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
Π‘Ρ€Π°Π²Π½Π΅Π½ΠΈΠ΅ Π±Π΅Π· привСдСния Ρ‚ΠΈΠΏΠΎΠ²

ΠŸΠ Π˜ΠœΠ•Π§ΠΠΠ˜Π•. НС ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ сравнСниС с ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ΠΌ Ρ‚ΠΈΠΏΠΎΠ² Π±Π΅Π· нСобходимости.

Для слоТных скриптов, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Webhook со слоТной Π»ΠΎΠ³ΠΈΠΊΠΎΠΉ, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ сравнСниС с ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ΠΌ Ρ‚ΠΈΠΏΠΎΠ², рСкомСндуСтся ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ для Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‚ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ нСсоотвСтствия ΠΈ ошибки.

Webhook Media

Π’ ΠΊΠΎΠ½Ρ†Π΅ 2019 Π³ΠΎΠ΄Π° ΠΈ Π² Π½Π°Ρ‡Π°Π»Π΅ 2020 Π³ΠΎΠ΄Π° ΠΊΠΎΠΌΠ°Π½Π΄Π° ΠΈΠ½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΠΈ Zabbix занималась Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎΠΉ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΎΠΉ Webhooks ΠΈ ΠΈΠ½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΠΉ Β«ΠΈΠ· ΠΊΠΎΡ€ΠΎΠ±ΠΊΠΈΒ», ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‚ΡΡ Π² дистрибутивС Zabbix.

РСшаСм практичСскиС Π·Π°Π΄Π°Ρ‡ΠΈ Π² Zabbix с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ JavaScript
Бсылка Π½Π° Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΡŽ

Preprocessing

  • ПоявлСниС ΠΏΡ€Π΅Π΄ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Π½Π° JavaScript ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΠ»ΠΎ ΠΎΡ‚ΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ ΠΎΡ‚ Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π° Π²Π½Π΅ΡˆΠ½ΠΈΡ… скриптов, ΠΈ Π² настоящСС врСмя Π² Zabbix ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ любоС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΈ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Ρ‚ΡŒ Π΅Π³ΠΎ Π² ΡΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½Π½ΠΎ Π΄Ρ€ΡƒΠ³ΠΎΠ΅ любоС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅.
  • ΠŸΡ€Π΅Π΄ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Π² Zabbix Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π° ΠΊΠΎΠ΄ΠΎΠΌ Π½Π° JavaScript, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΡ€ΠΈ компиляции Π² Π±Π°ΠΉΡ‚-ΠΊΠΎΠ΄ прСобразуСтся Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°ΡŽΡ‰ΡƒΡŽ СдинствСнноС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π² Π²ΠΈΠ΄Π΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° value Π² Π²ΠΈΠ΄Π΅ строки (Π² строкС ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΈ Ρ†ΠΈΡ„Ρ€Π°, ΠΈ число).
  • ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π½Π° Π²Ρ‹Ρ…ΠΎΠ΄Π΅ получаСтся функция, Π² ΠΊΠΎΠ½Ρ†Π΅ скрипта обязатСлСн return.
  • Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ использованиС ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΡ… макросов Π² ΠΊΠΎΠ΄Π΅.
  • РСсурсы ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΡ‚ΡŒ Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π½Π° ΡƒΡ€ΠΎΠ²Π½Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΉ систСмы, Π½ΠΎ ΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎ. Для шага ΠΏΡ€Π΅Π΄ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ выдСляСтся максимум 10 ΠΌΠ΅Π³Π°Π±Π°ΠΉΡ‚ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΈΠ²Π½ΠΎΠΉ памяти ΠΈ Π»ΠΈΠΌΠΈΡ‚ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ выполнСния Π² 10 сСкунд.

РСшаСм практичСскиС Π·Π°Π΄Π°Ρ‡ΠΈ Π² Zabbix с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ JavaScript

ΠŸΠ Π˜ΠœΠ•Π§ΠΠΠ˜Π•. ЗначСния Ρ‚Π°ΠΉΠΌ-Π°ΡƒΡ‚Π° Π² 10 сСкунд достаточно ΠΌΠ½ΠΎΠ³ΠΎ, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ сбор условных тысяч элСмСнтов Π΄Π°Π½Π½Ρ‹Ρ… Π·Π° 1 сСкунду ΠΏΠΎ достаточно «тяТСлому» ΡΡ†Π΅Π½Π°Ρ€ΠΈΡŽ ΠΏΡ€Π΅Π΄ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΌΠΎΠΆΠ΅Ρ‚ Π·Π°ΠΌΠ΅Π΄Π»ΠΈΡ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Ρƒ Zabbix. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ Π½Π΅ рСкомСндуСтся ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€Π΅Π΄ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ для выполнСния ΠΏΠΎΠ»Π½ΠΎΡ†Π΅Π½Π½Ρ‹Ρ… скриптов Π½Π° JavaScript Ρ‡Π΅Ρ€Π΅Π· Ρ‚Π°ΠΊ Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΡ‹Π΅ Ρ‚Π΅Π½Π΅Π²Ρ‹Π΅ элСмСнты Π΄Π°Π½Π½Ρ‹Ρ… (dummy items), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π·Π°ΠΏΡƒΡΠΊΠ°ΡŽΡ‚ΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для выполнСния ΠΏΡ€Π΅Π΄ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ.

ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ свой ΠΊΠΎΠ΄ ΠΌΠΎΠΆΠ½ΠΎ Ρ‡Π΅Ρ€Π΅Π· тСст ΠΏΡ€Π΅Π΄ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΈΠ»ΠΈ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Ρ‹ 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 сСкунд, 29 сСкунд Zabbix Β«Ρ…Π°Π»Ρ‚ΡƒΡ€ΠΈΡ‚Β», Π° Π² послСднюю сСкунду Π½Π°Ρ‡ΠΈΠ½Π°Π΅Ρ‚ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ ΠΈ вычислСния. Π­Ρ‚ΠΎ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ созданию ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ ΠΈ влияСт Π½Π° ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ рСкомСндуСтся ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ фиксированныС ΠΈΠ½Ρ‚Π΅Ρ€Π²Π°Π»Ρ‹, Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ссли это Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ.

Π’ Π΄Π°Π½Π½ΠΎΠΉ Π·Π°Π΄Π°Ρ‡Π΅ ΠΎΠΏΡ‚ΠΈΠΌΠ°Π»ΡŒΠ½ΠΎΠ΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ β€” ΠΏΡ€Π΅Π΄ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° ΠΈΠ· ΠΎΠ΄Π½ΠΎΠΉ строки Π½Π° JavaScript, которая ΠΊΠΎΠ½Π²Π΅Ρ€Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚ градусы ΠΏΠΎ Π€Π°Ρ€Π΅Π½Π³Π΅ΠΉΡ‚Ρƒ Π² градусы ΠΏΠΎ ЦСльсию:

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

Π­Ρ‚ΠΎ быстро ΠΈ просто, Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ Π»ΠΈΡˆΠ½ΠΈΡ… элСмСнтов Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒ ΠΏΠΎ Π½ΠΈΠΌ ΠΈΡΡ‚ΠΎΡ€ΠΈΡŽ, Π° Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ для ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΎΠΊ Π³ΠΈΠ±ΠΊΠΈΠ΅ ΠΈΠ½Ρ‚Π΅Ρ€Π²Π°Π»Ρ‹.

РСшаСм практичСскиС Π·Π°Π΄Π°Ρ‡ΠΈ Π² Zabbix с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ JavaScript

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

Но, Ссли Π² гипотСтичСской ситуации Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹ΠΉ элСмСнт Π΄Π°Π½Π½Ρ‹Ρ… ΡΠ»ΠΎΠΆΠΈΡ‚ΡŒ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, с ΠΊΠ°ΠΊΠΎΠΉ-Π»ΠΈΠ±ΠΎ константой, ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠΉ Π² макросС, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡƒΡ‡ΠΈΡ‚Ρ‹Π²Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ value раскрываСтся Π² строку. ΠŸΡ€ΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ слоТСния строк, Π΄Π²Π΅ строки просто ΠΎΠ±ΡŠΠ΅Π΄ΠΈΠ½ΡΡŽΡ‚ΡΡ Π² ΠΎΠ΄Π½Ρƒ.

РСшаСм практичСскиС Π·Π°Π΄Π°Ρ‡ΠΈ Π² Zabbix с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ JavaScript

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

Для получСния Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π° матСматичСского дСйствия, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ привСсти Ρ‚ΠΈΠΏΡ‹ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹Ρ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ Π² числовой Ρ„ΠΎΡ€ΠΌΠ°Ρ‚. Для этого ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ parseInt(), которая Π²Ρ‹Π΄Π°Π΅Ρ‚ Ρ†Π΅Π»ΠΎΠ΅ число, Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ parseFloat(), которая Π²Ρ‹Π΄Π°Π΅Ρ‚ Π΄Π΅ΡΡΡ‚ΠΈΡ‡Π½ΡƒΡŽ Π΄Ρ€ΠΎΠ±ΡŒ, ΠΈΠ»ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ number, которая Π²Ρ‹Π΄Π°Π΅Ρ‚ Ρ†Π΅Π»ΠΎΠ΅ число ΠΈΠ»ΠΈ Π΄Π΅ΡΡΡ‚ΠΈΡ‡Π½ΡƒΡŽ Π΄Ρ€ΠΎΠ±ΡŒ.

Π—Π°Π΄Π°Ρ‡Π° 2

ΠŸΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ врСмя Π² сСкундах Π΄ΠΎ окончания сСртификата.

УсловиС: Π½Π΅ΠΊΠΈΠΉ сСрвис Π²Ρ‹Π΄Π°Π΅Ρ‚ Π΄Π°Ρ‚Ρƒ окончания сСртификата Π² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅ "Feb 12 12:33:56 2022 GMT".

Π’ ECMAScript5 Date.parse() ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Π΄Π°Ρ‚Ρƒ Π² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅ ISO 8601 (YYYY-MM-DDTHH:mm:ss.sssZ). НСобходимо привСсти ΠΊ Π½Π΅ΠΌΡƒ строку Π² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅ MMM DD YYYY HH:mm:ss ZZ

ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΠ°: Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ мСсяца Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΎ тСкстом, Π° Π½Π΅ числом. Π”Π°Π½Π½Ρ‹Π΅ Π² Ρ‚Π°ΠΊΠΎΠΌ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅ Π½Π΅ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°ΡŽΡ‚ΡΡ Duktape.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ:

  • Π’ ΠΏΠ΅Ρ€Π²ΡƒΡŽ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ ΠΎΠ±ΡŠΡΠ²Π»ΡΠ΅Ρ‚ΡΡ пСрСмСнная, которая ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ (вСсь скрипт β€” объявлСниС ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ пСрСчислСны Ρ‡Π΅Ρ€Π΅Π· Π·Π°ΠΏΡΡ‚ΡƒΡŽ).

  • Π’ ΠΏΠ΅Ρ€Π²ΠΎΠΉ строкС ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ Π΄Π°Ρ‚Ρƒ Π² ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π΅ value ΠΈ раздСляСм Π΅Π΅ ΠΏΡ€ΠΎΠ±Π΅Π»Π°ΠΌΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ split. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ массив, Π³Π΄Π΅ ΠΊΠ°ΠΆΠ΄ΠΎΠΌΡƒ элСмСнту массива, начиная с индСкса 0, соотвСтствуСт ΠΎΠ΄ΠΈΠ½ элСмСнт Π΄Π°Ρ‚Ρ‹ Π΄ΠΎ ΠΈ послС ΠΏΡ€ΠΎΠ±Π΅Π»Π°. split(0) β€” мСсяц, split(1) β€” число, split(2) β€” строка с Π²Ρ€Π΅ΠΌΠ΅Π½Π΅ΠΌ ΠΈ Ρ‚. Π΄. ПослС этого ΠΊ ΠΊΠ°ΠΆΠ΄ΠΎΠΌΡƒ элСмСнту Π΄Π°Ρ‚Ρ‹ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠ±Ρ€Π°Ρ‰Π°Ρ‚ΡŒΡΡ ΠΏΠΎ индСксу Π² массивС.

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

  • ΠšΠ°ΠΆΠ΄ΠΎΠΌΡƒ мСсяцу (Π² хронологичСском порядкС) соотвСтствуСт индСкс Π΅Π³ΠΎ полоТСния Π² массивС (с 0 Π΄ΠΎ 11). Π§Ρ‚ΠΎΠ±Ρ‹ ΡΠΊΠΎΠ½Π²Π΅Ρ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ тСкстовоС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π² числовоС, ΠΊ индСксу мСсяца прибавляСтся Π΅Π΄ΠΈΠ½ΠΈΡ†Π° (ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ нумСрация мСсяцСв начинаСтся с 1). ΠŸΡ€ΠΈ этом Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ с ΠΏΡ€ΠΈΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ΠΌ Π΅Π΄ΠΈΠ½ΠΈΡ†Ρ‹ взято Π² скобки, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Π² ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π° строка, Π° Π½Π΅ число. Π’ ΠΊΠΎΠ½Ρ†Π΅ ΠΌΡ‹ выполняСм slice() β€” срСз массива с ΠΊΠΎΠ½Ρ†Π°, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π΄Π²Π° символа (Ρ‡Ρ‚ΠΎ Π²Π°ΠΆΠ½ΠΎ для мСсяцСв с Π΄Π²ΡƒΠ·Π½Π°Ρ‡Π½Ρ‹ΠΌ Π½ΠΎΠΌΠ΅Ρ€ΠΎΠΌ).

`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 позволяСт ΠΎΠΏΠ΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ макросами {Date} ΠΈ {Time}, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‚ Π΄Π°Ρ‚Ρƒ ΠΈ врСмя Π² понятном для ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅.

  • ПослС этого ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Π² JavaScript Ρ‚Π΅ΠΊΡƒΡ‰ΡƒΡŽ Π΄Π°Ρ‚Ρƒ Π² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅ Unix Timestamp ΠΈ Π²Ρ‹Ρ‡Π΅ΡΡ‚ΡŒ Π΅Π΅ ΠΈΠ· ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½ΠΎΠ³ΠΎ значСния Π΄Π°Ρ‚Ρ‹ окончания сСртификата, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ количСство миллисСкунд с Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ ΠΌΠΎΠΌΠ΅Π½Ρ‚Π° Π΄ΠΎ ΠΌΠΎΠΌΠ΅Π½Ρ‚Π° окончания сСртификата.

`now = Date.now();`

  • Π”Π΅Π»ΠΈΠΌ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π½Π° тысячу, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ сСкунды Π² Zabbix.

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

Π’ Ρ‚Ρ€ΠΈΠ³Π³Π΅Ρ€Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ ‘last<‘ ΠΈ Π½Π°Π±ΠΎΡ€ Ρ†ΠΈΡ„Ρ€, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ соотвСтствуСт количСству сСкунд Π² ΠΏΠ΅Ρ€ΠΈΠΎΠ΄Π΅, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΎΡ‚Ρ€Π΅Π°Π³ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π² нСдСлях. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Ρ‚Ρ€ΠΈΠ³Π³Π΅Ρ€ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠΏΠΎΠ²Π΅Ρ‰Π°Ρ‚ΡŒ ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ срок дСйствия сСртификата заканчиваСтся Ρ‡Π΅Ρ€Π΅Π· нСдСлю.

ΠŸΠ Π˜ΠœΠ•Π§ΠΠΠ˜Π•. ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° использованиС parseInt() Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ return, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠΊΠΎΠ½Π²Π΅Ρ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π΄Ρ€ΠΎΠ±Π½ΠΎΠ΅ число, ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½ΠΎΠ΅ Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ дСлСния миллисСкунд, Π² Ρ†Π΅Π»ΠΎΠ΅ число. Π’Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ parseFloat() ΠΈ Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒ Π΄Ρ€ΠΎΠ±Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅.

Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Π΄ΠΎΠΊΠ»Π°Π΄

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: habr.com

Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ