使用ODBC SQL的12发现queries

概述

这种低级别 discovery 是使用 SQL queries 完成的,其结果 get 会自动转换为适用于低级别发现的 JSON object。

监控项键

SQL queries 使用“数据库监视器”监控项 类型执行。 因此,ODBC monitoring 页面上的大多数说明均适用。 为了使“数据库监视器”发现规则正常工作,需要执行以下步骤:get。

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

  • db.odbc.discovery[<unique short 描述>,<数据源名称>,<连接 string] - 此 监控项 将SQL query 结果转换为 JSON array,并将其转换为 将query结果中的列名放入低级别自动发现宏中 与发现字段值配对的名称。这些宏可以是 用于创建 监控项、触发器等原型。另请参阅:使用 db.odbc.discovery.

  • db.odbc.get[<unique short description>,<dsn>,<connection string>]** - 此 监控项 将SQL query 结果转换为 JSON array,并保持 将 query 结果中的原始列名作为 JSON 中的字段名 与发现的值配对。与 db.odbc.discovery[],此 监控项 不支持 create 低级别自动发现 返回的 JSON 中的宏,因此无需检查是否 列名称可以是有效的宏名称。低级别自动发现 宏可以根据需要在后续步骤中定义,使用 自定义宏 使用 JSONPath 指向发现值的功能, 返回的 JSON。另请参阅:使用 db.odbc.get

使用 db.odbc.discovery

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

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

lld_rule_odbc.png

所有必填输入字段均以红色星号标记。

在此示例中,使用了对Zabbix数据库的以下直接query,用于选择所有Zabbix proxies及其正在监控的主机数量。例如,可以使用主机数量来过滤掉空的proxies:

mysql> SELECT h1.主机, COUNT(h2.主机) AS count FROM 主机 h1 LEFT JOIN 主机 h2

ON h1.hostid = h2.proxyid WHERE h1.status IN (5, 6) GROUP BY h1.主机; +---------+-------+ | 主机 | 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"。

如果列名无法转换为有效的宏名称,则发现规则将变为不受支持状态,并显示指出违规列号的错误消息。如果需要额外帮助,可以在DebugLevel=4时在Zabbix server日志文件中查看获取的列名:

$ grep db.odbc.discovery /tmp/zabbix_server.log
        ...
        23876:20150114:153410.856 In db_odbc_discovery() query:'SELECT h1.主机, COUNT(h2.主机) FROM 主机 h1 LEFT JOIN 主机 h2 ON h1.hostid = h2.proxy_hostid WHERE h1.status IN (5, 6) GROUP BY h1.主机;'
        23876:20150114:153410.860 db_odbc_discovery() column[1]:'主机'
        23876:20150114:153410.860 db_odbc_discovery() column[2]:'COUNT(h2.主机)'
        23876:20150114:153410.860 End of db_odbc_discovery():NOTSUPPORTED
        23876:20150114:153410.860 监控项 [Zabbix server:db.odbc.discovery[proxies,{$DSN}]] error: Cannot convert column #2 name to macro.

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

item_prototype_odbc.png

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

discovered_items_odbc1.png

使用 db.odbc.get

使用 db.odbc.get[,{$DSN}] 以及以下 SQL 示例:

mysql> SELECT h1.主机, COUNT(h2.主机) AS count FROM 主机 h1 LEFT JOIN 主机 h2

ON h1.hostid = h2.proxyid WHERE h1.status IN (5, 6) GROUP BY h1.主机; +---------+-------+ | 主机 | count | +---------+-------+

Japan 1 | 5 |
Japan 2 | 12 | | 拉脱维亚 (Latvia) | 3 | +---------+-------+ 3 行被返回(耗时 0.01 秒)

将返回以下 JSON:

[
           {
               "主机": "Japan 1",
               "count": "5"
           },
           {
               "主机": "Japan 2",
               "count": "12"
           },
           {
               "主机": "Latvia",
               "count": "3"
           }
       ]

如您所见,这里并没有低级别自动发现宏。然而,可以在发现规则的 自定义宏 标签下使用 JSONPath 创建自定义低级别自动发现宏,例如:

{#HOST} → $.主机

现在,这个 {#主机} 宏可以在 监控项原型 中使用:

item_prototype_odbc.png