7 触发器预测函数

概述

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

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

函数

在设置触发器之前,有必要先定义什么是问题状态,以及采取行动需要多少时间。然后,可以通过两种方式来设置用于提示潜在不良情况的触发器。第一种:当系统预计在“采取行动时间”之后处于问题状态时,触发器必须触发。第二种:当系统将在少于“采取行动时间”的时间内进入问题状态时,触发器必须触发。

对应可使用的触发器函数是 forecasttimeleft。请注意,这两种函数所依据的统计分析在本质上是相同的。您可以根据自己的偏好以任一方式设置触发器,并获得类似的结果。

参数

这两个函数使用几乎相同的一组参数。请参考支持的函数列表。

时间间隔

首先,您应指定 Zabbix 用于分析以生成预测的历史时间段。您可以像使用 avgcountdeltamaxminsum 函数一样,通过 time period 参数以及可选的时间偏移来完成。

预测范围

(仅 forecast
参数 time 指定 Zabbix 应将历史数据中发现的依赖关系外推到未来多远。无论是否使用 time_shifttime 都始终从当前时刻开始计算。

达到阈值

(仅 timeleft
参数 threshold 指定被分析的监控项必须达到的值, 无论是从上方还是从下方接近。 一旦我们确定了 f(t) (见下文),就应求解方程 f(t) = threshold,并返回 距离当前时间最近且位于当前时间右侧的根;如果不存在这样的根,则返回 1.7976931348623158E+308。

当监控项值接近阈值并随后越过 该阈值时,timeleft 会认为该交点已经发生在过去, 因此会切换到与 threshold 水平的下一个交点(如果有)。 最佳实践是将预测作为常规问题诊断的补充,而不是替代。1

拟合函数

默认的 fitlinear 函数。但如果你的受监控系统更复杂,你还有更多可选项。

fit x = f(t)
linear x = a + b*t
polynomialN2 x = a~0~ + a~1~*t + a~2~*t2 + ... + a~n~*tn
exponential x = a*exp(b*t)
logarithmic x = a + b*log(t)
power x = a*tb
模式

(仅适用于 forecast
每次评估一个触发器函数时,它都会从指定的历史周期获取数据,并将指定函数拟合到这些数据上。因此,如果数据略有不同,拟合后的函数也会略有不同。若只是简单地计算拟合函数在未来某个指定时间点的值,你将无法了解被分析的监控项在现在到未来该时刻之间预计会如何变化。对于某些 fit 选项(如 polynomial),仅看未来某个简单值可能会产生误导。

mode forecast 结果
value f(now + time)
max max~now\ <=\ t\ <=\ now\ +\ time~ f(t)
min min~now\ <=\ t\ <=\ now\ +\ time~ f(t)
delta max - min
avg 根据 定义 计算 f(t) 的平均值(now <= t <= now + time

详情

为避免使用巨大数值进行计算,我们将指定时间段内第一个值的时间戳加 1 ns 视为新的零时间(当前纪元时间的数量级为 109,纪元平方为 1018,双精度约为 10-16)。添加 1 ns 是为了为涉及计算 log(t) 的 对数 拟合提供所有正时间值。时间偏移不会影响 线性多项式指数 拟合(除了使计算更简单、更精确之外),但会改变 对数 函数的形状。

可能的错误

在以下情况下,函数返回 -1:

  • 指定的评估周期不包含任何数据;
  • 数学运算结果未定义3
  • 数值计算问题(遗憾的是,对于某些输入数据集,双精度浮点格式的范围和精度会变得不足)4

如果所选拟合曲线对所提供的数据描述不佳,或者用于准确预测的数据太少,则不会标记任何警告或错误。

示例与错误处理

要在主机即将耗尽可用磁盘空间时收到警告,您可以使用如下触发器表达式:

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

不过,错误代码 -1 可能会出现,并使您的触发器进入问题状态。通常这其实是好事,因为这会提醒您预测结果不正确,您应该更仔细地检查它们,以找出原因。但有时这也可能是坏事,因为 -1 仅仅表示在过去一小时内没有获取到有关主机可用磁盘空间的数据。如果您收到过多误报,请考虑使用更复杂的触发器表达式 5

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 也可能是一个有效的预测值。但在现实场景中,这种情况出现的概率可以忽略不计(请参见 how 运算符 = 的工作方式)。因此,如果您希望将 -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

2 多项式次数可以从 1 到 6,polynomial1 等同于 linear。不过,使用更高次数的多项式时请谨慎。如果评估周期中的点数少于确定多项式系数所需的数量,则会降低多项式次数(例如,请求的是 polynomial5,但只有 4 个点,因此将拟合 polynomial3)。

3 例如,拟合 exponentialpower 函数时,需要计算监控项值的 log()。如果数据中包含 0 或负数,就会报错,因为 log() 只对正值定义。

4 对于 linearexponentiallogarithmicpower 拟合,所有必要的计算都可以显式写出。对于 polynomial,只能在不进行任何额外步骤的情况下计算 value。计算 avg 需要求多项式的原函数(解析方式)。计算 maxmindelta 需要求多项式导数(解析方式)并找到其根(数值方式)。求解 f(t) = 0 需要找到多项式的根(数值方式)。

5 但在这种情况下,-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)