朝から昼寝

整理しておきたいIT技術の小ネタたち

Zabbixで受信したデータの加工TIPS

概要

監視ソフトウェアとして広く使用されているZabbix。監視対象サーバやIoT系のセンサー機器等から取得したデータを加工したいケースがあるかと思います。
本記事は、Zabbixで受信したデータの計算や、JSON形式データからの値の取り出し等について記載します。対象は主にZabbix 6系ですが、基本的な機能なので他のバージョンでも同様かと思います。
参考として、簡単にセットアップできるZabbix Applianceの導入についてこちらの記事にまとめてあります。

本記事の目的

  • Zabbixで受信したデータの計算や、JSON形式データからの値の取り出し等の方法を把握する。

目次

基本

計算アイテム(Calculated items)

Zabbixに登録したホスト(エージェントなど)から受信した値に対し、足し算や掛け算などの四則演算、あるいは他のアイテムとの演算、また関数を使用した各種計算を行った結果を取得する方法です。
Zabbixマニュアルに詳細が記載されています。

なお、100倍や100分の一など、一律の倍率を指定するだけであれば、後述の乗数(Custom Multiplier)で十分です。

計算アイテムの定義例を説明します。画像はアイテムの定義画面です。

Zabbix Calculated items
Zabbix Calculated items

以下、ポイント要約です。

  • Typeは「Calculated」を選択します。
  • NameKeyには任意の文字列を指定します。
  • 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倍する場合の設定例です。

Zabbix Custom multiplier
Zabbix Custom multiplier

  • 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 itemJSONPath)に詳細が記載されています。

ユースケースとしては、複数の値を含む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枚載せておきます。

Zabbix JSON取得用アイテム登録例1
Zabbix JSON取得用アイテム登録例1

上記は、HTTPエージェント以外の場合です。
- Typeは、Zabbixトラッパーや、Zabbixエージェント(アクティブ)が使用できます。Text形式でデータ取得できるものです。
- Type of informationは、「Text」を指定します。

Zabbix JSON取得用アイテム登録例2
Zabbix JSON取得用アイテム登録例2

上記は、HTTPエージェントの場合です。
- URLQuery fieldsは、APIやアクセス先のWebサービスの仕様に沿って定義します。Query fieldsは、URLの後に"?"に続いて付与されるリクエスト文字列の一部です。

設定例(アイテム2,3,4:JSONデータから値を取り出し)

次に、JSONデータから値を取り出すためのアイテム(前述のアイテム2,3,4)の定義例です。

Zabbix JSONデータから値を取り出すアイテム登録例
Zabbix JSONデータから値を取り出すアイテム登録例

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タブの設定を行うだけで十分です。
  • Zabbixの構成上、同じキー名を定義したアイテムを複数登録することはできません。構成によっては、この制限に注意する必要性があるので、一応記載しておきます。

文字列型から数値型へのデータ変換

次に、本当は小数データなのに文字列型として受信してからZabbix内では数値データとして扱いたい場合の変換方法です。例えば、SNMP経由で小数データを取得する場合、監視対象機器のMIBによってはSNMPのデータタイプが文字列型(OCTET STRING)で定義されていることがあります。

これは特に個別の設定は不要で、Type of informationに変換後のデータタイプを指定するだけで、Zabbixが自動的に変換してくれるようです。

数値型データへの変換例
数値型データへの変換例

参考URL等