Zabbix Documentation 3.0

3.04.04.2 (current)In development:4.4 (devel)Unsupported:1.82.02.22.43.23.4

User Tools

Site Tools


ru:manual:config:triggers:prediction

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
ru:manual:config:triggers:prediction [2015/12/23 20:50]
neogan translation is provided by gleb author this feature.
ru:manual:config:triggers:prediction [2015/12/23 22:30] (current)
dotneft
Line 1: Line 1:
-==== 8 Прогнозирующие триггерные функции ​====+==== 8 Прогнозирующие ​функции ​триггеров ====
  
 === Обзор === === Обзор ===
  
-Иногда надвигающаяся проблема подаёт знаки. Эти знаки можно заметить ​и меры ​могут быть предприняты ​заблаговременно для того, чтобы предотвратить или хотя бы уменьшить ​ущерб от проблемы.+Иногда ​имеются признаки ​надвигающейся проблемы. Эти признаки можно заметить, поэтому можно заблаговременно ​предпринять меры, чтобы предотвратить или хотя бы уменьшить ​влияние проблемы.
  
-В Zabbix-е есть средства ​для ​прогнозированияосновываясь на исторических данных, ​поведения наблбдаемой системы в будущем. Эти средства реализованы в виде прогнозирующих триггерных функций.+В Zabbix ​имеются средства прогнозирования ​будущего поведения наблюдаемой системы ​на основе исторических данных. Эти средства реализованы в виде прогнозирующих ​функций ​триггеров.
  
 === - Функции === === - Функции ===
  
-Необходимо знать две вещи ​как описать состояние проблемы и сколько времени необходимо для ​принятия мер. Далее есть два способа создать триггер,​ сигнализирующий о возможной нежелательной ситуации. Первый:​ триггер должен ​активизироваться, ​если ​система ​через времянеобходимое ​для принятия мер, будет в состоянии проблемы. Второй:​ триггер должен активизироваться, если система придёт в состояние проблемы за времяменьшее времени для ​принятия мер. Соответственно, нужно использовать триггерные функции ​**forecast** ​("​прогноз"​) ​и **timeleft** ​("время до"). Надо заметить,​ что ​за этими двумя функциями ​стоит одинаковый статистический анализ. Вы можете ​использовать тот способ, который кажется Вам ​более предпочтительным, и результаты будут идентичны.+Необходимо знать две вещи, а именно то, как описать состояние проблемы и сколько времени нужно, чтобы предпринять меры. Далее есть два способа создать триггер,​ сигнализирующий о возможной нежелательной ситуации. Первый:​ триггер должен ​"загореться"когда ​система ​после "пора действовать"​как ​ожидается, будет в состоянии проблема. Второй:​ триггер должен ​агореться", если система перейдет в состояние проблемы за время меньше, чем "пора действовать"​. Необходимо воспользоваться функциями ​триггеров, а именно **forecast** и **timeleft** ​соответсвенно. Надо заметить,​ что ​лежащий в основе статистический анализ, в основном идентичен у этих двух функций. Вы можете ​настроить триггер ​в зависимости от того, какой ​путь более предпочтителен для вас, и результаты будут идентичны.
  
 === - Параметры === === - Параметры ===
  
-Обе функции используют почти одинаковый набор параметров. Обращайтесь к списку [[manual/​appendix/​triggers/​functions|поддерживаемых функций]] за справкой.+Обе функции используют почти одинаковый набор параметров. Обратитесь к списку [[ru/manual/​appendix/​triggers/​functions|поддерживаемых функций]] за справкой.
  
-== - Временной интервал ==+== - Интервал ​времени ​==
  
