2 监控项值预处理
概述
预处理允许您在将接收到的监控项值保存到数据库之前,对其应用转换。 这些转换/预处理步骤由 Zabbix 服务器或 proxy 执行(如果监控项由 proxy 监控)。
此功能支持多种使用场景,例如:
- 将字节转换为位(例如,将网络流量值乘以“8”);
- 计算持续递增数值的每秒统计信息;
- 应用正则表达式以提取或修改值;
- 对值执行自定义脚本;
- 丢弃未变化的值以优化数据库存储。
可以为一个监控项配置一个或多个预处理步骤。 这些步骤将按照其配置顺序执行。
如果某个预处理步骤失败,监控项将变为不支持状态。
这可以通过 Custom on fail 错误处理来避免(大多数转换都支持此功能),它允许您丢弃值或设置自定义值。
对于日志监控项,日志元数据(不含值)始终会重置监控项的不支持状态,使其重新变为受支持状态。
即使初始错误是在从 agent 接收到日志值之后发生的,也会如此。
传递给预处理的所有值在初始阶段都被视为字符串。 在预处理流水线结束时,系统会将其转换为所需的值类型(如监控项配置中所定义)。 但是,如果需要,某些特定的预处理步骤可能会更早触发转换。 有关详细技术信息,请参见预处理详情。
为确保您的预处理配置按预期工作,您可以进行测试。
另请参见:预处理示例
配置
预处理步骤在监控项配置表单的预处理选项卡中定义。

