Иногда имеются признаки надвигающейся проблемы. Эти признаки можно заметить, таким образом можно заблаговременно предпринять меры, чтобы предотвратить или хотя бы уменьшить влияние проблемы.
В 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 как проблему.
Например, простой триггер такой как timeleft(/узел сети/элемент данных,1h,X) < 1h
может перейти в состояние проблемы, когда элемент данных приближается к X, и неожиданно "самоустраниться", как только значение X достигнуто. Если проблема выражается в том, что значение элемента данных меньше X, используйте: last(/узел сети/элемент данных) < X or timeleft(/узел сети/элемент данных,1h,X) < 1h
. Если проблема заключается в том, что значение элемент данных больше X, используйте: last(/узел сети/элемент данных) > X or timeleft(/узел сети/элемент данных,1h,X) < 1h
↩︎
Степень многочлена может быть от 1 до 6, при этом функция polynomial1 равнозначна linear. Однако, использовать полиномы высоких степеней следует с осторожностью. Если период вычисления содержит меньше точек, чем требуется для определения коэффициентов полинома, степень полинома понизится (например, запрашивается polynomial5, но есть только 4 точки, поэтому для аппроксимации будет использована polynomial3).↩︎
Например, построение экспоненциальной (exponential) и степенной (power) функций требует логарифмических вычислений значений элемента данных. Если данные содержат нулевые или отрицательные числа, вы получите сообщение об ошибке, поскольку вычисление логарифма возможно только при положительных значениях.↩︎
При аппроксимации linear, exponential, logarithmic и power выражений все необходимые вычисления можно написать в явном виде. При polynomial можно вычислить только value без дополнительных шагов. Вычисление avg включает в себя вычисление первообразной полинома (аналитически). Вычисление max, min и delta включает в себя вычисление производной полинома (аналитически) и поиск его корней (численно). Решение f(t) = 0 требует нахождения корней полинома (численно).↩︎
Но в этом случае -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)
↩︎