【わたしに♥おまかせ Zabbix⑤】Zabbixのデータベースについて – アイテム編

Zabbix, まるごとおまかせZabbix, わたしにおまかせZabbix, 製品紹介

こんにちは!プラットフォーム技術部の齊藤(沙)です。

前回はZabbixが監視設定や履歴データを保管するデータベースの中でもホストに関連するテーブルについて確認しました。今回はアイテムに関連するテーブルについて確認していきます。

前回の記事はこちら。

まとめ記事作りました♥

Zabbixを知ろう -Zabbixのデータベースについて – アイテム編

私たちアークシステムでは、パフォーマンスの観点からZabbixにおけるデータベースはMariaDB(Mysql)の使用を推奨しています。本記事では、Zabbix3.0、mariadb5.5の環境を用いて確認していきます。

アイテムに関する情報について

主要テーブル一覧

監視項目であるアイテムに関する情報は主に以下のテーブルに格納されています。

 hosts			  	   #ホスト(テンプレート)に関する主要な情報を格納するテーブル
 items			  	   #アイテムに関する情報を格納するテーブル
 applications			#アプリケーションに関する情報を格納するテーブル
 items_applications	 	#アイテムとアプリケーションの紐付けに関する情報を格納するテーブル

itemsテーブル詳細

まずはアイテムに関する主要な情報が格納されている「items」テーブルについて詳しく確認していきます。以下は「desc items;」コマンドの出力結果です。

+-----------------------+---------------------+------+-----+---------+-------+
| Field                 | Type                | Null | Key | Default | Extra |
+-----------------------+---------------------+------+-----+---------+-------+
| itemid                | bigint(20) unsigned | NO   | PRI | NULL    |       |
| type                  | int(11)             | NO   |     | 0       |       |
| snmp_community        | varchar(64)         | NO   |     |         |       |
| snmp_oid              | varchar(255)        | NO   |     |         |       |
| hostid                | bigint(20) unsigned | NO   | MUL | NULL    |       |
| name                  | varchar(255)        | NO   |     |         |       |
| key_                  | varchar(255)        | NO   |     |         |       |
| delay                 | int(11)             | NO   |     | 0       |       |
| history               | int(11)             | NO   |     | 90      |       |
| trends                | int(11)             | NO   |     | 365     |       |
| status                | int(11)             | NO   | MUL | 0       |       |
| value_type            | int(11)             | NO   |     | 0       |       |
| trapper_hosts         | varchar(255)        | NO   |     |         |       |
| units                 | varchar(255)        | NO   |     |         |       |
| multiplier            | int(11)             | NO   |     | 0       |       |
| delta                 | int(11)             | NO   |     | 0       |       |
| snmpv3_securityname   | varchar(64)         | NO   |     |         |       |
| snmpv3_securitylevel  | int(11)             | NO   |     | 0       |       |
| snmpv3_authpassphrase | varchar(64)         | NO   |     |         |       |
| snmpv3_privpassphrase | varchar(64)         | NO   |     |         |       |
| formula               | varchar(255)        | NO   |     |         |       |
| error                 | varchar(2048)       | NO   |     |         |       |
| lastlogsize           | bigint(20) unsigned | NO   |     | 0       |       |
| logtimefmt            | varchar(64)         | NO   |     |         |       |
| templateid            | bigint(20) unsigned | YES  | MUL | NULL    |       |
| valuemapid            | bigint(20) unsigned | YES  | MUL | NULL    |       |
| delay_flex            | varchar(255)        | NO   |     |         |       |
| params                | text                | NO   |     | NULL    |       |
| ipmi_sensor           | varchar(128)        | NO   |     |         |       |
| data_type             | int(11)             | NO   |     | 0       |       |
| authtype              | int(11)             | NO   |     | 0       |       |
| username              | varchar(64)         | NO   |     |         |       |
| password              | varchar(64)         | NO   |     |         |       |
| publickey             | varchar(64)         | NO   |     |         |       |
| privatekey            | varchar(64)         | NO   |     |         |       |
| mtime                 | int(11)             | NO   |     | 0       |       |
| flags                 | int(11)             | NO   |     | 0       |       |
| interfaceid           | bigint(20) unsigned | YES  | MUL | NULL    |       |
| port                  | varchar(64)         | NO   |     |         |       |
| description           | text                | NO   |     | NULL    |       |
| inventory_link        | int(11)             | NO   |     | 0       |       |
| lifetime              | varchar(64)         | NO   |     | 30      |       |
| snmpv3_authprotocol   | int(11)             | NO   |     | 0       |       |
| snmpv3_privprotocol   | int(11)             | NO   |     | 0       |       |
| state                 | int(11)             | NO   |     | 0       |       |
| snmpv3_contextname    | varchar(255)        | NO   |     |         |       |
| evaltype              | int(11)             | NO   |     | 0       |       |
+-----------------------+---------------------+------+-----+---------+-------+

