7 预测触发功能

概述

有时会有即将出现问题的迹象。可以通过这些迹象,来提前采取措施防止或至少将问题的影响降至最低。

Zabbix 有可以根据历史数据预测被监控系统未来行为的工具。这些工具是通过预测触发功能实现的。

1 功能

我们需要知道的两件事是如何定义问题状态和采取行动需要多少时间。这里有两种方法可以设置一个关于潜在不必要情况的触发信号。第一:当系统在“采取行动时间”之后预期处于问题状态时,触发器必须触发。第二:当系统将在“采取行动的时间”之内处于问题状态时,触发器必须触发。要使用的相应触发函数是 forecast and timeleft。请注意, 这两个函数的基础统计分析基本相同。您可以按照自己喜欢的方式设置触发器,并获得类似的结果。

2 参数

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

2.1 时间间隔

首先,你应该指定 Zabbix 需要分析的历史时间来提出预测。你可以通过 time period参数和 可选时间偏移以熟悉的方式执行此操作,就像使用 avg, count, delta, max, min and sum函数一样。

2.2 预测范围

(仅限forecast )
参数 time Zabbix 应该在多长时间内推断它在历史数据中找到的依赖关系。不管你是否使用time_shifttime 总是从当前时刻开始计算。

2.3 达到阈值

(仅限timeleft )
参数 threshold指定分析监控项必须达到的值,不管从上还是从下达到。一旦确定了f(t) (见下文) ,我们应该求解方程 f(t) = threshold并返回更靠近现在和从现在开始向右的根,如果没有这样的根,则返回 999999999999.9999。

当监控项值接近阈值然后越过它时, timeleft 假定交叉点已经过去,因此切换 threshold 水平的, 水平的下一个交叉点(如果有)。最佳实践应该是使用预测作为普通问题诊断的补充,而不是替代。1

2.4 拟合函数

默认fit线性函数. 但是,如果你的监控系统更复杂,可以有更多选项。

fitx = f(t)
线性x = a + bt
多项式2x = a0 + a1t + a2t2 + … + antn
指数x = aexp(bt)
对数x = a + blog(t)
x = atb
2.5 模式

(仅限forecast )
每次评估触发函数时,它都会从指定的历史期间获取数据,并将指定的函数拟合到数据中。 因此,如果数据略有不同,拟合函数也会略有不同。如果我们只是简单地计算未来某个特定时间拟合函数的值,那么将一无所获对于分析监控项在现在和未来那个时刻之间的预期行为。对于某些 fit 选项 (例如 polynomial) 未来的简单值可能会产生误导。

模式forecast 结果
f(now + time)
最大值maxnow <= t <= now + time f(t)
最小值minnow <= t <= now + time f(t)
增量max - min
平均值average of f(t) (now <= t <= now + time) 参考定义

3 细节

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

4 潜在错误

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

  • 指定的评估期不包含数据;

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

  • 数值复杂性(不幸的是,对于某些输入数据集的双精度浮点格式的范围和精度变得不够)4

如果选择的拟合不能很好地描述所提供的数据,或者无法准确预测的数据太少,则不会标记警告或错误。

5 示例和错误处理

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

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

但是,错误代码 -1 可能会发挥作用并使你的触发器处于问题状态。一般来说,你会收到警告说明你的预测无法正常工作,你应该更彻底地查看它们以找出原因。但有时它很糟糕,因为 -1 可能只是意味着没有关于在过去一小时内获得的主机可用磁盘空间的数据。如果您收到太多误报警报,请考虑使用更复杂的触发器表达式 5

  1. 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 可能是有效的预测。但是在现实世界中这种情况的概率可以忽略不计 (看看operator \=如何工作)。因此,如果您想要或不想分别将 -1 视为问题,可以添加 ... 或 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, 多项式1等价于线性。但是 请谨慎使用高次多项式。如果评估周期包含的点数少于确定多项式系数所需的点数,则会降低多项式次数(例如 要求多项式5, 但只有4个点,因此将拟合多项式3 )。↩︎

  3. 例如,拟合 指数 函数涉及计算监控项值的log() 。如果数据包含零或负数,你将收到错误,因为 log() 仅针对正值定义。↩︎

  4. 对于线性, 指数, 对数 拟合,所有必要的计算都可以明确写出来。对于多项式无需任何额外步骤即可计算仅 。计算 平均 涉及计算多项式反导数(分析)。计算最大, 最小增量涉及计算多项式导数 (解析) 并找到它的根 (数值). 求解 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)↩︎