有时会出现问题即将发生的征兆。通过识别这些征兆,可以提前采取措施来预防或至少减轻问题的影响。
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 = 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警告 您的 主机,您可以使用如下触发器表达式:
然而,错误代码-1可能会出现并将您的触发器置于 问题状态。通常这是好事,因为你get了一个关于你的警告 预测功能运行不正常,您需要更仔细地检查它们 彻底调查以找出原因。但有时这很糟糕,因为-1可能仅仅 意味着没有获取到关于主机空闲磁盘空间的数据 最近一小时。如果您收到过多的误报警报, 考虑使用更复杂的触发器表达式5:
预测的情况稍微复杂一些。首先, -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)