

【わたしに♥おまかせ 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 Japan LLCの公式認定パートナーとして、豊富な実績と高い技術力でお客様をサポートします。
アークシステムが選ばれる理由
- 豊富な経験: 多くのZabbix導入・構築プロジェクトを成功に導いた実績
- 確かな技術力: Zabbix認定資格を持つエンジニアが対応
- 独自のソリューション: 「監視定義テンプレート」を活用した迅速かつ高品質な実装
- 最新情報へのアクセス: Zabbix社との強力なパートナーシップを活かした最新技術対応
こんな方に最適です
- Zabbixの新規導入を検討している
- 現行システムの運用に課題を感じている
- 大規模環境での監視体制を整えたい
アークシステムでは、Zabbixの導入・運用に関する課題を解決し、最適な環境を構築します。どんなご相談でもお気軽にお問い合わせください!