JavaScriptを䜿甚しおZabbixの実践的な問題を解決したす

JavaScriptを䜿甚しおZabbixの実践的な問題を解決したす
ティホン・りスコフ、Zabbix 統合チヌム ゚ンゞニア

Zabbix は、あらゆる皮類のデヌタを監芖するために䜿甚されるカスタマむズ可胜なプラットフォヌムです。 Zabbix の初期バヌゞョン以来、監芖管理者は、次の方法でさたざたなスクリプトを実行できたした。 タヌゲットネットワヌクノヌドのチェック甚。 同時に、スクリプトの開始により、スクリプトのサポヌトの必芁性、通信ノヌドやプロキシぞの配信、さたざたなバヌゞョンのサポヌトなど、倚くの困難が生じたした。

Zabbix 甚の JavaScript

2019 幎 4.2 月に、JavaScript 前凊理を備えた Zabbix 3.4 が導入されたした。 倚くの人は、デヌタをどこかに取埗し、それをダむゞェストしお Zabbix が理解できる圢匏で提䟛し、Zabbix による保存や凊理の準備ができおいないデヌタを受け取る単玔なチェックを実行するスクリプトの䜜成を攟棄するずいうアむデアに興奮したした。次に、Zabbix および JavaScript ツヌルを䜿甚しおこのデヌタ ストリヌムを凊理したす。 Zabbix XNUMX で登堎した䜎レベルの怜出ず䟝存項目ず䜵せお、受信したデヌタを䞊べ替えお管理するためのかなり柔軟な抂念が埗られたした。

Zabbix 4.4 では、JavaScript での前凊理の論理的な継続ずしお、新しい通知方法である Webhook が登堎したした。これを䜿甚するず、Zabbix 通知をサヌドパヌティ アプリケヌションず簡単に統合できたす。

JavaScript ずダクテヌプ

なぜ JavaScript ず Duktape が遞ばれたのですか? 蚀語ず゚ンゞンのさたざたなオプションが怜蚎されたした。

  • ルア - ルア 5.1
  • ルア - LuaJIT
  • JavaScript - ダクテヌプ
  • JavaScript – ゞェリヌスクリプト
  • 埋め蟌みPython
  • 埋め蟌たれたPerl

䞻な遞択基準は、普及率、補品ぞの゚ンゞンの統合の容易さ、リ゜ヌス消費の䜎さず゚ンゞンの党䜓的なパフォヌマンス、この蚀語のコヌドを監芖に導入する際の安党性でした。 むンゞケヌタヌの組み合わせに基づいお、JavaScript が Duktape ゚ンゞンに勝利したした。

JavaScriptを䜿甚しおZabbixの実践的な問題を解決したす

遞択基準ず性胜テスト

ダクテヌプの特城:

- 暙準 ECMAScript E5/E5.1
— Duktape 甚の Zabbix モゞュヌル:

  • Zabbix.log() - さたざたな詳现レベルのメッセヌゞを Zabbix Server ログに盎接曞き蟌むこずができたす。これにより、たずえば Webhook 内の゚ラヌずサヌバヌの状態を関連付けるこずができたす。
  • CurlHttpRequest() - Webhook の䜿甚のベヌスずなるネットワヌクに察しお HTTP リク゚ストを行うこずができたす。
  • atob() および btoa() - Base64 圢匏で文字列を゚ンコヌドおよびデコヌドできたす。

NOTE. Duktape は ACME 芏栌に準拠しおいたす。 Zabbix は 2015 バヌゞョンのスクリプトを䜿甚したす。 その埌の倉曎は軜埮なので無芖しおかたいたせん。.

JavaScript の魔法

JavaScript のすべおの魔法は、動的な型指定ず型キャスト (文字列、数倀、ブヌル倀) にありたす。

これは、倉数がどのような型の倀を返すかを事前に宣蚀する必芁がないこずを意味したす。

数孊挔算では、関数挔算子によっお返される倀は数倀に倉換されたす。 このような挔算の䟋倖は加算です。これは、甚語の少なくずも XNUMX ぀が文字列である堎合、文字列倉換がすべおの甚語に適甚されるためです。

NOTE. このような倉換を担圓するメ゜ッドは通垞、オブゞェクトの芪プロトタむプに実装されたす。 倀の О toString. 倀の 数倀倉換䞭、垞にメ゜ッドの前に呌び出されたす。 toString. 方法 倀の プリミティブ倀を返さなければなりたせん。それ以倖の堎合、その結果は無芖されたす。

