有时会出现问题即将发生的迹象。这些迹象可以被发现,从而可以提前采取措施,防止问题的发生或至少减轻其影响。
Zabbix 提供了基于历史数据预测监控系统未来行为的工具。这些工具通过预测触发器函数实现。
在设置触发器之前,有必要明确定义问题状态是什么以及需要多少时间采取行动。然后有两种方式来设置触发器以提示潜在的不良情况。第一种方式:当系统在“响应时间”后预计处于问题状态时触发器必须触发。第二种方式:当系统在少于“响应时间”的时间内即将达到问题状态时触发器必须触发。相应的触发器函数为 forecast 和 timeleft。请注意,这两个函数的底层统计分析基本上是相同的。您可以根据偏好选择任意一种方式设置触发器,其结果是相似的。
这两个函数使用几乎相同的参数集。请参考supported functions中的参数列表。
首先,您需要指定Zabbix进行分析以得出预测结果的历史时间段。您可以通过熟悉的方式,使用time period
参数以及可选的时间偏移量来实现这一点,这与您在使用avg、count、delta、max、min和sum函数时的操作方式相同。
(预测模式)
参数 time
指定 Zabbix 应该基于历史数据中发现的依赖关系向前推算多远。无论是否使用 time_shift
,time
的计时始终从当前时刻开始。
(仅限timeleft)
参数 threshold
指定了被分析的 监控项 必须达到的值,无论该值是从上方还是下方接近。一旦我们确定了 f(t)(见下文),我们就应该解方程 f(t) = threshold
,并返回距离当前时间较近且位于当前时间右侧的根;如果没有这样的根,则返回 1.7976931348623158E+308。
当 监控项值 接近阈值然后越过它时,timeleft 会假设该交叉点已经过去,因此会切换到下一个与 threshold
水平的交叉点(如果存在)。最佳实践是将预测作为常规问题诊断的补充,而不是替代方案。1
默认的 fit
是 线性 函数。但如果您的监控系统更加复杂,则您可以从更多选项中进行选择。
fit |
x = f(t) |
---|---|
linear | x = a + b*t |
polynomialN2 | x = a0 + a1*t + a2*t2 + ... + an*tn |
exponential | x = a*exp(b*t) |
logarithmic | x = a + b*log(t) |
power | x = a*tb |
(仅限预测)
每次评估触发器函数时,它都会从指定的历史时间段获取数据,并将指定的函数拟合到这些数据上。因此,如果数据略有不同,拟合出的函数也会略有不同。如果我们只是简单地计算未来某个指定时间点上拟合函数的值,那么我们将无法了解分析的 监控项 在当前到未来该时间点之间可能的行为表现。对于某些 fit
选项(例如 polynomial),来自未来的简单值可能会产生误导。
mode |
forecast 结果 |
---|---|
value | f(now + time ) |
max | maxnow <= t <= now + time f(t) |
min | minnow <= t <= now + time f(t) |
delta | max - min |
avg | f(t) 的平均值(now <= t <= now + time ),依据 definition |
为了避免使用极大数值进行计算,我们将指定时间段内第一个值的时间戳加上 1 ns 作为一个新的零时间点(当前纪元时间约为 109,纪元平方为 1018,双精度约为 10-16)。添加 1 ns 是为了确保对 logarithmic(对数)和 power(幂函数)拟合使用的所有时间值均为正数,因为这些拟合涉及计算 log(t)。时间偏移不会影响 linear(线性)、polynomial(多项式)和 exponential(指数)拟合(除了使计算更简单和更精确),但会改变 logarithmic(对数)和 power(幂函数)拟合的函数形状。
在以下情况下,函数会返回 -1:
如果所选模型与提供的数据拟合效果较差,或者数据量过少导致无法准确预测,系统不会标记任何警告或错误。
当您即将耗尽磁盘空间时,get 会发出警告,当您即将 run 磁盘空间时也是如此。 您的 主机,您可以使用类似如下的触发器表达式:
但是,错误代码-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进入问题状态时 监控项 值接近 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 是等效的 转换为线性。但是,请将更高阶的多项式 与 警告。如果 评估周期包含的点数不足以确定状态 多项式系数,多项式阶数将被降低(例如, polynomial5 被请求,但只有 4 个点,因此 polynomial3 将被拟合)。
3 例如,拟合指数或幂函数涉及 计算 监控项值 的 log()。如果数据包含零或负数 数字时,将会出现get错误,因为log()仅对正数定义。 仅返回OutputFormat格式要求结果
4 对于线性、指数、对数和幂拟合 必要的计算可以显式编写。对于多项式 只有 value 可以在没有任何额外步骤的情况下进行计算。 计算 avg 需要计算多项式不定积分 (分析上)。计算 max、min 和 delta 涉及以下内容: 计算多项式导数(解析方法)并求其根 (数值上)。求解 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)