-Прежде всего ​следует ​указать период истории,​ который ​следует ​проанализировать ​Zabbix-у ​для составления прогноза. ​Вы можете сделать это ​знакомым образом с помощью параметра ''​sec''​ или ''#​num''​ и необязательного ''​сдвиг_времени''​ по аналогии с функциями **avg**, **count**, **delta**, **max**, **min** и **sum**.+Прежде всего ​вам необходимо ​указать период истории,​ который ​Zabbix должен проанализировать для составления прогноза. ​Сделайте это ​привычным ​способом ​при ​помощи параметров ''​sec''​ или ''#​num''​ и необязательного ''​сдвиг_времени''​ по аналогии с функциями **avg**, **count**, **delta**, **max**, **min** и **sum**.
  
 == - Горизонт предсказания == == - Горизонт предсказания ==
  
-(Только **forecast**)\\ Параметр ''​время''​ определяет,​ насколько далеко в будущее Zabbix будет экстраполировать зависимости,​ которые ему удастся найти в исторических данных. Независимо о того, используется ''​сдвиг_времени''​ или нет, ''​время''​ всегда отсчитывается от текущего момента.+(Только **forecast**)\\ Параметр ''​время''​ определяет,​ насколько далеко в будущее Zabbix будет экстраполировать зависимости,​ которые ему удастся найти в исторических данных. Независимо о того, используете ли вы ''​сдвиг_времени''​ или нет, ''​время''​ всегда отсчитывается от текущего момента.
  
-== - Порог (который необходимо достигнуть) ​==+== - Достигаемый порог ==
  
-(Только **timeleft**)\\ Параметр ''​порог''​ значение,​ которое должен достичь анализируемый элемент данных,​ неважно, сверху или снизу. После того, как ​найдена f(t) (смотрите ниже), мы должны решить уравнение f(t) = ''​порог''​ и взять ближайший к текущему моменту корень,​ который ​лежит справа от текущего момента,​ или возвратить 999999999999.9999,​ если таких корней нет.+(Только **timeleft**)\\ Параметр ''​порог'' ​определяет ​значение,​ которого должен достичь анализируемый элемент данных,​ нет никакой разницы, сверху или снизу. После того, как ​мы определили ​f(t) (смотри ниже), мы должны решить уравнение f(t) = ''​порог''​ и вернуть ближайший к текущему моменту корень,​ который ​находится справа от текущего момента,​ или вернуть 999999999999.9999,​ если таковых корней нет.
  
-<note tip>​Когда значения элемента данных приближаются к порогу,​ а затем пересекают его, **timeleft** делает вывод, что пересечение уже находится в прошлом,​ и поэтому переключается на следуещее пересечение с ''​порог''​овым уровнем, если таковое имеется. Наилучшим решением яляется использование прогнозирования наряду с обычной диагностикой проблем,​ а не замена первым последнего.((Например,​ простой триггер наподобие <​code>​{host:​item.timeleft(1h,,​X)} < 1h</​code>​ может переключиться ​в состояние проблемы,​ когда элемент данных приближается к X, и неожиданно "​самоустраниться",​ как только X достигнут. Если проблема выражается в том, что элемент данных меньше X, используйте:​ <​code>​{host:​item.last()} < X or {host:​item.timeleft(1h,,​X)} < 1h</​code>​ Если проблема ​выражается в том, что элемент данных более X, используйте:​ <​code>​{host:​item.last()} > X or {host:​item.timeleft(1h,,​X)} < 1h</​code>​))</​note>​ +<note tip>​Когда значения элемента данных приближаются к порогу,​ а затем пересекают его, **timeleft** делает вывод, что пересечение уже находится в прошлом,​ и поэтому переключается на следуещее пересечение с уровнем ​''​порога'',​ если таковое имеется. Наилучшим решением яляется использование прогнозирований наряду с обычными ​диагностиками ​проблем,​ а не заменой одним на другое.((Например,​ простой триггер наподобие <​code>​{host:​item.timeleft(1h,,​X)} < 1h</​code>​ может перейти в состояние проблемы,​ когда элемент данных приближается к X, и неожиданно "​самоустраниться",​ как только ​значение ​X достигнуто. Если проблема выражается в том, что ​значение ​элемента данных меньше X, используйте:​ <​code>​{host:​item.last()} < X or {host:​item.timeleft(1h,,​X)} < 1h</​code>​ Если проблема ​заключается в том, что ​значение ​элемент данных больше X, используйте:​ <​code>​{host:​item.last()} > X or {host:​item.timeleft(1h,,​X)} < 1h</​code>​))</​note>​ 
-== - Аппроксимирующие функции ==+== - Функции аппроксимации ==
  