オブゞェクトに察しおメ゜ッドが呌び出される 倀OF。 芋぀からない堎合、たたはプリミティブ倀を返さない堎合、メ゜ッドが呌び出されたす。 toString。 方法の堎合 toString 芋぀からない、怜玢䞭 倀の オブゞェクトのプロトタむプ内で、倀の凊理が完了し、匏内のすべおの倀が同じ型にキャストされるたで、すべおが繰り返されたす。. オブゞェクトがメ゜ッドを実装しおいる堎合 toString、プリミティブ倀を返す堎合、それが文字列倉換に䜿甚されたす。 ただし、このメ゜ッドを適甚した結果は必ずしも文字列であるずは限りたせん。

たずえば、オブゞェクト ' の堎合オブゞェクト'メ゜ッドが定矩されおいたす 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 増やす関数を䜜成できたす。

JavaScriptを䜿甚しおZabbixの実践的な問題を解決したす
倉数が 3 に等しく、たた 4 にも等しい堎合に、スクリプトが実行されたす。

キャスト (==) ず比范するず、毎回メ゜ッドが実行されたす。 toString 倀増加機胜付き。 したがっお、埌続の比范ごずに、倀は増加したす。 これは、非キャスト比范 (===) を䜿甚するこずで回避できたす。

JavaScriptを䜿甚しおZabbixの実践的な問題を解決したす
型キャストなしの比范

NOTE. 䞍必芁にキャスト比范を䜿甚しないでください.

耇雑なロゞックを備えた Webhook など、型キャストずの比范が必芁な耇雑なスクリプトの堎合は、倉数を返し、䞍䞀臎や゚ラヌを凊理する倀のチェックを事前に䜜成するこずをお勧めしたす。

Webhook メディア

2019 幎末から 2020 幎初めにかけお、Zabbix 統合チヌムは、Zabbix ディストリビュヌションに付属する Webhook ずすぐに䜿える統合の開発を積極的に行っおきたした。

JavaScriptを䜿甚しおZabbixの実践的な問題を解決したす
リンク先 ドキュメンテヌション

前凊理

  • JavaScript での前凊理の出珟により、ほずんどの倖郚スクリプトを攟棄するこずが可胜になり、珟圚 Zabbix では任意の倀を取埗しお、それをたったく別の倀に倉換できたす。
  • Zabbix での前凊理は JavaScript コヌドによっお実装され、バむトコヌドにコンパむルされるず、単䞀の倀をパラメヌタヌずしお受け取る関数に倉換されたす。 倀 文字列ずしお (文字列には数字ず数字の䞡方を含めるこずができたす)。
  • 出力は関数であるため、スクリプトの最埌に return.
  • コヌド内でカスタム マクロを䜿甚するこずが可胜です。
  • リ゜ヌスは、オペレヌティング システム レベルだけでなく、プログラム的にも制限できたす。 前凊理ステップには、最倧 10 メガバむトの RAM ず 10 秒の実行時間制限が割り圓おられたす。

JavaScriptを䜿甚しおZabbixの実践的な問題を解決したす

NOTE. かなり「重い」前凊理シナリオに埓っお 10 秒間に条件付きの数千のデヌタ項目を収集するず、Zabbix の速床が䜎䞋する可胜性があるため、1 秒ずいうタむムアりト倀は非垞に長い倀です。 したがっお、前凊理を実行するためだけに実行される、いわゆるシャドり デヌタ芁玠 (ダミヌ アむテム) を通じお本栌的な 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

蚈算項目を前凊理に眮き換えたす。

状態: センサヌから枩床を華氏で取埗し、摂氏で保存したす。

以前は、枩床を華氏で収集するアむテムを䜜成しおいたした。 その埌、数匏を䜿甚しお華氏を摂氏に倉換する別のデヌタ項目 (蚈算枈み)。

問題:

  • デヌタ芁玠を耇補し、すべおの倀をデヌタベヌスに保存する必芁がありたす。
  • 蚈算され、数匏で䜿甚される「芪」デヌタ項目ず、蚈算されるデヌタ項目の間隔に぀いお合意する必芁がありたす。 そうしないず、蚈算項目がサポヌトされおいない状態になったり、以前の倀が蚈算されたりする可胜性があり、監芖結果の信頌性に圱響したす。

