ODBC SQLクエリを使用したディスカバリ
概要
このタイプのローレベルディスカバリは、SQLクエリを使用して実行され、その結果はローレベルディスカバリに適したJSONオブジェクトに自動的に変換されます。
アイテムキー
SQLクエリは "Database monitor" アイテムタイプを使用して実行されます。
そのため、ODBC monitoring ページの手順の大部分は、動作する "Database monitor" ディスカバリルールを作成するために適用できます。
"Database monitor" ディスカバリルールでは、次の2つのアイテムキーを使用できます。
-
db.odbc.discovery[<unique short description>,<dsn>,<connection string>]- このアイテムは SQL クエリ結果を JSON 配列に変換し、クエリ結果の列名を、検出されたフィールド値と組み合わされた low-level discovery マクロ名に変換します。
これらのマクロは、アイテム、トリガーなどのプロトタイプを作成する際に使用できます。
参照: db.odbc.discovery の使用。 -
db.odbc.get[<unique short description>,<dsn>,<connection string>]- このアイテムは SQL クエリ結果を JSON 配列に変換し、クエリ結果の元の列名を、検出された値と組み合わされた JSON 内のフィールド名として保持します。
db.odbc.discovery[]と比較すると、このアイテムは返される JSON 内に low-level discovery マクロを作成しないため、列名が有効なマクロ名になり得るかを確認する必要はありません。
low-level discovery マクロは、必要に応じて追加手順として定義できます。返された JSON 内の検出された値を指す JSONPath を使用する カスタム LLD マクロ 機能を利用してください。
参照: db.odbc.get の使用。
db.odbc.discovery の使用
以下の例では、Zabbix データベースに対する ODBC クエリに基づいて、Zabbix プロキシの低レベルディスカバリを使用し、SQL クエリがどのように JSON に変換されるかを示します。
これは、どのプロキシが稼働しているかを監視するための zabbix[proxy,<name>,lastaccess] 内部アイテム を自動作成するのに役立ちます。
まず、ディスカバリルールの設定から始めます。

必須の入力フィールドには赤いアスタリスクが付いています。
ここでは、Zabbix データベースに対して次の直接クエリを使用し、すべての Zabbix プロキシと、それぞれが監視しているホスト数を取得します。
ホスト数は、たとえば空のプロキシを除外するために使用できます。
mysql> SELECT h1.host, COUNT(h2.host) AS count FROM hosts h1 LEFT JOIN hosts h2 ON h1.hostid = h2.proxyid WHERE h1.status IN (5, 6) GROUP BY h1.host;
+---------+-------+
| host | count |
+---------+-------+
| Japan 1 | 5 |
| Japan 2 | 12 |
| Latvia | 3 |
+---------+-------+
3 rows in set (0.01 sec)
db.odbc.discovery[,{$DSN}] アイテムの内部処理により、このクエリの結果は自動的に次の JSON に変換されます。
[
{
"{#HOST}": "Japan 1",
"{#COUNT}": "5"
},
{
"{#HOST}": "Japan 2",
"{#COUNT}": "12"
},
{
"{#HOST}": "Latvia",
"{#COUNT}": "3"
}
]
列名がマクロ名になり、選択された行がそれらのマクロの値になることがわかります。
列名がどのようにマクロ名へ変換されるかが明確でない場合は、上の例のように COUNT(h2.host) AS count のような列エイリアスを使用することを推奨します。
列名を有効なマクロ名に変換できない場合、ディスカバリルールはサポートされていない状態になり、エラーメッセージには問題のある列番号が詳細に示されます。
追加のヘルプが必要な場合は、取得された列名が Zabbix サーバーのログファイルで DebugLevel=4 の下に表示されます。
$ grep db.odbc.discovery /tmp/zabbix_server.log
...
23876:20150114:153410.856 In db_odbc_discovery() query:'SELECT h1.host, COUNT(h2.host) FROM hosts h1 LEFT JOIN hosts h2 ON h1.hostid = h2.proxy_hostid WHERE h1.status IN (5, 6) GROUP BY h1.host;'
23876:20150114:153410.860 db_odbc_discovery() column[1]:'host'
23876:20150114:153410.860 db_odbc_discovery() column[2]:'COUNT(h2.host)'
23876:20150114:153410.860 End of db_odbc_discovery():NOTSUPPORTED
23876:20150114:153410.860 Item [Zabbix server:db.odbc.discovery[proxies,{$DSN}]] error: Cannot convert column #2 name to macro.
SQL クエリが JSON オブジェクトにどのように変換されるかを理解できたので、アイテムプロトタイプで {#HOST} マクロを使用できます。

ディスカバリが実行されると、各プロキシに対してアイテムが作成されます。

db.odbc.get の使用
db.odbc.get[,{$DSN}] と次の SQL の例を使用します。
mysql> SELECT h1.host, COUNT(h2.host) AS count FROM hosts h1 LEFT JOIN hosts h2 ON h1.hostid = h2.proxyid WHERE h1.status IN (5, 6) GROUP BY h1.host;
+---------+-------+
| host | count |
+---------+-------+
| Japan 1 | 5 |
| Japan 2 | 12 |
| Latvia | 3 |
+---------+-------+
3 rows in set (0.01 sec)
この JSON が返されます。
[
{
"host": "Japan 1",
"count": "5"
},
{
"host": "Japan 2",
"count": "12"
},
{
"host": "Latvia",
"count": "3"
}
]
ご覧のとおり、low-level discovery マクロは含まれていません。 ただし、JSONPath を使用して、discovery rule の LLD macros タブでカスタム low-level discovery マクロを作成できます。たとえば、次のようにします。
{#HOST} → $.host
これで、この {#HOST} マクロをアイテムプロトタイプで使用できます。
