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

7 触发器预测函数

概述

有时会有即将发生问题的迹象。可以通过这些迹象,提前采取措施防止或减轻问题的影响。

Zabbix拥有基于监控系统的历史数据来预测未来行为的工具。这些工具通过触发器预测函数来实现。

1 函数

在设置触发器之前,首先需要定义问题状态是什么以及需要多少时间来触发。然后有两种方式来设置触发器来标记潜在的不希望出现的情况。第一种:当系统在“触发时间”后预期处于问题状态时,触发器必须触发。第二种:当系统在“触发时间”之前将达到问题状态时,触发器必须触发。相应触发器函数是forecasttimeleft.。请注意,这两个函数所依赖的统计分析基本上是相同的。你可以根据自己的喜好以任何一种方式设置触发器,结果将是相似的。

2 参数

两个函数使用完全一样的参数,参考支持函数 列表。

2.1 时间间隔

首先,你应该指定 Zabbix 需要分析的历史时间段来提出预测。你可以通过time period参数和 可选时间偏移以熟悉的方式执行此操作,就像使用 avg, count, delta, max, minsum函数一样。

2.2 预测范围

(仅限forecast )
参数time 指Zabbix根据历史数据中发现的依赖关系来预测未来的时间长度。无论你是否使用time_shifttime总是从当前时刻开始计算。

2.3 阈值

(仅限timeleft )
参数 threshold指定分析监控项必须达到的值,如果从上或下都没有差异。一旦确定了f(t) (见下文) ,我们应该求解方程 f(t) = threshold并返回更靠近现在和从现在开始向右的根,如果没有这样的根,则返回 1.7976931348623158E+308。

当监控项值接近阈值然后越过它时, timeleft 假定阈值交叉点已经过去,因此切换到下一个阈值 级别的交叉点(如果有)。最佳实践应该是使用预测作为普通问题诊断的补充,而不是替代。[^1]

2.4 fit函数

默认fit线性函数. 但是,如果你的监控系统更复杂,可以有更多选项。

fit x = f(t)
线性 x = a + b*t
多项式1 x = a0 + a1*t + a2*t2 + ... + an*tn
指数 x = a*exp(b*t)
对数 x = a + b*log(t)
x = a*tb
2.5 模式

(仅限forecast )
每次评估触发函数时,它都会从指定的历史周期中获取数据,代入指定的函数中。 因此,如果数据略有不同,fit函数值也会略有不同。如果我们只是简单地计算未来某个特定时间fit函数的值,那么对于分析监控项在现在和未来某个时刻之间的预期行为将一无所获。对一些 fit 函数 (例如 多项式) 生成的值可能会产生误导。

模式 forecast 结果
f(now + time)
最大值 maxnow <= t <= now + time f(t)
最小值 minnow <= t <= now + time f(t)
增量 max - min
平均值 average of f(t) (now <= t <= now + time) 参考定义

3 细节

为避免计算量很大,我们将指定周期内第一个值的时间戳加上1ns视为新的零时间 (当前纪元时间为109, 纪元平方为1018, 双精度约为10-16)。添加1ns以提供log(t)计算中对数的所有正时间值。时间偏移不会影响 线性, 多项式, 指数 (除了更简单和更精确的计算), 但会改变对数 函数的形态。

4 潜在错误

以下情形,函数返回 -1:

  • 指定的评估时间段内无数据
  • 数学运算结果没有被定义2
  • 复杂数字(不幸的是,对于某些输入的数据范围和双精度浮点数的精度格式设置不足)3

如果选择的fit函数不足以描述提供的数据或仅有很少的数据参与计算预测,不会出现警告或错误标记。

5 示例和错误处理

要在主机上的可用磁盘空间即将用尽时获得告警,你可以使用如下的触发器表达式:

timeleft(/host/vfs.fs.size[/,free],1h,0)}<1h

但是,错误代码-1可能产生,并使触发器变为问题状态,一般来说,预测功能无法正常工作时收到告警是非常好的,你应该彻底的查看他们并找到原因,但,有时它是不好的,因为-1仅简单表示在最后一小时这里没有主机磁盘空间数据,如果你收到太多的误报告警,考虑使用更复杂的表达式 4

timeleft(/host/vfs.fs.size[/,free],1h,0)<1h and timeleft(/host/vfs.fs.size[/,free],1h,0)<>-1

该情形对于forecast有点困难。首先,-1 可能会或可能不会让触发器变为问题状态,主要取决于你的表达式类似 forecast(/host/item,(...))<...forecast(/host/item,(...))>...

此外, 如果监控项值为负数是正常的,-1 可能是个有效的预测,但是这种情况再现实情况可能性是很少的 (查看操作符= 如何 工作)。因此,如果你想活不想让-1作为一个问题对待,新增 ... or forecast(/host/item,(...))=-1... and forecast(/host/item,(...))<>-1 ; [^1]: 例如,一个简单的触发器如 timeleft(/host/item,1h,X) < 1h可能会在当监控项值接近X时达到问题状态,然后在达到X时突然恢复,如果异常时监控值低于X,使用:last(/host/item) < X or timeleft(/host/item,1h,X) < 1h ,如果异常时监控项值高于X时,使用: last(/host/item) > X or timeleft(/host/item,1h,X) < 1h


  1. 多项式次数从1到6, 多项式1 等价于线性。但 谨慎使用高次多项式,如果评估周期中包含的数据点少于确定多项式系数的数据点数,多项式会降次I (例如,多项式5是被要求的,但是只有4个点,这时,多项式3被使用)。↩︎

  2. 例如,使用指数函数涉及监控项值计算的log(),如果数据中包含0或负数,你将获取到一个错误,因为log()仅对正值定义。↩︎

  3. 对于 线性, 指数, 对数 函数,所有必要计算可以明确的写出来。对于 多项式,在没有任何额外的步骤下, 才可以被计算。计算平均需要计算多项式的反导数(解析),计算最大, 最小增量需要计算多项式导数(解析),然后找到他们的根(数字),求解f(t) = 0需要找到多项式的根(数字)。↩︎

  4. 但这种情况 -1 能导致你的触发器从问题状态变为恢复状态,安全起见使用: timeleft(/host/vfs.fs.size[/,free],1h,0)<1h and ({TRIGGER.VALUE}=0 and timeleft(/host/vfs.fs.size[/,free],1h,0)<>-1 or {TRIGGER.VALUE}=1)↩︎