XNUMX ぀の解決策は、柔軟なチェック間隔をやめお固定間隔を遞択し、デヌタ (この堎合は華氏での枩床) を受け取った項目の埌で蚈算項目が評䟡されるようにするこずでした。

しかし、たずえば、テンプレヌトを䜿甚しお倚数のデバむスをチェックし、そのチェックが 30 秒ごずに実行される堎合、Zabbix は 29 秒間「ハッキング」し、最埌の XNUMX 秒でチェックず蚈算を開始したす。 これによりキュヌが䜜成され、パフォヌマンスに圱響したす。 したがっお、本圓に必芁な堎合にのみ固定間隔を䜿甚するこずをお勧めしたす。

この問題の最適な解決策は、華氏を摂氏に倉換する XNUMX 行の JavaScript 前凊理です。

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

迅速か぀簡単で、䞍芁なデヌタ項目を䜜成しお履歎を保持する必芁がなく、柔軟な間隔でチェックするこずもできたす。

JavaScriptを䜿甚しおZabbixの実践的な問題を解決したす

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

ただし、仮定の状況で、たずえばマクロで定矩された定数を䜿甚しお、受信したデヌタ芁玠を远加する必芁がある堎合は、パラメヌタが 倀 文字列に展開されたす。 文字列の加算挔算では、XNUMX ぀の文字列が単玔に XNUMX ぀に結合されたす。

JavaScriptを䜿甚しおZabbixの実践的な問題を解決したす

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

算術挔算の結果を取埗するには、取埗した倀の型を数倀圢匏に倉換する必芁がありたす。 このために、関数を䜿甚できたす parseInt、敎数、関数を生成したす。 parseFloat()、小数たたは関数を生成したす。 数、敎数たたは小数を返したす。

2タスク

蚌明曞が終了するたでの時間を秒単䜍で取埗したす。

状態: サヌビスは蚌明曞の有効期限を「12 幎 12 月 33 日 56:2022:XNUMX GMT」の圢匏で発行したす。

ECMAScript5では Date.parse ISO 8601 圢匏 (YYYY-MM-DDTHH:mm:ss.sssZ) の日付を受け入れたす。 MMM DD YYYY HH:mm:ss ZZ の圢匏で文字列をキャストする必芁がありたす。

問題: 月の倀は数倀ではなくテキストずしお衚されたす。 この圢匏のデヌタは Duktape では受け入れられたせん。

゜リュヌション䟋:

  • たず、倀を受け取る倉数が宣蚀されたす (スクリプト党䜓は、カンマで区切っおリストされた倉数の宣蚀です)。

  • 最初の行ではパラメヌタの日付を取埗したす。 倀 メ゜ッドを䜿甚しおスペヌスで区切りたす split。 したがっお、むンデックス 0 から始たる配列の各芁玠がスペヌスの前埌の XNUMX ぀の日付芁玠に察応する配列が埗られたす。 分割(0) - 月、 分割(1) - 番号、 分割(2) - 時刻を含む文字列など。その埌、配列内のむンデックスによっお日付の各芁玠にアクセスできたす。

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

  • 各月 (時系列順) は、配列内のその䜍眮のむンデックス (0 から 11) に察応したす。 テキスト倀を数倀に倉換するには、月のむンデックスに 1 が远加されたす (月の番号は XNUMX から始たるため)。 この堎合、XNUMX を远加した匏は括匧で囲たれたす。そうしないず、数倀ではなく文字列が取埗されるからです。 最埌にやりたす スラむス - 配列を末尟から切り取っお XNUMX 文字だけを残したす (これは XNUMX 桁の数字を含む月の堎合に重芁です)。

`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 タむムスタンプ圢匏で珟圚の日付を取埗し、結果ずしお埗られる蚌明曞の有効期限日からそれを枛算しお、珟圚から蚌明曞の有効期限が切れるたでのミリ秒数を取埗したす。

`now = Date.now();`

  • Zabbix では、受信した倀を XNUMX で割っお秒を取埗したす。

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

トリガヌでは、匏 ' を指定できたす。最埌' の埌に、応答する期間の秒数 (週単䜍など) に察応する䞀連の数字が続きたす。 したがっお、トリガヌは蚌明曞が XNUMX 週間で期限切れになるこずを通知したす。

NOTE. 䜿甚に泚意しおください parseInt 機胜的に returnミリ秒を陀算した結果の小数を敎数に倉換したす。 も䜿甚できたす parseFloat() 郚分デヌタを保存したす.

レポヌトを芋る

出所 habr.com

コメントを远加したす