アイテムはZabbixの仕様上、ホストまたはテンプレートに紐付く形で存在します。そしてZabbixのデータベースの中では、ホストもテンプレートも共に「hosts」テーブル内に情報が格納されます。

「items」テーブルに「hostid」が存在して簡単に取得できそうなので、まずはホストに紐付くアイテムの一覧を取得して見たいと思います。

ホスト+テンプレートのアイテムについて

SQL文 (‘hosts’ – ‘items’)

以下は実行するSQL文です。

「hosts」テーブルにおける「status」カラム内の値が「3」となっているデータはテンプレートを表すため、where句の1つめの条件で検索対象から除外しています。

select 
 h.name,
 i.name,
 i.key_
from
 hosts h
 left outer join items i
  on h.hostid=i.hostid
where
 h.status<>3
and
 h.host='ArkTest';

実行結果 (‘hosts’ – ‘items’)

以下が実行結果です。

+---------+--------------------------------+------------+
| name    | name                           | key_       |
+---------+--------------------------------+------------+
| ArkTest | [PING] Zabbix Agent Ping Check | agent.ping |
| ArkTest | [PING] Ping Check              | icmpping   |
+---------+--------------------------------+------------+

ホストに紐付くアイテムを取得することができました!

でもこれでは、ホストに紐付いているアイテムがどのテンプレートに存在するものなのかがわかりません。つぎはテンプレート名も一緒に取得して見たいと思います。

SQL文 (‘hosts’ – ‘items’ – ‘hosts(テンプレート)’)

以下は実行するSQL文です。

select
 h1.host,
 h2.host,
 i.name,
 i.key_
from
 hosts h1
 inner join items i
  on h1.hostid=i.hostid
 left outer join items i2
  on i.templateid=i2.itemid
 left outer join hosts h2
  on i2.hostid=h2.hostid
where
 h1.host='ArkTest';

「items」テーブル内の「templateid」カラムの情報を使って、どのテンプレートのアイテムなのかを追っていきます。テンプレートとホストに関する情報が同じテーブルに格納されているため、少し分かり辛いですね。。。

実行結果 (‘hosts’ – ‘items’ – ‘hosts(テンプレート)’)

以下が実行結果です。

+---------+---------------------+--------------------------------+------------+
| host    | host                | name                           | key_       |
+---------+---------------------+--------------------------------+------------+
| ArkTest | Agent Ping Template | [PING] Zabbix Agent Ping Check | agent.ping |
| ArkTest | Ping Check Template | [PING] Ping Check              | icmpping   |
+---------+---------------------+--------------------------------+------------+

最初は少し混乱しましたが、テンプレート名も無事取得することができました!

ホスト+アイテムについて

ここまでで、ホストとそのホストに紐付く”テンプレートに作成されたアイテム”についての参照方法について確認しました。

つぎはホストとそのホストに個別作成されたアイテム(以下ホスト個別アイテム)の参照方法について確認していきたいと思います。設定方法の誤りで意図せず発生するホスト個別アイテムですが、SQLでリスト化できれば設定後の確認で便利ですよね!

確認のため、「ArkTest」ホストに「host item」という名前のホスト個別アイテムを作成しました。

SQL文 (‘hosts’ – ‘items(ホスト個別)’)

以下は実行するSQL文です。

select
 h.host,
 i.name,
 i.key_
from items i
 left outer join hosts h
 on i.hostid=h.hostid 
where
 i.templateid is NULL
and
 h.status<>3
