Zabbix Documentation 3.0

2.23.04.04.2 (current)In development:4.4 (devel)Unsupported:1.82.02.43.23.4

User Tools

Site Tools

This translation is older than the original page and might be outdated. See what has changed.

Sidebar

ru:manual:config:triggers:prediction

This is an old revision of the document!


8 Прогнозирующие триггерные функции

Обзор

Иногда надвигающаяся проблема подаёт знаки. Эти знаки можно заметить и меры могут быть предприняты заблаговременно для того, чтобы предотвратить или хотя бы уменьшить ущерб от проблемы.

В Zabbix-е есть средства для прогнозирования, основываясь на исторических данных, поведения наблбдаемой системы в будущем. Эти средства реализованы в виде прогнозирующих триггерных функций.

1 Функции

Необходимо знать две вещи - как описать состояние проблемы и сколько времени необходимо для принятия мер. Далее есть два способа создать триггер, сигнализирующий о возможной нежелательной ситуации. Первый: триггер должен активизироваться, если система через время, необходимое для принятия мер, будет в состоянии проблемы. Второй: триггер должен активизироваться, если система придёт в состояние проблемы за время, меньшее времени для принятия мер. Соответственно, нужно использовать триггерные функции forecast (“прогноз”) и timeleft (“время до”). Надо заметить, что за этими двумя функциями стоит одинаковый статистический анализ. Вы можете использовать тот способ, который кажется Вам более предпочтительным, и результаты будут идентичны.

2 Параметры

Обе функции используют почти одинаковый набор параметров. Обращайтесь к списку поддерживаемых функций за справкой.

2.1 Временной интервал

Прежде всего следует указать период истории, который следует проанализировать Zabbix-у для составления прогноза. Вы можете сделать это знакомым образом с помощью параметра sec или #num и необязательного сдвиг_времени по аналогии с функциями avg, count, delta, max, min и sum.

2.2 Горизонт предсказания

(Только forecast)
Параметр время определяет, насколько далеко в будущее Zabbix будет экстраполировать зависимости, которые ему удастся найти в исторических данных. Независимо о того, используется сдвиг_времени или нет, время всегда отсчитывается от текущего момента.

2.3 Порог (который необходимо достигнуть)

(Только timeleft)
Параметр порог значение, которое должен достичь анализируемый элемент данных, неважно, сверху или снизу. После того, как найдена f(t) (смотрите ниже), мы должны решить уравнение f(t) = порог и взять ближайший к текущему моменту корень, который лежит справа от текущего момента, или возвратить 999999999999.9999, если таких корней нет.

Когда значения элемента данных приближаются к порогу, а затем пересекают его, timeleft делает вывод, что пересечение уже находится в прошлом, и поэтому переключается на следуещее пересечение с пороговым уровнем, если таковое имеется. Наилучшим решением яляется использование прогнозирования наряду с обычной диагностикой проблем, а не замена первым последнего.1)
2.4 Аппроксимирующие функции

По умолчанию аппроксимация - это линейная (linear) функция. Если наблюдаемая система более сложная, Вы можете выбрать один из следующих вариантов.

аппроксимация x = f(t)
линейная функция (linear) x = a + b*t
многочлен (polynomialN)2) x = a0 + a1*t + a2*t2 + … + an*tn
показательная функция (exponential) x = a*exp(b*t)
логарифмическая функция (logarithmic) x = a + b*log(t)
степенная функция (power) x = a*tb
2.5 Режимы

(Только forecast)
Каждый раз, когда вычисляется триггерная функция, запрашиваются данные из указанного исторического периода и по полученным данным строится указанная аппроксимация. Поэтому, если данные немного изменятся, то и построенная аппроксимация немного изменится. Если мы будем просто рассчитывать значение аппроксимирующей функции в заданный момент времени в будущем, Вы не будете ничего знать о том, как согласно прогнозу будет меняться анализируемый элемент данных между текущим моментом и этим моментом в будущем. При некоторых значениях параметра аппроксимация (вроде polynomial) одно лишь значение из будущего может быть обманчивым.

режим результат forecast
значение (value) f(сейчас + время)
максимум (max) maxсейчас <= t <= сейчас + время f(t)
минимум (min) minсейчас <= t <= сейчас + время f(t)
разброс (delta) max - min
среднее (avg) среднее значение f(t) (сейчас <= t <= сейчас + время) в соответствии с определением

3 Подробности

