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

4 历史函数

此处列出的所有函数都支持:

关于函数参数的一些整体说明:

  • 函数参数用逗号分隔
  • 可选函数参数(或参数部分)由< >表示
  • 每个函数都描述了特定功能的参数
  • /host/key(sec|#num)<:time shift> 参数绝不能被引用
常用参数
  • /host/key 是引用主机监控项历史记录函数的常用强制性首选参数
  • (sec|#num)<:time shift> 是引用主机监控项历史记录函数的常用强制性次选参数 ,其中:
    • sec - 以秒为单位的最大 评估周期 (可以使用时间 后缀 ),或者
    • #num - 最新收集值最大 评估范围(如果前面有井号)
    • time shift (可选) 允许将评估点及时移回。参阅有关指定时间偏移 更多详细内容

历史函数

函数
描述 函数特定参数 注释
change (/host/key)
前一个值和最新值之间的差异量。 支持的值类型:float, int, str, text, log
对于字符串返回:
0 - 值相等
1 - 值不同
例子:
=> change(/主机/键)>10
数值差异将被计算,如这些传入的示例值('previous' 和 'latest' 值 = 差异):
'1' 和 '5' = +4
'3' 和 '1' = -2
'0' 和 '-2.5' = -2.5
另请参阅:abs 用于比较
changecount (/host/key,(sec|#num)<:time shift>,<mode>)
在定义的评估期间内相邻值之间变化的次数。 参见通用参数

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

支持的 modes
all - 计算所有变化(默认)
dec - 计算减少的次数
inc - 计算增加的次数
支持的值类型:float, int, str, text, log
对于非数值类型,将忽略 mode 参数。
例子:
=> changecount(/主机/键, 1w) → 直到现在上个星期的值变化次数
=> changecount(/主机/键, #10, "inc") → 在最后10个值中相对于相邻值的值增加次数
=> changecount(/主机/键,24h, "dec") → 直到现在最后24小时相对于相邻值的值减少次数
count (/host/key,(sec|#num)<:time shift>,<operator>,<pattern>)
在定义的评估期间内的值的数量。 参见通用参数

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

支持的 operators
eq - 等于(整数,默认)
ne - 不等于
gt - 大于
ge - 大于或等于
lt - 小于
le - 小于或等于
like (字符串,默认) - 如果包含模式(区分大小写)
bitand - 位与
regexp - 正则表达式匹配(区分大小写)
iregexp - 正则表达式匹配(不区分大小写)

注意:
eq(默认)、negtgeltlebandregexpiregexp 支持整数监控项
eq(默认)、negtgeltleregexpiregexp 支持浮点监控项
like(默认)、eqneregexpiregexp 支持字符串、文本和日志监控项

pattern (可选) - 需要的模式(字符串参数必须使用双引号)
支持的值类型:float, integer, string, text, log

浮点监控项的匹配精度为 2.22e-16;如果数据库未升级,则精度为 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 参数可以是普通或全局(以 '@' 开头)正则表达式。在全局正则表达式的情况下,情况敏感性是从全局正则表达式设置中继承的。为了正则表达式匹配的目的,浮点值将始终用 '.' 后的4位小数表示。还要注意,对于大数,十进制(存储在数据库中)和二进制(由 Zabbix server 使用)表示之间的差异可能会影响第4位小数。
例子:
=> count(/主机/键,10m) → 直到现在的最后10分钟的值的数量
=> count(/主机/键,10m,"like","error") → 直到现在的最后10分钟包含 'error' 的值的数量
=> count(/主机/键,10m,,12) → 直到现在的最后10分钟等于 '12' 的值的数量
=> count(/主机/键,10m,"gt",12) → 直到现在的最后10分钟超过 '12' 的值的数量
=> count(/主机/键,#10,"gt",12) → 直到现在的最后10个值中超过 '12' 的值的数量
=> count(/主机/键,10m:now-1d,"gt",12) → 从现在起24小时10分钟至24小时前超过 '12' 的值的数量
=> count(/主机/键,10m,"bitand","6/7") → 直到现在的最后10分钟在3个最低有效位具有 '110'(二进制)的值的数量
=> count(/主机/键,10m:now-1d) → 从现在起24小时10分钟至24小时前的值的数量
countunique (/host/key,(sec|#num)<:time shift>,<operator>,<pattern>)
在定义的评估期间内的唯一值的数量。 参见通用参数

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

支持的 operators
eq - 等于(整数,默认)
ne - 不等于
gt - 大于
ge - 大于或等于
lt - 小于
le - 小于或等于
like (默认为字符串、文本、日志) - 如果包含模式(区分大小写)
bitand - 位与
regexp - 正则表达式匹配(区分大小写)
iregexp - 正则表达式匹配(不区分大小写)

注意:
eq(默认)、negtgeltlebandregexpiregexp 支持整数监控项
eq(默认)、negtgeltleregexpiregexp 支持浮点监控项
like(默认)、eqneregexpiregexp 支持字符串、文本和日志监控项

pattern (可选) - 需要的模式(字符串参数必须使用双引号)
支持的值类型:float, integer, string, text, log

浮点监控项的匹配精度为 2.22e-16;如果数据库未升级,则精度为 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 参数可以是普通或全局(以 '@' 开头)正则表达式。在全局正则表达式的情况下,情况敏感性是从全局正则表达式设置中继承的。为了正则表达式匹配的目的,浮点值将始终用 '.' 后的4位小数表示。还要注意,对于大数,十进制(存储在数据库中)和二进制(由 Zabbix server 使用)表示之间的差异可能会影响第4位小数。
例子:
=> countunique(/主机/键,10m) → 直到现在的最后10分钟的唯一值的数量
=> countunique(/主机/键,10m,"like","error") → 直到现在的最后10分钟包含 'error' 的唯一值的数量
=> countunique(/主机/键,10m,"gt",12) → 直到现在的最后10分钟超过 '12' 的唯一值的数量
=> countunique(/主机/键,#10,"gt",12) → 直到现在的最后10个值中超过 '12' 的唯一值的数量
=> countunique(/主机/键,10m:now-1d,"gt",12) → 从现在起24小时10分钟至24小时前超过 '12' 的唯一值的数量
=> countunique(/主机/键,10m,"bitand","6/7") → 直到现在的最后10分钟在3个最低有效位具有 '110'(二进制)的唯一值的数量
=> countunique(/主机/键,10m:now-1d) → 从现在起24小时10分钟至24小时前的唯一值的数量
find (/host/key,<(sec|#num)<:time shift>>,<operator>,<pattern>)
查找值匹配。 参见通用参数

sec#num (可选) - 如果未指定,默认为最新值

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

支持的 operators
eq - 等于(整数,默认)
ne - 不等于
gt - 大于
ge - 大于或等于
lt - 小于
le - 小于或等于
like (默认为字符串、文本、日志) - 值包含在 pattern 中给定的字符串(区分大小写)
bitand - 位与
regexp - 正则表达式匹配(区分大小写)
iregexp - 正则表达式匹配(不区分大小写)

注意:
eq(默认)、negtgeltlebandregexpiregexp 支持整数监控项
eq(默认)、negtgeltleregexpiregexp 支持浮点监控项
like(默认)、eqneregexpiregexp 支持字符串、文本和日志监控项

pattern - 需要的模式(字符串参数必须使用双引号);如果 operatorregexpiregexp,则为Perl 兼容正则表达式 (PCRE) 正则表达式。
支持的值类型:float, int, str, text, log

返回值:
1 - 找到匹配
0 - 否则

如果处理了多个值,如果至少有一个匹配的值,则返回 '1'。

使用 regexpiregexp 作为第三个参数时,第四个 pattern 参数可以是普通或全局(以 '@' 开头)正则表达式。在全局正则表达式的情况下,情况敏感性是从全局正则表达式设置中继承的。

例子:
=> find(/主机/键,10m,"like","error") → 在直到现在的最后10分钟内查找包含 'error' 的值
first (/host/key,sec<:time shift>)
在定义的评估期间内的第一个(最旧的)值。 参见常用参数 支持的值类型:float, int, str, text, log
例子:
=> first(/主机/键,1h) → 检索直到现在的最后一个小时内的最旧的值
另请参阅 last()。
fuzzytime (/host/key,sec)
检查被动 agent 时间与 Zabbix server/proxy 时间的差异。 参见通用参数 支持的值类型:float, int

返回值:
1 - 被动监控项值(作为时间戳)与 Zabbix server/proxy 时间戳(值收集的时钟)之间的差异小于或等于 T 秒
0 - 否则

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

例子:
=> fuzzytime(/主机/键,60s)=0 → 如果时间差异超过 60 秒,则检测到问题

此函数不推荐在涉及多个监控项的复杂触发器表达式中使用,因为它可能导致意外结果(时间差异将用最新的度量来衡量),例如在 fuzzytime(/Host/system.localtime,60s)=0 or last(/Host/trap)<>0
last (/host/key,<#num<:time shift>>)
最新值。 参见常用参数

#num (可选) - 第N个最新值
支持的值类型:float, int, str, text, log
请注意,带井号的时间周期(#N)在这里与许多其他函数的工作方式不同。
例如:
last() 总是等于 last(#1)
last(#3) - 第三个最新值(不是三个最新值)

如果历史记录中一秒内存在超过两个值,Zabbix 不保证值的确切顺序。

例子:
=> last(/主机/键) → 检索最新值
=> last(/主机/键,#2) → 检索上一个值
=> last(/主机/键,#1) <> last(/主机/键,#2) → 最新值和上一个值不同
另请参阅 first()。
logeventid (/host/key,<#num<:time shift>>,<pattern>)
检查最后一条日志条目的事件ID是否与正则表达式匹配。 查看通用参数

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

pattern (可选)- 描述所需模式的正则表达式,Perl Compatible Regular Expression (PCRE)风格(字符串参数必须用双引号括起来)。
支持的值类型:日志

返回值:
0 - 不匹配
1 - 匹配
logseverity (/host/key,<#num<:time shift>>)
最后一条日志条目的日志严重性。 查看通用参数

#num (可选)- 最近的第N个值
支持的值类型:日志

返回值:
0 - 默认严重性
N - 严重性(整数,适用于Windows事件日志:1 - 信息,2 - 警告,4 - 错误,7 - 审核失败,8 - 审核成功,9 - 严重,10 - 详细)。
Zabbix从Windows事件日志的信息字段获取日志严重性。
logsource (/host/key,<#num<:time shift>>,<pattern>)
检查最后一条日志条目的日志源是否与正则表达式匹配。 查看通用参数

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

pattern (可选)- 描述所需模式的正则表达式,Perl Compatible Regular Expression 风格(字符串参数必须用双引号括起来)。
支持的值类型:日志

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

通常用于Windows事件日志。例如,logsource("VMware Server")。
monodec (/host/key,(sec|#num)<:time shift>,<mode>)
检查值是否呈现单调递减。 查看通用参数

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)<:time shift>,<mode>)
检查值是否呈现单调递增。 查看通用参数

mode (必须用双引号括起)- weak(每个值都大于或等于前一个值;默认)或 strict(每个值都增加了)
支持的值类型:integer

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

示例:
=> monoinc(/Host1/system.localtime,#3,"strict")=0 - 检查系统本地时间是否一致递增
nodata (/host/key,sec,<mode>)
检查是否未接收到数据。 查看通用参数

sec 时间间隔不应少于30秒,因为历史同步进程仅每30秒计算一次此函数。

不允许使用nodata(/host/key,0)。

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

返回值:
1 - 如果在定义的时间期间内未接收到数据
0 - 否则

自Zabbix 5.0起,默认情况下,由 proxy 监控的'nodata'触发器对 proxy 可用性敏感 - 如果 proxy 变得不可用,'nodata'触发器不会在恢复连接后立即触发,而是会跳过延迟期间的数据。请注意,对于被动 proxy,如果在恢复连接超过15秒并且不少于2 & ProxyUpdateFrequency 秒后,将激活抑制。对于主动 proxy,如果在恢复连接超过15秒后,将激活抑制。

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

请注意,如果在第一个参数的期间内:
- 没有数据并且Zabbix服务器已重启
- 没有数据并且维护已完成
- 没有数据并且监控项已添加或重新启用
错误将显示在触发器配置信息列中。

如果Zabbix服务器、proxy和agent之间存在时间差异,此函数可能无法正常工作。另见:时间同步要求
percentile (/host/key,(sec|#num)<:time shift>,percentage)
周期的第P百分位数,P(百分比)由第三个参数指定。 查看通用参数

percentage - 一个介于0到100(含)之间的浮点数,小数点后最多可有4位数字
支持的值类型:float, integer
rate (/host/key,sec<:time shift>)
在定义时间段内单调递增计数器的每秒平均增长率。 查看通用参数 支持的值类型:float, integer

功能上对应于PromQL中的'rate'。

示例:
=> rate(/host/key,30s) → 如果30秒内的单调增加是20,此函数将返回0.67。