誰でも ZABBIX

Zabbixの使い方、役に立つ情報、等々

2. アイテムの保存前処理 - 正規表現、文字列削除、XML XPath、JSON Path

2回に分けて、アイテムの保存前処理の紹介をしています。

前回は計算、差分、数値変換の各設定を確認しました。

2. アイテムの保存前処理 - 計算、差分、数値変換 - 誰でも ZABBIX

今回は、正規表現、文字列削除、XML XPathJSON Pathを設定を紹介します。

テスト用のアイテム

今回は文字列処理が主体なので、テキストデータのZabbixトラッパーアイテムを使います。

f:id:Unam:20180207220840p:plain

テキスト

正規表現

文字列の中から必要な箇所だけを取り出し監視データとして格納することができます。これまでは、log監視のキーの中でのみ、この仕組みがサポートされていましたが、V3.4から、アイテムの保存前処理でもサポートされるようになりました。

正規表現で値を取り出す前の元のデータは、以下のとおりです。

$ sudo zabbix_sender -z 192.168.0.9 -s Test001 -k trapper.text -o "City=Tokyo, Country=Japan"


f:id:Unam:20180208210118p:plain

保存前処理の正規表現の指定で、必要なデータ(今回のサンプルではTokyo)のみ取り出します。正規表現の定義は以下のとおりです。

^City=(.*),.*$


f:id:Unam:20180208211251p:plain

正規表現の中に含まれるグループ()の部分を取り出します。右側のフィールドに、エスケープシーケンスと数値で、取り出したいグループの番号を指定します(普通はひとつだけだと思いますが)。

結果
f:id:Unam:20180209225110p:plain

このような処理も可能です。

定義
f:id:Unam:20180208212025p:plain

結果
f:id:Unam:20180208212058p:plain

前後文字列削除

これはプログラムでよく使用するTrim関数と同じ処理です。この処理でいろいろデータが加工しやすくなります。

監視データ(文字の前、中、後に、ハイフンをな挿入しています)

$ sudo zabbix_sender -z 192.168.0.9 -s Test001 -k trapper.text -o "--City=Tokyo,--Country=Japan--"


保存前処理の定義
f:id:Unam:20180208212904p:plain

結果
f:id:Unam:20180208212930p:plain

指定した文字が頭から、もしくは、末尾から存在している場合に削除されます。文中で対象のもじが現れても削除されません。

末尾/先頭文字列削除

上記の例の、片一方だけ処理するパターンです。

末尾文字列削除
f:id:Unam:20180208213210p:plain

結果
f:id:Unam:20180208213432p:plain

先頭文字列削除
f:id:Unam:20180208213314p:plain

結果
f:id:Unam:20180208213400p:plain

構造化データ

XML XPath

今回は、XPATHの説明自体は、割愛させていただきます。 Zabbixのドキュメントに記載されたサンプルをそのまま入力して、実際の動作を認します。

1 Creating an item [Zabbix Documentation 3.4]


まず、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>"


XML XPathの定義

number(/document/item/value)

f:id:Unam:20180208215127p:plain

結果
f:id:Unam:20180208215251p:plain

ひとつ下のデータは、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)

f:id:Unam:20180208215854p:plain

結果
f:id:Unam:20180208220324p:plain

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

f:id:Unam:20180208223225p:plain

結果
f:id:Unam:20180208223144p:plain

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

f:id:Unam:20180208223635p:plain

結果
f:id:Unam:20180208223712p:plain

JSON Pathとjqのクエリは別々の仕様なので、注意が必要です。JSON Pathの挙動は、こちらのサイトで確認可能です。

jsonpath.com

まとめ

今回はサンプル主体であまり説明は記載しませんでしたが、各機能の基本的な動きを理解いただくのにご参考になれば幸いです。

正規表現は、これまで監視データとしてトリガーやグラフの対象にしづらかったデータも取り込めるようになり、監視データの活用範囲や、監視の質の向上につなげることが可能になると思います。

XML XPathJSON Pathは、WebAPI等のデータを外部スクリプトでマスターデータとして取得し、そのデータから依存アイテムとして取り出すときに大きな役割を発揮します。この依存アイテム保存前処理の組み合わせで、これまで完全に外部スクリプト依存だった処理が、Zabbixで記述できるようになり、設定の可読性、可搬性が大きく向上することができるようになりました。その辺の詳細は、別途ご紹介する予定です。