【わたしに♥おまかせ Zabbix⑥】Zabbixのデータベースについて – トリガー編

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

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

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

前回の記事はこちら。

まとめ記事作りました♥

Zabbixを知ろう – Zabbixのデータベースについて – トリガー編

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

トリガーに関する情報について

主要テーブル一覧

監視データを評価する設定(条件式)であるトリガーに関する情報は主に以下のテーブルに格納されています。

triggers     #トリガーに関する主要な情報を格納するテーブル
functions    #トリガーの条件式に関する情報を格納するテーブル
items        #トリガー条件式内のアイテムキー情報を格納するテーブル

triggersテーブル詳細

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

+-------------+---------------------+------+-----+---------+-------+
| Field       | Type                | Null | Key | Default | Extra |
+-------------+---------------------+------+-----+---------+-------+
| triggerid   | bigint(20) unsigned | NO   | PRI | NULL    |       |
| expression  | varchar(2048)       | NO   |     |         |       |
| description | varchar(255)        | NO   |     |         |       |
| url         | varchar(255)        | NO   |     |         |       |
| status      | int(11)             | NO   | MUL | 0       |       |
| value       | int(11)             | NO   | MUL | 0       |       |
| priority    | int(11)             | NO   |     | 0       |       |
| lastchange  | int(11)             | NO   |     | 0       |       |
| comments    | text                | NO   |     | NULL    |       |
| error       | varchar(128)        | NO   |     |         |       |
| templateid  | bigint(20) unsigned | YES  | MUL | NULL    |       |
| type        | int(11)             | NO   |     | 0       |       |
| state       | int(11)             | NO   |     | 0       |       |
| flags       | int(11)             | NO   |     | 0       |       |
+-------------+---------------------+------+-----+---------+-------+

itemidが見つかりました。前回の記事で使ったSQLに加えてfunctionsテーブルのitemidを利用して、ホストに紐付くアイテムとトリガーを取得して見たいと思います。

トリガーの取得

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

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

select
 h1.host,
 h2.host,
 i.name,
 i.key_,
 t.description,
 t.expression
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
 left outer join functions f
 on i.itemid=f.itemid
 left outer join triggers t
 on f.triggerid=t.triggerid
where
 h1.host='ArkTest';

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

以下が実行結果です。

+---------+---------------------+--------------------------------+-------------+----------------------------------------------+------------------------------------------------------------------------+
| host    | host                | name                           | key_        | description                                  | expression                                                             |
+---------+---------------------+--------------------------------+-------------+----------------------------------------------+------------------------------------------------------------------------+
| ArkTest | Agent Ping Template | [PING] Zabbix Agent Ping Check | agent.ping  | [PING] Zabbix Agent Ping Check to {HOSTNAME} | {13441}=1                                                              |
| ArkTest | Ping Check Template | [PING] Ping Check              | icmpping    | [PING] Ping Check to {HOSTNAME}              | ({TRIGGER.VALUE}=0 and {13442}=3) or ({TRIGGER.VALUE}=1 and {13443}<3) |
+---------+---------------------+--------------------------------+-------------+----------------------------------------------+------------------------------------------------------------------------+

ホストに紐付くテンプレート、テンプレートに内包されているアイテムとトリガーを取得することができました。

やったー!と思いきや内容を良く見るとトリガー条件式(expression)の値が一部数字に置き換わっています。

なんの数字なのか調べてみると「functions」テーブルの「functionid」であることが分かりました。「functions」テーブル内の「function」、「parameter」に加え、「itemid」も所持しているので、再び「functions」テーブルと、「Items」テーブルを結合すればちゃんとしたトリガー条件式が取得できそうです。

しかしながら「expression」のカラムに全て情報が内包されてしまっているのでjoinでは結合できそうにありません。

どうしよう。。。

トリガー取得 (リトライ)

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

SQLに詳しい先輩の力を拝借して「replace」句を駆使して「functionid」を「itemid」へ「itemid」を「アイテムキー」へと置換を繰り返して無理やりトリガー条件式を出力してみました。

※ SQLが非常に煩雑で長くなってしまったのでここではSQL文の記載を割愛させて頂きます。

以下が実行結果です。

+---------+---------------------+--------------------------------+-------------+----------------------------------------------+----------------------------------------------------------------------------------------------------------------------------+
| host    | host                | name                           | key_        | description                                  | expression                                                                                                                 |
+---------+---------------------+--------------------------------+-------------+----------------------------------------------+----------------------------------------------------------------------------------------------------------------------------+
| ArkTest | Agent Ping Template | [PING] Zabbix Agent Ping Check | agent.ping  | [PING] Zabbix Agent Ping Check to {HOSTNAME} | {ArkTest:agent.ping.nodata(240)}=1                                                                                         |
| ArkTest | Ping Check Template | [PING] Ping Check              | icmpping    | [PING] Ping Check to {HOSTNAME}              | ({TRIGGER.VALUE}=0 and {ArkTest:icmpping.count(#3,0,eq)}=3) or ({TRIGGER.VALUE}=1 and {ArkTest:icmpping.count(#3,1,eq)}<3) |
+---------+---------------------+--------------------------------+-------------+----------------------------------------------+----------------------------------------------------------------------------------------------------------------------------+

なんとか設定どおりのトリガーキーを取得することができました!

まとめ

今回はトリガーに関する情報が格納されているテーブルと、そのリレーションについて確認しました。アイテムに比べて、情報の持ち方が特殊で取得できるまでかなり苦労しました(汗)

トリガーの情報をSQLで取得するためには、

  • 「functions」、「triggers」、「items」テーブルの情報を参照する必要がある
  • トリガーキーは単純なテーブルの結合では設定どおりの値を取得できない

という点に留意することが大切だと感じました!

ZabbixDBの情報をSQLを用いて出力して利用する場合はトリガーキーの出力のさせ方に工夫が必要ですね!

次回の記事はこちら。

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

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