3 Выражение триггера
Обзор
На этой странице описываются синтаксис выражений триггеров и подробности их вычисления.
Синтаксис простого выражения:
function(/host/item,time_period)<operator><constant>
В этом выражении первый операнд (слева от оператора) — это функция с её параметрами в круглых скобках (обычно это элемент данных и период времени).
Функция используется для анализа полученных данных за указанный период времени, в результате чего вычисляется значение.
Затем это значение сравнивается со вторым операндом с помощью оператора. В этом примере второй операнд является константой, но он также может быть другой функцией.
Например:
min(/Zabbix server/net.if.in[eth0,bytes],5m)>100K
Этот триггер срабатывает, если количество полученных байтов на eth0 в течение последних пяти минут всегда было больше 100 килобайт. В этом случае выражение истинно и создаётся проблема.
Выражения триггеров чрезвычайно гибкие. В более сложных выражениях можно комбинировать несколько функций, операторов и констант.
См. также:
- Примеры триггеров
- Обнаружение проблем с помощью триггеров (общее введение)
Функции
Функции позволяют анализировать собранные значения, например, вычислять среднее или находить определенную строку.
Нажмите на соответствующую группу функций, чтобы увидеть более подробную информацию.
| Группа функций | Функции | |
|---|---|---|
| Агрегирующие функции | avg, bucket_percentile, count, histogram_quantile, item_count, kurtosis, mad, max, min, skewness, stddevpop, stddevsamp, sum, sumofsquares, varpop, varsamp | |
| Функции foreach | avg_foreach, bucket_rate_foreach, count_foreach, exists_foreach, last_foreach, max_foreach, min_foreach, sum_foreach | |
| Побитовые функции | bitand, bitlshift, bitnot, bitor, bitrshift, bitxor | |
| Функции даты и времени | date, dayofmonth, dayofweek, now, time | |
| Функции истории | change, changecount, count, countunique, find, first, firstclock, fuzzytime, last, lastclock, logeventid, logseverity, logsource, logtimestamp, monodec, monoinc, nodata, percentile, rate | |
| Функции трендов | baselinedev, baselinewma, trendavg, trendcount, trendmax, trendmin, trendstl, trendsum | |
| Математические функции | abs, acos, asin, atan, atan2, avg, cbrt, ceil, cos, cosh, cot, degrees, e, exp, expm1, floor, log, log10, max, min, mod, pi, power, radians, rand, round, signum, sin, sinh, sqrt, sum, tan, truncate | |
| Операторные функции | between, in | |
| Прогнозирующие функции | forecast, timeleft | |
| Строковые функции | ascii, bitlength, bytelength, char, concat, insert, jsonpath, left, length, ltrim, mid, repeat, replace, right, rtrim, trim, xmlxpath | |
Если не указано иное, эти функции поддерживаются в:
Функции foreach поддерживаются только для агрегирующих вычислений.
Обычно функции возвращают числовые значения для сравнения. Если возвращаются строки, сравнение возможно с помощью операторов = и <> (см. пример Обнаружение несовпадающего программного обеспечения на разных узлах сети).
Параметры функции
Параметры функции позволяют указать:
- ключ элемента данных (в виде
/узел сети/ключ) для функций, ссылающихся на историю элемента данных узла сети - период времени (и другие специфичные для функции параметры)
- другие выражения
Ключ элемента данных
Ссылающийся элемент данных должен находиться в поддерживаемом состоянии (кроме функции nodata(), которая вычисляется также и для неподдерживаемых элементов данных).
Опускать имя узла сети в первом параметре (то есть как в function(//key,parameter,...)) поддерживается только в определённых контекстах:
- В формуле вычисляемых элементов данных
- В макросах выражений, которые могут использоваться в:
- поле Имя события
- имени графика
- метке элементов карты "Host" и "Trigger" map elements
В этих контекстах вы также можете использовать макрос {HOST.HOST}.
{HOST.HOST<1-9>} можно использовать в случае поля Имя события и элемента карты "Trigger" для ссылки на конкретный элемент данных в выражении триггера.
Если в этих контекстах имя узла сети опущено или заменено на {HOST.HOST}, ссылка указывает на первый элемент данных в выражении триггера или на первый элемент данных на графике.
Вне этих поддерживаемых контекстов опускание имени узла сети в выражениях триггера приведёт к ошибке.
См. пример Compare long-term CPU loads для иллюстрации использования двойной косой черты в макросах имени события.
Период времени
Параметры, специфичные для функции, размещаются после ключа элемента данных и отделяются от ключа элемента данных запятой.
Большинство числовых функций принимают период времени в качестве параметра. Он позволяет указать интересующий нас интервал. Его можно указать как период времени (30s, 10m, 1h) или как диапазон значений (#5 — для пяти последних значений).
Для указания периода времени можно использовать секунды или суффиксы времени. Если параметру предшествует знак решетки, он имеет другое значение:
| Expression | Description |
|---|---|
| sum(/host/key,10m) | Сумма значений за последние 10 минут. |
| sum(/host/key,#10) | Сумма десяти последних значений. |
Параметры со знаком решетки имеют другое значение для функции last — они обозначают N-е предыдущее значение, поэтому при значениях 30, 70, 20, 60, 50 (от самого нового к самому старому):
last(/host/key,#2)вернет '70'last(/host/key,#5)вернет '50'
Период времени измеряется до "текущего момента" — где "текущий момент" является временем последнего пересчета триггера (см. Частота вычисления); "текущий момент" не является временем "сейчас" сервера.
Период времени определяет одно из следующего:
- Учитывать все значения между "текущий момент - период времени" и "текущий момент" (или, при сдвиге времени, между "текущий момент - сдвиг времени - период времени" и "текущий момент - сдвиг времени")
- Учитывать не более num значений из прошлого, вплоть
до "текущего момента"
- Если для указанного периода времени или количества num доступно 0 значений, то триггер или вычисляемый элемент данных, использующий эту функцию, становится неподдерживаемым
Обратите внимание:
- Если в триггере используется только одна функция (ссылающаяся на историю данных), "текущий момент" всегда является временем последнего полученного значения. Например, если последнее значение было получено час назад, период времени будет считаться до последнего значения, полученного час назад.
- Новый триггер вычисляется сразу после получения первого значения (функции истории); для функций дата и время и nodata() он будет вычислен в течение 30 секунд. Таким образом, триггер будет вычислен, даже если, возможно, заданный период времени (например, один час) еще не прошел с момента создания триггера. Триггер также будет вычислен после первого значения, даже если диапазон был задан, например, как десять последних значений.
Сдвиг по времени
Поддерживается необязательный сдвиг по времени с указанием времени или количества значений в качестве параметра функции. Этот параметр позволяет ссылаться на данные за период времени в прошлом.
Сдвиг по времени начинается с now, обозначающего текущее время, после чего указывается +N<time unit> или -N<time unit> — для добавления или вычитания N единиц времени.
Например, avg(/host/key,1h:now-1d) вернет среднее значение за один час сутки назад.
Сдвиг по времени, заданный в месяцах (M) и годах (y), поддерживается только для функций трендов. Другие функции поддерживают секунды (s), минуты (m), часы (h), дни (d) и недели (w).
Сдвиг по времени с абсолютными периодами времени
В параметре сдвига по времени поддерживаются абсолютные периоды времени, например, от полуночи до полуночи для дня, с понедельника по воскресенье для недели, с первого по последний день месяца для месяца.
Сдвиг по времени для абсолютных периодов времени начинается с now, обозначающего текущее время, после чего может следовать любое количество операций со временем: /<time unit> — задает начало и конец единицы времени, например, от полуночи до полуночи для дня; +N<time unit> или -N<time unit> — для добавления или вычитания N единиц времени.
Обратите внимание, что значение сдвига по времени может быть больше или равно 0, тогда как минимальное значение периода времени равно 1.
| Параметр | Описание |
|---|---|
| 1d:now/d | Вчера |
| 1d:now/d+1d | Сегодня |
| 2d:now/d+1d | Последние 2 дня |
| 1w:now/w | Прошлая неделя |
| 1w:now/w+1w | Текущая неделя |
Другие выражения
Параметры функций могут содержать другие выражения, как в следующем синтаксисе:
min(min(/host/key,1h),min(/host2/key2,1h)*10)
Обратите внимание, что другие выражения нельзя использовать, если функция ссылается на историю элемента данных. Например, следующий синтаксис не допускается:
min(/host/key,#5*10)
Хотя другие выражения триггеров в качестве параметров функций в триггерах ограничены функциями, не использующими историю, это ограничение не применяется в вычисляемых элементах данных.
Операторы
Для триггеров поддерживаются следующие операторы (в порядке убывания приоритета выполнения):
| Приоритет | Оператор | Определение | Примечания для неизвестных значений | Принудительно приводить операнд к float 1 |
|---|---|---|---|---|
| 1 | - | Унарный минус | -Unknown → Unknown | Да |
| 2 | not | Логическое НЕ | not Unknown → Unknown | Да |
| 3 | * | Умножение | 0 * Unknown → Unknown (да, Unknown, а не 0 — чтобы не потерять Unknown в арифметических операциях) 1.2 * Unknown → Unknown |
Да |
| / | Деление | Unknown / 0 → error Unknown / 1.2 → Unknown 0.0 / Unknown → Unknown |
Да | |
| 4 | + | Арифметический плюс | 1.2 + Unknown → Unknown | Да |
| - | Арифметический минус | 1.2 - Unknown → Unknown | Да | |
| 5 | < | Меньше чем. Оператор определяется как: A<B ⇔ (A<B-0.000001) |
1.2 < Unknown → Unknown | Да |
| <= | Меньше или равно. Оператор определяется как: A<=B ⇔ (A≤B+0.000001) |
Unknown <= Unknown → Unknown | Да | |
| > | Больше чем. Оператор определяется как: A>B ⇔ (A>B+0.000001) |
Да | ||
| >= | Больше или равно. Оператор определяется как: A>=B ⇔ (A≥B-0.000001) |
Да | ||
| 6 | = | Равно. Оператор определяется как: A=B ⇔ (A≥B-0.000001) and (A≤B+0.000001) |
Нет 1 | |
| <> | Не равно. Оператор определяется как: A<>B ⇔ (A<B-0.000001) or (A>B+0.000001) |
Нет 1 | ||
| 7 | and | Логическое И | 0 and Unknown → 0 1 and Unknown → Unknown Unknown and Unknown → Unknown |
Да |
| 8 | or | Логическое ИЛИ | 1 or Unknown → 1 0 or Unknown → Unknown Unknown or Unknown → Unknown |
Да |
1 Строковый операнд всё равно приводится к числовому, если:
- другой операнд является числовым
- к операнду применяется оператор, отличный от = или <>
(Если приведение не удаётся, числовой операнд приводится к строковому, и затем оба операнда сравниваются как строки.)
Операторы not, and и or чувствительны к регистру и должны быть в нижнем регистре. Они также должны быть отделены пробелами или круглыми скобками.
Все операторы, кроме унарных - и not, имеют левостороннюю ассоциативность. Унарные - и not неассоциативны (то есть следует использовать -(-1) и not (not 1) вместо --1 и not not 1).
Результат вычисления:
- операторы <, <=, >, >=, =, <> должны возвращать '1' в выражении триггера, если указанное отношение истинно, и '0', если оно ложно. Если хотя бы один операнд имеет значение Unknown, результатом будет Unknown;
- and для известных операндов должно возвращать '1', если оба его операнда не равны '0'; в противном случае возвращается '0'; для неизвестных операндов and возвращает '0' только если один из операндов равен '0'; в противном случае возвращается 'Unknown';
- or для известных операндов должно возвращать '1', если хотя бы один из его операндов не равен '0'; в противном случае возвращается '0'; для неизвестных операндов or возвращает '1' только если один из операндов не равен '0'; в противном случае возвращается 'Unknown';
- результат оператора логического отрицания not для известного операнда равен '0', если значение его операнда не равно '0'; и '1', если значение его операнда равно '0'. Для неизвестного операнда not возвращает 'Unknown'.
Неизвестное состояние выражения
Неизвестный операнд может появиться в выражении триггера, если:
- используется неподдерживаемый элемент данных
- вычисление функции для поддерживаемого элемента данных приводит к ошибке
В этом случае выражение триггера обычно вычисляется в Unknown (так как его невозможно вычислить)
Можно получать уведомления о триггерах в состоянии unknown.
Исключения
Несмотря на наличие неизвестного операнда, в некоторых случаях выражения триггеров могут вычисляться в известный результат (Проблема/ОК):
- Функция
nodata()вычисляется независимо от того, поддерживается ли указанный элемент данных. - Выражения с AND/OR могут вычисляться в известный результат в двух случаях:
- Случай 1: "
1 or some_function(unsupported_item1) or some_function(unsupported_item2) or ..." вычисляется в известный результат ('1' или "Проблема"), - Случай 2: "
0 and some_function(unsupported_item1) and some_function(unsupported_item2) and ..." вычисляется в известный результат ('0' или "ОК").
- Случай 1: "
- Если вычисление функции для поддерживаемого элемента данных приводит к ошибке, значение функции становится
Unknownи участвует как неизвестный операнд в дальнейшем вычислении выражения.
Неизвестные операнды могут "исчезать" только в логических выражениях, как описано выше.
В арифметических выражениях неизвестные операнды всегда приводят к Unknown (кроме деления на 0).
Неизвестное состояние выражения не изменяет состояние триггера (Проблема/ОК).
Поэтому, если состояние триггера было "Проблема" (см. Случай 1), оно остается в состоянии проблемы, даже если известная часть разрешилась ('1' становится '0'), потому что теперь выражение вычисляется в Unknown, а это не изменяет состояние триггера.
Если выражение триггера с несколькими неподдерживаемыми элементами данных вычисляется в Unknown, сообщение об ошибке в веб-интерфейсе ссылается на последний вычисленный неподдерживаемый элемент данных.
Кэширование значений
Значения, необходимые для вычисления триггеров, кэшируются сервером Zabbix. Из-за этого вычисление триггеров в течение некоторого времени после перезапуска сервера создает повышенную нагрузку на базу данных.
Кэш значений не очищается при удалении значений истории элементов данных (вручную или с помощью housekeeper), поэтому сервер будет использовать кэшированные значения, пока они не станут старше периодов времени, заданных в функциях триггеров, или пока сервер не будет перезапущен.
Если в кэше нет недавних данных и в функции не задан период запроса, Zabbix по умолчанию будет запрашивать из базы данных исторические значения вплоть до одной недели в прошлом.