TWSNMP FC/FK ポーリング判定スクリプト (JavaScript) 解説
TWSNMP FK(およびFC)では、多くのポーリング種別で「Script」欄にJavaScriptを記述することで、監視結果の判定ロジックを柔軟にカスタマイズできます。
基本的な判定は「戻り値が true なら正常、false なら異常(設定したレベル)」となりますが、変数の操作や過去の値との比較など高度な処理も可能です。
TWSNMPシリーズの公式サイトは、
https://lhx98.linkclub.jp/twise.co.jp/
です。
基本的な仕組み
-
エンジン: Go言語製のJavaScriptインタプリタ Otto を使用しています。ES5相当の機能が利用可能です(ES6以降の機能は一部非対応)。
-
判定: スクリプトの最後の評価値(戻り値)が
true の場合、ポーリング状態は「正常 (normal)」となります。 false またはそれ以外の場合、ポーリング設定で指定した「レベル (Level)」の状態(注意、重要、警報など)になります。
-
エラー: スクリプト実行中にエラーが発生した場合、ポーリング状態は「不明 (unknown)」となります。
共通で利用可能な関数・変数
すべてのスクリプト対応ポーリングで利用可能な機能です。
関数
| 関数名 |
説明 |
使用例 |
setResult(key, value) |
ポーリング結果 (Result) に任意のキーと値を保存します。保存した値は次回のポーリングで *_last 変数として参照したり、グラフ表示やログに利用できます。 |
setResult("myCalc", 123); |
getResult(key) |
現在のポーリング結果から値を取得します。 |
var v = getResult("rtt"); |
setLevel(level) |
判定結果が異常の場合のレベルを動的に変更します。引数は low, high, warn などを指定します。 |
setLevel("warn"); |
変数
-
前回値 (
*_last): 前回のポーリング結果が、キー名に _last を付けた変数として利用可能です。
- 例: 前回の
count 値は count_last で参照可能。
- 用途:
count > count_last のように前回からの増加を確認するなど。
-
interval: ポーリング間隔(秒)。速度計算などに利用できます(※一部のポーリングでは未定義の場合があります)。
ポーリング種別ごとの利用可能な変数
各ポーリングタイプで、スクリプト実行時に自動的にセットされる変数です。
1. HTTP / HTTPS (Modeにより異なる)
| 変数名 |
説明 |
備考 |
status |
HTTPステータス文字列 |
例: "200 OK" |
code |
HTTPステータスコード (数値) |
例: 200, 404 |
rtt |
応答時間 (ナノ秒) |
|
getBody() |
レスポンスボディを取得する関数 |
Extractor が getBody の場合のみ |
jsonpath(selector) |
JSONPathで値を抽出する関数 |
Extractor が jsonpath の場合のみ |
goquery(selector) |
HTMLから要素を抽出する関数 |
Extractor が goquery の場合のみ |
| (抽出した値) |
Extractor (Grok/正規表現) で定義した名前付きキャプチャ |
|
※ metrics モードの場合、パースされたメトリクス値(例: requests, workers など)も変数として利用可能です。
2. SNMP
| 変数名 |
説明 |
備考 |
| (MIB名) |
取得したMIBの値 |
sysUpTime, ifInOctets など。OIDの末尾インデックスは除かれる場合がある。 |
sysUpTime |
システム稼働時間 |
|
*_Delta |
前回値との差分 |
Modeが delta / ps の場合 |
*_PS |
1秒あたりの増加量 |
Modeが ps の場合 |
snmpGet(oid) |
任意のOIDの値を取得する関数 |
Modeが script の場合のみ利用可能 |
3. Syslog / Trap (ログ監視)
| 変数名 |
説明 |
備考 |
count |
期間内に受信した該当ログの件数 |
|
| (抽出した値) |
Extractor で定義した名前付きキャプチャ |
1件ずつの判定の場合 |
4. NetFlow
| 変数名 |
説明 |
備考 |
bytes |
合計バイト数 |
|
packets |
合計パケット数 |
|
bps |
平均通信速度 (bits/sec) |
|
pps |
平均パケットレート (packets/sec) |
|
srcCount, dstCount
|
送信元・宛先IP数 |
Countモード時 |
flows |
フロー数 |
Statsモード時 |
5. Command (Cmd) / SSH
| 変数名 |
説明 |
備考 |
exitCode |
コマンド終了コード |
0が正常、それ以外はエラーなど |
getBody() |
標準出力を取得する関数 |
Extractor が getBody の場合 |
| (抽出した値) |
Extractor (Grok) で定義した名前付きキャプチャ |
|
6. DNS
| 変数名 |
説明 |
備考 |
rtt |
名前解決にかかった時間 (ナノ秒) |
|
count |
取得できたレコード数 |
|
addr, host, mx 等 |
解決されたレコードの内容 |
モードによる (配列または文字列) |
7. MQTT
| 変数名 |
説明 |
備考 |
topic |
受信したトピック |
Subscribeモード時 |
payload |
受信したメッセージ本文 |
Subscribeモード時 |
rtt |
接続応答時間 |
Connectモード時 |
8. その他 (Monitor, Certificate, etc.)
-
Monitor:
cpu, mem, disk, load などのシステムリソース情報。
-
TwLogEye:
count, errors, warns などの集計値。
-
gNMI:
data (JSON文字列), last (取得時刻)。
スクリプト記述例
例1: HTTPのステータスコードと応答時間による判定
// ステータスコードが200、かつ応答時間が1秒(1,000,000,000ナノ秒)未満なら正常
code == 200 && rtt < 1000 * 1000 * 1000;
例2: SNMPでトラフィックが増加しているか確認 (前回値との比較)
// ifInOctetsが前回より増えていれば正常
// 初回(last変数が未定義)は正常とする
if (typeof ifInOctets_last === 'undefined') {
true;
} else {
ifInOctets > ifInOctets_last;
}
例3: 異常時のレベルを動的に変更する
// エラー数が10以上ならHigh(重要)、1以上ならWarn(注意)、0なら正常
if (errorCount >= 10) {
setLevel("high");
false;
} else if (errorCount > 0) {
setLevel("warn");
false;
} else {
true;
}