このタイプのローレベルディスカバリは、SQLクエリを使用して実行され、その結果はローレベルディスカバリに適したJSONオブジェクトに自動的に変換されます。
SQLクエリは「Database monitor」アイテムタイプを使用して実行されます。 したがって、動作する「Database monitor」ディスカバリールールを取得するには、ODBC監視ページのほとんどの手順が適用されます。
「Database monitor」ディスカバリールールでは、2つのアイテムキーを使用できます。
db.odbc.discovery[<一意の短い説明>,<dsn>,<接続文字列>] - このアイテムは、SQLクエリの結果をJSON配列に変換し、クエリ結果の列名を低レベルディスカバリーマクロ名に変換し、検出されたフィールド値とペアにします。 これらのマクロは、アイテム、トリガーなどのプロトタイプ作成時に使用できます。 詳細はdb.odbc.discoveryの使用も参照してください。
db.odbc.get[<一意の短い説明>,<dsn>,<接続文字列>] - このアイテムは、SQLクエリの結果をJSON配列に変換し、クエリ結果の元の列名をJSONのフィールド名として保持し、検出された値とペアにします。 db.odbc.discovery[]と比較して、このアイテムは返されるJSONに低レベルディスカバリーマクロを作成しないため、列名が有効なマクロ名になり得るかどうかを確認する必要はありません。 低レベルディスカバリーマクロは、必要に応じてカスタムLLDマクロ機能を使用し、返されたJSON内の検出された値を指すJSONPathを指定して追加ステップとして定義できます。 詳細はdb.odbc.getの使用も参照してください。
次の例は、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[,{$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"
}
]ご覧の通り、ここには低レベルディスカバリマクロはありません。 ただし、LLDマクロタブで、JSONPathを使用してカスタムの低レベルディスカバリマクロを作成できます。例えば:
この{#HOST}マクロはアイテムプロトタイプで使用できます。
