This shows you the differences between two versions of the page.
Both sides previous revision Previous revision Next 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 [2018/09/15 22:04] (current) dotneft |
||
---|---|---|---|
Line 1: | Line 1: | ||
- | ==== 8 Прогнозирующие триггерные функции ==== | + | ==== 7 Прогнозирующие функции триггеров ==== |
=== Обзор === | === Обзор === | ||
- | Иногда надвигающаяся проблема подаёт знаки. Эти знаки можно заметить и меры могут быть предприняты заблаговременно для того, чтобы предотвратить или хотя бы уменьшить ущерб от проблемы. | + | Иногда имеются признаки надвигающейся проблемы. Эти признаки можно заметить, поэтому можно заблаговременно предпринять меры, чтобы предотвратить или хотя бы уменьшить влияние проблемы. |
- | В 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] |