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>是引用主机监控项历史数据的函数的通用第二个参数,其中:
函数详情
关于函数参数的一些通用说明:
- 函数参数之间用逗号分隔
- 可选函数参数(或参数的一部分)用
<>表示 - 每个函数都会说明其特定参数
/host/key和(sec|#num)<:time shift>参数绝不能加引号
change(/host/key)
前一个值与最新值之间的差异量。
支持的值类型:Float、Integer、String、Text、Log。
对于字符串返回: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>)
定义的评估周期内相邻值之间的变化次数。
支持的值类型:Float、Integer、String、Text、Log。
参数:
- 参见 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>)
在定义的评估周期内的值的数量。
支持的值类型:Float、Integer、String、Text、Log。
参数:
- 参见 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 值的运算符。
- like 和 bitand 不支持作为 Float 值的运算符。
- 对于 String、Text 和 Log 值,仅支持 eq、ne、like、regexp 和 iregexp 运算符。
- 当使用 bitand 作为运算符时,第四个
pattern参数可以指定为两个数字,并用 '/' 分隔:number_to_compare_with/mask。 count() 会对值和 mask 进行“按位 AND”运算,并将结果与 number_to_compare_with 比较。 如果“按位 AND”的结果等于 number_to_compare_with,则该值会被计数。
如果 number_to_compare_with 和 mask 相等,则只需指定 mask(不带 '/')。 - 当使用 regexp 或 iregexp 作为运算符时,第四个
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>)
在定义的评估周期内唯一值的数量。
支持的值类型:Float、Integer、String、Text、Log。
参数:
- 参见 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 值的操作符。
- like 和 bitand 不支持作为 Float 值的操作符。
- 对于 String、Text 和 Log 值,仅支持 eq、ne、like、regexp 和 iregexp 操作符。
- 当使用 bitand 作为操作符时,第四个
pattern参数可以指定为两个数字,并用 '/' 分隔:number_to_compare_with/mask。countunique() 会对值和 mask 执行“按位与”运算,并将结果与 number_to_compare_with 进行比较。 如果“按位与”的结果等于 number_to_compare_with,则该值会被计数。
如果 number_to_compare_with 和 mask 相等,则只需指定 mask(不带 '/')。 - 当使用 regexp 或 iregexp 作为操作符时,第四个
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>)
在定义的评估周期内查找匹配的值。
支持的值类型:Float、Integer、String、Text、Log。
返回:1 - 找到;0 - 其他情况。
参数:
- 参见 common parameters
- sec 或 #num(可选)- 如果未指定,则默认为最新值
- operator(必须用双引号括起来)
支持的
operators:
eq - 相等(整数、浮点数默认)
ne - 不等于
gt - 大于
ge - 大于或等于
lt - 小于
le - 小于或等于
like(字符串、文本、日志默认)- 如果包含pattern中给出的字符串则匹配(区分大小写)
bitand - 按位 AND
regexp - 匹配pattern中给出的正则表达式(区分大小写)
iregexp - 匹配pattern中给出的正则表达式(不区分大小写) - pattern - 所需的模式(字符串参数必须用双引号括起来);如果
operator为 regexp、iregexp,则为 Perl Compatible Regular Expression(PCRE)正则表达式
备注:
- 如果处理多个值,只要至少有一个值匹配,就返回 '1'。
- like 不支持作为整数值的 operator。
- like 和 bitand 不支持作为浮点值的 operator。
- 对于字符串、文本和日志值,仅支持 eq、ne、like、regexp 和 iregexp operators。
- 当 regexp 或 iregexp 作为 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>)
在定义的计算周期内的第一个(最早的)值。
支持的值类型:Float、Integer、String、Text、Log。
参数:
另请参见 last()。
示例:
first(/host/key,1h) #检索截至当前最近一小时内最早的值
fuzzytime(/host/key,sec)
检查被动 agent 时间与 Zabbix 服务器/proxy 时间相差多少。
支持的值类型:Float、Integer。
返回值: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>>)
最新值。
支持的值类型:Float、Integer、String、Text、Log。
参数:
- 参见 common parameters
- #num(可选)- 第 N 个最新值
注释:
- 请注意,这里的带井号的时间段(#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 - 匹配。
参数:
- 参见 common parameters
- #num(可选)- 第 N 个最近的值
- pattern(可选)- 描述所需模式的正则表达式,采用 Perl Compatible Regular Expression(PCRE)风格(字符串参数必须用双引号括起来)
示例:
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)。
参数:
- 参见 common parameters
- #num(可选)- 第 N 个最近的值
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 - 匹配。
参数:
- 参见 common parameters
- #num(可选)- 第 N 个最近的值
- pattern(可选)- 描述所需模式的正则表达式,采用 Perl Compatible Regular Expression(PCRE)风格(字符串参数必须用双引号括起来)
通常用于 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>)
检查是否未收到数据。
支持的值类型:Integer、Float、Character、Text、Log。
返回值: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 服务器已重启
- 没有数据且维护已完成
- 没有数据且该监控项已添加或重新启用。 - 错误会显示在触发器 configuration 的 Info 列中。
- 如果 Zabbix 服务器、proxy 和 agent 之间存在时间差,此函数可能无法正常工作。 另请参见:时间同步要求。
示例:
nodata(/host/agent.ping,5m)=1 #如果 5 分钟内未从 Zabbix agent 收到数据,则触发
百分位数(/host/key,(sec|#num)<:time shift>,percentage)
一个时间段的第 P 百分位数,其中 P(百分比)由第三个参数指定。
支持的值类型:Float、Integer。
参数:
- 参见 通用参数
- 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>)
在定义的时间段内,单调递增计数器每秒平均增长率。
支持的值类型:Float、Integer。
参数:
功能上对应 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 个请求