自动发现(LLD)为在计算机上为不同实体自动创建监控项、触发器和图形提供了有效途径。例如,Zabbix 能够在机器上自动启动对文件系统或网络接口的监控,无需为每个文件系统或网络接口手动创建监控项;还可配置 Zabbix 依据定期执行发现后的实际结果,移除不必要的监控。
除 Linux 系统自带的发现字段外,Zabbix 还支持通过 snmp OID 进行自动发现。用户可自行定义发现类型,只要脚本返回值遵循特定的 JSON 格式即可。
配置自动发现过程通常如下:首先,用户在 “配置”→“模板”→“发现” 列中创建一个发现规则。该发现规则包含(1)发现必要实体(如文件系统或网络接口)的项;(2)应根据该项的值创建的监控项、触发器和图形的原型。
Zabbix 内置关键字可理解为 Zabbix 底层的函数 / 接口,用户能通过调用这个函数 / 接口(或在调用时传参)获取指定格式的值;若需自定义发现规则,Zabbix 内置关键字可以是用户自行编写的脚本 / 函数 / 接口。
以通过 SNMP 发现接口入方向流量的示例进行解析。首先创建一个模板:
然后找到刚创建的模板并进行编辑:
进入模板后,创建一个自动发现规则:
填入如下内容:
图中:
这个步骤用于获取自动发现规则中的键值:discovery [{#IFDESCR},1.3.6.1.2.1.2.2.1.2,{#IFTYPE},1.3.6.1.2.1.2.2.1.3] 的行为大致等同于:
{#IFDESCR} = snmpwalk -v 2c -c public 192.168.1.1 1.3.6.1.2.1.2.2.1.2
{#IFTYPE} = snmpwalk -v 2c -c public 192.168.1.1 1.3.6.1.2.1.2.2.1.3
由于 snmpwalk 遍历出的值较多,假设 snmpwalk 的结果如下:
$ snmpwalk -v 2c -c public 192.168.1.1 1.3.6.1.2.1.2.2.1.2 |
snmp 一般通过索引定位,Zabbix 内置关键字 discovery 为返回结果自动添加了索引,所以 discovery [{#IFDESCR},1.3.6.1.2.1.2.2.1.2,{#IFTYPE},1.3.6.1.2.1.2.2.1.3] 最终获取的结果为(JSON 格式也是预先定义好的,我们只需填充值):
{ |
Zabbix 规定自动发现规则必须是上述 JSON 格式,即以 “data” 为字典的键,值为字典组成的列表,字典中包含用户自定义的变量和根据关键字获取的值。(实际测试表明,自定义脚本只有值(字典组成的列表)也是可行的)。
接下来添加【监控项原型】,原型即模板,用于生成一系列监控项。
图中:
自动发现规则与监控项原型协同工作,原理大致如下:
discovery 获取 SNMPINDEX 和 IFDESCR 的对应信息,如:
{#SNMPINDEX}: 1,{#IFDESCR}: "G1/0/1", {#SNMPINDEX}: 2,{#IFDESCR}: "G1/0/2"} |
自动发现规则获取接口列表后,根据监控项原型中的 SNMP OID 获取流量,为当前设备的其中一个接口生成监控项,如:if.in.bits.G1/0/1:102400
① 监控项的 key:if.in.bits [G1/0/1] 由第一步自动发现和监控项原型 key 拼接而成。
② 流量信息 102400 由 1.3.6.1.2.31.1.1.1.6.1 这个 OID 获取(类似 snmpwalk 操作)。
将这个自动发现规则应用到设备上后,可获得三个监控项,分别是:
名称 | key | 流量获取方法 |
Incoming traffic on interface G1/0/1 | if.in.bits[G1/0/1] | 通过 OID 1.3.6.1.2.31.1.1.1.6.1 获取 |
Incoming traffic on interface G1/0/2 | if.in.bits[G1/0/2] | 通过 OID 1.3.6.1.2.31.1.1.1.6.2 获取 |
Incoming traffic on interface G1/0/3 | if.in.bits[G1/0/3] | 通过 OID 1.3.6.1.2.31.1.1.1.6.3 获取 |
以上就是通过 snmp oid 获取自动发现接口入方向流量的示例。
为加深理解,可手动添加一个自定义发现规则。
以自动返回 ping 结果的自动发现规则为例,首先编写如下脚本,返回的 JSON 需遵循固定格式:
#!/root/bin/python3 |
脚本具备两个功能:
执行结果如下:
# 直接执行 |
一般情况下,实现这两个功能的脚本应分开编写,本示例为简化操作放在了一起。
接下来添加自动发现规则,以在 agent 添加自定义 key 为例:
# 修改agent的配置文件,添加客户端自定义key,允许传参 |
页面上添加自动发现规则:
添加完成后,点进规则里面,添加【监控项原型】
添加完成后,手动执行一下发现规则:
查看自动发现的监控项:
查看获取到的数据:
错误信息