2022 Zabbix中国峰会
2022 Zabbix中国峰会

3 低级别自动发现

概述

低级别自动发现提供了一种为计算机上的不同实体自动创建监控项、触发器和图表的方法。例如,Zabbix 可以自动对计算机上的文件系统或网络接口进行监控,而不需要为每个文件系统或网络接口手动创建监控项。另外,可以基于周期性自动发现的结果来删除无用的监控实体。

用户可以基于特定的JSON格式来自定义发现类型。

自动发现的大体流程如下:

首先,用户在 "配置" → "模板" → "自动发现" 一栏中创建发现规则。发现规则包含用来发现特定实体(如文件系统和网络接口)的(1)监控项以及监控项、触发器和图表的(2)原型。

用于自动发现的监控项与常规监控项没有大体区别:Zabbix server向agent(或者其它任何类型的监控代理)请求监控项的值,agent对其回复一个文本值。唯一区别是agent响应中包含所发现的一系列JSON数组。对自动发现检查规则有自定义的需求时才需要了解格式的细节方面,不过有必要知道返回值包含一系列 宏 → 值 的键值对。比如,监控项 "net.if.discovery" 会返回两组键值对:"{#IFNAME}" → "lo" 和 "{#IFNAME}" → "eth0"。

当创建实际的监控项、触发器、图表以及主机时,宏会替换成接收到的值。使用低级别自动发现(LLD)的宏请参考 选项 中的全部列表。

当通过自动发现收到监控项返回值的时候,Zabbix server会查找 宏 → 值 键值对,每一对 宏 → 值 会基于原型生成监控项、触发器和图表。在上述 "net.if.discovery" 的例子中,为环回接口 "lo" 生成了一组监控项、触发器和图表,为 "eth0"接口生成了一组监控项、触发器和图表。

注意,自从Zabbix 4.2 开始,低级别自动发现返回的JSON数组的格式变化了。JSON格式将不再包含 "data" 对象。现在低级别自动发现接受一个普通的JSON数组,来支持一些新特性,如监控项值的预处理和对于JSON文件中用于低级别自动发现的宏的路径自定义。

