2 监控项值预处理

概述

预处理允许你在将收到的监控项值保存到数据库之前,对其应用转换。 这些转换/预处理步骤由 Zabbix 服务器或 proxy 执行(如果监控项由 proxy 监控)。

此功能支持多种使用场景,例如:

  • 将字节转换为比特(例如,将网络流量值乘以 "8");
  • 计算逐秒统计值,适用于持续递增的值;
  • 应用正则表达式以提取或修改值;
  • 在值上执行自定义脚本;
  • 丢弃未变化的值以优化数据库存储。

可以为一个监控项配置一个或多个预处理步骤。 这些步骤会按照配置顺序执行。

如果某个预处理步骤失败,监控项将变为不受支持。 可以通过 Custom on fail 错误处理(适用于大多数转换)来避免这种情况,从而允许你丢弃值或设置自定义值。

对于日志监控项,日志元数据(不含值)将始终重置监控项的不受支持状态,使其重新变为受支持。 即使最初的错误发生在从 agent 接收到日志值之后,也会如此。

传递给预处理的所有值最初都被视为字符串。 在预处理流水线结束时,会将其转换为监控项配置中定义的目标值类型。 不过,某些特定的预处理步骤在需要时可能会触发更早的转换。 有关详细技术信息,请参见预处理详情

为确保你的预处理配置按预期工作,你可以进行测试

另请参见:预处理示例

配置

预处理步骤在监控项的预处理选项卡中定义 配置 表单.

点击添加按钮选择支持的转换类型.

当至少定义一个预处理步骤时,信息类型字段会显示在选项卡底部 如需更改信息类型,可直接在预处理选项卡中操作而无需离开该界面 详细参数说明请参阅Creating an item

支持的转换

下面列出了所有支持的转换。 单击转换名称可查看其完整详细信息。

名称 描述 类型
正则表达式 将值与正则表达式进行匹配,并替换为所需的输出。 文本
替换 查找搜索字符串,并将其替换为另一个字符串(或不替换为任何内容)。
修剪 从值的开头和结尾移除指定字符。
右侧修剪 从值的结尾移除指定字符。
左侧修剪 从值的开头移除指定字符。
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 个捕获组;
  • 有关现有示例,请参阅正则表达式部分。
Replace

查找搜索string并将其替换为另一个(或空值)。

参数:

  • search string - 要查找并替换的string,区分大小写(必填);
  • replacement - 用于替换搜索string的string。 替换string也可以为空,从而在找到搜索string时允许delete。

注释:

  • 所有出现的搜索string都将被替换;
  • 可以使用转义序列来搜索或替换换行符、回车符、制表符和空格"\n \r \t \s";反斜杠可以转义为"\\",转义序列可以转义为"\\n";
  • 在低级发现期间会自动对换行符、回车符、制表符进行转义处理。
Trim

从值的开头和结尾删除指定字符。

Right trim

从值的末尾移除指定字符。

Left trim

从值的开头移除指定字符。

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 名称的值,并应用格式化选项:

  • 不变 - 将十六进制字符串作为未转义的十六进制字符串返回(注意,显示提示仍会应用);
  • 从十六进制 STRING 转换为 UTF-8 - 将十六进制字符串转换为 UTF-8 字符串;
  • 从十六进制 STRING 转换为 MAC - 将十六进制字符串验证为 MAC 地址,并返回正确的 MAC 地址字符串(其中的 ' ' 将替换为 ':');
  • 从 BITS 转换为整数 - 将以十六进制字符序列表示的位字符串的前 8 个字节(例如 "1A 2B 3C 4D")转换为 64 位无符号整数。 对于长度超过 8 个字节的位字符串,将忽略后续字节。
SNMP walk 转换为 JSON

将 SNMP 值转换为 JSON。

在 JSON 中指定字段名称及其对应的 SNMP OID 路径。 字段值将由指定 SNMP OID 路径中的值填充。

注释:

  • 提供与 SNMP walk 值 步骤中类似的值格式化选项;
  • 您可以将此预处理步骤用于 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 将丢弃该差异(不存储任何内容),并等待下一个值。
每秒变化量

计算每秒的值变化速度(当前值与之前值之间的差值)。

注释:

  • 此步骤适用于计算持续增长的值的每秒变化速度;
  • 由于此计算可能产生浮点数,因此建议将“信息类型”设置为数值(浮点),即使传入的原始值为整数也是如此。 这对于小数部分很重要的小数尤其适用。 如果浮点值较大,可能超出“float”字段长度,从而导致整个值丢失,则建议使用数值(无符号),这样只会截去小数部分。
  • 计算方式为(value-prev_value)/(time-prev_time),其中,value - 当前值;prev_value - 之前接收的值;time - 当前时间戳;prev_time - 之前值的时间戳;
  • 每个监控项只允许执行一个变化操作(“简单变化”或“每秒变化量”);
  • 如果当前值小于之前的值,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来声明局部变量

注释:

在范围内

通过指定最小值/最大值(包括边界)来定义值应处于的范围。

