12 使用ODBC SQL的发现queries

概述

这类底层discovery操作通过SQLqueries实现,其结果get会自动转换为适用于低级发现的JSONobject格式。

监控项键

SQL queries 通过"数据库监控"监控项类型执行 因此,ODBC monitoring 页面上的大多数说明都适用于get一个正常工作的"数据库监控"发现规则。

在"数据库监控"发现规则中可以使用两个监控项键值:

  • db.odbc.discovery[<唯一简短描述>,<数据源名称>,<连接string>] - 该监控项将SQLquery结果转换为JSONarray格式,将query结果中的列名转换为低级发现宏名称,并与发现的字段值配对。 这些宏可用于创建监控项、触发器原型等。 另请参阅:使用 db.odbc.discovery.

  • db.odbc.get[<唯一简短描述>,<数据源名称>,<连接string>] - 此监控项将SQLquery结果转换为JSONarray, 并保留来自query结果的原始列名作为JSON中的字段名称与查询到的值配对. 与db.odbc.discovery[]相比,该监控项不会create返回JSON中的低级发现宏,因此无需检查列名是否可作为有效的宏名称。 低级发现宏可根据需要作为额外步骤进行定义,使用custom LLD macro功能并结合JSONPath指向返回JSON中的发现值。 另请参阅:使用 db.odbc.get.

使用 db.odbc.discovery

作为说明SQLquery如何转换为JSON的实际示例,让我们考虑通过对Zabbix数据库执行ODBCquery来实现Zabbix proxies的低级发现。 这对于自动创建"zabbix[proxy,<name>,lastaccess]"internal items以监控哪些proxies处于活动状态非常有用。

让我们从发现规则配置开始:

lld_rule_odbc.png

所有必填字段都用红色星号标记。

这里使用以下直接对Zabbix数据库的query来选择所有Zabbix proxies,以及它们监控的主机数量。 主机的数量可用于过滤掉空的proxies:

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}]"监控项的内部工作原理,此query的结果会自动转换为以下JSON:

[
           {
               "{#HOST}": "Japan 1",
               "{#COUNT}": "5"
           },
           {
               "{#HOST}": "Japan 2",
               "{#COUNT}": "12"
           },
           {
               "{#HOST}": "Latvia",
               "{#COUNT}": "3"
           }
       ]

可以看到列名变为宏名称,选中的行成为这些宏的值。

如果不清楚列名如何转换为宏名,建议使用列别名,如上面示例中的"COUNT(h2.主机) AS count"。

如果列名无法转换为有效的宏名,则发现规则将不受支持,并显示错误消息详细说明有问题的列号。 如果需要其他帮助,在Zabbix server日志file的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.

现在我们了解了SQLquery如何转换为JSONobject,我们可以在监控项原型中使用{#主机}宏:

item_prototype_odbc.png

一旦执行发现,将为每个proxy创建一个监控项:

discovered_items_odbc1.png

使用 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"
           }
       ]

可见其中并不包含低级发现宏。 但可以通过JSONPath在发现规则的LLD macros选项卡中创建自定义低级发现宏,例如:

{#HOST} → $.host

现在这个{#主机}宏可用于监控项原型:

item_prototype_odbc.png