Иногда имеются признаки надвигающейся проблемы. Эти признаки можно заметить, таким образом можно заблаговременно предпринять меры, чтобы предотвратить или хотя бы уменьшить влияние проблемы.
В Zabbix имеются средства прогнозирования будущего поведения наблюдаемой системы на основе исторических данных. Эти средства реализованы в виде прогнозирующих функций триггеров.
Перед настройкой триггера необходимо определить, что такое состояние проблемы и сколько времени нужно для принятия мер. Далее есть два способа настроить триггер, сигнализирующий о возможной нежелательной ситуации. Первый: триггер должен сработать, когда ожидается, что после «времени реагирования» система будет в проблемном состоянии. Второй: триггер должен сработать, когда прогнозируется, что система достигнет проблемного состояния за время, меньшее, чем «время реагирования». Для этого используются функции триггеров forecast и timeleft соответственно. Надо отметить, что статистический анализ, лежащий в основе этих двух функций, в основном идентичен. Вы можете настроить триггер любым удобным для вас способом с аналогичными результатами.
Обе функции используют практически идентичный набор параметров. Воспользуйтесь списком поддерживаемых функций для справки.
Прежде всего вам необходимо указать исторический период, который Zabbix должен проанализировать для составления прогноза. Делайте это привычным способом при помощи параметра период времени
и необязательного сдвига времени по аналогии с функциями avg, count, delta, max, min и sum.
(Только forecast)
Параметр время
определяет, насколько далеко в будущее Zabbix будет экстраполировать зависимости, которые ему удастся найти в исторических данных. Независимо от того, используете ли вы сдвиг_времени
или нет, время
всегда отсчитывается от текущего момента.
(Только timeleft)
Параметр порог
задает значение, которого должен достичь анализируемый элемент данных, нет никакой разницы, сверху или снизу. После того, как мы определили f(t) (смотрите ниже), мы должны решить уравнение f(t) = порог
и вернуть ближайший к текущему моменту корень, который находится справа от текущего момента, или вернуть 999999999999.9999, если таковых корней нет.
Когда значения элемента данных приближаются к порогу, а затем пересекают его, timeleft делает вывод, что пересечение уже находится в прошлом, и поэтому переключается на следующее пересечение с уровнем порога
, если таковое имеется. Наилучшим решением было бы использовать прогнозирования в качестве дополнения к обычным диагностикам проблем, а не замены одного на другое.1
По умолчанию аппроксимация
является линейной (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 |
(Только forecast)
Каждый раз, когда вычисляется функция триггера, данные запрашиваются из указанного периода истории и по полученным данным строится указанная аппроксимация. Поэтому, если данные немного изменятся, то и построенная аппроксимация немного изменится. Если мы будем просто рассчитывать значение функции аппроксимации в заданный момент времени в будущем, то вы ничего не будете знать о том, как согласно прогнозу будет меняться анализируемый элемент данных между текущим моментом и этим моментом в будущем. При некоторых параметрах аппроксимации
(вроде polynomial) просто лишь одно значение из будущего может ввести в заблуждение.
режим |
Результат forecast |
---|---|
значение (value) | f(сейчас + время ) |
максимум (max) | maxсейчас <= t <= сейчас + время f(t) |
минимум (min) | minсейчас <= t <= сейчас + время f(t) |
дельта (delta) | max - min |
среднее (avg) | среднее значение f(t) (сейчас <= t <= сейчас + время ) в соответствии с определением |
Для того, чтобы избежать вычислений с большими числами, мы рассматриваем штамп времени первого значения в указанном периоде плюс 1 наносекунда как новую точку отсчёта времени (текущие штампы времени порядка 109, в квадрате уже 1018, а точность дробных значений около 10-16). 1 наносекунда прибавляется для того, чтобы все значения времени были положительными, поскольку построение логарифмической (logarithmic) и степенной (power) аппроксимаций подразумевает вычисление log(t). Этот сдвиг времени не влияет на линейную (linear), полиномиальную (polynomial) и экспоненциальную (exponential) функции (за исключением более легких и более точных вычислений), но изменяет форму логарифмической (logarithmic) и степенной (power) функций.
Функции возвращают -1 в следующих ситуациях:
Никаких предупреждений или ошибок не выдаётся, если выбранная функция аппроксимации плохо описывает предоставленные данные или данных просто недостаточно для точного прогноза.
Для получения предупреждения о том, что у вашего узла сети скоро закончится свободное дисковое пространство, вы можете использовать следующее выражение триггера:
Однако, может появиться код ошибки -1 и перевести ваш триггер в состояние проблемы. Вообще говоря, это неплохо, потому что вы получите предупреждение о том, что ваши прогнозирования не работают должным образом, и вам стоит обратить на них внимание, чтобы разобраться почему. Но иногда это плохо, потому что -1 может просто означать, что за последний час не было получено никаких данных о свободном дисковом пространстве данного узла сети. Если вы получаете много сообщений о ложных тревогах, подумайте об использовании более сложного выражения триггера 5:
timeleft(/узел сети/vfs.fs.size[/,free],1h,0)<1h and timeleft(/узел сети/vfs.fs.size[/,free],1h,0)<>-1
С forecast ситуация немного сложнее. Начнём с того, что -1 может перевести, а может и не перевести триггер в состояние проблемы в зависимости от вашего выражения триггера, которое может быть вроде forecast(/узел сети/элемент данных,(...))<...
или наподобие forecast(/узел сети/элемент данных,(...))>...
Более того, -1 может быть вполне корректным результатом прогнозирования, если прогнозируемый элемент данных может принимать отрицательные значения. Но вероятность возникновения такой ситуации в реальных условиях пренебрежительно мала (смотрите, как работает оператор =). Поэтому добавьте ... or forecast(/узел сети/элемент данных,(...))=-1
или ... and forecast(/узел сети/элемент данных,(...))<>-1
, если вы соответсвенно хотите или, наоборот, не хотите рассматривать -1 как проблему.
1 Например, простой триггер такой как timeleft(/узел сети/элемент данных,1h,X) < 1h
может перейти в состояние проблемы, когда элемент данных приближается к X, и неожиданно восстановиться, как только значение X достигнуто. Если проблема выражается в том, что значение элемента данных меньше X, используйте: last(/узел сети/элемент данных) < X or timeleft(/узел сети/элемент данных,1h,X) < 1h
. Если проблема заключается в том, что значение элемент данных больше X, используйте: last(/узел сети/элемент данных) > X or timeleft(/узел сети/элемент данных,1h,X) < 1h
2 Степень многочлена может быть от 1 до 6, при этом функция polynomial1 равнозначна linear. Однако, использовать полиномы высоких степеней следует с осторожностью. Если период вычисления содержит меньше точек, чем требуется для определения коэффициентов полинома, степень полинома понизится (например, запрашивается polynomial5, но есть только 4 точки, поэтому для аппроксимации будет использована polynomial3).
3 Например, построение экспоненциальной (exponential) и степенной (power) функций требует логарифмических вычислений значений элемента данных. Если данные содержат нулевые или отрицательные числа, вы получите сообщение об ошибке, поскольку вычисление логарифма возможно только при положительных значениях.
4 При аппроксимации linear, exponential, logarithmic и power выражений все необходимые вычисления можно написать в явном виде. При polynomial можно вычислить только value без дополнительных шагов. Вычисление avg включает в себя вычисление первообразной полинома (аналитически). Вычисление max, min и delta включает в себя вычисление производной полинома (аналитически) и поиск его корней (численно). Решение f(t) = 0 требует нахождения корней полинома (численно).
5 Но в этом случае -1 может восстановить триггер из состояния проблемы. Для полной защищённости используйте: timeleft(/узел сети/vfs.fs.size[/,free],1h,0)<1h and ({TRIGGER.VALUE}=0 and timeleft(/узел сети/vfs.fs.size[/,free],1h,0)<>-1 or {TRIGGER.VALUE}=1)