and
 h.host='ArkTest';

「templateid」にはNULLを、ホストの「status」には3以外の値を条件として実行します。

実行結果 (‘hosts’ – ‘items(ホスト個別)’)

以下が実行結果です。

+---------+-----------+-------------+
| host    | name      | key_        |
+---------+-----------+-------------+
| ArkTest | host item | host.item[] |
+---------+-----------+-------------+

確認用の作成した、ホスト個別アイテムが取得できました!
(ディスカバリルールで作成されるアイテムもこのSQL文では出力されます。)

これで以下についてSQL文で簡単に確認できるようになりました。

  • ホストに紐付くテンプレートアイテム
  • ホストに紐付くホスト個別アイテム

アイテム+アプリケーションについて

丁度実施している作業で、特定のアプリケーション名が設定されているアイテムを確認する必要があるので、最後にアプリケーション名の取得についても確認して見たいと思います。

applicationsテーブル詳細

以下は「desc applications;」コマンドの出力結果です。

+---------------+---------------------+------+-----+---------+-------+
| Field         | Type                | Null | Key | Default | Extra |
+---------------+---------------------+------+-----+---------+-------+
| applicationid | bigint(20) unsigned | NO   | PRI | NULL    |       |
| hostid        | bigint(20) unsigned | NO   | MUL | NULL    |       |
| name          | varchar(255)        | NO   |     |         |       |
| flags         | int(11)             | NO   |     | 0       |       |
+---------------+---------------------+------+-----+---------+-------+

むむむ。「itemid」が存在しません。

items_applicationsテーブル詳細

以下は「desc items_applications;」コマンドの出力結果です。

+---------------+---------------------+------+-----+---------+-------+
| Field         | Type                | Null | Key | Default | Extra |
+---------------+---------------------+------+-----+---------+-------+
| itemappid     | bigint(20) unsigned | NO   | PRI | NULL    |       |
| applicationid | bigint(20) unsigned | NO   | MUL | NULL    |       |
| itemid        | bigint(20) unsigned | NO   | MUL | NULL    |       |
+---------------+---------------------+------+-----+---------+-------+

「itemid」を発見しました。
「items_applications」テーブルの「itemid」を使えばアイテムに紐付くアプリケーション名を取得できそうです。

SQL文 (‘items(ホスト個別)’ – ‘items_applications’ – ‘applications’)

以下は実行するSQL文です。

select
 h.host,
 i.name,
 i.key_,
 a.name
from items i
 left outer join hosts h
  on i.hostid=h.hostid
 left outer join items_applications ia
  on i.itemid=ia.itemid
 left outer join applications a
  on ia.applicationid=a.applicationid
where
 i.templateid is NULL
and
 h.status<>3
and
 h.host='ArkTest';

実行結果 (‘items(ホスト個別)’ – ‘items_applications’ – ‘applications’)

以下が実行結果です。

+---------+-----------+-------------+------+
| host    | name      | key_        | name |
+---------+-----------+-------------+------+
| ArkTest | host item | host.item[] | TEST |
+---------+-----------+-------------+------+

アイテムに紐付くアプリケーション名についても取得することができました!

まとめ

今回はアイテムに関する情報が格納されているテーブルと、そのリレーションについて確認しました。WebUIのフィルタ機能の強化により、SQL文で設定内容を確認する機会は減っていますが、欲しい情報だけを一覧表示させることが出来る点ではSQL文は非常に便利!

データベースからアイテムを参照する際には

  • 「hosts」テーブルに、ホストとテンプレート情報が保存されている

ことを留意することが大切ですね!

もっとZabbixのデータベースのことを知るために、次回はデータベースの中のトリガーに関する情報について確認していきたいと思います。

次回の記事はこちら。

アークシステムでは、Zabbixの環境構築や保守サポートを低価格・短納期で実現する「まるごとおまかせZabbix」を提供しています。 本サービスの詳細や、Zabbixを活用したソリューションにご興味をお持ちの方がいらっしゃいましたら サービス紹介ページ からお気軽にお問合わせ下さい。

  • 株式会社アークシステムの来訪管理・会議室予約システム BRoomHubs
  • 低コスト・短納期で提供するまるごとおまかせZabbix