有时会出现问题即将发生的征兆。通过识别这些征兆,可以提前采取措施来预防或至少减轻问题的影响。
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 <= 当前时间 + timef(t) | 
| min | 最小值当前时间 <= t <= 当前时间 + timef(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)