有时会出现问题即将发生的迹象。这些迹象可以被发现,从而可以提前采取措施,防止问题的发生或至少减轻其影响。
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:
如果所选模型与提供的数据拟合效果较差,或者数据量过少导致无法准确预测,系统不会标记任何警告或错误。
当您即将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
可能在以下情况下进入问题状态 监控项 值接近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
last(/host/item) > X or timeleft(/host/item,1h,X) < 1h
2 多项式次数范围可从 1 至 6,polynomial1 表示等效关系 to linear. However, use higher degree polynomials with caution. If the 评估周期包含的点数少于确定所需的点数 多项式系数,多项式次数将降低(例如, polynomial5 被请求,但仅有 4 个数据点,因此 polynomial3 will be fitted).
3 例如,拟合指数或幂函数时涉及 计算 监控项值 的对数 log()。如果数据包含零或负值 在数值处理时,若对非正数调用get函数将报错,因为log()函数仅定义在正数域 values only.
4。对于线性、指数、对数和幂拟合,所有 必要的计算可以显式地编写。对于多项式 只有值可以在无需任何额外步骤的情况下进行计算。 计算avg涉及多项式不定积分的求解 (分析性)。计算最大值、最小值和差值涉及 计算多项式导数(解析法)并求其根 (数值上)。求解f(t) = 0涉及寻找多项式根 (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)