11 利用ODBC SQL查询执行自动发现

    概述

    监控项的键

    设置监控项类型为 “数据库监控” 来执行SQL查询。 所以为了让一个”数据库监控”类型的自动发现规则正常工作,可以参考ODBC监控 页面中的大部分指南。

    “数据库监控”类型的自动发现规则会用到两个键:

    • db.odbc.discovery[<唯一简短描述>,<dsn(数据来源名称)>,<连接字符串>] - 此监控项将SQL查询结果转换为一个JSON数组,其中表的字段名称会转换为宏的名称,宏的名称与发现的对应值成对匹配。这些宏可用于创建监控项和触发器等原型。另请参阅: 。

    • db.odbc.get[<唯一简短描述>,<dsn(数据来源名称)>,<连接字符串>] - 此监控项将SQL查询结果转换为一个JSON数组,保留原始表字段名称作为输入框的名称,以JSON格式表示,并与对应的已发现的值成对匹配。相比于 , 此监控项不在返回的JSON数组中创建低级别自动发现的宏, 因此无需检查表字段名称是否是有效的宏名称。通过使用 自定义LLD 宏, 将JSONPath指向对应JSON值,可作为额外步骤按需定义低级别自动发现的宏。另请参阅: 。

    使用db.odbc.discovery

    让我们看一个SQL查询转换为JSON数组的真实案例。思考一下如何在Zabbix数据库上使用ODBC查询对Zabbix proxy执行低级别自动发现。 此功能对于自动创建 “zabbix[proxy,<name>,lastaccess]“ 并监控存活的proxy很有用。

    下面开始配置自动发现规则:

    所有强制输入区域均标记为红色星号。

    此处Zabbix数据库上的查询用于查询所有Zabbix proxy,连同proxy所监控的主机数量. 比如,主机数量可用于过滤掉没有监控任何主机的proxy:

    通过 “db.odbc.discovery[,{$DSN}]“ 监控项的内部工作机制, 查询结果会自动转换为下面的JSON数组:

    1. [
    2. {
    3. "{#HOST}": "Japan 1",
    4. },
    5. {
    6. "{#HOST}": "Japan 2",
    7. },
    8. {
    9. "{#HOST}": "Latvia",
    10. "{#COUNT}": "3"
    11. }

    可以看到字段名称变为宏的名称, 所选的记录变成这些宏的值。

    如果通过这种方式展示字段名称转换为宏名称不是很明显,那建议在上面的例子中使用字段别名,比如 “COUNT(h2.host) AS count”。

    如果字段名称无法转换为有效的宏名称,则自动发现规则变为unsupport(不支持的)状态,其错误消息显示不合规字段的编号. 如果需要额外帮助, debug级别DebugLevel=4的Zabbix server日志文件中可找到获取的字段名称:

    一旦自动发现开始执行, 会根据每个proxy创建一个对应的监控项:

    discovered_items_odbc1.png

    使用db.odbc.get

    请看下面使用 db.odbc.get[,{$DSN}] 和相关SQL语句的例子:

    1. +---------+-------+
    2. | host | count |
    3. +---------+-------+
    4. | Japan 1 | 5 |
    5. | Japan 2 | 12 |
    6. | Latvia | 3 |
    7. +---------+-------+

    会返回这个JSON数组:

    可以看到, 返回的JSON数组中不包含低级别自动发现的宏. 然而, 可以在自动发现规则的 选项卡中利用JSONPath来自定义宏, 比如: