4 JavaScriptの保存前処理

概要

このセクションでは、JavaScriptによる保存前処理について詳しく説明します。

JavaScriptの保存前処理

JavaScriptの保存前処理は、JavaScriptの関数を'value'という1つのパラメーターとユーザー提供の関数本体で呼び出すことで行われます。保存前処理のステップの結果は、この関数から返される値です。例えば、華氏から摂氏への変換を行う場合、ユーザーは次のように入力する必要があります。

return (value - 32)  * 5 / 9

JavaScriptの保存前処理パラメーターは、サーバーによってJavaScript関数にラップされます。

function (value)
       {
          return (value - 32) * 5 / 9
       }

入力パラメーター'value'は常に文字列として渡されます。戻り値はいくつかの例外とともに自動的にToString()メソッドで文字列に変換されます(失敗した場合は、エラーが文字列として返されます)。

  • 未定義の値を返すとエラーになります。
  • null値を返すと、入力値が破棄されます。これは'失敗時のカスタマイズ'の'値を破棄'と似た動作になります。

エラーは、値/オブジェクト(通常は文字列かエラーオブジェクト)をスローすることによって返されます。

例:

if (value == 0)
           throw "Zero input value"
       return 1/value

各スクリプトには10秒の実行タイムアウトがあり、超えるとエラーが返されます(スクリプトによって、タイムアウトがトリガーするのに時間がかかる場合があります)。512メガバイトのヒープ制限が施行されています(Zabbix 6.0.19より前は64メガバイト)。

JavaScriptの保存前処理のステップのバイトコードはキャッシュされ、次回ステップが適用されたときに再利用されます。アイテムの保存前処理ステップに変更を加えると、キャッシュされたスクリプトがリセットされ、後で再コンパイルされます。

連続したランタイムエラー(3回連続)が発生すると、1つのスクリプトによって次のスクリプトの実行環境が破壊される可能性を軽減するために、エンジンが再初期化されます(このアクションは、デバッグレベル4以上でログに記録されます)。

JavaScriptの保存前処理は、Duktape(https://duktape.org/) JavaScriptエンジンを使用して実装されています。

参照: 追加のJavaScriptオブジェクトとグローバル関数

スクリプトでマクロの使用

JavaScriptのコードでユーザーマクロを使用することができます。 スクリプトにユーザーマクロが含まれている場合、これらのマクロは特定の保存前処理のステップを実行する前に、サーバー/プロキシによって解決されます。 フロントエンドで保存前処理ステップのテストするとき、マクロの値は引き出されないので手動で入力する必要があることに注意してください。

マクロがその値で置き換えられるとき、コンテキストは無視されます。 マクロの値はそのままコードに挿入されるため、JavaScriptコードにマクロの値を挿入する前にエスケープを追加することはできません。 このため、場合によってはJavaScriptのエラーを引き起こす可能性があります。

以下の例では、受信した値が{$THRESHOLD}マクロの値を超えた場合、代わりに閾値(存在する場合)が返されます。

var threshold = '{$THRESHOLD}';
       return (!isNaN(threshold) && value > threshold) ? threshold : value;