Zabbix技術者ブログ

HOME >

Zabbix 8.0リリース前に知っておきたい新機能 「階層ローレベルディスカバリ編」

Zabbix 階層ローレベルディスカバリ

はじめに

2026年は次期LTS版となる「Zabbix 8.0」リリースが予定されています。現在鋭意開発中であるこのバージョンですが、すでにリリース済みのZabbix 7.2 / 7.4からも機能が継承される予定です。

そこで今回は、Zabbix 7.4で実装された「階層ローレベルディスカバリ」機能をご紹介します。
「ローレベルディスカバリ(LLD)」とは、Zabbixが監視対象を自動的に見つけてきて、監視設定まで行ってくれる便利な機能です。
今回紹介する「階層ローレベルディスカバリ」は、そのLLDがさらにパワーアップした新機能です。

従来からの変更点

一言でいうと、「自動検出した対象をさらに掘り下げて自動検出できる」ようになりました。
例えばDBサーバでは、1台のDBサーバの中に複数のデータベースがあり、それぞれの中にたくさんのテーブルがあるという構造になります。

階層化LLD-DB

このような階層構造を持つ環境を監視したいとき、これまでのZabbixでは少し面倒な工夫が必要でした。

従来の機能

これまでのLLDには、「1つのディスカバリルールで検出できるのは1階層だけ」という制約がありました。
つまり「データベースを自動検出する」ルールを作れば、zabbix や mysql といったデータベースは自動検出できますが、その中のテーブルまで一気に検出することはできません。

LLD自動検出図
そのため、「データベースの中のテーブルも自動検出したい」と思っても、別のディスカバリルールを作ったり、スクリプトを工夫してデータをフラットに加工したりと手間がかかっていました。
また、マスターアイテムと依存LLDルールを組み合わせる方法でも実現は可能でしたが、親子関係が設定上で分かりづらいという課題がありました。

Zabbix 7.4の「階層ローレベルディスカバリ」とは

そんな悩みを解決してくれるのが、Zabbix 7.4で追加された新機能「ディスカバリプロトタイプ」です。
これまでのディスカバリルールには「アイテムプロトタイプ」「トリガープロトタイプ」「ホストプロトタイプ」がありましたが、ここに新しく「ディスカバリプロトタイプ」が加わりました。

ディスカバリプロトタイプを使うと、ディスカバリルールの中にさらにディスカバリルールを入れ子(ネスト)で作れるようになります。
例えば「データベース検出ルール」の中に「テーブル検出ルール」を入れ子で記述できます。

LLD自動検出が可能

なお、ネストできる段数に制限はないため、「データベース → テーブルスペース → テーブル」のような3階層、4階層も自由に表現できます。



実際にやってみた

ここからは実際にZabbixで階層ローレベルディスカバリを設定してみます。
Zabbixサーバ自身が使っているMySQLデータベースに対して 「データベースを検出 → 各データベースの中のテーブルを検出」という2段階のディスカバリを作成します。
今回の構成は「マスターアイテム+依存ディスカバリルール+ディスカバリプロトタイプ(Nested)+依存アイテム」です。
マスターアイテムでスクリプトを1回だけ実行し、そのJSONデータを依存ディスカバリルールや ディスカバリプロトタイプが共有して使う形になります。 また、今回値を取得するDBにはZabbix DBの他、ダミーで「blog_demo」「blog_archive」 をあらかじめ作成しています。

階層化LLD_DB構成

ステップ1: 階層構造のデータを取得するスクリプトを用意

まずは、Zabbixに「データベースとテーブルの一覧」を階層構造のデータとして渡せるようにします。
MySQLからデータベース名と、その中のテーブル一覧をJSONで返すスクリプトを作成し、 Zabbixエージェントの UserParameter で呼び出せるようにしておきます。

[
	{
		"database": "blog_archive",
		"table_count": 2,
		"tables": [
			{ "table_name": "old_posts", "engine": "InnoDB", "data_length": 16384, "index_length": 0 },
			{ "table_name": "old_users", "engine": "InnoDB", "data_length": 16384, "index_length": 0 }
		]
	},
	{
		"database": "blog_demo",
		"table_count": 3,
		"tables": [
			{ "table_name": "comments", "engine": "InnoDB", "data_length": 16384, "index_length": 0 },
			{ "table_name": "posts", "engine": "InnoDB", "data_length": 16384, "index_length": 0 },
			{ "table_name": "users", "engine": "InnoDB", "data_length": 16384, "index_length": 0 }
		]
	},
	{
		"database": "zabbix",
		"table_count": 207,
		"tables": [
			{ "table_name": "acknowledges", "engine": "InnoDB", "data_length": 16384, "index_length": 49152 },
			{ "table_name": "actions", "engine": "InnoDB", "data_length": 16384, "index_length": 32768 },
			{ "table_name": "alerts", "engine": "InnoDB", "data_length": 16384, "index_length": 131072 }
		]
	}
]

