这种低级别 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。
作为一个实际示例来说明SQL query如何转换为JSON,让我们考虑通过对Zabbix数据库执行ODBC query来实现对Zabbix proxies的低级别自动发现。这对于自动创建"zabbix[proxy,<name>,lastaccess]" internal items以监控哪些proxies处于活动状态非常有用。
让我们从发现规则的配置开始:
所有必填输入字段均以红色星号标记。
在此示例中,使用了对Zabbix数据库的以下直接query,用于选择所有Zabbix proxies及其正在监控的主机数量。例如,可以使用主机数量来过滤掉空的proxies:
ON h1.hostid = h2.proxyid WHERE h1.status IN (5, 6) GROUP BY h1.主机; +---------+-------+ | 主机 | count | +---------+-------+
通过"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,我们可以在监控项原型中使用{#主机}宏:
一旦执行了发现操作,将为每个proxy创建一个监控项:
使用 db.odbc.get[,{$DSN}]
以及以下 SQL 示例:
ON h1.hostid = h2.proxyid WHERE h1.status IN (5, 6) GROUP BY h1.主机; +---------+-------+ | 主机 | count | +---------+-------+
将返回以下 JSON:
[
{
"主机": "Japan 1",
"count": "5"
},
{
"主机": "Japan 2",
"count": "12"
},
{
"主机": "Latvia",
"count": "3"
}
]
如您所见,这里并没有低级别自动发现宏。然而,可以在发现规则的 自定义宏 标签下使用 JSONPath 创建自定义低级别自动发现宏,例如:
现在,这个 {#主机} 宏可以在 监控项原型 中使用: