This is an old revision of the document!
Иногда надвигающаяся проблема подаёт знаки. Эти знаки можно заметить и меры могут быть предприняты заблаговременно для того, чтобы предотвратить или хотя бы уменьшить ущерб от проблемы.
В Zabbix-е есть средства для прогнозирования, основываясь на исторических данных, поведения наблбдаемой системы в будущем. Эти средства реализованы в виде прогнозирующих триггерных функций.
Необходимо знать две вещи - как описать состояние проблемы и сколько времени необходимо для принятия мер. Далее есть два способа создать триггер, сигнализирующий о возможной нежелательной ситуации. Первый: триггер должен активизироваться, если система через время, необходимое для принятия мер, будет в состоянии проблемы. Второй: триггер должен активизироваться, если система придёт в состояние проблемы за время, меньшее времени для принятия мер. Соответственно, нужно использовать триггерные функции forecast (“прогноз”) и timeleft (“время до”). Надо заметить, что за этими двумя функциями стоит одинаковый статистический анализ. Вы можете использовать тот способ, который кажется Вам более предпочтительным, и результаты будут идентичны.
Обе функции используют почти одинаковый набор параметров. Обращайтесь к списку поддерживаемых функций за справкой.
Прежде всего следует указать период истории, который следует проанализировать Zabbix-у для составления прогноза. Вы можете сделать это знакомым образом с помощью параметра sec
или #num
и необязательного сдвиг_времени
по аналогии с функциями avg, count, delta, max, min и sum.
(Только forecast)
Параметр время
определяет, насколько далеко в будущее Zabbix будет экстраполировать зависимости, которые ему удастся найти в исторических данных. Независимо о того, используется сдвиг_времени
или нет, время
всегда отсчитывается от текущего момента.
(Только timeleft)
Параметр порог
значение, которое должен достичь анализируемый элемент данных, неважно, сверху или снизу. После того, как найдена f(t) (смотрите ниже), мы должны решить уравнение f(t) = порог
и взять ближайший к текущему моменту корень, который лежит справа от текущего момента, или возвратить 999999999999.9999, если таких корней нет.
порог
овым уровнем, если таковое имеется. Наилучшим решением яляется использование прогнозирования наряду с обычной диагностикой проблем, а не замена первым последнего.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, а точность типа double около 10-16). 1 нс прибавляется для того, чтобы все значения времени были положительными, поскольку построение логарифмической и степенной аппроксимаций подразумевает вычисление log(t). Этот сдвиг времени не влияет на линейную функцию, многочлен и показательную функцию (кроме упрощения и повышения точности вычислений), но изменяет форму логарифмической и степенной функций.
Функции возвращают -1 в следующих ситуациях:
Для получения предупреждения о том, что у Вашего узла сети скоро закончится свободное дисковое пространство, Вы можете использовать следующее триггерное выражение:
{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 как проблему, соответственно.
{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
{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)