单击添加以选择受支持的转换。
定义至少一个预处理步骤后,选项卡底部会显示信息类型字段。 如有需要,可以在不离开预处理选项卡的情况下更改信息类型。 有关参数的详细说明,请参阅创建监控项。
支持的转换
下面列出了所有支持的转换。
单击转换名称可查看其完整详细信息。
| 名称 | 描述 | 类型 |
|---|---|---|
| 正则表达式 | 将值与正则表达式进行匹配,并替换为所需的输出。 | 文本 |
| 替换 | 查找搜索字符串,并将其替换为其他内容(或不替换为任何内容)。 | |
| 修剪 | 从值的开头和结尾删除指定字符。 | |
| 右侧修剪 | 从值的结尾删除指定字符。 | |
| 左侧修剪 | 从值的开头删除指定字符。 | |
| XML XPath | 使用 XPath 功能从 XML 数据中提取值或片段。 | 结构化数据 |
| JSON Path | 使用 JSONPath 功能从 JSON 数据中提取值或片段。 | |
| CSV 转 JSON | 将 CSV 文件数据转换为 JSON 格式。 | |
| XML 转 JSON | 将 XML 格式的数据转换为 JSON。 | |
| SNMP walk 值 | 根据指定的 OID/MIB 名称提取值,并应用格式化选项。 | SNMP |
| SNMP walk 转 JSON | 将 SNMP 值转换为 JSON。 | |
| SNMP get 值 | 将格式化选项应用于 SNMP get 值。 | |
| 自定义乘数 | 将值乘以指定的整数或浮点值。 | 算术 |
| 简单变化 | 计算当前值与前一个值之间的差异。 | 变化 |
| 每秒变化 | 计算值变化(当前值与前一个值之间的差异)的每秒速率。 | |
| 布尔值转十进制 | 将值从布尔格式转换为十进制。 | 数字系统 |
| 八进制转十进制 | 将值从八进制格式转换为十进制。 | |
| 十六进制转十进制 | 将值从十六进制格式转换为十进制。 | |
| JavaScript | 输入 JavaScript 代码。 | 自定义脚本 |
| 范围内 | 定义值应处于的范围。 | 验证 |
| 匹配正则表达式 | 指定值必须匹配的正则表达式。 | |
| 不匹配正则表达式 | 指定值不得匹配的正则表达式。 | |
| 检查 JSON 中的错误 | 检查位于 JSONPath 的应用程序级错误消息。 | |
| 检查 XML 中的错误 | 检查位于 XPath 的应用程序级错误消息。 | |
| 使用正则表达式检查错误 | 使用正则表达式检查应用程序级错误消息。 | |
| 检查不支持的值 | 检查是否无法获取监控项值。 | |
| 丢弃未更改的值 | 如果值未发生变化,则丢弃该值。 | 限流 |
| 带心跳的丢弃未更改的值 | 如果值在定义的时间段内未发生变化,则丢弃该值。 | |
| Prometheus 模式 | 使用以下查询从 Prometheus 指标中提取所需数据。 | Prometheus |
| Prometheus 转 JSON | 将所需的 Prometheus 指标转换为 JSON。 |
如果为所选转换启用了 失败时自定义处理 复选框,则可以选中该选项并指定自定义错误处理选项:丢弃值(丢弃该值)、将值设置为(设置指定的值)或 将错误设置为(设置指定的错误消息)。
如果预处理步骤失败,并且选择了 丢弃值 或 将值设置为 选项,则监控项不会变为不支持。
请注意,对于 变化 和 限流 预处理步骤,Zabbix 必须记住上一个值,以便按要求计算或比较新值。
这些先前的值由预处理管理器处理。
如果 Zabbix 服务器或 proxy 重启,或者对预处理步骤进行了任何更改,则相应监控项的上一个值会被重置,从而导致:
- 对于 简单变化、每秒变化 步骤,下一个值将被忽略,因为没有可用于计算变化的上一个值;
- 对于 丢弃未更改的值、带心跳的丢弃未更改的值 步骤,即使根据丢弃规则本应丢弃下一个值,也永远不会丢弃该值。
正则表达式
将值与正则表达式进行匹配,并替换为所需的输出。
参数:
- pattern - 正则表达式;
- output - 输出格式模板。 \N(其中 N=1…9)转义序列将替换为第 N 个匹配组。 \0 转义序列将替换为匹配的文本。
注释:
- 如果无法匹配输入值,监控项将变为不受支持;
- 正则表达式支持使用 \N 序列提取最多 10 个捕获组;
- 有关现有示例,请参阅正则表达式部分。
替换
查找搜索字符串并将其替换为另一个字符串(或不替换为任何内容)。
参数:
- 搜索字符串 - 要查找并替换的字符串,区分大小写(必填);
- 替换内容 - 用于替换搜索字符串的字符串。
替换字符串也可以为空,这样在找到搜索字符串时实际上可将其删除。
说明:
- 搜索字符串的所有匹配项都将被替换;
- 可以使用转义序列来搜索或替换换行符、回车符、制表符和空格:"\n \r \t \s";反斜杠可转义为 "\\",转义序列可转义为 "\\n";
- 在低级别发现期间,会自动对换行符、回车符、制表符进行转义。
截取
从值的开头和结尾移除指定的字符。
右截取
从值的结尾移除指定的字符。
左截取
从值的开头移除指定的字符。
XML XPath
使用 XPath 功能从 XML 数据中提取值或片段。
注释:
- 要使此选项正常工作,Zabbix 服务器(或 Zabbix proxy)必须在编译时启用 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>”
JSON Path
使用 JSONPath 功能 从 JSON 数据中提取值或片段。
CSV 转 JSON
将 CSV 文件数据转换为 JSON 格式。
更多信息,请参见:CSV 转 JSON 预处理。
XML 转 JSON
将 XML 格式的数据转换为 JSON。
有关更多信息,请参阅:序列化规则。
SNMP walk 值
通过指定的 OID/MIB 名称提取值,并应用格式化选项:
- 不变 - 将十六进制字符串作为未转义的十六进制字符串返回(注意,显示提示仍会应用);
- 从 hex-STRING 转换为 UTF-8 - 将十六进制字符串转换为 UTF-8 字符串;
- 从 hex-STRING 转换为 MAC - 将十六进制字符串验证为 MAC 地址,并返回规范的 MAC 地址字符串(其中的
' '将替换为':'); - 从 BITS 转换为整数 - 将以十六进制字符序列表示的位字符串(例如,“1A 2B 3C 4D”)的前 8 个字节转换为 64 位无符号整数。 对于长度超过 8 个字节的位字符串,后续字节将被忽略。
SNMP walk 转换为 JSON
将 SNMP 值转换为 JSON。
在 JSON 中指定字段名称及其对应的 SNMP OID 路径。 字段值将由指定 SNMP OID 路径中的值填充。
注释:
- 可使用与 SNMP walk value 步骤中类似的值格式化选项;
- 您可以将此预处理步骤用于 SNMP OID 发现。
SNMP 获取值
对 SNMP 获取值应用格式选项:
- 从 Hex-STRING 转换为 UTF-8 - 将十六进制字符串转换为 UTF-8 字符串;
- 从 Hex-STRING 转换为 MAC - 将十六进制字符串验证为 MAC 地址,并返回正确的 MAC 地址字符串(其中的
' '将替换为':'); - 从 BITS 转换为整数 - 将以十六进制字符序列表示的位字符串的前 8 个字节(例如 "1A 2B 3C 4D")转换为 64 位无符号整数。 对于长度超过 8 个字节的位字符串,后续字节将被忽略。
自定义乘数
将值乘以指定的整数或浮点数。
注释:
- 使用此选项可将以 KB、MBps 等为单位接收的值转换为 B、Bps。
否则,Zabbix 无法正确设置前缀(K、M、G 等)。
- 请注意,如果监控项的信息类型为 Numeric (unsigned),则在应用自定义乘数之前,带小数部分的传入值将被截断(即,'0.9' 将变为 '0');
- 如果对信息类型设置为 Numeric (unsigned) 的监控项使用自定义乘数,或将值存储为 Change per second,且计算所得的值实际为浮点数,则该计算值仍会被视为正确值:截断小数部分,并将值作为整数存储;
- 支持科学计数法,例如
1e+70;用户宏和 LLD 宏;包含宏的字符串,例如{#MACRO}e+10、{$MACRO1}e+{$MACRO2}。 宏必须解析为整数或浮点数。
简单变化
计算当前值与之前值之间的差异。
注释:
- 此步骤可用于测量持续增长的值;
- 计算方式为 value-prev_value,其中 value - 当前值;prev_value - 之前接收到的值;
- 每个监控项只允许执行一种变化操作(“简单变化”或“每秒变化”);
- 如果当前值小于之前的值,Zabbix 将丢弃该差异(不存储任何内容),并等待下一个值。
每秒变化量
计算每秒的值变化速度(当前值与前一个值之间的差值)。
注释:
- 此步骤适用于计算持续增长值的每秒增长速度;
- 由于此计算可能产生浮点数,因此建议将“信息类型”设置为 Numeric (float),即使接收到的原始值为整数。
这对于较小的数值尤其重要,因为小数部分可能具有实际意义。
如果浮点值较大,可能超出“float”字段的长度限制,从而导致整个值丢失,则建议使用 Numeric (unsigned),这样只会截去小数部分。
- 计算公式为 (value-prev_value)/(time-prev_time),其中 value - 当前值;prev_value - 上一次接收到的值;time - 当前时间戳;prev_time - 上一个值的时间戳;
- 每个监控项只允许执行一种变化操作(“Simple change”或“Change per second”);
- 如果当前值小于前一个值,Zabbix 将丢弃该差值(不存储任何内容),并等待下一个值。 这有助于正确处理例如 32 位 SNMP 计数器回绕(溢出)的情况。
布尔值转十进制
将值从布尔格式转换为十进制。
注释:
- 文本表示形式会转换为 0 或 1。 因此,'TRUE' 存储为 1,'FALSE' 存储为 0。 所有值均以不区分大小写的方式进行匹配。 当前可识别的值包括:TRUE - true、t、yes、y、on、up、running、enabled、available、ok、master;FALSE - false、f、no、n、off、down、unused、disabled、unavailable、err、slave。 此外,任何非零数值都被视为 TRUE,零被视为 FALSE。
八进制转十进制
将值从八进制格式转换为十进制。
十六进制转十进制
将值从十六进制格式转换为十进制。
JavaScript
在参数字段中单击或单击其旁边的铅笔图标时,在打开的模态编辑器中输入 JavaScript 代码。
请勿在预处理 JavaScript 中使用未声明的赋值。
请使用 var 声明局部变量。
注释:
- 可用的 JavaScript 长度取决于所使用的数据库;
- 更多信息,请参见:JavaScript 预处理。
在范围内
通过指定最小值/最大值(包括边界)来定义值应处于的范围。
注释:
- 接受数值(包括任意位数、可选的小数部分和可选的指数部分,以及负值);
- 最小值应小于最大值;
- 至少必须存在一个值;
- 可以使用用户宏和低级别发现宏。
匹配正则表达式
指定值必须匹配的正则表达式。
不匹配正则表达式
指定值不得匹配的正则表达式。
检查 JSON 中的错误
检查位于 JSONPath 的应用程序级错误消息。
如果检查成功且消息不为空,则停止处理;否则,继续使用此预处理步骤之前的值进行处理。
注释:
- 这些外部服务错误将原样报告给用户,不会添加预处理步骤信息;
- 如果无法解析无效 JSON,则不会报告错误。
检查 XML 中的错误
检查位于 XPath 的应用程序级错误消息。 如果检查成功且消息不为空,则停止处理;否则,继续使用此预处理步骤之前的值进行处理。
注释:
- 这些外部服务错误将原样报告给用户,不会添加预处理步骤信息;
- 如果无法解析无效的 XML,则不会报告错误。
使用正则表达式检查错误
使用正则表达式检查应用程序级错误消息。
如果检查成功且消息不为空,则停止处理;否则,继续使用此预处理步骤之前的值进行处理。
参数:
- pattern - 正则表达式;
- output - 输出格式模板。
转义序列 \N(其中 N=1…9)将替换为第 N 个匹配组。
转义序列 \0 将替换为匹配的文本。
注释:
- 这些外部服务错误将原样报告给用户,不会添加预处理步骤信息。
检查不支持的值
检查是否无法获取监控项值。 根据检查返回的错误消息,指定应如何处理失败。
参数:
- scope - 选择错误处理范围:
任意错误 - 任意错误;
错误匹配 - 仅匹配 pattern 中指定正则表达式的错误;
错误不匹配 - 仅不匹配 pattern 中指定正则表达式的错误 - pattern - 用于匹配错误的正则表达式。
如果在范围参数中选择了 任意错误,则不显示此字段。
如果显示此字段,则为必填字段。
注释:
- 通常,无法获取值或获取值失败会导致监控项变为不支持。 此预处理步骤允许您修改此行为。
- 此预处理步骤仅检查是否无法获取监控项值。 例如,它不会检查获取的值类型(如字符串)是否与监控项的信息类型(如数值)匹配;有关详细信息,请参阅预处理示例。 如果类型不匹配,在执行完所有预处理步骤后,监控项仍可能变为不支持。 要检查类型是否匹配,您可以使用例如 自定义倍数 预处理步骤;请参阅预处理示例。
- 在 设置值为 或 设置错误为 字段中支持捕获正则表达式组。 使用 \N(其中 N=1…9)获取第 N 个匹配组;使用 \0 获取匹配的文本;
- 这些步骤始终作为第一个预处理步骤执行,并且在保存对监控项的更改后置于所有其他步骤之上;
- 支持按指定顺序使用多个 检查不支持的值 步骤。 任意错误 步骤将自动作为此组中的最后一个步骤。
丢弃未变化的值
如果某个值未发生变化,则将其丢弃。
说明:
- 如果某个值被丢弃,则不会将其保存到数据库中,Zabbix 服务器也不会知道已接收到该值。
不会对任何触发器表达式进行求值,因此也不会为相关触发器创建/恢复任何问题。
函数将仅基于实际保存到数据库中的数据运行。
由于趋势数据是基于数据库中的数据构建的,如果某一小时没有保存任何值,则该小时也不会有趋势数据。 - 每个监控项只能指定一个限流选项。
使用心跳丢弃未更改的值
如果值在指定时间段(以秒为单位)内未发生变化,则丢弃该值。
注释:
- 支持使用正整数指定秒数(最小值为 1 秒);
- 可以使用时间后缀(例如:
30s、1m、2h、1d);
- 可以使用用户宏和低级别发现宏;
- 如果某个值被丢弃,则不会将其保存到数据库中,Zabbix 服务器也不会知道已接收到该值。
不会评估任何触发器表达式,因此不会为相关触发器创建或解决问题。
函数仅基于实际保存到数据库中的数据运行。
由于趋势数据基于数据库中的数据构建,如果某个小时内没有保存任何值,则该小时也不会有趋势数据。
- 每个监控项只能指定一个限流选项。
Prometheus 模式
使用以下查询从 Prometheus 指标中提取所需数据。
有关更多详细信息,请参见 Prometheus 检查。
Prometheus 转 JSON
将所需的 Prometheus 指标转换为 JSON。
有关更多详细信息,请参见 Prometheus 检查。
宏支持
用户宏 和带上下文的用户宏支持用于:
- 预处理步骤参数,包括 JavaScript 代码;
- 自定义错误处理参数(设置值为 和 设置错误为 字段)。
当宏被替换为其值时,宏上下文会被忽略。 宏值会按原样插入到代码中,无法在将该值放入 JavaScript 代码之前添加额外的转义。 请注意,这在某些情况下可能会导致 JavaScript 错误。
测试
参见预处理测试。