内置的自动发现的键已经可以实现在JSON文件的根路径返回一个低级别自动发现数组。如果数组使用{#MACRO}作为键,则宏和值会自动提取。任何新的内置自动发现检查都将使用没有“ data”元素的新语法。当处理一个低级别自动发现的值时,第一个步骤就是定位根目录 (数组位于 $.$.data)。

当"data"元素从所有跟自动发现有关的内置监控项中移除时,为了向后兼容,Zabbix会接受带有"data"元素的JSON格式,不过并不鼓励这么用。如果JSON数据包含一个对象,该对象只有一个"data"数组,则"data"数组的内容会通过JSONPath $.data自动提取出来。低级别自动发现现在接受可选的自定义宏,可在JSONPath语法中自定义路径。

由于上述更改,较新的代理将不再能够和较旧的 Zabbix 服务器兼容。

参阅: 被发现的实体

配置低级别自动发现

我们将基于一个文件系统自动发现的示例来说明低级别发现。

要配置自动发现, 需完成下列操作:

  • 找到: 配置模板主机
  • 在对应模板/主机中点击 自动发现

  • 在屏幕右上角点击 创建自动发现规则
  • 在发现规则表格中填入所需信息

自动发现规则

自动发现规则表格包含五个选项卡,从左到右表示自动发现的数据流:

  • 自动发现规则 - 最重要的一项,指定了用于获取自动发现的数据的内置监控项或自定义脚本
  • 预处理 - 对发现的数据进行预处理
  • LLD 宏 - 允许提取一些宏值用于已发现的监控项、触发器等
  • 过滤 - 过滤发现的值
  • 覆盖 - 允许对已发现的特定对象的监控项、触发器、图形或主机原型进行修改

自动发现规则 选项卡包含用于自动发现的监控项的键 (以及一些通用的发现规则属性):

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

参数 描述
名称 自动发现规则名称。
类型 自动发现检查的类型。
此例中使用 Zabbix agent 这个监控项的键。
自动发现规则还可以定义为 依赖型监控项, 此监控项依赖标准监控项,但不可依赖于其它自动发现规则。对于一个依赖型监控项来说, 选择对应类型 (依赖型监控项) 然后在 '主监控项' 区域指定主监控项。主监控项必须已存在。
输入监控项的键 (最大2048个字符)。
例如,可以使用内置的 "vfs.fs.discovery" 监控项的键来返回一个JSON,其中包含计算机上存在的文件系统、它们的类型和挂载选项的列表。
注意,文件系统自动发现还可以使用"vfs.fs.get"键的发现结果 (参照 示例)。
更新间隔 此区域指定了执行自动发现的频率。刚开始执行文件系统自动发现时,可以设置很小的间隔,但当发现之前设置的已经生效,就可以改为30分钟或更长。因为文件系统通常不太会变化。
支持时间后缀,比如 30s, 1m, 2h, 1d。
支持用户宏
注意: 如果设置了取值非零的自定义间隔,则更新间隔才能设置为'0'。 如果更新间隔设置为 '0', 并且自定义间隔 (类型:灵活 或 计划) 不等于0, 则监控项的检查频率基于自定义间隔。
新的发现规则将在创建后60秒内检查,除非它们具有调度或灵活更新间隔,并且更新间隔设置为0
注意 对于已存在的自动发现规则来说,通过点击 立刻检查 按钮可以立即执行自动发现。
自定义间隔 可创建自定义规则来检查监控项:
灵活 - 创建一个 例外的更新间隔 (不同频率的更新间隔)。
计划 - 创建一个自定义的更新时间表。
详细信息参阅 自定义间隔
超时 设置自动发现检查超时。选择超时选项:
全局 - 使用了Proxy/全局超时 (超时 字段显示为灰色);
覆盖 - 使用自定义超时(在 Timeout 字段中设置; 允许的范围: 1 - 600s).支持 时间单位, e.g. 30s, 1m, 和 用户宏.
点击 超时 链接跳转到 proxy超时设置 or 全局 超时设置 (如果没有使用proxy). 注意 超时 链接只对 超级管理员 类型用户可见,他们才有 管理常规管理Proxies 前端菜单的权限.
删除丢失的资源 定义被发现的实体一旦发现状态变为: "不再被发现" 时多久后被删除:
从不 - 不会被删除;
立即 - 立即被删除;
之后 - 在定义的时间周期之后被删除.这个值必须大于 禁用丢失的资源 的值.
支持 时间单位 , 例如. 2h, 1d.
支持 用户宏 .
注意: 不推荐使用 "立即" , 因为如果只是错误地编辑过滤器从而导致实体与所有的历史数据一起被删除.
请注意,低级别自动发现不会删除手动禁用的资源.
禁用丢失的资源 定义被发现的实体一旦发现状态变为: "不再被发现" 时多久后被禁用:
从不 - 不会被禁用;
立即 - 立即被禁用;
之后 - 在定义的时间周期之后被禁用. 这个值应该大于发现规则更新间隔.
注意,如果被低级别自动发现重新发现,自动禁用的资源将再次启用. 手动禁用的资源再次发现后不会被启用.
如果删除丢失的资源 设置为 "立即",则不显示此字段.
支持 时间单位 are supported, 例如. 2h, 1d.
支持 用户宏 .
描述 输入描述信息.
启用 如果选中此选项,则将执行该规则.

自动发现规则历史记录不会保存。

预处理

预处理 选项卡定义发现结果的转换规则。可以定义一个或多个转换规则。 转换规则执行的顺序以定义的顺序为准。所有预处理均由Zabbix server来执行。

参阅:

类型
转换 描述
文本
正则表达式 将接收的值匹配正则表达式的匹配模式<pattern>,并替换为输出<output>。正则表达式可以使用 \N 转义字符提取最多10个匹配的组。
参数:
匹配模式 - 正则表达式
输出 - 输出格式化的模板。一个 \N (N=1…9) 转义字符会替换为第N个匹配的组。一个 \0 转义字符替换为匹配的文本。
如果选取了 失败时自定义 复选框, 则可以自定义错误处理选项: 丢弃值,将值设置为,将错误设置为。
替换 搜索字符串并替换为另一个字符串或空字符串。所有搜索结果均会被替换。
参数:
搜索字符串 - 需要搜索的字符串, 大小写敏感(强制要求)
替换 - 最终替换成为的字符串。替换成为的字符串可以是空值,通常用于删除搜索字符串。
可使用转义字符 "\n \r \t \s" 查找替换换行符, 回车, 制表符和空格; 反斜线可以用 "\\" 转义,转义序列可以用 "\\n"转义。低级别自动发现过程中,换行符, 回车和制表符自动转义。
结构化数据
JSONPath 使用JSONPath功能提取数据或将JSON数据分片。
如果选取了 失败时自定义 复选框, 万一预处理失败,监控项不会变为不支持。另外还可以自定义错误处理选项: 丢弃值,将值设置为,将错误设置为。
XML XPath 使用XPath功能提取数据或将XML数据分片。
要使用此功能,Zabbix server服务器需要安装libxml库。
例子:
number(/document/item/value) 会从 <document><item><value>10</value></item></document>提取 10
number(/document/item/@attribute) 会从 <document><item attribute="10"></item></document>提取 10
/document/item 会从 <document><item><value>10</value></item></document>提取 <item><value>10</value></item>
注意,不支持名称空间。
如果选取了 失败时自定义 复选框, 则可以自定义错误处理选项:丢失该值、设置指定的值或设置指定的错误消息。
CSV to JSON 将 CSV 文件数据转换为 JSON 格式。
更多信息请参考: CSV到JSON数据预处理.
XML to JSON 将 XML 格式的数据转换为 JSON。
更多信息请参阅: 序列化规则.
如果选取了 失败时自定义 复选框, 则可以自定义错误处理选项: 丢弃值,将值设置为,将错误设置为。
SNMP
SNMP 遍历值 根据指定的 OID/MIB 名称提取值并进行格式化设置选项:
未更新 - 不转义Hex-STRING十六进制字符;
UTF-8(16进制字符串) - 将十六进制字符串转换为 UTF-8字符串;
MAC(16进制字符串) - 将十六进制字符串转换为 MAC 地址字符串(将 ' ' 替换为 ':');
位转换为整数 - 将位字符串的前8个字节转换为十六进制字符序列(例如. "1A 2B 3C 4D")为64位无符号整数. 在长于8字节的位字符串中,将忽略相应的字节.
如果选取了 失败时自定义 复选框, 则可以自定义错误处理选项: 丢弃值,将值设置为,将错误设置为。
SNMP 遍历为JSON 将 SNMP 值转换为 JSON. 在 JSON 和相应的 SNMPOID 中指定一个字段名. 字段值将由指定 SNMPOID 的值填充。.
你可以对 SNMP OID discovery使用这个预处理.
可以使用与 SNMP 遍历值 步骤中类似的值格式设置选项.
如果选取了 失败时自定义 复选框, 则可以自定义错误处理选项: 丢弃值,将值设置为,将错误设置为。
SNMP 获取值 对 SNMP get 值进行格式化设置:
UTF-8(16进制字符串) - 将十六进制字符串转换为 UTF-8字符串;
MAC(16进制字符串) - 将十六进制字符串转换为 MAC 地址字符串(将 ' ' 替换为 ':');
位转换为整数 - 将位字符串的前8个字节转换为十六进制字符序列(例如. "1A 2B 3C 4D")为64位无符号整数. 在长于8字节的位字符串中,将忽略相应的字节.
如果选取了 失败时自定义 复选框, 则可以自定义错误处理选项: 丢弃值,将值设置为,将错误设置为。
自定义脚本
JavaScript 在单击参数字段或铅笔图标时出现的块中输入 JavaScript 代码。
注意,可输入的Javascript代码长度取决于 使用的数据库.
更多信息请参考: Javascript代码预处理
验证
未匹配正则表达式 指定一个值不匹配的正则表达式。
例如 Error:(.*?)\.
如果选取了 失败时自定义 复选框, 则可以自定义错误处理选项: 丢弃值,将值设置为,将错误设置为。
检查JSON中格式错误 检查位于 JSONPath 的应用程序级错误消息。如果执行成功并且信息不为空则停止处理;否则继续使用此预处理步骤之前的值进行处理。注意,不添加预处理步骤信息,这些外部服务错误原封不动报告给用户。
例如 $.errors。如果收到一个这样的JSON数据{"errors":"e1"} ,则下个预处理步骤不会执行。
如果选取了 失败时自定义 复选框, 则可以自定义错误处理选项: 丢弃值,将值设置为,将错误设置为。
检查XML数据错误 检查xpath路径下的应用层错误信息。如果执行成功并且信息不为空则停止处理; 否则继续使用此预处理步骤之前的值进行处理。注意,不添加预处理步骤信息,这些外部服务错误原封不动报告给用户。
无效的XML分析失败不会报告给用户。
如果选取了 失败时自定义 复选框, 则可以自定义错误处理选项: 丢弃值,将值设置为,将错误设置为。
匹配正在表达式 指定值必须匹配的正则表达式.
如果选取了 失败时自定义 复选框, 则可以自定义错误处理选项: 丢弃值,将值设置为,将错误设置为。
节流
丢弃检查周期内未变化的值 如果一个值在定义的时间周期内(秒)未改变,则丢弃该值。
秒数的范围为正整数(最小1秒)。可使用时间单位 (如 30s, 1m, 2h, 1d)。可使用用户宏和低级别自动发现宏。
一个自动发现监控项只能指定一个节流选项。
比如 1m. 如果规则在60秒内收到两次相同的值,则相同的值会被丢弃。
注意: 改变监控项原型不会重置节流。仅当预处理步骤发生变化时,节流才会重置。
Prometheus
Prometheus转JSON 转换Prometheus指标转换成JSON格式。
参阅 Prometheus检查 获取更多信息。

注意,如果自动发现规则已经通过模板应用到主机上,则此选项卡的内容是只读的。

自定义宏

LLD 宏 选项卡可以自定义低级别自动发现宏。

如果返回的JSON数据不包含所需的宏时,自定义宏就派上用场了。例如:

  • 用于文件系统自动发现的内置的 vfs.fs.discovery 键返回JSON数据,其中包含一些预定义的LLD宏,比如 {#FSNAME}, {#FSTYPE}。这些宏可直接用于监控项和触发器原型,(参考本页后续小节); 自定义宏不是强制的;
  • vfs.fs.get 键同样返回JSON数据,包含 文件系统数据, 但不包括任何预定义的LLD宏。此例中你可以自定义宏, 并把自定义的宏映射到JSONPath返回的JSON数据上:

提取的值可用于已发现的监控项、触发器等实体上。 注意,这些值将从自动发现的结果并进行了预处理步骤的结果中提取出来。

参数 描述
LLD宏 低级别自动发现宏的名称, 使用如下的语法格式: {#MACRO}.
JSONPath 使用 JSONPath 语法从 LLD 行提取 LLD 宏值的路径。.
比如, $.foo 会从下面的JSON数据中提取 "bar" 和 "baz": [{"foo":"bar"}, {"foo":"baz"}]
从JSON数据中提取的值用于替换监控项、触发器和其它实体的原型中配置的LLD宏。
可以使用点标记法或括号标记法来指定JSONPath。括号标记法应该用于任何使用特殊字符和编码的场景中, 像 $['unicode + special chars #1']['unicode + special chars #2']

过滤器

过滤器可用于生成只匹配过滤条件的监控项、触发器和图表。过滤器 选项卡包含自动发现规则的过滤器配置,其可以过滤自动发现的值:

参数 描述
计算方式 可用的过滤器选项如下:
- 必须满足所有过滤条件;
- 只需满足其中一条过滤条件即可;
和/或 - 不同宏的名称使用 ,相同宏的名称使用 ;
自定义表达式 - 可自定义过滤器的计算公式。公式必须包含列表中的所有过滤器。最大限制255个符号。
过滤器 可用下列过滤器条件操作符: 匹配, 不匹配, 存在, 不存在.
匹配不匹配 操作符可识别与Perl兼容的正则表达式 (PCRE). 例如, 如果你只对文件系统 C:, D: 和 E: 感兴趣, 那么可将 {#FSNAME} 放入 "宏" 然后 将正则表达式 "^C|^D|^E" 放入 "正则表达式" 文本区域. 还可通过使用{#FSTYPE} 宏 (比如. "^ext|^reiserfs") 过滤文件系统类型以及使用 {#FSDRIVETYPE} 宏 (比如, "fixed")过滤驱动类型 (只支持Windows agent)。
可以在 "正则表达式" 区域输入正则表达式或引用全局的 正则表达式
要测试正则表达式,可以使用"grep -E", 比如: for f in ext2 nfs reiserfs smbfs; do echo $f \| grep -E '^ext\|^reiserfs' \|\| echo "SKIP: $f"; done

存在不存在 操作符允许基于响应中是否存在指定的 LLD 宏来筛选实体。

LLD 规则中使用的正则表达式中的错误或输入错误(例如, 一个错误的 "File systems for discovery" 的正则表达式)可能造成很多个配置项、历史数据以及主机的事件信息被删除。

如果要正确发现大小写不同的文件系统名称,那么Zabbix的MYSQL数据库必须配置成大小写敏感。

覆盖

覆盖 选项卡允许对满足给定条件发现出来的对象,设置规则来修改监控项,触发器、图形和主机原型或它们的属性。

覆盖(如果有的话)显示在一个可重新排序的拖放列表中,并且按照定义的顺序执行。 配置一个新的覆盖,在 覆盖 选项卡单击 。要编辑现有覆盖,请单击覆盖名称。在弹出窗口中编辑覆盖规则详细信息。

所有强制参数都标有红色星号。

参数 描述
名称 唯一的(根据 LLD 规则)覆盖名称。
如果匹配过滤器 当下面条件满足时,是否需要执行下一步覆盖:
继续覆盖 - 后续覆盖会被执行。
停止处理 - 执行先前的(如有的话)操作并且当前这个覆盖也会被执行,对于匹配的 LLD 行,将忽略后续重写。
过滤器 定义了覆盖会应用到哪些已发现实体上。覆盖过滤器在自动发现规则的过滤器 之后执行,其和自动发现规则的过滤器功能相同。
操作 覆盖操作包含下列内容:
条件 - 一个对象类型 (监控项原型/触发器原型/图表原型/主机原型) 和一个需要满足的条件(等于/不等于/包含/不包含/匹配/不匹配)
动作 - 编辑和移除操作的链接。

配置操作

要配置一个新操作, 点击操作面板上的 。编辑现有操作, 点击操作旁边的 。点击编辑按钮会出现弹窗。

参数 描述
对象 可使用四种对象:
监控项原型
触发器原型
图表原型
主机原型
条件 对筛选的实体应用操作.
操作 支持以下操作:
等于 - 应用到此原型
不等于 - 应用到所有原型, 此原型除外
包含 - 如果原型名称包含此字符串,则应用
不包含 - 如果原型名称不包含此字符串,则应用
匹配 - 如果原型名称匹配正则表达式,则应用
不匹配 - 如果原型名称不匹配正则表达式,则应用
模式 要搜索的 正则表达式 或字符串.
对象: 监控项原型
启用新的 如果选择复选框, 会出现按钮, 允许覆盖原始监控项原型设置:
- 添加监控项,并且监控项处于启用状态。
- 添加监控项到已发现的实体,但处于禁用状态.
发现 如果选择复选框, 会出现按钮, 允许覆盖原始监控项原型设置:
- 添加监控项。
- 不添加监控项.
更新间隔 如果选择复选框, 会出现两个选项, 允许为监控项设置不同的间隔:
延迟 - 监控项更新间隔。支持用户宏时间单位 (如 30s, 1m, 2h, 1d)。如果使用了 自定义时间间隔 则更新间隔应设置为0。
自定义时间间隔 - 点击 指定 灵活/计划的时间间隔。 更多信息请参阅 自定义时间间隔.
历史记录 如果选择复选框, 会出现按钮, 允许给监控项设置不同的历史保存周期:
请勿存储 - 如果选择,那么历史数据不会保存。
存储最多 - 如果选择, 右侧会出现输入框,可以输入保存周期。支持用户宏LLD宏.
趋势 如果选择复选框, 会出现按钮, 允许给监控项设置不同的趋势数据保存周期:
请勿存储 - 如果选择, 趋势数据不会保存。
存储最多 - 如果选择, 右侧会出现输入框。支持用户宏LLD宏.
标签 如果选择复选框,会出现一个新面板, 允许指定 标签-值 的键值对。
即使标签名称匹配,这些标签也会追加到监控项原型的标签末尾.
对象: 触发器原型
启用新的 如果选择复选框, 会出现按钮, 允许覆盖原始触发器原型设置:
- 添加触发器,并且处于启用状态。
- 添加触发器到已发现的实体中,但触发器是禁用的.
发现 如果选择复选框, 会出现按钮,允许覆盖原始触发器原型设置 :
- 添加触发器。
- 不会添加触发器.
严重性 如果选择复选框, 会出现触发器严重性按钮, 允许修改触发器的严重性级别.
标签 如果选择复选框,会出现一个新面板, 允许指定 标签-值 的键值对。
即使标签名称匹配,这些标签也会追加到监控项原型的标签末尾.
对象: 图形原型
发现 如果选择复选框, 会出现按钮, 允许覆盖原始图形原型设置:
- 添加图形。
- 不添加图形.
对象: 主机原型
启用新的 如果选择复选框, 会出现按钮,允许覆盖原始主机原型设置 :
- 创建主机,主机处于启用状态。
- 创建主机,主机处于禁用状态.
发现 如果选择复选框,会出现按钮,允许覆盖原始的主机原型设置:
- 主机将被发现。
- 主机不会被发现.
模板链接 如果选择复选框,会出现一个输入框,用于指定模板。 输入模板名称,或点击输入框旁边的 选择 然后从弹窗列表中选择模板。
所有链接到主机原型的模板均会被替换为此覆盖中配置的模板.
标签 如果选择复选框,会出现一个新面板, 允许指定 标签-值 的键值对。
即使标签名称匹配,这些标签也会追加到主机原型的标签后面.
主机资产记录 如果选择复选框,会出现按钮,允许基于主机原型选择不同的资产模式 :
禁用 - 不添加主机资产数据。
手工 - 手工输入主机资产数据。
自动 - 基于收集的数据自动添加主机资产数据.

表单按钮

表单底部的按钮允许执行多个操作。

· ·
添加发现规则。此按钮只对新的发现规则可用。
更新发现规则的属性。此按钮仅适用于现有的发现规则。
根据当前发现规则的属性创建另一个发现规则。
立即执行发现规则。该发现规则必须已存在。 参考 更多信息.
注意 当立即执行发现时, 配置缓存没有更新, 则自动发现的结果可能不会显示最近的变更。
删除发现规则。
取消对发现规则的编辑。

发现的实体

下面的截图展示了主机配置中已发现的监控项、触发器和图表。发现的实体用橙色的链接作为前缀标记,橙色链接指向关联的自动发现规则.

注意,如果已经存在具有相同唯一性条件的实体,例如,具有相同键值的监控项或具有相同名称的图形,则不会创建已发现的实体。在这种情况下,在前端显示一条错误消息,即低级别自动发现规则不能创建某些实体。但是,发现规则本身不会因为无法创建某些实体而不受支持,而必须跳过这些实体。发现规则会继续创建/更新其它实体。

如果发现的实体(文件系统、接口等)不再被发现(或没有通过过滤器条件),基于它创建的实体可能会被自动禁用并最终删除。

可以根据 禁用丢失的资源 参数的值自动禁用丢失的资源。这会影响丢失的主机、监控项和触发器。

根据 删除丢失的资源 参数的值,可以自动删除丢失的资源。这会影响丢失的主机、主机组、监控项、触发器和图表。

当被发现的实体变成 '不在被发现了'时,生存期指示符显示在实体列表中。将鼠标指针移动到它上面,将显示一条指示其状态详细信息的消息。

如果实体被标记为删除,但没有在预期的时间删除(禁用发现规则或监控项主机) ,那么它们将在下次执行发现规则时被删除。

包含标记为删除的其他实体的实体,如果在发现规则级别上更改,将不会更新。例如,如果基于 LLD 的触发器包含标记为删除的项,它们将不会更新。例如,如果基于 LLD 的触发器包含标记为删除的监控项,它们将不会更新。

其它类型的自动发现

有关其他类型的开箱即用自动发现的详细信息和操作方法,请参阅以下章节:

有关自动发现监控项的 JSON 格式的更多细节,以及如果通过一个Perl脚本实现发现自己的文件系统的示例。请参阅 创建自定义LLD规则