-По умолчанию ''​аппроксимация'' ​- это линейная (//​linear//​) функция. Если наблюдаемая система более сложная, ​Вы можете выбрать один из следующих вариантов.+По умолчанию ''​аппроксимация'' ​является линейной (//​linear//​) функцией. Если наблюдаемая система более сложная, ​вы можете выбрать один из следующих вариантов.
  
 ^ ''​аппроксимация''​ ^ x = f(t) ^ ^ ''​аппроксимация''​ ^ x = f(t) ^
-|линейная функция (//​linear//​) |x = a + b*t | +|линейная (//​linear//​) |x = a + b*t | 
-|многочлен (//​polynomialN//​)((Степень многочлена может быть от 1 до 6, при этом //​polynomial1//​ равнозначен //linear//. Однако,​ использовать ​многочлены высоких степеней следует [[https://​en.wikipedia.org/​wiki/​Runge'​s_phenomenon|с осторожностью]]. Если ​исторический ​период содержить меньше точек, чем требуется для определения коэффициентов ​многочлена, степень ​многочлена будет ​понижена ​(например,​ запрашивается //​polynomial5//,​ но есть только 4 точки, поэтому для аппроксимации будет использован //​polynomial3//​).)) |x = a<​sub>​0</​sub>​ + a<​sub>​1</​sub>​*t + a<​sub>​2</​sub>​*t<​sup>​2</​sup>​ + ... + a<​sub>​n</​sub>​*t<​sup>​n</​sup>​ | +|полином (//​polynomialN//​)((Степень многочлена может быть от 1 до 6, при этом ​функция ​//​polynomial1//​ равнозначна //linear//. Однако,​ использовать ​полиномы высоких степеней следует [[https://​en.wikipedia.org/​wiki/​Runge'​s_phenomenon|с осторожностью]]. Если период ​вычисления ​содержит меньше точек, чем требуется для определения коэффициентов ​полинома, степень ​полинома понизится ​(например,​ запрашивается //​polynomial5//,​ но есть только 4 точки, поэтому для аппроксимации будет использована //​polynomial3//​).)) |x = a<​sub>​0</​sub>​ + a<​sub>​1</​sub>​*t + a<​sub>​2</​sub>​*t<​sup>​2</​sup>​ + ... + a<​sub>​n</​sub>​*t<​sup>​n</​sup>​ | 
-|показательная функция (//​exponential//​) |x = a*exp(b*t) | +|экспоненциальная (//​exponential//​) |x = a*exp(b*t) | 
-|логарифмическая функция (//​logarithmic//​) |x = a + b*log(t) | +|логарифмическая (//​logarithmic//​) |x = a + b*log(t) | 
-|степенная функция (//power//) |x = a*t<​sup>​b</​sup>​ |+|степенная (//power//) |x = a*t<​sup>​b</​sup>​ |
  
 == - Режимы == == - Режимы ==
  
-(Только **forecast**)\\ Каждый раз, когда вычисляется триггерная функция, ​запрашиваются ​данные ​из указанного исторического периода ​и по полученным данным строится указанная аппроксимация. Поэтому,​ если данные немного изменятся,​ то и построенная аппроксимация немного изменится. Если мы будем просто рассчитывать значение аппроксимирующей функции в заданный момент времени в будущем, ​Вы не будете ​ничего ​знать о том, как согласно прогнозу будет меняться анализируемый элемент данных между текущим моментом и этим моментом в будущем. При некоторых значениях параметра ''​аппроксимация''​ (вроде //​polynomial//​) одно лишь значение из будущего может ​быть обманчивым.+(Только **forecast**)\\ Каждый раз, когда вычисляется функция триггера, данные ​запрашиваются из указанного ​периода истории и по полученным данным строится указанная аппроксимация. Поэтому,​ если данные немного изменятся,​ то и построенная аппроксимация немного изменится. Если мы будем просто рассчитывать значение аппроксимирующей функции в заданный момент времени в будущем, ​то вы ничего ​не будете знать о том, как согласно прогнозу будет меняться анализируемый элемент данных между текущим моментом и этим моментом в будущем. При некоторых параметрах ''​аппроксимации''​ (вроде //​polynomial//​) ​просто лишь ​одно ​значение из будущего может ​ввести в заблуждение.
  
 ^ ''​режим''​ ^ результат **forecast** ^ ^ ''​режим''​ ^ результат **forecast** ^
Line 47: Line 47:
 |максимум (//max//) |max<​sub>​сейчас <​nowiki><​=</​nowiki>​ t <​nowiki><​=</​nowiki>​ сейчас + ''​время''</​sub>​ f(t) | |максимум (//max//) |max<​sub>​сейчас <​nowiki><​=</​nowiki>​ t <​nowiki><​=</​nowiki>​ сейчас + ''​время''</​sub>​ f(t) |
 |минимум (//min//) |min<​sub>​сейчас <​nowiki><​=</​nowiki>​ t <​nowiki><​=</​nowiki>​ сейчас + ''​время''</​sub>​ f(t) | |минимум (//min//) |min<​sub>​сейчас <​nowiki><​=</​nowiki>​ t <​nowiki><​=</​nowiki>​ сейчас + ''​время''</​sub>​ f(t) |
-|разброс ​(//delta//) |//max// - //min// |+|дельта (//delta//) |//max// - //min// |
 |среднее (//avg//) |среднее значение f(t) (сейчас <​nowiki><​=</​nowiki>​ t <​nowiki><​=</​nowiki>​ сейчас + ''​время''​) в соответствии с  [[https://​en.wikipedia.org/​wiki/​Mean_of_a_function|определением]] | |среднее (//avg//) |среднее значение f(t) (сейчас <​nowiki><​=</​nowiki>​ t <​nowiki><​=</​nowiki>​ сейчас + ''​время''​) в соответствии с  [[https://​en.wikipedia.org/​wiki/​Mean_of_a_function|определением]] |
  
 === - Подробности === === - Подробности ===
  
-Для того, чтобы избежать вычислений с большими числами,​ мы рассматриваем штамп времени первого значения в указанном периоде плюс 1 нс как новую точку остчёта времени (текущие штампы времени порядка 10<​sup>​9</​sup>,​ в квадрате уже 10<​sup>​18</​sup>,​ а точность ​типа double ​около 10<​sup>​-16</​sup>​). 1 нс прибавляется для того, чтобы все значения времени были положительными,​ поскольку построение логарифмической и степенной аппроксимаций подразумевает вычисление log(t). Этот сдвиг времени не влияет на линейную функцию, ​многочлен и показательную функцию роме упрощения и повышения ​точности ​вычислений),​ но изменяет форму логарифмической и степенной функций.+Для того, чтобы избежать вычислений с большими числами,​ мы рассматриваем штамп времени первого значения в указанном периоде плюс 1 наносекунда ​как новую точку остчёта времени (текущие штампы времени порядка 10<​sup>​9</​sup>,​ в квадрате уже 10<​sup>​18</​sup>,​ а точность ​дробных значений ​около 10<​sup>​-16</​sup>​). 1 нс прибавляется для того, чтобы все значения времени были положительными,​ поскольку построение логарифмической и степенной аппроксимаций подразумевает вычисление log(t). Этот сдвиг времени не влияет на линейную функцию, ​полином и экспоненциальную функции (за исключением более легких и более точных вычислений),​ но изменяет форму логарифмической и степенной функций.
  
 === - Возможные ошибки === === - Возможные ошибки ===
Line 60: Line 60:
   * указанных период не содержит данных;​   * указанных период не содержит данных;​
  
-  * математическая операция не определена((Например,​ построение показательной и степенной функций требует логарифмирования значений элемента данных. Если данные содержат нулевые или отрицательные числа, ​Вы получите сообщение об ошибке,​ поскольку логарифмирование ​возможно только ​для ​положительных значений.));+  * математическая операция не задана((Например,​ построение ​экспоненциальной и степенной функций требует логарифмических ​вычислений значений элемента данных. Если данные содержат нулевые или отрицательные числа, ​вы получите сообщение об ошибке,​ поскольку ​вычисление ​логарифма возможно только ​при ​положительных значениях.));
  
-  * сложности вычислительного характера ​(к сожалению,​ для некоторых наборов входных данных диапазона и точности формата чисел с плаваюшей точкой двойной точности становится недостаточно)((Для ​аппроксимаций //linear//, //​exponential//,​ //​logarithmic//​ и //power// выражения для ​всех необходимых вычислений могут быть ​написаны в явном виде. ​Для ​//​polynomial//​ только //​value// ​может быть вычислено ​без дополнительных шагов. Вычисление //avg// включает в себя вычисление первообразной ​многочлена (аналитически). Вычисление //max//, //min// и //delta// включает в себя вычисление производной ​многочлена (аналитически) и поиск её корней (численно). Решение f(t) = 0 требует нахождения корней ​многочлена (численно).+  * сложности вычислений (к сожалению,​ для некоторых наборов входных данных диапазона и точности формата чисел с плаваюшей точкой двойной точности становится недостаточно)((При ​аппроксимации //linear//, //​exponential//,​ //​logarithmic//​ и //power// выражений все необходимые вычисления можно ​написать в явном виде. ​При ​//​polynomial// ​можно вычислить ​только //value// без дополнительных шагов. Вычисление //avg// включает в себя вычисление первообразной ​полинома (аналитически). Вычисление //max//, //min// и //delta// включает в себя вычисление производной ​полинома (аналитически) и поиск его корней (численно). Решение f(t) = 0 требует нахождения корней ​полинома (численно).
 )). )).
  
-<note tip>​Никаких предупреждений или ошибок не выдаётся,​ если выбранная аппроксимирующая функция плохо описывает ​указанные данные или просто недостаточно ​данных ​для точного прогноза.</​note>​+<note tip>​Никаких предупреждений или ошибок не выдаётся,​ если выбранная аппроксимирующая функция плохо описывает ​предоставленные данные или просто ​данных ​недостаточно для точного прогноза.</​note>​
  
 === - Примеры и обработка ошибок === === - Примеры и обработка ошибок ===
  
-Для получения предупреждения о том, что у Вашего узла сети скоро закончится свободное дисковое пространство, ​Вы можете использовать следующее триггерное выражение:​+Для получения предупреждения о том, что у вашего узла сети скоро закончится свободное дисковое пространство, ​вы можете использовать следующее выражение ​триггера:
 <​code>​{host:​vfs.fs.size[/,​free].timeleft(1h,,​0)}<​1h</​code>​ <​code>​{host:​vfs.fs.size[/,​free].timeleft(1h,,​0)}<​1h</​code>​
  
-Однако,​ может появиться код ошибки -1 и перевести ​Ваш триггер в состояние проблемы. Вообще говоря,​ это не плохо, потому что ​Вы получаете предупреждение о том, что ​Ваше прогнозирование не работает ​как положено, и Вам стоит обратить на них внимание,​ чтобы разобраться почему. Но иногда это плохо, потому что -1 может просто означать,​ что о свободном дисковом пространстве данного узла сети ​за последний час не было получено никаких данных. Если ​Вы получаете много сообщений о ложных тревогах,​ подумайте об использовании более сложного триггерного выражения((Но в этом случае -1 может восстановить триггер из состояния проблемы. Для полной защищённости используйте:​ <​code>​{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)</​code>​)):​+Однако,​ может появиться код ошибки -1 и перевести ​ваш триггер в состояние проблемы. Вообще говоря,​ это не плохо, потому что ​вы получите предупреждение о том, что ​ваши прогнозирования не работает ​должным образом, и вам стоит обратить на них внимание,​ чтобы разобраться почему. Но иногда это плохо, потому что -1 может просто означать,​ что ​за последний час не было получено никаких данных ​о свободном дисковом пространстве данного узла сети. Если ​вы получаете много сообщений о ложных тревогах,​ подумайте об использовании более сложного выражения((Но в этом случае -1 может восстановить триггер из состояния проблемы. Для полной защищённости используйте:​ <​code>​{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)</​code>​)) ​триггера:
 <​code>​{host:​vfs.fs.size[/,​free].timeleft(1h,,​0)}<​1h and {host:​vfs.fs.size[/,​free].timeleft(1h,,​0)}<>​-1</​code>​ <​code>​{host:​vfs.fs.size[/,​free].timeleft(1h,,​0)}<​1h and {host:​vfs.fs.size[/,​free].timeleft(1h,,​0)}<>​-1</​code>​
  
-Ситуация немного сложнее с **forecast**. Начнём с того, что -1 сможет ​или не сможет переводить триггер в состояние проблемы в зависимости от Вашего триггерного выражения,​ которое может быть вроде <​code>​{host:​item.forecast(...)}<​...</​code>​ или ​вроде <​code>​{host:​item.forecast(...)}>​...</​code>​+Ситуация немного сложнее с **forecast**. Начнём с того, что -1 может ​перевести, а может ​и не перевести триггер в состояние проблемы в зависимости от вашего выражения ​триггера, которое может быть вроде <​code>​{host:​item.forecast(...)}<​...</​code>​ или ​наподобие <​code>​{host:​item.forecast(...)}>​...</​code>​
  
-Более того, -1 может быть вполне ​правильным результатом прогнозирования,​ если прогнозируемый элемент данных может принимать отрицательные значения. Но вероятность возникновения такой ситуации в реальных условиях пренебрежимо мала (смотрите,​ [[manual/​config/​triggers/​expression|как]] работает оператор **=**). Поэтому добавьте <​code>​... or {host:​item.forecast(...)}=-1</​code>​ или <​code>​... and {host:​item.forecast(...)}<>​-1</​code>​ если ​Вы хотитеили, наоборот,​ не хотите рассматривать -1 как проблему, соответственно.+Более того, -1 может быть вполне ​корректным результатом прогнозирования,​ если прогнозируемый элемент данных может принимать отрицательные значения. Но вероятность возникновения такой ситуации в реальных условиях пренебрежительно мала (смотрите,​ [[ru/manual/​config/​triggers/​expression|как]] работает оператор **=**). Поэтому добавьте <​code>​... or {host:​item.forecast(...)}=-1</​code>​ или <​code>​... and {host:​item.forecast(...)}<>​-1</​code>​ если ​вы соответсвенно ​хотите или, наоборот,​ не хотите рассматривать -1 как проблему.
  
 === Смотрите также === === Смотрите также ===
  
-  - [[http://​zabbix.org/​mw/​images/​1/​18/​Prediction_docs.pdf|Predictive trigger functions ​(pdf)]] on zabbix.org+  - [[http://​zabbix.org/​mw/​images/​1/​18/​Prediction_docs.pdf|Прогнозирующие функции триггеров ​(pdf)]] on zabbix.org ​[en]