4 历史数据函数
以下列出的所有函数均支持于:
函数列表未包含额外信息。点击函数可查看完整详情。
| 函数 | 描述 |
|---|---|
| change | 最新值与前一值的差异量。 |
| changecount | 在定义评估周期内相邻值之间的变化次数。 |
| count | 在定义评估周期内的数值数量。 |
| countunique | 在定义评估周期内的唯一值数量。 |
| find | 在定义评估周期内查找匹配值。 |
| first | 定义评估周期内的首个(最旧)值。 |
| fuzzytime | 检查被动agent时间与Zabbix server/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、文本、日志。
对于字符串返回:0 - 值相等;1 - 值不同。
参数:请参见 通用参数。
备注:
- 数值差值将按以下示例传入的值 ('前一个' 与 '最新一个' 值 = 变化) 进行计算:
'1' 和 '5' =+4
'3' 和 '1' =-2
'0' 和 '-2.5' =-2.5 - 另请参阅:abs 用于比较。
示例:
change(/主机/key)>10
changecount(/host/key,(sec|#num)<:time shift>,<mode>)
在定义的评估周期内相邻值之间变化的次数。
支持的值类型:float, integer, string, 文本, 日志。
参数:
- 参见 通用参数;
- mode(必须用双引号括起) - 可选值:all - 统计所有变化(默认);dec - 统计减少次数;inc - 统计增加次数。
对于非数值类型的值,mode 参数将被忽略。
示例:
changecount(/主机/key,1w) # 过去一周内的数值变化次数(状态变更次数统计)
changecount(/主机/key,#10,"inc") # 最近10个值中相对前值增加的次数(局部单调性检测:value[n] > value[n-1])
changecount(/主机/key,24h,"dec") # 过去24小时内相对前值减少的次数(下降趋势统计:value[n] < value[n-1])
count(/host/key,(sec|#num)<:time shift>,<operator>,<pattern>)
定义的评估周期内的值的数量。 支持的值类型:float、integer、string、文本、日志。
参数:
- 参见 常见参数;
- 运算符(必须用双引号括起)。支持的
operators:
eq - 等于(默认用于 integer、float)
ne - 不等于
gt - 大于
ge - 大于或等于
lt - 小于
le - 小于或等于
like(默认用于 string、文本、日志)- 包含模式匹配(区分大小写)
bitand - 按位与
regexp - 区分大小写地匹配pattern中给出的正则表达式
iregexp - 不区分大小写地匹配pattern中给出的正则表达式 - pattern - 所需的模式(string 参数必须用双引号括起来)。
注释:
- 浮点型监控项 与 2.22e-16 的精度匹配;
- like 运算符不支持用于 integer 值;
- like 和 bitand 不被支持作为 float 值的操作符;
- 对于 string、文本和日志值,仅支持 eq、ne、like、regexp 和 iregexp 运算符;
- 使用 bitand 作为运算符时,第四个
pattern参数可以指定为两个数字,用“/”分隔:要比较的数字/掩码。count() 会从值和 掩码 计算“按位与”,然后将结果与 要比较的数字 进行比较。如果“按位与”的结果等于 要比较的数字,则该值会计数。
如果 要比较的数字 和 掩码 相等,则只需指定 掩码(不带“/”)。 - 使用 regexp 或 iregexp 作为操作符时,第四个
pattern参数可以是普通正则表达式或全局正则表达式(以 '@' 开头)。对于全局正则表达式,其大小写敏感性继承自全局正则表达式设置。在正则表达式匹配时,float 值始终以 4 小数点后两位的格式表示。还需注意,对于大数值,其十进制(存储在数据库中)与二进制(由 Zabbix server 使用)表示之间的差异可能会影响小数点后第四位。
示例:
`count(/主机/key,10m)` #当前时间往前 10 分钟的值
count(/主机/key,10m,"like","error") #the 过去10分钟内包含'error'的数值数量(字符串匹配计数)
count(/主机/key,10m,,12) #当前的 过去10分钟内等于'12'的数值数量(精确匹配:value == 12)
count(/主机/key,10m,"gt",12) #这个 过去10分钟内大于'12'的数值数量(数值过滤计数)
count(/主机/key,#10,"gt",12) #the 最近10个值中大于'12'的数值数量(滑动窗口统计)
count(/主机/key,10m:now-1d,"gt",12) #the 24小时前至10分钟前与24小时前之间大于'12'的数值数量(跨周期数据对比)
count(/主机/key,10m,"bitand","6/7") # 最近过去10分钟内的数值数量(总数据点数,含重复值)中3最低有效位为'110'(二进制)的情况
count(/主机/key,10m:now-1d) #the 24小时前至10分钟前与24小时前之间的数值数量(历史数据量对比)
countunique(/host/key,(sec|#num)<:time shift>,<operator>,<pattern>)
在定义的评估周期内唯一值的数量。
支持的值类型:float, integer, string, 文本, 日志。
参数:
- 参见通用参数;
- operator(必须用双引号括起)。支持的
operators:
eq - 等于(默认用于 integer, float)
ne - 不等于
gt - 大于
ge - 大于或等于
lt - 小于
le - 小于或等于
like(默认用于 string, 文本, 日志)- 包含模式匹配(区分大小写)
bitand - 按位与
regexp - 区分大小写的正则表达式匹配,正则表达式在pattern中给出
iregexp - 不区分大小写的正则表达式匹配,正则表达式在pattern中给出 - pattern - 所需的模式(string 参数必须用双引号括起)。
注释:
- 浮点型监控项 匹配精度为 2.22e-16;
- like 不支持作为 integer 值的操作符;
- like 和 bitand 不支持作为 float 值的操作符;
- 对于 string、文本和日志值,仅支持 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参数可以是普通正则表达式或全局正则表达式(以 '@' 开头)。对于全局正则表达式,区分大小写由全局正则表达式设置继承。为了进行正则匹配,float 值将始终以4个小数位表示。请注意,对于大数,小数(存储在数据库中)和二进制(由 Zabbix server 使用)表示之间的差异可能影响第4个小数位。
示例:
countunique(/主机/key,10m) # 过去10分钟内的唯一值数量(统计时间窗口:now-10m → now)
countunique(/主机/key,10m,"like","error") # 过去10分钟内包含'error'的唯一值数量(附加条件:值包含"error"字符串)
countunique(/主机/key,10m,,12) # 等于 '12' 的 过去10分钟内的唯一值数量(统计时间窗口:now-10m → now)
countunique(/主机/key,10m,"gt",12) # 过去10分钟内大于'12'的唯一值数量(数值比较:value > 12)
countunique(/主机/key,#10,"gt",12) # 最近10个值中大于'12'的唯一值数量(样本范围:最后10个数据点)
countunique(/主机/key,10m:now-1d,"gt",12) # 24小时前至10分钟前与24小时前之间大于'12'的唯一值数量(时间窗口:[T-24h, T-10m] ∩ [T-48h, T-24h])
countunique(/主机/key,10m,"bitand","6/7") # 最低位 3 位中包含 '110'(二进制)的 过去10分钟内的唯一值数量(统计时间窗口:now-10m → now)
countunique(/主机/key,10m:now-1d) # 24小时前至10分钟前与24小时前之间的唯一值数量(双重时间范围对比)
find(/host/key,(sec|#num)<:time shift>,<operator>,<pattern>)
在定义的评估周期内查找值匹配。
支持的值类型:float、integer、string、文本、日志。
返回值:1 - 找到;0 - 否则。
参数:
- 参见 通用参数;
- sec 或 #num(可选) - 如果未指定,默认为最新值;
- operator(必须用双引号括起)。支持的
operators:
eq - 等于(默认用于 integer、float)
ne - 不等于
gt - 大于
ge - 大于或等于
lt - 小于
le - 小于或等于
like(默认用于 string、文本、日志) - 如果包含在pattern中指定的 string,则匹配(区分大小写)
bitand - 按位与
regexp - 匹配在pattern中指定的正则表达式(区分大小写)
iregexp - 匹配在pattern中指定的正则表达式(不区分大小写) - pattern - 所需的模式(string 参数必须用双引号括起);如果
operator是 regexp 或 iregexp,则为 Perl Compatible Regular Expression(PCRE)正则表达式。
备注:
- 如果处理多个值,则只要至少有一个值匹配,就会返回 '1';
- like 不支持作为 integer 值的操作符;
- like 和 bitand 不支持作为 float 值的操作符;
- 对于 string、文本和日志值,仅支持 eq、ne、like、regexp 和 iregexp 操作符;
- 当操作符为 regexp 或 iregexp 时,第四个
pattern参数可以是普通正则表达式或 全局正则表达式(以 '@' 开头)正则表达式。对于全局正则表达式,其大小写敏感性继承自全局正则表达式设置。
示例:
find(/主机/key,10m,"like","error") #查找在最近 10 分钟内包含 '错误' 的值
first(/host/key,sec<:time shift>)
在定义的评估周期内第一个(最早的)值。
支持的值类型:float、integer、string、文本、日志。
参数:
- 参见 通用参数。
另见 last()。
示例:
first(/主机/key,1h) #检索从当前时间往前一小时内的最早值
fuzzytime(/host/key,sec)
检查被动的 agent 时间与 Zabbix server/proxy 时间之间的差异。
支持的值类型:float、integer。
返回值:1 - 如果被动的 监控项 值(作为时间戳)与 Zabbix server/proxy 时间戳(值收集时钟)之间的差异小于或等于 sec 秒;否则返回 0。
参数:
- 参见 通用参数。
备注:
- 通常与 'system.localtime' 监控项 一起使用,以检查本地时间是否与 Zabbix server 的本地时间同步。注意:'system.localtime' 必须配置为一个 被动检查。
- 也可以与
vfs.file.time[/path/file,modify]键一起使用,以检查 file 是否长时间未 get 更新; - 不建议在复杂的触发器表达式(包含多个 监控项)中使用此函数,因为它可能导致意外结果(时间差异将根据最近的指标进行测量),例如在
fuzzytime(/Host/system.localtime,60s)=0 or last(/Host/trap)<>0中。
示例:
fuzzytime(/主机/key,60s)=0 # 如果时间差超过 60 秒,则检测问题<br><br>
last(/host/key,<#num<:time shift>>)
最新值。
支持的值类型:float、integer、string、文本、日志。
参数:
- 参见 通用参数;
- #num(可选)- 第N个最新的值。
备注:
- 注意此处带井号的时间周期(#N)与其他许多函数中的使用方式不同。例如:
last(/host/key)总是等于last(/host/key,#1);last(/host/key,#3)表示第三个最新的值(不是最近的三个值); - 如果历史数据中同一秒存在两个以上的值,Zabbix 无法保证值的顺序;
- 参见 first()。
示例:
last(/主机/key) #获取最新值
last(/主机/key,#2) #获取上一个值
last(/主机/key,#1) <> last(/主机/key,#2) #最新值与上一个值不同
logeventid(/host/key,<#num<:time shift>>,<pattern>)
检查最后一条日志条目的事件ID是否匹配正则表达式。
支持的值类型:日志。
返回:0 - 不匹配;1 - 匹配。
参数:
- 参见 通用参数;
- #num(可选) - 第N个最近的值;
- pattern(可选) - 描述所需模式的正则表达式,Perl Compatible Regular Expression风格(string参数必须用双引号括起)。
logseverity(/host/key,<#num<:time shift>>)
最后一条日志条目的日志严重性。
支持的值类型:日志。
返回值:0 - 默认严重性;N - 严重性(integer,适用于Windows事件日志:1 - 信息,2 - 警告,4 - 错误,7 - 失败审核,8 - 成功审核,9 - 严重,10 - 详细)。
参数:
- 参见 通用参数;
- #num(可选) - 第#num个最近的值。
Zabbix从Windows事件日志的信息字段获取日志严重性。
logsource(/host/key,<#num<:time shift>>,<pattern>)
检查最后一条日志条目的日志来源是否匹配正则表达式。
支持的值类型:日志。
返回值:0 - 不匹配;1 - 匹配。
参数:
- 参见 通用参数;
- #num(可选) - 第几个最近的值;
- pattern(可选) - 描述所需模式的正则表达式,采用Perl Compatible Regular Expression(PCRE)风格(string参数必须用双引号括起)。
通常用于 Windows 事件日志。
示例:
logsource(/主机/key,,"VMware Server")
monodec(/host/key,(sec|#num)<:time shift>,<mode>)
检查值是否出现了单调递减。
支持的值类型:integer。
返回值:1 - 如果时间段内的所有元素持续递减;0 - 否则。
参数:
- 参见 通用参数;
- mode(必须用双引号括起)- weak(每个值都小于或等于前一个值;默认)或 strict(每个值都已减少)。
示例:
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>)
检查值是否单调递增。
支持的值类型:integer。
返回值:1 - 如果时间段内的所有元素持续增加;0 - 否则。
参数:
- 参见 通用参数;
- mode(必须用双引号括起)- weak(每个值都大于或等于前一个值;默认)或 strict(每个值都必须增加)。
示例:
monoinc(/Host1/system.localtime,#3,"strict")=0 # 检查系统本地时间是否持续增加
nodata(/host/key,sec,<mode>)
检查未收到数据。
支持的值类型:integer、float、字符、文本、日志。
返回值:1 - 如果在定义的时间段内未收到数据;0 - 否则。
参数:
- 参见 通用参数;
- sec - 该时间段不应小于 30 秒,因为历史同步进程仅每 30 秒计算一次此函数;不允许使用
nodata(/host/key,0)。 - mode - 如果设置为 strict(双引号括起),此函数将对 proxy 可用性不敏感(详见注释)。
注释:
- 默认情况下,由 proxy 监控的 'nodata' 触发器对 proxy 的可用性敏感 - 如果 proxy 不可用,则在连接恢复后 'nodata' 触发器不会立即触发,而是跳过延迟期间的数据。请注意,对于被动式 proxies,如果连接在超过 15 秒且不少于 2 秒后恢复,则会激活抑制功能。对于主动式 proxies,如果连接在超过 15 秒后恢复,则会激活抑制功能。要关闭对 proxy 可用性的敏感性,请使用第三个参数,例如:
nodata(/host/key,5m,"strict");在这种情况下,只要无数据的评估周期(五分钟)结束,函数就会触发。 - 如果在第一个参数的时间段内发生以下情况,此函数将显示错误:
- 无数据且 Zabbix server 重新启动
- 无数据且维护已完成
- 无数据且 监控项 已添加或重新启用 - 错误将在触发器 configuration 的 Info 列中显示;
- 如果 Zabbix server、proxy 和 agent 之间存在时间差异,此函数可能无法正常工作。另请参见:时间同步;
- nodata() 函数不能单独在表达式中使用;表达式中必须至少包含一个来自 another group 的函数,引用 主机 监控项(date and time functions 除外)。有关 nodata() 函数在表达式中的工作方式的详细信息,请参见 计算时间。
percentile(/host/key,(sec|#num)<:time shift>,percentage)
某一时间段的 P 百分位数,其中 P(百分比)由第三个参数指定。
支持的值类型:float、integer。
参数:
- 参见 通用参数;
- percentage - 介于 0 和 100(含)之间的浮点数,小数点后最多包含 4 位数字。
rate(/host/key,sec<:time shift>)
在定义的时间段内,单调递增计数器增加的每秒平均速率。
支持的值类型:float, integer。
参数:
- 参见 通用参数。
功能上对应于 PromQL 的 'rate'。
示例:
rate(/主机/key,30s) #如果在 30 秒内单调递增为 20,此函数将返回 0.67。