ステップ2: マスターアイテムを作成

監視対象ホストに、スクリプトを実行するためのアイテムを1つ作成します。 これが「マスターアイテム」となり、スクリプト実行して階層JSONを取得します。
タイプは「Zabbixエージェント」、キーはUserParameterで登録したキー(例: custom.mysql.db_table_discovery)、データ型は「テキスト」を指定します。

階層化LLD_マスターアイテム作成

ステップ3: 親のディスカバリルールを作成

次に、データベースを検出する親のディスカバリルールを作成します。
タイプは「依存アイテム」、マスターアイテムにステップ2で作成したアイテムを指定します。
これでマスターアイテムが取得したJSONデータを、このディスカバリルールがそのまま参照できるようになります。 階層化LLD_親LLD作成①
LLDマクロタブで {#DB} = $.database を指定しておくことで、JSONからデータベース名を取り出せます。
階層化LLD_親LLD作成2

ステップ4: ディスカバリプロトタイプを作成

ここからが新機能です。親ディスカバリルールの中で、 子ディスカバリルールを「ディスカバリプロトタイプ」として追加します。
タイプは「Nested」を選択します。Nestedを指定すると、新規にデータを取りに行かず、親が処理したJSONの該当部分をそのまま受け取って動作します。
階層化LLD_ネストされたLLD
前処理タブで JSONPath $.tables を指定し、LLDマクロタブで {#TABLE} = $.table_name を定義することで、
テーブル名を {#TABLE} という変数として使えるようになります。

ディスカバリのプロトタイプ 階層化LLD_マスターアイテム作成

ステップ5: アイテムプロトタイプを作成

最後に、テーブルごとの監視アイテムを自動生成するための「アイテムプロトタイプ」を作成します。
タイプは「依存アイテム」とし、マスターアイテムにステップ2で作成したアイテムを指定します。 アイテム名には親のマクロ {#DB} と子のマクロ {#TABLE} の両方が使えます。 これにより「データベース.テーブル」という分かりやすい命名が可能になります

プロトタイプ作成

前処理のJSONPathで {#DB} と {#TABLE} を使って絞り込むことで、対象テーブルの値を取り出します。

アイテムのプロトタイプ保存前処理

実行結果

ディスカバリの実行結果がこちらです。

実行結果ディスカバリルール 実行結果アイテム

「データベース × テーブル」のすべての組み合わせで、監視アイテムが自動生成されます。
新しいデータベースを作ったり、テーブルを追加したりしても、Zabbixが次回のディスカバリ実行時に自動検出してくれます。

こんな環境で活用できそう

こんな環境で 階層構造の例
データベース監視 データベース → テーブルスペース → テーブル
ストレージ監視 プール → ボリューム → スナップショット
ネットワーク機器の監視 シャーシ → モジュール → ポート
コンテナ監視 コンテナ → ネットワーク / ボリューム / ポート

これまで「自動化したいけど、ちょっと階層が複雑だから諦めていた」という監視対象にも、再チャレンジしやすくなります。

おわりに

Zabbix 7.4で追加された「階層ローレベルディスカバリ」は、ホストを分けることなく、 追加のデータ取得もなく、入れ子の自動検出ができる便利な機能です。
これまで設定が面倒だった階層構造の監視が実現しやすくなります。

なお、今回ご紹介した機能が搭載されたZabbix 7.4はサポート期間が短いポイントリリース版となります。安定運用を重視する場合は次回LTSのZabbix 8.0をご検討いただき、それまではZabbix 7.4で新機能の検証を試してみてください。

ちなみに今回、データ取得用のスクリプトは生成AIに作ってもらいました。
設定の試行錯誤の壁打ち相手としても生成AIは使えますので、「ちょっと新機能を触ってみたいけど取っ掛かりが…」という方は、 AIの力も借りつつ気軽に試してみてはいかがでしょうか。

なお、当社はZabbix認定パートナーとして、お客様のZabbix環境の構築や公式サポートを提供しております。
ぜひこちらも一度ご検討いただければと思います。



Zabbixについてお問い合わせ等ございましたら、こちらから

Zabbix関連のお問合せ