注释:

  • 接受数值(包括任意位数、可选的小数部分和可选的指数部分,以及负值);
  • 最小值应小于最大值;
  • 至少必须存在一个值;
  • 可以使用用户宏和低级别发现宏。
匹配正则表达式

指定值必须匹配的正则表达式。

不匹配正则表达式

指定值不得匹配的正则表达式。

检查 JSON 中的错误

检查位于 JSONPath 的应用程序级错误消息。

如果检查成功且消息不为空,则停止处理;否则,继续使用此预处理步骤之前的值进行处理。

注释:

  • 这些外部服务错误将原样报告给用户,不会添加预处理步骤信息;
  • 如果无法解析无效的 JSON,则不会报告错误。
检查 XML 中的错误

检查位于 XPath 的应用程序级错误消息。 如果检查成功且消息不为空,则停止处理;否则,继续使用此预处理步骤之前的值进行处理。

注释:

  • 这些外部服务错误将原样报告给用户,不会添加预处理步骤信息;
  • 如果无法解析无效的 XML,则不会报告错误。
使用正则表达式检查错误

使用正则表达式检查应用程序级错误消息。

如果处理成功且消息不为空,则停止处理;否则,继续使用此预处理步骤之前的值进行处理。

参数:

  • pattern - 正则表达式;
  • output - 输出格式模板。 \N(其中 N=1…9)转义序列将替换为第 N 个匹配组。 \0 转义序列将替换为匹配的文本。

注释:

  • 这些外部服务错误将原样报告给用户,不会添加预处理步骤信息。
检查不支持的值

检查是否无法获取监控项值。 通过检查返回的错误消息,指定应如何处理失败。

参数:

  • scope - 选择错误处理范围:
    any error - 任意错误;
    error matches - 仅匹配 pattern 中指定正则表达式的错误;
    error does not match - 仅不匹配 pattern 中指定正则表达式的错误
  • pattern - 用于匹配错误的正则表达式。 如果在范围参数中选择了 any error,则不显示此字段。 如果显示,此字段为必填项。

注释:

  • 通常,无法获取值或获取值失败会导致监控项变为不支持。 此预处理步骤允许您修改此行为。
  • 此预处理步骤仅检查是否无法获取监控项值。 例如,它不会检查获取的值类型(如字符串)是否与监控项的信息类型(如数值)匹配;有关详细信息,请参阅预处理示例。 如果类型不匹配,在执行完所有预处理步骤后,监控项仍可能变为不支持。 要检查类型是否匹配,可以使用例如 Custom multiplier 预处理步骤;请参阅预处理示例
  • Set value toSet error to 字段支持捕获正则表达式组。 使用 \N(其中 N=1…9)获取第 N 个匹配组;使用 \0 获取匹配的文本;
  • 这些步骤始终作为第一个预处理步骤执行,并在保存对监控项的更改后置于所有其他步骤之上;
  • 支持按指定顺序使用多个 Check for not supported value 步骤。 any error 步骤将自动作为此组中的最后一个步骤。
Discard unchanged

若值未发生变更则予以丢弃.

注释:

  • 若某值被丢弃,则不会被保存至数据库且Zabbix server不会感知到该值的接收. 由于不会触发任何表达式评估,因此相关触发器的问题将不会被创建/解决. 函数仅能基于实际存入数据库的数据进行运算. 由于趋势数据是基于数据库中的数据生成,若某小时内无数据存入,则该时段内也不会产生趋势数据.
  • 每个监控项仅能指定一种节流选项.
在心跳周期内丢弃未更改的值

如果某个值在定义的时间段(以秒为单位)内未发生更改,则丢弃该值。

注释:

  • 支持使用正整数指定秒数(最小值为 1 秒);
  • 可以使用时间后缀(例如:30s1m2h1d);
  • 可以使用用户宏和低级别发现宏;
  • 如果某个值被丢弃,则不会将其保存到数据库中,Zabbix 服务器也不会知道已收到该值。 不会评估任何触发器表达式,因此不会为相关触发器创建或解决任何问题。 函数仅基于实际保存到数据库中的数据运行。 由于趋势数据基于数据库中的数据构建,如果某个小时内没有保存任何值,则该小时也不会有趋势数据。
  • 每个监控项只能指定一个限流选项。
Prometheus 模式

使用以下查询从 Prometheus 指标中提取所需数据。

有关更多详细信息,请参阅 Prometheus 检查

Prometheus 转 JSON

将所需的 Prometheus 指标转换为 JSON。

有关更多详细信息,请参见 Prometheus 检查

宏支持

User macros 以及带上下文的用户宏支持在以下场景使用:

  • 预处理步骤参数,包括JavaScript代码
  • 自定义错误处理参数(设置值为设置错误为字段)

宏上下文在宏被替换为其值时会被忽略。 宏值会原样插入代码中,无法在将值放入JavaScript代码前进行额外转义。 请注意,在某些情况下这可能导致JavaScript错误。

测试

参见preprocessing testing