7 种预测性触发器函数

概述

有时会出现问题即将发生的征兆。通过识别这些征兆,可以提前采取措施来预防或至少减轻问题的影响。

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

函数

在设置触发器之前,需要先定义问题状态是什么以及需要多少时间来采取行动。然后有两种方式来设置触发器以发出潜在不良情况的信号。第一种:当系统预计在"行动时间"后处于问题状态时,触发器必须触发。第二种:当系统将在少于"行动时间"内达到问题状态时,触发器必须触发。对应的触发器函数是forecasttimeleft。请注意,这两个函数的基础统计分析基本上是相同的。您可以根据个人偏好以类似的结果设置任一种触发器。

参数

这两个函数使用几乎相同的参数集。请参考supported functions列表作为参考。

时间间隔

首先,您需要指定Zabbix用于生成预测分析的历史数据周期。这可以通过熟悉的time period参数和可选的时间偏移来实现,其操作方式与avgcountdeltamaxminsum函数相同。

预测范围

(仅限forecast)
参数time用于指定Zabbix应从历史数据中推断依赖关系的未来时间范围。无论是否使用time_shifttime始终从当前时刻开始计算。

达到阈值

(仅适用于timeleft)
参数threshold指定被分析的监控项需要达到的阈值, 无论从上方还是下方接近该值。确定f(t)函数后(见下文), 我们需要解方程f(t) = threshold并返回距离当前时间最近且位于当前时间右侧的根, 若无符合条件的根则返回999999999999.9999。

当监控项值接近阈值并发生交叉时, timeleft会判定交叉点已成为过去事件, 从而自动切换到下一个与threshold水平的交点(如果存在)。 最佳实践是将预测功能作为常规问题诊断的补充,而非替代方案。1

拟合函数

默认的fit线性函数。但如果您的监控系统更为复杂,您还有更多选项可供选择。

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

(仅限forecast)
每次触发函数被评估时,它都会从指定的历史周期获取数据,并将指定函数拟合到数据上。因此,如果数据略有不同,拟合函数也会稍有差异。如果我们仅仅计算拟合函数在未来指定时刻的值,你将无法了解被分析的监控项在当前到未来那一刻之间的预期行为。对于某些fit选项(如多项式),来自未来的简单值可能具有误导性。

mode forecast 结果
value f(当前时间 + time)
max 最大值当前时间 <= t <= 当前时间 + time f(t)
min 最小值当前时间 <= t <= 当前时间 + time f(t)
delta 最大值 - 最小值
avg 根据definition计算的f(t)平均值(当前时间 <= t <= 当前时间 + time

详情

为避免处理超大数值的计算,我们将指定周期内第一个值的时间戳加上1纳秒作为新的零时基准(当前纪元时间约为109量级,纪元时间的平方达1018,而双精度浮点数的精度约为10-16)。添加1纳秒的目的是为涉及对数时间计算的对数拟合提供全正时间值。时间偏移不会影响线性多项式指数拟合(除了使计算更简单精确外),但会改变对数函数的形态。

潜在错误

函数在这些情况下返回-1:

  • 指定的评估周期内无数据;

  • 数学运算结果未定义3;

  • 数值计算问题(某些输入数据集可能导致此情况

    range and precision of double-precision floating-point format become insufficient)4.

即使所选拟合模型与提供数据匹配度差,或数据量过少导致预测不准确,系统也不会触发任何警告或错误提示。

示例与错误处理

当您即将run磁盘空间不足时get警告 您的 主机,您可以使用如下触发器表达式:

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

然而,错误代码-1可能会出现并将您的触发器置于 问题状态。通常这是好事,因为你get了一个关于你的警告 预测功能运行不正常,您需要更仔细地检查它们 彻底调查以找出原因。但有时这很糟糕,因为-1可能仅仅 意味着没有获取到关于主机空闲磁盘空间的数据 最近一小时。如果您收到过多的误报警报, 考虑使用更复杂的触发器表达式5:

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

预测的情况稍微复杂一些。首先, -1 可能会也可能不会将触发器置于问题状态,具体取决于 您是否有类似 forecast(/host/item,(...))<... 的表达式 像 forecast(/host/item,(...))>...

此外,如果对于监控项来说-1是正常值,那么它也可能是一个有效的预测值 值为负数。但这种情况在现实中的概率 世界局势的影响可以忽略不计(参见 how 操作符 = 有效). 因此 添加 ... or forecast(/host/item,(...))=-1... and forecast(/host/item,(...))<>-1 如果你想或不想 将-1视为问题。

脚注

1 例如,一个简单的触发器如

`timeleft(/host/item,1h,X) < 1h` may go into problem state when the
       item value approaches X and then suddenly recover once value X is
       reached. If the problem is item value being below X, use:
       `last(/host/item) < X or timeleft(/host/item,1h,X) < 1h` If the
       problem is item value being above X, use:
       `last(/host/item) > X or timeleft(/host/item,1h,X) < 1h`

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 等同于

to *linear*. However, use higher degree polynomials [with
       caution](https://en.wikipedia.org/wiki/Runge's_phenomenon). If the
       evaluation period contains less points than needed to determine
       polynomial coefficients, polynomial degree will be lowered (e.g.,
       *polynomial5* is requested, but there are only 4 points, therefore
       *polynomial3* will be fitted).

3 例如,拟合指数函数涉及

calculating log() of item values. If data contains zeros or negative
       numbers, you will get an error since log() is defined for positive
       values only.

4 对于线性指数对数拟合

necessary calculations can be written explicitly. For *polynomial*
       only *value* can be calculated without any additional steps.
       Calculating *avg* involves computing polynomial antiderivative
       (analytically). Computing *max*, *min* and *delta* involves
       computing polynomial derivative (analytically) and finding its roots
       (numerically). Solving f(t) = 0 involves finding polynomial roots
       (numerically).

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)