2. アイテムの保存前処理 - 正規表現、文字列削除、XML XPath、JSON Path
2回に分けて、アイテムの保存前処理の紹介をしています。
前回は計算、差分、数値変換の各設定を確認しました。
今回は、正規表現、文字列削除、XML XPath、JSON Pathを設定を紹介します。
テスト用のアイテム
今回は文字列処理が主体なので、テキストデータのZabbixトラッパーアイテムを使います。
テキスト
正規表現
文字列の中から必要な箇所だけを取り出し監視データとして格納することができます。これまでは、log監視のキーの中でのみ、この仕組みがサポートされていましたが、V3.4から、アイテムの保存前処理でもサポートされるようになりました。
正規表現で値を取り出す前の元のデータは、以下のとおりです。
$ sudo zabbix_sender -z 192.168.0.9 -s Test001 -k trapper.text -o "City=Tokyo, Country=Japan"
保存前処理の正規表現の指定で、必要なデータ(今回のサンプルではTokyo)のみ取り出します。正規表現の定義は以下のとおりです。
^City=(.*),.*$
正規表現の中に含まれるグループ()の部分を取り出します。右側のフィールドに、エスケープシーケンスと数値で、取り出したいグループの番号を指定します(普通はひとつだけだと思いますが)。
結果
このような処理も可能です。
定義
結果
前後文字列削除
これはプログラムでよく使用するTrim関数と同じ処理です。この処理でいろいろデータが加工しやすくなります。
監視データ(文字の前、中、後に、ハイフンをな挿入しています)
$ sudo zabbix_sender -z 192.168.0.9 -s Test001 -k trapper.text -o "--City=Tokyo,--Country=Japan--"
保存前処理の定義
結果
指定した文字が頭から、もしくは、末尾から存在している場合に削除されます。文中で対象のもじが現れても削除されません。
末尾/先頭文字列削除
上記の例の、片一方だけ処理するパターンです。
末尾文字列削除
結果
先頭文字列削除
結果
構造化データ
XML XPath
今回は、XPATHの説明自体は、割愛させていただきます。 Zabbixのドキュメントに記載されたサンプルをそのまま入力して、実際の動作を認します。
まず、xml表記を見やすくするために、xmllintをインストールします。
$ sudo apt-get install libxml2-utils
監視データとして取得するXMLデータです。
$ echo "<document><item><value>10</value></item></document>" | xmllint --format - <?xml version="1.0"?> <document> <item> <value>10</value> </item> </document>
このデータをZabbixに送ります。
$ sudo zabbix_sender -z 192.168.0.9 -s Test001 -k trapper.text -o "<document><item><value>10</value></item></document>"
number(/document/item/value)
結果
ひとつ下のデータは、XPathを指定していない場合のデータです。
今回は、比較のためにテキストデータで取得していますが、本来このように必要なデータだけ取り出し、数値タイプのアイテムに格納します。
サンプル2
対象データ
$ echo '<document><item attribute="10"></item></document>' | xmllint --format - <?xml version="1.0"?> <document> <item attribute="99"/> </document>
zabbix_sender
$ sudo zabbix_sender -z 192.168.0.9 -s Test001 -k trapper.text -o "<document><item attribute=\"99\"></item></document>"
保存前処理のの定義(属性データの抽出)
number(/document/item/@attribute)
結果
JSON Path
JSON Pathも、XML同様、仕様自体の紹介は割愛させていただきます。
整形用にjqコマンドをインストールします。
$ sudo apt-get install jq
監視データとして取得するJSONデータです。
$ echo '{"document":{"item":{"value": 10}}}' | jq { "document": { "item": { "value": 10 } } }
このデータをZabbixに送ります。
sudo zabbix_sender -z 192.168.0.9 -s Test001 -k trapper.text -o '{"document":{"item":{"value": 10}}}'
JSON Pathの定義
$.document.item.value
結果
10が抽出できました。ひとつ下は、保存前処理を定義していない場合のデータです。
サンプル2
対象データ
$ echo '{"document":{"items":[{"value": 10}, {"value": 20}]}}' | jq { "document": { "items": [ { "value": 10 }, { "value": 20 } ] } }
zabbix_sender
$ sudo zabbix_sender -z 192.168.0.9 -s Test001 -k trapper.text -o '{"document":{"items":[{"value": 10}, {"value": 20}]}}'
保存前処理のの定義(配列の2番目の値を取り出します)
$.document.items[1].value
結果
JSON Pathとjqのクエリは別々の仕様なので、注意が必要です。JSON Pathの挙動は、こちらのサイトで確認可能です。
まとめ
今回はサンプル主体であまり説明は記載しませんでしたが、各機能の基本的な動きを理解いただくのにご参考になれば幸いです。
正規表現は、これまで監視データとしてトリガーやグラフの対象にしづらかったデータも取り込めるようになり、監視データの活用範囲や、監視の質の向上につなげることが可能になると思います。
XML XPathやJSON Pathは、WebAPI等のデータを外部スクリプトでマスターデータとして取得し、そのデータから依存アイテムとして取り出すときに大きな役割を発揮します。この依存アイテムと保存前処理の組み合わせで、これまで完全に外部スクリプト依存だった処理が、Zabbixで記述できるようになり、設定の可読性、可搬性が大きく向上することができるようになりました。その辺の詳細は、別途ご紹介する予定です。