这种低级别的 discovery操作通过SQL queries完成,其结果get会自动转换为适用于低级发现的JSON object
SQL queries 通过"Database monitor" 监控项 类型执行 因此,ODBC monitoring页面上的大部分说明同样适用于 为了get一个正常工作的"数据库监控"发现规则。
在"数据库监控"发现规则中可以使用两个监控项键:
db.odbc.discovery[<unique short
description>,<dsn>,<connection string>] - this item transforms the SQL query result into a JSON array, turning the column names from the query result into low-level discovery macro names paired with the discovered field values. These macros can be used in creating item, trigger, etc prototypes. See also: Using db.odbc.discovery.
db.odbc.discovery[]
, 该 监控项 不 create 低级发现 返回的JSON中的宏,因此无需检查是否 列名可以是有效的宏名称。低级发现 宏可以根据需要作为额外步骤进行定义,使用 自定义宏 功能通过JSONPath指向发现的值 返回的JSON。另请参阅:使用db.odbc.get。作为说明SQLquery如何转换为JSON的实际示例,让我们考虑通过对Zabbix数据库执行ODBCquery来实现Zabbix proxies的低级发现。这对于自动创建"zabbix[proxy,<name>,lastaccess]"internal items以监控哪些proxies处于活动状态非常有用。
让我们从发现规则配置开始:
所有必填字段都用红色星号标记。
这里使用以下直接对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.proxy_hostid 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,就可以在监控项原型中使用{#主机}宏:
执行发现后,将为每个proxy创建一个监控项:
使用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.proxy_hostid 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创建自定义低级发现宏,例如:
现在这个{#主机}宏可用于监控项原型: