4 历史函数

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

这些函数仅列出名称,不提供额外信息。 单击函数可查看完整详情。

Function Description
change 前一个值与最新值之间的差值。
changecount 在定义的评估周期内,相邻值之间的变化次数。
count 在定义的评估周期内的值数量。
countunique 在定义的评估周期内的唯一值数量。
find 在定义的评估周期内查找匹配的值。
first 在定义的评估周期内的第一个(最早的)值。
fuzzytime 检查被动 agent 时间与 Zabbix 服务器/proxy 时间相差多少。
last 最新值。
logeventid 检查最后一条日志记录的事件 ID 是否与正则表达式匹配。
logseverity 最后一条日志记录的日志严重性。
logsource 检查最后一条日志记录的日志来源是否与正则表达式匹配。
monodec 检查值是否存在单调递减。
monoinc 检查值是否存在单调递增。
nodata 检查是否未收到数据。
percentile 某一周期的第 P 百分位数,其中 P(百分比)由第三个参数指定。
rate 在定义的时间段内,单调递增计数器的每秒平均增长率。
通用参数
  • /host/key 是引用主机监控项历史数据的函数的通用必需第一个参数
  • (sec|#num)<:time shift> 是引用主机监控项历史数据的函数的通用第二个参数,其中:
    • sec - 以秒为单位的最大评估周期(可使用时间后缀),或
    • #num - 最近收集值中的最大评估范围(如果前面带有井号)
    • time shift(可选)允许将评估点向前回移。 有关指定 time shift 的更多详细信息,请参见更多详情

函数详情

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

  • 函数参数之间用逗号分隔
  • 可选函数参数(或参数的一部分)用 < > 表示
  • 每个函数都会说明其特定参数
  • /host/key(sec|#num)<:time shift> 参数绝不能加引号
change(/host/key)

前一个值与最新值之间的差异量。
支持的值类型:FloatIntegerStringTextLog
对于字符串返回:0 - 值相等;1 - 值不同。

参数:参见通用参数

注释:

  • 数值差异将按如下所示的输入示例值进行计算(“前一个”值和“最新”值 = 差异):
    '1' 和 '5' = +4
    '3' 和 '1' = -2
    '0' 和 '-2.5' = -2.5
  • 另请参见:abs 用于比较。

示例:

change(/host/system.uptime)<0 #自上次值以来,系统运行时间变化为负(表示发生了重启)
change(/host/system.cpu.load[all,avg1])>2 #CPU 负载(1 分钟)相较上次值上升了超过 2
change(/host/vfs.fs.size[/,free])<-1G #两次检查之间可用磁盘空间减少了超过 1 GB
changecount(/host/key,(sec|#num)<:time shift>,<mode>)

定义的评估周期内相邻值之间的变化次数。
支持的值类型:FloatIntegerStringTextLog

参数:

  • 参见 common parameters
  • mode(必须用双引号括起来)- 可选值:all - 统计所有变化(默认);dec - 统计减少;inc - 统计增加

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

示例:

changecount(/host/icmpping,10m)>5 #ping 状态在 10 分钟内变化超过 5 次
changecount(/host/vfs.file.contents["/sys/class/net/eth0/operstate"],1h)>5 #eth0 的运行状态在 1 小时内变化超过 5 次
changecount(/host/proc.num[httpd],15m)>10 #httpd 进程数量在 15 分钟内变化超过 10 次
changecount(/host/key,#10,"inc") #最近 10 个值中(相对于相邻值)增加的次数
changecount(/host/key,24h,"dec") #截至现在的最近 24 小时内(相对于相邻值)减少的次数
count(/host/key,(sec|#num)<:time shift>,<operator>,<pattern>)

在定义的评估周期内的值的数量。
支持的值类型:FloatIntegerStringTextLog

参数:

  • 参见 common parameters
  • operator(必须用双引号括起来) 支持的 operators
    eq - 相等(Integer、Float 的默认值)
    ne - 不等于
    gt - 大于
    ge - 大于或等于
    lt - 小于
    le - 小于或等于
    like(String、Text、Log 的默认值)- 如果包含模式则匹配(区分大小写)
    bitand - 按位 AND
    regexp - 匹配 pattern 中给出的正则表达式,区分大小写
    iregexp - 匹配 pattern 中给出的正则表达式,不区分大小写
  • pattern - 所需的模式(字符串参数必须用双引号括起来)

注释:

  • Float 监控项的匹配精度为 2.22e-16。
  • like 不支持作为 Integer 值的运算符。
  • likebitand 不支持作为 Float 值的运算符。
  • 对于 String、Text 和 Log 值,仅支持 eqnelikeregexpiregexp 运算符。
  • 当使用 bitand 作为运算符时,第四个 pattern 参数可以指定为两个数字,并用 '/' 分隔:number_to_compare_with/mask。 count() 会对值和 mask 进行“按位 AND”运算,并将结果与 number_to_compare_with 比较。 如果“按位 AND”的结果等于 number_to_compare_with,则该值会被计数。
    如果 number_to_compare_withmask 相等,则只需指定 mask(不带 '/')。
  • 当使用 regexpiregexp 作为运算符时,第四个 pattern 参数可以是普通正则表达式,也可以是 global 正则表达式(以 '@' 开头)。 对于全局正则表达式,大小写敏感性继承自全局正则表达式设置。 在进行 regexp 匹配时,Float 值将始终以小数点后 4 位表示。 另请注意,对于较大的数字,十进制(存储在数据库中)和二进制(由 Zabbix 服务器使用)表示之间的差异可能会影响第 4 位小数。

示例:

count(/host/icmpping,30m,,"0")>5 #ping 失败超过 5 次,持续 30 分钟
count(/host/key,10m,"like","error") #从现在起过去 10 分钟内包含 'error' 的值的数量
count(/host/key,10m,,12) #从现在起过去 10 分钟内等于 '12' 的值的数量
count(/host/key,10m,"gt",12) #从现在起过去 10 分钟内大于 '12' 的值的数量
count(/host/key,#10,"gt",12) #最近 10 个值中大于 '12' 的值的数量
count(/host/key,10m:now-1d,"gt",12) #从现在起 24 小时前到 24 小时 10 分钟前之间大于 '12' 的值的数量
count(/host/key,10m,"bitand","6/7") #从现在起过去 10 分钟内最低 3 位为 '110'(二进制)的值的数量
count(/host/key,10m:now-1d) #从现在起 24 小时前到 24 小时 10 分钟前之间的值的数量
countunique(/host/key,(sec|#num)<:time shift>,<operator>,<pattern>)

在定义的评估周期内唯一值的数量。
支持的值类型:FloatIntegerStringTextLog

参数:

  • 参见 common parameters
  • operator(必须用双引号括起来)。 支持的 operators
    eq - 等于(Integer、Float 的默认值)
    ne - 不等于
    gt - 大于
    ge - 大于或等于
    lt - 小于
    le - 小于或等于
    like(String、Text、Log 的默认值)- 如果包含模式则匹配(区分大小写)
    bitand - 按位与
    regexp - 匹配 pattern 中给出的正则表达式,区分大小写
    iregexp - 匹配 pattern 中给出的正则表达式,不区分大小写
  • pattern - 所需的模式(字符串参数必须用双引号括起来)

说明:

  • Float 监控项的匹配精度为 2.22e-16。
  • like 不支持作为 Integer 值的操作符。
  • likebitand 不支持作为 Float 值的操作符。
  • 对于 String、Text 和 Log 值,仅支持 eqnelikeregexpiregexp 操作符。
  • 当使用 bitand 作为操作符时,第四个 pattern 参数可以指定为两个数字,并用 '/' 分隔:number_to_compare_with/mask。countunique() 会对值和 mask 执行“按位与”运算,并将结果与 number_to_compare_with 进行比较。 如果“按位与”的结果等于 number_to_compare_with,则该值会被计数。
    如果 number_to_compare_withmask 相等,则只需指定 mask(不带 '/')。
  • 当使用 regexpiregexp 作为操作符时,第四个 pattern 参数可以是普通正则表达式,也可以是 global 正则表达式(以 '@' 开头)。 对于全局正则表达式,大小写敏感性继承自全局正则表达式设置。 为了进行 regexp 匹配,Float 值始终会以小数点后 4 位表示。 另请注意,对于较大的数字,十进制(存储在数据库中)和二进制(Zabbix 服务器中使用)表示之间的差异可能会影响第 4 位小数。

示例:

countunique(/host/key,10m) #过去 10 分钟直到现在的唯一值数量
countunique(/host/key,10m,"like","error") #过去 10 分钟直到现在包含 'error' 的唯一值数量
countunique(/host/key,10m,,12) #过去 10 分钟直到现在等于 '12' 的唯一值数量
countunique(/host/key,10m,"gt",12) #过去 10 分钟直到现在大于 '12' 的唯一值数量
countunique(/host/key,#10,"gt",12) #截至现在的最近 10 个值中大于 '12' 的唯一值数量
countunique(/host/key,10m:now-1d,"gt",12) #从现在往前 24 小时到 24 小时 10 分钟之前之间,大于 '12' 的唯一值数量
countunique(/host/key,10m,"bitand","6/7") #过去 10 分钟直到现在,最低 3 位中包含二进制 '110' 的唯一值数量
countunique(/host/key,10m:now-1d) #从现在往前 24 小时到 24 小时 10 分钟之前之间的唯一值数量
find(/host/key,(sec|#num)<:time shift>,<operator>,<pattern>)

在定义的评估周期内查找匹配的值。
支持的值类型:FloatIntegerStringTextLog
返回:1 - 找到;0 - 其他情况。

参数:

  • 参见 common parameters
  • sec#num(可选)- 如果未指定,则默认为最新值
  • operator(必须用双引号括起来) 支持的 operators
    eq - 相等(整数、浮点数默认)
    ne - 不等于
    gt - 大于
    ge - 大于或等于
    lt - 小于
    le - 小于或等于
    like(字符串、文本、日志默认)- 如果包含 pattern 中给出的字符串则匹配(区分大小写)
    bitand - 按位 AND
    regexp - 匹配 pattern 中给出的正则表达式(区分大小写)
    iregexp - 匹配 pattern 中给出的正则表达式(不区分大小写)
  • pattern - 所需的模式(字符串参数必须用双引号括起来);如果 operatorregexpiregexp,则为 Perl Compatible Regular Expression(PCRE)正则表达式

备注:

  • 如果处理多个值,只要至少有一个值匹配,就返回 '1'。
  • like 不支持作为整数值的 operator。
  • likebitand 不支持作为浮点值的 operator。
  • 对于字符串、文本和日志值,仅支持 eqnelikeregexpiregexp operators。
  • regexpiregexp 作为 operator 时,第四个 pattern 参数可以是普通正则表达式,也可以是 global 正则表达式(以 '@' 开头)。 对于全局正则表达式,大小写敏感性继承自全局正则表达式设置。

示例:

find(/host/key,10m,"like","error") #查找最近 10 分钟内直到现在包含 'error' 的值
find(/host/agent.version,,"like","beta")=1 #Zabbix agent 版本为 beta,必须升级
find(/host/log[/var/log/nginx/access.log],,"regexp"," 500 ")=1 #已发现内部 web 服务器错误
first(/host/key,sec<:time shift>)

在定义的计算周期内的第一个(最早的)值。
支持的值类型:FloatIntegerStringTextLog

参数:

另请参见 last()

示例:

first(/host/key,1h) #检索截至当前最近一小时内最早的值
fuzzytime(/host/key,sec)

检查被动 agent 时间与 Zabbix 服务器/proxy 时间相差多少。
支持的值类型:FloatInteger
返回值:1 - 被动监控项值(作为时间戳)与 Zabbix 服务器/proxy 时间戳(采集该值时的时钟)之间的差值小于或等于 sec 秒;0 - 否则。

参数:

注释:

  • 通常与 system.localtime 监控项一起使用,以检查本地时间是否与 Zabbix 服务器的本地时间同步。 注意,对于 Zabbix agent,system.localtime 必须配置为 被动检查;在 Zabbix agent 2 上,它也可以配置为主动检查。
  • 也可与 vfs.file.time[/path/file,modify] 键一起使用,以检查文件是否长时间未更新。
  • 不建议在复杂的触发器表达式中使用此函数(涉及多个监控项),因为它可能导致意外结果(时间差将按最近的指标进行测量),例如:fuzzytime(/Host/system.localtime,60s)=0 or last(/Host/trap)<>0

示例:

fuzzytime(/host/system.localtime,5m)=0 #客户端本地时间与 Zabbix 服务器/proxy 时间相差超过 5 分钟
fuzzytime(/host/system.localtime,5m)=0 and nodata(/host/system.localtime,10m)=0 #客户端本地时间与 Zabbix 服务器/proxy 时间相差超过 5 分钟(同时确保该监控项没有停止上报数据)
last(/host/key,<#num<:time shift>>)

最新值。
支持的值类型:FloatIntegerStringTextLog

参数:

注释:

  • 请注意,这里的带井号的时间段(#N)与许多其他函数中的行为不同。 例如:last(/host/key) 始终等于 last(/host/key,#1)last(/host/key,#3) - 第三个最新值(不是 最近的三个值)。
  • 如果历史记录中在同一秒内存在超过两个值,Zabbix 不保证这些值的精确顺序。
  • 另请参见 first()

示例:

last(/host/key) #获取最后一个值
last(/host/key,#2) #获取前一个值
last(/host/key,#1) <> last(/host/key,#2) #最后一个值和前一个值不同
logeventid(/host/key,<#num<:time shift>>,<pattern>)

检查最后一条日志记录的事件 ID 是否与正则表达式匹配。
支持的值类型:Log
返回:0 - 不匹配;1 - 匹配。

参数:

示例:

logeventid(/host/eventlog[Security],,"^4625$")=1 #找到一条 ID 匹配 "4625"(认证失败)的日志记录
logeventid(/host/eventlog[System],,"^(6008|41)$")=1 #找到一条 ID 匹配 "6008" 或 "41" 的日志记录
logseverity(/host/key,<#num<:time shift>>)

最后一条日志条目的日志严重级别。
支持的值类型:Log
返回值:0 - 默认严重级别;N - 严重级别(整数,对 Windows 事件日志很有用:1 - Information,2 - Warning,4 - Error,7 - Failure Audit,8 - Success Audit,9 - Critical,10 - Verbose)。

参数:

Zabbix 从 Windows 事件日志的 Information 字段中获取日志严重级别。

示例:

logseverity(/host/log[/var/log/syslog],10m)>3 #找到一条严重级别高于 "3" 的日志条目
logseverity(/host/eventlog[System],10m)=4 #找到一条严重级别等于 "Error" 的日志条目
logsource(/host/key,<#num<:time shift>>,<pattern>)

检查最后一条日志记录的日志源是否与正则表达式匹配。
支持的值类型:Log
返回:0 - 不匹配;1 - 匹配。

参数:

通常用于 Windows 事件日志。

示例:

logsource(/host/eventlog[Application],,"MSSQLSERVER")=1 #找到源匹配 "MSSQLSERVER" 的日志记录
logsource(/host/eventlog[System],,"Service Control Manager")=1 #找到源匹配 "Service Control Manager" 的日志记录
logsource(/host/eventlog[System],,"Service Control Manager")=1 and logeventid(/host/eventlog[System],,"^7031$")=1 #找到源匹配 "Service Control Manager" 且事件 ID 匹配 "7031" 的日志记录
monodec(/host/key,(sec|#num)<:time shift>,<mode>)

检查数值是否出现单调递减。
支持的值类型:Integer
返回值:1 - 如果时间段内所有元素持续递减;0 - 否则。

参数:

  • 参见 common parameters
  • mode(必须用双引号括起来)- weak(每个值都小于或等于前一个值;默认)或 strict(每个值都已下降)

示例:

monodec(/host/system.swap.size[all,free],60s) + monodec(/host2/system.swap.size[all,free],60s) + monodec(/host3/system.swap.size[all,free],60s) #计算有多少主机的可用 swap 大小出现了下降
monodec(/host/proc.num[nginx],10m,"strict")=1 #nginx 进程数量在 10 分钟内单调递减
monoinc(/host/key,(sec|#num)<:time shift>,<mode>)

检查值是否呈单调递增。
支持的值类型:Integer
返回值:1 - 如果时间段内所有元素持续递增;0 - 否则。

参数:

  • 参见 common parameters
  • mode(必须用双引号括起来)- weak(每个值都大于或等于前一个值;默认)或 strict(每个值都严格递增)

示例:

monoinc(/host/system.localtime,#3,"strict")=0 #系统本地时间没有持续递增
monoinc(/host/vfs.dir.count[/mnt/data/logs],24h,"weak")=0 #如果文件数量在 24 小时内一直停滞不变则触发器(预期应增长)
nodata(/host/key,sec,<mode>)

检查是否未收到数据。
支持的值类型:IntegerFloatCharacterTextLog
返回值:1 - 如果在定义的时间段内未收到数据;0 - 否则。

参数:

  • 参见 common parameters
  • sec - 该时间段不应少于 30 秒,因为 history syncer 进程每 30 秒才计算一次此函数;nodata(/host/key,0) 不允许
  • mode - 如果设置为 strict(双引号),此函数将不受 proxy 可用性影响(详见注释)

注释:

  • 默认情况下,由 proxy 监控的 'nodata' 触发器对 proxy 可用性敏感 - 如果 proxy 变得不可用,在连接恢复后,'nodata' 触发器不会立即触发,而是会跳过延迟期间的数据。 请注意,对于被动 proxy,如果连接恢复时间超过 15 秒且不超过 2 秒之后,则会启用抑制。 对于主动 proxy,如果连接恢复时间超过 15 秒,则会启用抑制。 要关闭对 proxy 可用性的敏感性,请使用第三个参数,例如:nodata(/host/key,5m,"strict");在这种情况下,一旦无数据的评估周期(5 分钟)结束,函数就会立即触发。
  • 如果在第 1 个参数对应的时间段内出现以下情况,此函数将显示错误:
    - 没有数据且 Zabbix 服务器已重启
    - 没有数据且维护已完成
    - 没有数据且该监控项已添加或重新启用。
  • 错误会显示在触发器 configurationInfo 列中。
  • 如果 Zabbix 服务器、proxy 和 agent 之间存在时间差,此函数可能无法正常工作。 另请参见:时间同步要求

示例:

nodata(/host/agent.ping,5m)=1 #如果 5 分钟内未从 Zabbix agent 收到数据,则触发
百分位数(/host/key,(sec|#num)<:time shift>,percentage)

一个时间段的第 P 百分位数,其中 P(百分比)由第三个参数指定。
支持的值类型:FloatInteger

参数:

  • 参见 通用参数
  • percentage - 一个介于 0 和 100 之间(含)的浮点数,小数点后最多 4 位

示例:

percentile(/host/net.if.in[eth0,bytes],1h,95)>1000000 #95th percentile network input (bytes/sec) over 1 hour has gone beyond a threshold (e.g., 1 MB/s)
percentile(/host/system.cpu.util,5m,95)>80 #95th percentile of CPU utilization user-time percentage has gone above 80
percentile(/host/icmppingsec[192.168.0.2],15m,95)>0.15 #most latency measurements are below 150 ms but the higher-end tail (top 5%) implies regular lag
percentile(/host/net.if.in[eth0,bytes],1h,50) #calculate the 50th percentile (the median value) of incoming network traffic for an hour; this yields a different result from avg() (the average), as percentile does not consider outlier values
(percentile(/host/net.if.in[eth0,bytes],1h,50)+percentile(/host/net.if.in[eth0,bytes],1h,51))/2 #calculate precise median value with an even number of values for an hour
rate(/host/key,sec<:time shift>)

在定义的时间段内,单调递增计数器每秒平均增长率。
支持的值类型:FloatInteger

参数:

功能上对应 PromQL 的 'rate'。

示例:

rate(/host/key,30s) #如果 30 秒内的单调递增量为 20,则此函数返回 0.67。
rate(/host/net.if.in[eth0,bytes],5m)>500000 #eth0 上的入站接口流量速率在过去 5 分钟内已超过 500 KB/s
rate(/host/app.requests.count,1m)>100 #过去 1 分钟内,请求计数器的增长已超过每秒 100 个请求

请参见 all supported functions