Для того, чтобы избежать вычислений с большими числами, мы рассматриваем штамп времени первого значения в указанном периоде плюс 1 нс как новую точку остчёта времени (текущие штампы времени порядка 109, в квадрате уже 1018, а точность типа double около 10-16). 1 нс прибавляется для того, чтобы все значения времени были положительными, поскольку построение логарифмической и степенной аппроксимаций подразумевает вычисление log(t). Этот сдвиг времени не влияет на линейную функцию, многочлен и показательную функцию (кроме упрощения и повышения точности вычислений), но изменяет форму логарифмической и степенной функций.

4 Возможные ошибки

Функции возвращают -1 в следующих ситуациях:

  • указанных период не содержит данных;
  • математическая операция не определена3);
  • сложности вычислительного характера (к сожалению, для некоторых наборов входных данных диапазона и точности формата чисел с плаваюшей точкой двойной точности становится недостаточно)4).
Никаких предупреждений или ошибок не выдаётся, если выбранная аппроксимирующая функция плохо описывает указанные данные или просто недостаточно данных для точного прогноза.

5 Примеры и обработка ошибок

Для получения предупреждения о том, что у Вашего узла сети скоро закончится свободное дисковое пространство, Вы можете использовать следующее триггерное выражение:

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

Однако, может появиться код ошибки -1 и перевести Ваш триггер в состояние проблемы. Вообще говоря, это не плохо, потому что Вы получаете предупреждение о том, что Ваше прогнозирование не работает как положено, и Вам стоит обратить на них внимание, чтобы разобраться почему. Но иногда это плохо, потому что -1 может просто означать, что о свободном дисковом пространстве данного узла сети за последний час не было получено никаких данных. Если Вы получаете много сообщений о ложных тревогах, подумайте об использовании более сложного триггерного выражения5):

{host:vfs.fs.size[/,free].timeleft(1h,,0)}<1h and {host:vfs.fs.size[/,free].timeleft(1h,,0)}<>-1

Ситуация немного сложнее с forecast. Начнём с того, что -1 сможет или не сможет переводить триггер в состояние проблемы в зависимости от Вашего триггерного выражения, которое может быть вроде

{host:item.forecast(...)}<...
или вроде
{host:item.forecast(...)}>...

Более того, -1 может быть вполне правильным результатом прогнозирования, если прогнозируемый элемент данных может принимать отрицательные значения. Но вероятность возникновения такой ситуации в реальных условиях пренебрежимо мала (смотрите, как работает оператор =). Поэтому добавьте

... or {host:item.forecast(...)}=-1
или
... and {host:item.forecast(...)}<>-1
если Вы хотите, или, наоборот, не хотите рассматривать -1 как проблему, соответственно.

Смотрите также

1)
Например, простой триггер наподобие
{host:item.timeleft(1h,,X)} < 1h
может переключиться в состояние проблемы, когда элемент данных приближается к X, и неожиданно “самоустраниться”, как только X достигнут. Если проблема выражается в том, что элемент данных меньше X, используйте:
{host:item.last()} < X or {host:item.timeleft(1h,,X)} < 1h
Если проблема выражается в том, что элемент данных более X, используйте:
{host:item.last()} > X or {host:item.timeleft(1h,,X)} < 1h
2)
Степень многочлена может быть от 1 до 6, при этом polynomial1 равнозначен linear. Однако, использовать многочлены высоких степеней следует с осторожностью. Если исторический период содержить меньше точек, чем требуется для определения коэффициентов многочлена, степень многочлена будет понижена (например, запрашивается polynomial5, но есть только 4 точки, поэтому для аппроксимации будет использован polynomial3).
3)
Например, построение показательной и степенной функций требует логарифмирования значений элемента данных. Если данные содержат нулевые или отрицательные числа, Вы получите сообщение об ошибке, поскольку логарифмирование возможно только для положительных значений.
4)
Для аппроксимаций linear, exponential, logarithmic и power выражения для всех необходимых вычислений могут быть написаны в явном виде. Для polynomial только value может быть вычислено без дополнительных шагов. Вычисление avg включает в себя вычисление первообразной многочлена (аналитически). Вычисление max, min и delta включает в себя вычисление производной многочлена (аналитически) и поиск её корней (численно). Решение f(t) = 0 требует нахождения корней многочлена (численно).
5)
Но в этом случае -1 может восстановить триггер из состояния проблемы. Для полной защищённости используйте:
{host:vfs.fs.size[/,free].timeleft(1h,,0)}<1h and ({TRIGGER.VALUE}=0 and {host:vfs.fs.size[/,free].timeleft(1h,,0)}<>-1 or {TRIGGER.VALUE}=1)