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 поддерживаются только для агрегатных вычислений.

Обычно функции возвращают числовые значения для сравнения. При возврате строк сравнение возможно с помощью операторов = и <> (см. пример Обнаружение несовпадающего ПО на разных узлах сети).

Параметры функции

Параметры функции позволяют указать:

  • ключ элемента данных (в виде /host/key) для функций, ссылающихся на историю элемента данных узла сети
  • период времени (и другие параметры, специфичные для функции)
  • другие выражения
Ключ элемента данных

Ссылающийся элемент данных должен находиться в поддерживаемом состоянии (кроме функции nodata(), которая вычисляется также и для неподдерживаемых элементов данных).

Опускать имя узла сети в первом параметре (то есть как в function(//key,parameter,...)) поддерживается только в определённых контекстах:

  • В формуле вычисляемых элементов данных
  • В макросах выражений, которые могут использоваться в:

В этих контекстах вы также можете использовать макрос {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'

Период времени измеряется до "now" - то есть до момента последнего пересчета триггера (см. Частота вычисления); "now" - это не текущее время сервера.

Период времени задает либо:

  • Все значения между "now - период времени" и "now" (или, при применении сдвига времени, между "now - сдвиг времени - период времени" и "now - сдвиг времени").
  • Указанное количество значений из прошлого, вплоть до "now".

Если для указанного периода вычисления данные отсутствуют, триггер или вычисляемый элемент данных, использующий эту функцию, становится неподдерживаемым.

Обратите внимание:

  • Если в триггере используется только одна функция (обращающаяся к истории данных), "now" всегда соответствует последнему полученному значению. Например, если последнее значение было получено час назад, период времени будет считаться вплоть до последнего значения час назад.
  • Новый триггер вычисляется сразу после получения первого значения (функции истории); для функций дата и время и nodata() он будет вычислен в течение 30 секунд. Таким образом, триггер будет вычислен даже в том случае, если заданный период времени (например, один час) еще не прошел с момента создания триггера. Триггер также будет вычислен после получения первого значения, даже если диапазон времени был задан, например, как десять последних значений.
Сдвиг времени

Поддерживается необязательный сдвиг времени с использованием времени или количества значений в качестве параметра функции. Этот параметр позволяет ссылаться на данные за период времени в прошлом.

Сдвиг времени начинается с now - указания текущего времени, и далее следует +N<единица времени> или -N<единица времени> - для добавления или вычитания N единиц времени.

Например, avg(/host/key,1h:now-1d) вернет среднее значение за час сутки назад.

Сдвиг времени, заданный в месяцах (M) и годах (y), поддерживается только для функций трендов. Другие функции поддерживают секунды (s), минуты (m), часы (h), дни (d) и недели (w).

Сдвиг времени с абсолютными периодами времени

Абсолютные периоды времени поддерживаются в параметре сдвига времени, например, с полуночи до полуночи для дня, с понедельника по воскресенье для недели, с первого по последний день месяца для месяца.

Сдвиг времени для абсолютных периодов времени начинается с now - указания текущего времени, и далее следует любое количество операций со временем: /<единица времени> - определяет начало и конец единицы времени, например, с полуночи до полуночи для дня, +N<единица времени> или -N<единица времени> - для добавления или вычитания N единиц времени.

Обратите внимание, что значение сдвига времени может быть больше или равно 0, тогда как минимальное значение периода времени равно 1.

Parameter Description
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 → ошибка
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' или "ОК").
  • Если вычисление функции для поддерживаемого элемента данных приводит к ошибке, значение функции становится Unknown и участвует как неизвестный операнд в дальнейшем вычислении выражения.

Неизвестные операнды могут "исчезать" только в логических выражениях, как описано выше. В арифметических выражениях неизвестные операнды всегда приводят к Unknown (кроме деления на 0).

Неизвестное состояние выражения не изменяет состояние триггера (Проблема/ОК). Поэтому, если состояние триггера было "Проблема" (см. Случай 1), оно остается в состоянии проблемы, даже если известная часть разрешилась ('1' становится '0'), потому что теперь выражение вычисляется в Unknown, а это не изменяет состояние триггера.

Если выражение триггера с несколькими неподдерживаемыми элементами данных вычисляется в Unknown, сообщение об ошибке в веб-интерфейсе ссылается на последний вычисленный неподдерживаемый элемент данных.

Кэширование значений

Значения, которые необходимы для вычисления триггеров, кэшируются Zabbix сервером. По этой причине такое вычисление триггеров приводит к более высокой нагрузке на базу данных на некоторое время после перезапуска сервера. Кэш значений не очищается, когда значения истории элементов данных удаляются (либо вручную, либо при помощи автоматической очистки истории), поэтому сервер будет использовать кэшированные значения, пока они не станут старше, чем периоды времени, заданные в функциях триггеров, либо пока сервер не будет перезапущен.

Если в кэше нет последних данных и в функции не определён период запроса, Zabbix по умолчанию будет запрашивать у базы данных значения истории вплоть до одной недели назад.