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