Zabbixで受信したデータの加工TIPS
監視ソフトウェアとして広く使用されているZabbix。監視対象サーバやIoT系のセンサー機器等から取得したデータを加工したいケースがあるかと思います。
本記事は、Zabbixで受信したデータの計算や、JSON形式データからの値の取り出し等について記載します。対象は主にZabbix 6系ですが、基本的な機能なので他のバージョンでも同様かと思います。
参考として、簡単にセットアップできるZabbix Applianceの導入についてこちらの記事にまとめてあります。
本記事の目的
- Zabbixで受信したデータの計算や、JSON形式データからの値の取り出し等の方法を把握する。
基本
計算アイテム(Calculated items)
Zabbixに登録したホスト(エージェントなど)から受信した値に対し、足し算や掛け算などの四則演算、あるいは他のアイテムとの演算、また関数を使用した各種計算を行った結果を取得する方法です。
Zabbixマニュアルに詳細が記載されています。
なお、100倍や100分の一など、一律の倍率を指定するだけであれば、後述の乗数(Custom Multiplier)で十分です。
計算アイテムの定義例を説明します。画像はアイテムの定義画面です。
以下、ポイント要約です。
Type
は「Calculated」を選択します。Name
、Key
には任意の文字列を指定します。Type of information
は、計算した後の値の種類を指定します。図では小数を扱いたい場合を想定し、浮動小数点数(「Numeric(float)」)を指定してあります。整数の場合は「Numeric (unsigned)」を指定します。Formula
では計算式を指定します。詳細は後述します。Units
は単位を指定します。Update Interval
はこの計算アイテムの更新間隔を指定します。詳細は後述します。
Formula
は、以下のように入力します。
- 例1:host1のアイテム(キー名:key1)の最新値を100で割った値を取得する場合
last(/host1/key1)/100
last()
関数は、指定したキーの最新の値を取得する関数です。 - 例2:例1と同じ計算をするが、key1の値が30秒以上更新されていない場合はゼロを取得する場合
last(/host1/key1)/100*(1-nodata(/host1/key1,30))
nodata(キー、期間(秒))
関数は、指定したキーの値が指定した期間より長い間、取得されていない場合に1を返し、取得されている場合には0を返します。
計算式に*(1-nodata(…))
を加えることで、例えば監視対象ホストとの通信が不可になる等のトラブルが発生した際には計算の結果が必ずゼロになるので、トラブル発生前に取得した古いデータが使い続けられてしまうといった動作を防ぐことができます。
計算アイテムには、以下の注意点があります。
- 計算式に含める要素(キー)は、予め別途定義しておく必要性があります。
- 計算アイテムの更新間隔は、計算式に含めるキー自体の更新間隔より短く指定しても意味がありません。計算アイテムの計算を頻繁に行っても、その計算に使用される要素(キー)が更新されていないケースが生じるためです。
計算アイテムの定義の仕方は、Zabbixマニュアルに詳細が記載されています。
– 計算アイテムの説明(いくつか例あり)
– 使用可能な関数の説明
乗数(Custom Multiplier)
Zabbixに登録したホスト(エージェントなど)から受信した値に対し、一律の倍率で乗算した値を使用する方法です。Zabbixマニュアルに詳細が記載されています。
該当のアイテムの保存前処理(Preprocessing)として指定するだけです。
画像は、取得した値を常に100倍する場合の設定例です。
Preprocessing steps
は、Name
にCustom multiplierを選択し、Parameters
にかけたい数(乗数)を指定します。10分の一にしたい場合は0.1です。Type of information
は、乗算した後の値の種類を指定します。整数の場合は「Numeric (unsigned)」を指定します。浮動小数点数の場合は「Numeric(float)」を指定します。
JSONデータからの値の取り出し(Dependent item / JSONPath)
概要
Zabbixがホストから受信するデータがJSON形式である場合に、そのJSONデータから目的の値を取り出す方法です。
Dependent item(依存アイテム、従属アイテム)とJSONPathを使用します。Zabbixマニュアル(Dependent item、JSONPath)に詳細が記載されています。
ユースケースとしては、複数の値を含むJSONデータを1つのアイテム(キー)経由で受信し、その中に含まれる値を個々のアイテムとして扱う場合です。特に、1つのJSONデータに含まれる各値が「同時に取得された」ということが整合性の面から重要である場合、この方法が有効です。
以下に、JSONデータと定義するアイテムのイメージを記載します。
(ある時点で取得するJSONデータの例) { "data1" : "123", "data2" : "456", "data3" : "789" }
定義するアイテム | 説明 |
---|---|
アイテム1 | 上記のJSONデータを取得するアイテム(HTTP エージェント、Zabbix トラッパー等) |
アイテム2 | アイテム1のJSONデータからdata1の値”123″を取り出すDependent item |
アイテム3 | アイテム1のJSONデータからdata2の値”456″を取り出すDependent item |
アイテム4 | アイテム1のJSONデータからdata3の値”789″を取り出すDependent item |
設定例(アイテム1:JSONデータを取得)
JSONデータ取得用のアイテム(前述のアイテム1)の定義例です。HTTPエージェント以外の場合と、HTTPエージェントの場合で、設定項目が異なるため画像を2枚載せておきます。
上記は、HTTPエージェント以外の場合です。
– Type
は、Zabbixトラッパーや、Zabbixエージェント(アクティブ)が使用できます。Text形式でデータ取得できるものです。
– Type of information
は、「Text」を指定します。
上記は、HTTPエージェントの場合です。
– URL
やQuery fields
は、APIやアクセス先のWebサービスの仕様に沿って定義します。Query fields
は、URL
の後に”?”に続いて付与されるリクエスト文字列の一部です。
設定例(アイテム2,3,4:JSONデータから値を取り出し)
次に、JSONデータから値を取り出すためのアイテム(前述のアイテム2,3,4)の定義例です。
Item
タブ以外に、Preprocessing
タブも設定します。
Type
は、「Dependent item」を選択します。Master item
には、上記でJSON取得用に定義したアイテムを指定します。Type of information
は、JSONから取り出す値の型を指定します。Preprocessing
タブでは、Preprocessing steps
に「JSONPath」を定義し、Parameters
には「$.data1」のようにJSONデータの中から取り出したい値の名前を指定します。Type of information
は、Item
タブにある同項目と同期されています。- JSONデータから取り出したい値の数だけ、同様にDependent itemを定義します。
定義したDependent itemは、Zabbixの監視対象項目として扱うことができます。
補足
以下、JSON形式のデータから値を取り出す際の補足事項です。
-
JSONデータを取得するアイテムのタイプはHTTPエージェントの場合もあれば、それ以外のタイプのアイテムからテキストデータとしてJSONデータを受信する場合もあります。環境に応じて定義できます。
-
JSONデータを取得するアイテムのタイプに関わらず、Dependent item(依存アイテム)を使用するという点は同じです。
- ただし、JSONデータから取り出す値が1つだけである場合は、Dependent itemを定義する必要性はありません。JSONデータを取得するアイテム内で、
Preprocessing
タブの設定を行うだけで十分です。
- ただし、JSONデータから取り出す値が1つだけである場合は、Dependent itemを定義する必要性はありません。JSONデータを取得するアイテム内で、
-
Zabbixの構成上、同じキー名を定義したアイテムを複数登録することはできません。構成によっては、この制限に注意する必要性があるので、一応記載しておきます。
文字列型から数値型へのデータ変換
次に、本当は小数データなのに文字列型として受信してからZabbix内では数値データとして扱いたい場合の変換方法です。例えば、SNMP経由で小数データを取得する場合、監視対象機器のMIBによってはSNMPのデータタイプが文字列型(OCTET STRING)で定義されていることがあります。
これは特に個別の設定は不要で、Type of information
に変換後のデータタイプを指定するだけで、Zabbixが自動的に変換してくれるようです。