4 自动发现SNMP OIDs

概述

在本节中,我们将对一个 SNMP 设备执行低级别发现

自 Zabbix 服务器/proxy 6.4 起,已支持这种基于 SNMP OID 的发现方法。

示例配置

1. 创建一个 SNMP agent 监控项,使用如下键值:

walk[.1.3.6.1.4.1.9999.1.1.1.1]

该监控项执行一次 SNMP 表 walk,并在一次请求中返回表中的所有条目,返回格式与 snmpwalk 工具在使用格式化选项 -Oe -Ot -On 时的输出一致。

它将返回如下多行文本值:

.1.3.6.1.4.1.9999.1.1.1.1.1.1 = STRING: "Temperature Sensor"
.1.3.6.1.4.1.9999.1.1.1.1.2.1 = STRING: "temp"
.1.3.6.1.4.1.9999.1.1.1.1.3.1 = 100
.1.3.6.1.4.1.9999.1.1.1.1.1.2 = STRING: "Humidity Sensor"
.1.3.6.1.4.1.9999.1.1.1.1.2.2 = STRING: "humidity"
.1.3.6.1.4.1.9999.1.1.1.1.3.2 = 200

2. 创建一个发现规则:

  • Name 字段中,输入一个描述性的发现规则名称(例如,“Discover sensors”)。
  • Type 字段中,选择“Dependent item”。
  • Key 字段中,输入一个描述性的键值(例如,“net.if.discovery”)。
  • Master item 字段中,选择“SNMP walk item”。

3. 在 Preprocessing 选项卡中,添加一个预处理步骤,在 Name 下拉框中选择 “SNMP walk to JSON”,并配置 3 个参数:

  • Field name:“{#SENSORNAME}”;OID prefix:“.1.3.6.1.4.1.9999.1.1.1.1.1”;Format:“Unchanged”。
  • Field name:“{#SENSORTYPE}”;OID prefix:“.1.3.6.1.4.1.9999.1.1.1.1.2”;Format:“Unchanged”。
  • Field name:“{#SENSORVALUE}”;OID prefix:“.1.3.6.1.4.1.9999.1.1.1.1.3”;Format:“Unchanged”。

预处理后,发现规则将返回一个由宏集合组成的 JSON 数组。

例如:

[
    {
        "{#SNMPINDEX}": "1",
        "{#SENSORNAME}": "Temperature Sensor",
        "{#SENSORTYPE}": "temp",
        "{#SENSORVALUE}": "100"
    },
    {
        "{#SNMPINDEX}": "2",
        "{#SENSORNAME}": "Humidity Sensor",
        "{#SENSORTYPE}": "humidity",
        "{#SENSORVALUE}": "200"
    }
]

每个对象表示一个已发现的传感器,并提供诸如 {#SNMPINDEX}{#SENSORNAME}{#SENSORTYPE}{#SENSORVALUE} 之类的宏。

它们按 SNMP 索引分组,该索引是每个 OID 末尾的数字后缀(例如 .1、.2)—— 该索引可唯一标识 SNMP 表中的每一行,并会自动提取为 {#SNMPINDEX}

4. 在该发现规则下,创建一个或多个监控项原型(以发现规则作为 master item)。

例如,传感器值 dependent item:

  • Name 字段中,输入 “Sensor {#SNMPINDEX}: {#SENSORNAME}”。
  • Type 字段中,选择 “Dependent item”。
  • Key 字段中,输入 “sensor.value[{#SNMPINDEX}]”。
  • Master item 字段中,选择 “SNMP walk item”。

Preprocessing 选项卡中,添加一个预处理步骤,在 Name 中选择 “SNMP walk value”,并在 Parameter 字段中填写 OID “.1.3.6.1.4.1.9999.1.1.1.1.3.{#SNMPINDEX}”。 Format:“Unchanged”。

将发现以下监控项:

Name Key 提取值的 OID 监控项值
Sensor 1: Temperature Sensor sensor.value[1] .1.3.6.1.4.1.9999.1.1.1.1.3.1 100
Sensor 2: Humidity Sensor sensor.value[2] .1.3.6.1.4.1.9999.1.1.1.1.3.2 200

当发现规则运行时,将创建诸如 sensor.value[1]sensor.value[2] 之类的监控项。

每个 dependent item 都通过预处理从 master item 的 SNMP walk 结果中提取其值,而无需自行执行单独的 SNMP 请求。

5. 在触发器原型中使用与发现规则相同的宏来引用 dependent item 原型。 例如:

{Template_Sensor:sensor.value[{#SNMPINDEX}].last()} > 75

这将为每个已发现的传感器生成一个触发器(例如,sensor.value[1]、sensor.value[2]),并在最新值(温度或湿度)超过 75 时触发。

6. 为每个已发现的实体包含 dependent item。 图形监控项键值示例:

sensor.value[{#SNMPINDEX}]

将为每个 {#SNMPINDEX} 创建一个图形,用于绘制温度和湿度随时间变化的曲线。

无论发现了多少个监控项,此配置在每个轮询周期内都只执行一次 SNMP walk 请求。 所有 dependent item 都通过预处理从 master SNMP walk 结果中提取其值,从而显著减少 SNMP 流量和负载。

使用 walk[] 的动态索引

动态索引(例如接口索引)可能会在硬件重新配置时发生变化。 为适应这种行为,可以创建一个主 SNMP walk 发现规则,并使用如下 key:

walk[1.3.6.1.2.1.2.2.1.10]

在经过 SNMP walk to JSON 预处理后,结果可能类似于:

[
    {
        "{#SNMPINDEX}": "2",
        "{#VALUE}": "123456"
    },
    {
        "{#SNMPINDEX}": "3",
        "{#VALUE}": "654321"
    }
]

一个依赖监控项原型使用 {#SNMPINDEX} 宏来构造 key:

net.if.in[{#SNMPINDEX}]

此原型的预处理包含名称为 “SNMP walk value” 的步骤,并在 Parameter 字段中使用 OID “1.3.6.1.2.1.2.2.1.10.{#SNMPINDEX}”。 Format:“Unchanged”。

在运行时,将创建实际监控项,例如 net.if.in[2]net.if.in[3]。 如果某个接口索引发生变化(例如,在 SNMP 表中索引 25 替换),那么在发现规则下一次运行时:

  • 旧的依赖监控项 net.if.in[2] 会被标记为“丢失”或被移除,并且不再为该监控项采集新数据。
  • 将创建新的依赖监控项 net.if.in[5],并从空历史记录开始。
  • net.if.in[2] 的历史数据不会自动迁移到 net.if.in[5]。

触发器原型示例:

{Template_Interface:net.if.in[{#SNMPINDEX}].last()} > 1000000000

图形原型示例包含以下监控项:

net.if.in[{#SNMPINDEX}]
net.if.out[{#SNMPINDEX}]

此配置可确保对具有动态索引的表进行可靠监控,同时尽量减少 SNMP 流量——每个轮询周期只需要执行一次 SNMP walk,而依赖监控项原型会提取所需的值。

已发现的实体

当服务器运行时,它将根据 SNMP 发现规则返回的值创建实际的依赖监控项、触发器和图形。