7 种预测性触发器函数
概述
有时会出现问题即将发生的征兆。通过识别这些征兆,可以提前采取措施来预防或至少减轻问题的影响。
Zabbix提供基于历史数据预测被监控系统未来行为的工具。这些工具通过预测性触发器函数实现。
函数
在设置触发器之前,需要先定义问题状态是什么以及需要多少时间来采取行动。然后有两种方式来设置触发器以发出潜在不良情况的信号。第一种:当系统预计在"行动时间"后处于问题状态时,触发器必须触发。第二种:当系统将在少于"行动时间"内达到问题状态时,触发器必须触发。对应的触发器函数是forecast和timeleft。请注意,这两个函数的基础统计分析基本上是相同的。您可以根据个人偏好以类似的结果设置任一种触发器。
参数
这两个函数使用几乎相同的参数集。请参考supported functions列表作为参考。
时间间隔
首先,您需要指定Zabbix用于生成预测分析的历史数据周期。这可以通过熟悉的time period参数和可选的时间偏移来实现,其操作方式与avg、count、delta、max、min和sum函数相同。
预测范围
(仅限forecast)
参数time用于指定Zabbix应从历史数据中推断依赖关系的未来时间范围。无论是否使用time_shift,time始终从当前时刻开始计算。
达到阈值
(仅适用于timeleft)
参数threshold指定被分析的监控项需要达到的阈值,
无论从上方还是下方接近该值。确定f(t)函数后(见下文),
我们需要解方程f(t) = threshold并返回距离当前时间最近且位于当前时间右侧的根,
若无符合条件的根则返回999999999999.9999。
当监控项值接近阈值并发生交叉时,
timeleft会判定交叉点已成为过去事件,
从而自动切换到下一个与threshold水平的交点(如果存在)。
最佳实践是将预测功能作为常规问题诊断的补充,而非替代方案。1
拟合函数
默认的fit是线性函数。但如果您的监控系统更为复杂,您还有更多选项可供选择。
fit |
x = f(t) |
|---|---|
| 线性 | x = a + b*t |
| 多项式N2 | x = a~0~ + a~1~*t + a~2~*t2 + ... + a~n~*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)