4 历史数据函数

此处列出的所有函数均支持以下场景:

关于函数参数的通用说明:

  • 函数参数之间用逗号分隔
  • 可选函数参数(或参数部分)用< >表示
  • 函数特定参数将在各函数中单独说明
  • /host/key(sec|#num)<:time shift>参数绝对不可加引号
通用参数
  • /host/key 是引用主机监控项历史的函数中常见的必选第一个参数
  • (sec|#num)<:time shift> 是引用主机监控项历史的函数中常见的第二个参数,其中:
    • sec - 最大评估周期(以秒为单位,可使用suffixes),或
    • #num - 最新采集值中的最大评估周期(如果前面带有井号标记)
    • time shift(可选)允许将评估点回溯到过去时间。关于指定时间偏移,请参阅时间偏移

历史函数

功能
Description 功能特定参数 注释
change (/host/key)
The amount of difference between the previous and latest value. 支持的值类型: float, 整型, 字符串, 文本, 日志

对于字符串返回:
0 - 值相等
1 - 值不同

示例:
=> change(/主机/key)>10

数值差异将按如下方式计算,以下传入示例值 ('前一个' 与 '最新一个' 值 = 变化) 可见:
'1' 和 '5' = +4
'3' 和 '1' = -2
'0' 和 '-2.5' = -2.5

另请参阅: abs 进行比较
changecount (/host/key,(sec\ #num)<:时间偏移>,<模式>)
Number of changes between adjacent values within the defined evaluation period. 参见通用参数

mode(可选;必须使用双引号)

支持的modes
all - 统计所有变更(默认)
dec - 统计减少次数
inc - 统计增加次数
支持的值类型:float、整型、字符串、文本、日志

对于非数值类型,mode参数将被忽略。

示例:
=> changecount(/主机/key, 1w) → 最近一周内直到评估周期的值变更次数
=> changecount(/主机/key,#10,"inc") → 最近10个值中相对前值增加的次数(局部单调性检测:value[n] > value[n-1])
=> changecount(/主机/key,24h,"dec") → 最近24小时内直到评估周期的值减少次数(相对于相邻值)
count (/host/key,(sec\ #num)<:时间偏移>,<操作符>,<模式>)
Number of values within the defined evaluation period. 参见通用参数.

operator (可选; 必须使用双引号)

支持的operators:
eq - 等于 (默认为integer, float)
ne - 不等于
gt - 大于
ge - 大于或等于
lt - 小于
le - 小于或等于
like (默认为string, 文本, 日志) - 如果包含模式则匹配(区分大小写)
bitand - 按位与
regexp - 对pattern中给定的正则表达式进行区分大小写的匹配
iregexp - 对pattern中给定的正则表达式进行不区分大小写的匹配

注意:
integer 监控项支持eq(默认), ne, gt, ge, lt, le, band, regexp, iregexp
浮点型监控项支持eq(默认), ne, gt, ge, lt, le, regexp, iregexp
string, 文本和日志监控项支持like(默认), eq, ne, regexp, iregexp

pattern (可选) - 所需模式(string参数必须使用双引号)
支持的值类型: float, integer, string, 文本, 日志

浮点型监控项匹配精度为2.22e-16; 如果数据库是not upgraded则精度为0.000001.

当第三个参数为bitand时,第四个pattern参数可以指定为两个数字,用'/'分隔: number_to_compare_with/mask. count()计算值与mask的"按位与"结果,并与number_to_compare_with比较。如果"按位与"结果等于number_to_compare_with,则计入该值。
如果number_to_compare_withmask相等,只需指定mask(不带'/').

当第三个参数为regexpiregexp时,第四个pattern参数可以是普通或全局正则表达式(以'@'开头)正则表达式。对于全局正则表达式,大小写敏感性继承自全局正则表达式设置。为了正则表达式匹配,float值将始终表示为小数点后4位。还需注意,对于大数,十进制(存储在数据库中)和二进制(由Zabbix server使用)表示的差异可能会影响第4位小数。

示例:
=> count(/主机/key,10m) → 最近10分钟直到评估周期的值数量
=> count(/主机/key,10m,"like","error") → 最近10分钟直到评估周期包含'错误'的值数量
=> count(/主机/key,10m,,12) → 最近10分钟直到评估周期等于'12'的值数量
=> count(/主机/key,10m,"gt",12) → 最近10分钟直到评估周期超过'12'的值数量
=> count(/主机/key,#10,"gt",12) → 最近10个值直到评估周期超过'12'的值数量
=> count(/主机/key,10m:now-1d,"gt",12) → 从评估周期算起24小时前10分钟到24小时前超过'12'的值数量
=> count(/主机/key,10m,"bitand","6/7") → 最近10分钟直到评估周期在最低3位有'110'(二进制)的值数量
=> count(/主机/key,10m:now-1d) → 从评估周期算起24小时前10分钟到24小时前的值数量
countunique (/host/key,(sec\ #num)<:时间偏移>,<操作符>,<模式>)
Number of unique values within the defined evaluation period. 参见通用参数.

operator (可选; 必须使用双引号)

支持的operators:
eq - 等于 (默认为integer, float)
ne - 不等于
gt - 大于
ge - 大于或等于
lt - 小于
le - 小于或等于
like (默认为string, 文本, 日志) - 如果包含模式则匹配(区分大小写)
bitand - 按位与
regexp - 对pattern中给定的正则表达式进行区分大小写的匹配
iregexp - 对pattern中给定的正则表达式进行不区分大小写的匹配

注意:
eq (默认), ne, gt, ge, lt, le, band, regexp, iregexp 支持integer 监控项
eq (默认), ne, gt, ge, lt, le, regexp, iregexp 支持浮点型监控项
like (默认), eq, ne, regexp, iregexp 支持string, 文本和日志监控项

pattern (可选) - 必需的模式(string参数必须使用双引号)
支持的值类型: float, integer, string, 文本, 日志

浮点型监控项匹配精度为2.22e-16; 如果数据库是not upgraded则精度为0.000001.

当第三个参数为bitand时,第四个pattern参数可以指定为两个数字,用'/'分隔: number_to_compare_with/mask. countunique()计算值与mask的"按位与"结果,并与number_to_compare_with比较。如果"按位与"结果等于number_to_compare_with,则该值被计数。
如果number_to_compare_withmask相等,则只需指定mask(不带'/').

当第三个参数为regexpiregexp时,第四个pattern参数可以是普通或全局正则表达式(以'@'开头)的正则表达式。对于全局正则表达式,区分大小写继承自全局正则表达式设置。为了正则表达式匹配,float值将始终表示为小数点后4位。还需注意,对于大数,十进制(存储在数据库中)和二进制(由Zabbix server使用)表示的差异可能会影响第4位小数。

示例:
=> countunique(/主机/key,10m) → 最近10分钟到评估周期的唯一值数量
=> countunique(/主机/key,10m,"like","error") → 最近10分钟到评估周期包含'错误'的唯一值数量
=> countunique(/主机/key,10m,"gt",12) → 最近10分钟到评估周期超过'12'的唯一值数量
=> countunique(/主机/key,#10,"gt",12) → 最近10个值到评估周期超过'12'的唯一值数量
=> countunique(/主机/key,10m:now-1d,"gt",12) → 从评估周期算起24小时前10分钟到24小时前超过'12'的唯一值数量
=> countunique(/主机/key,10m,"bitand","6/7") → 最近10分钟到评估周期在最低3位有'110'(二进制)的唯一值数量
=> countunique(/主机/key,10m:now-1d) → 从评估周期算起24小时前10分钟到24小时前的唯一值数量
find (/host/key,<(sec\ #num)<:时间偏移>>,<操作符>,<模式>)
Find a value match. 参见通用参数.

sec#num (可选) - 未指定时默认取最新值

operator (可选; 必须使用双引号包裹)

支持的operators:
eq - 等于 (integer, float的默认值)
ne - 不等于
gt - 大于
ge - 大于等于
lt - 小于
le - 小于等于
like (string, 文本, 日志的默认值) - 值包含pattern中给定的string (区分大小写)
bitand - 按位与
regexp - 匹配pattern中给定的正则表达式 (区分大小写)
iregexp - 匹配pattern中给定的正则表达式 (不区分大小写)

注意事项:
integer 监控项支持: eq (默认), ne, gt, ge, lt, le, band, regexp, iregexp
浮点型监控项支持: eq (默认), ne, gt, ge, lt, le, regexp, iregexp
string, 文本和日志监控项支持: like (默认), eq, ne, regexp, iregexp

pattern - 必需的模式 (string参数必须使用双引号包裹); 当operatorregexp, iregexp时需提供Perl Compatible Regular Expression (PCRE)正则表达式
支持的值类型: float, int, str, text, log

返回值:
1 - 找到匹配项
0 - 其他情况

若处理多个值,当存在至少一个匹配值时返回'1'

当第三个参数为regexpiregexp时,第四个pattern参数可以是普通或全局正则表达式 (以'@'开头)正则表达式。对于全局正则表达式,其大小写敏感特性继承自全局正则表达式设置。

示例:
=> find(/主机/key,10m,"like","error") → 在最近10分钟内查找包含评估周期的'错误'值
first (/host/key,sec<:time shift>)
The first (the oldest) value within the defined evaluation period. 参见通用参数. 支持的值类型: float, int, str, text, log

示例:
=> first(/主机/key,1h) → 获取最近一小时内的最旧值直到评估周期

另见last().
fuzzytime (/host/key,sec)
Checking how much the passive agent time differs from the Zabbix server/proxy time. 参见通用参数 支持的值类型: float, int

返回值:
1 - 被动监控项值(作为时间戳)与Zabbix server/proxy时间戳(数值采集时钟)之间的差值小于等于sec
0 - 其他情况

通常与'system.localtime'监控项一起使用,用于检查本地时间是否与Zabbix server的本地时间同步。注意'system.localtime'必须配置为被动检查
也可与vfs.file.time[/path/file,modify]键一起使用,检查file是否长时间未get更新。

示例:
=> fuzzytime(/主机/key,60s)=0 → 当时间差超过60秒时检测到问题

不建议在复杂触发器表达式中使用此函数(涉及多个监控项),因为它可能导致意外结果(时间差将使用最新指标测量),例如在fuzzytime(/Host/system.localtime,60s)=0 or last(/Host/trap)<>0
last (/host/key,<#num<:time shift>>)
The most recent value. 参见通用参数.

#num (可选) - 第N个最近的值
支持的值类型: float, int, str, text, log

请注意带井号的时间段(#N)在此处的运作方式与许多其他函数不同.
例如:
last(/主机/key) 始终等于 last(/主机/key,#1)
last(/主机/key,#3) - 第三个最近的值(不是三个最新值)

如果在历史记录中一秒内存在多个值,Zabbix不保证值的精确顺序.

示例:
=> last(/主机/key) → 获取最后一个值
=> last(/主机/key,#2) → 获取前一个值
=> last(/主机/key,#1) <> last(/主机/key,#2) → 最后一个值和前一个值不同

另见first().
logeventid (/host/key,<#num<:time shift>>,<pattern>)
Checking if event ID of the last log entry matches a regular expression. 参见通用参数.

#num (可选) - 第N个最近的值

pattern (可选) - 描述所需模式的正则表达式, Perl Compatible Regular Expression (PCRE) 风格 (string 参数必须使用双引号).
支持的值类型: log

返回:
0 - 不匹配
1 - 匹配
logseverity (/host/key,<#num<:time shift>>)
Log severity of the last log entry. 参见通用参数.

#num (可选) - 第N个最新值
支持的值类型: log

返回值:
0 - 默认严重级别
N - 严重级别(integer, 适用于Windows事件日志: 1 - 信息, 2 - 警告, 4 - 错误, 7 - 失败审核, 8 - 成功审核, 9 - 严重, 10 - 详细).
Zabbix从Windows事件日志的Information字段获取日志严重级别.
logsource (/host/key,<#num<:time shift>>,<pattern>)
Checking if log source of the last log entry matches a regular expression. 参见通用参数.

#num (可选) - 第N个最近的值

pattern (可选) - 描述所需模式的正则表达式, Perl Compatible Regular Expression (PCRE) 风格 (string 参数必须使用双引号).
支持的值类型: log

返回:
0 - 不匹配
1 - 匹配

通常用于Windows事件日志. 例如, logsource("VMware Server").
monodec (/host/key,(sec\ #num)<:time shift>,<mode>)
Check if there has been a monotonous decrease in values. 参见通用参数.

mode (必须使用双引号) - weak (每个值小于或等于前一个值;默认) 或 strict (每个值均递减)
支持值类型: int

如果时间段内所有元素持续递减则返回1,否则返回0.

示例:
=> monodec(/Host1/system.swap.size[all,free],60s) + monodec(/Host2/system.swap.size[all,free],60s) + monodec(/Host3/system.swap.size[all,free],60s) - 计算有多少个主机出现空闲交换空间减少的情况
monoinc (/host/key,(sec\ #num)<:时间偏移>,<模式>)
Check if there has been a monotonous increase in values. 参见通用参数

mode (必须使用双引号) - weak (每个值大于或等于前一个值;默认) 或 strict (每个值都严格递增)
支持的值类型: int

如果时间段内所有元素持续递增则返回1,否则返回0。

示例:
=> monoinc(/Host1/system.localtime,#3,"strict")=0 - 检查系统本地时间是否持续严格递增
nodata (/host/key,sec,<mode>)
Checking for no data received. 参见通用参数.

sec 周期不应小于30秒,因为历史同步器进程每30秒才计算一次此函数.

nodata(/主机/key,0) 是不允许的.

mode - 如果设置为strict(双引号包裹),该函数将对proxy可用性不敏感(详见注释).
支持所有值类型.

返回:
1 - 如果在定义的时间段内未收到数据
0 - 其他情况

从Zabbix 5.0开始,由proxy监控的'nodata'触发器默认对proxy可用性敏感 - 如果proxy变为不可用,'nodata'触发器不会在连接恢复后立即触发,而是会跳过延迟期间的数据。注意对于被动proxies,如果连接恢复时间超过15秒且不少于2秒,则会激活抑制。对于主动proxies,如果连接恢复时间超过15秒,则会激活抑制.

要关闭对proxy可用性的敏感性,请使用第三个参数,例如: nodata(/主机/key,5m,"strict"); 这种情况下该函数将像5.0.0之前版本一样工作,一旦超过评估周期(五分钟)没有数据就会立即触发.

注意如果在第一个参数周期内出现以下情况,该函数将显示错误:
- 没有数据且Zabbix server已重启
- 没有数据且维护已完成
- 没有数据且监控项已添加或重新启用
错误显示在触发器configurationInfo列中.

如果Zabbix server、proxy和agent之间存在时间差异,该函数可能无法正常工作。另请参阅: 时间同步;

nodata()函数不能单独在表达式中使用;表达式中必须包含至少一个来自another group的函数,引用主机 监控项(date and time functions除外)。有关nodata()函数在表达式中如何工作的详细信息,请参阅计算时间.
percentile (/host/key,(sec\ #num)<:时间偏移>,百分比)
P-th percentile of a period, where P (percentage) is specified by the third parameter. 参见通用参数.

percentage - 介于0到100之间(含)的浮点数,小数点后最多4位
支持的值类型: float, int
rate (/host/key,sec<:time shift>)
Per-second average rate of the increase in a monotonically increasing counter within the defined time period. 参见通用参数 支持的值类型: float, 整型

功能上对应PromQL的'rate'

示例:
=> rate(/主机/key,30s) → 若30秒内单调递增值为20,该函数将返回0.67