[comment]: # ({510ac9cc-510ac9cc})
# 2. Выражение триггера

[comment]: # ({/510ac9cc-510ac9cc})

[comment]: # ({07d50a02-473bcd5e})
#### Обзор

Используемые в [триггерах](/manual/config/triggers) выражения являются очень гибкими.
Вы можете использовать их для создания сложных логических проверок, касающихся отслеживаемой статистики.

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

Синтаксис простого полезного выражения:
`функция(/узел сети/ключ,параметр)<оператор><константа>`.

Например:

```default
min(/Zabbix server/net.if.in[eth0,bytes],5m)>100K
```

сработает, если количество полученных байт за последние пять минут всегда превышает 100 килобайт.

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

-   выражение проблемы — задаёт условия проблемы
-   выражение восстановления (опционально) — задаёт дополнительные условия решения проблемы

Когда задается только выражение проблемы, это выражение будет использоваться в качестве порога как проблемы, так и восстановления проблемы.
Как только выражение проблемы вычисляется в значение ИСТИНА, возникает проблема.
Как только выражение проблемы вычисляется в значение ЛОЖЬ, проблема считается решённой.

Если задаются оба выражения, как проблемы, так и дополнительного выражения восстановления, решение проблемы становится более сложным: не только выражение проблемы должно стать ЛОЖЬ, но также и выражение восстановления должно стать ИСТИНА.
Такой подход полезен для создания [гистерезиса](#гистерезис) и помогает избежать частых переключений триггера (из/в состояния ПРОБЛЕМЫ и обратно).

:::noteclassic
Использовать макрос {TRIGGER.VALUE} в выражении восстановления непродуктивно, поскольку это выражение вычисляется только тогда, когда триггер находится в состоянии «Проблема».
Следовательно, при вычислении выражения {TRIGGER.VALUE} всегда будет разрешаться в «1» (что указывает на состояние «Проблема»).
:::

[comment]: # ({/07d50a02-473bcd5e})

[comment]: # ({8df5a50f-d4e5ef03})
#### Функции

Функции позволяют обсчитывать собранные значения (вычислять среднее, минимальное, максимальное, сумму), искать строки, ссылаться на текущее время и принимать во внимание другие факторы.

Имеется полный список [поддерживаемых функций](/manual/appendix/functions).

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

[comment]: # ({/8df5a50f-d4e5ef03})

[comment]: # ({79396a0f-b255de16})
#### Параметры функции

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

-   узел сети и ключ элемента данных (функции, ссылающиеся только на историю элемента данных узла сети)
-   параметры, специфичные для функции
-   другие выражения (недоступны для функций, ссылающихся только на историю элемента данных узла сети, см. [другие выражения](#other-expressions) для примеров)

Узел сети и ключ элемента данных можно указать как `/host/key`.<br>
Опускание имени узла сети в первом параметре (то есть как в `function(//key,parameter,...)`) поддерживается только в определенных контекстах:

-   В формуле вычисляемых элементов данных
-   В макросах выражений, которые можно использовать в:
    -   поле [*Имя события*](/manual/config/triggers/trigger#configuration)
    -   имени графика
    -   подписи элементов карты "Host" и "Trigger" [map elements](/manual/config/visualization/maps/map#adding-elements)

В этих контекстах также можно использовать макрос [`{HOST.HOST}`](/manual/appendix/macros/supported_by_location#hosthost).
`{HOST.HOST<1-9>}` можно использовать в случае поля *Имя события* и элемента карты "Trigger", чтобы ссылаться на конкретный элемент в выражении триггера.
Когда имя узла сети опущено или заменено на `{HOST.HOST}` в этих контекстах, ссылка указывает на первый элемент в выражении триггера или на первый элемент в графике.
Вне этих поддерживаемых контекстов опускание имени узла сети в выражениях триггера приведет к ошибке.
См. [Пример 18](#example-18) для иллюстрации использования двойной косой черты в макросах имени события.

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

Хотя другие выражения триггера в качестве параметров функции ограничены функциями без истории в триггерах, это ограничение не применяется в [вычисляемых элементах данных](/manual/config/items/itemtypes/calculated).

[comment]: # ({/79396a0f-b255de16})

[comment]: # ({233dadf7-cf9e09bb})
##### Параметры, зависящие от функции

Параметры, которые зависят от используемой функции, помещаются после ключа элемента данных и отделяются от него запятой.
Смотрите полный список этих параметров по  [поддерживаемым функциям](/manual/appendix/functions).

Большинство числовых функций принимают время в качестве параметра.
Чтобы указать время, вы можете использовать секунды или [суффиксы времени](/manual/appendix/suffixes).
Параметр, которому предшествует символ решётки, имеет другое значение:

|Выражение|Описание|
|----------|-----------|
|**sum**(/узел сети/ключ,**10m)**|Сумма значений за последние 10 минут.|
|**sum**(/узел сети/ключ,**\#10)**|Сумма последних десяти значений.|

В случае с функцией **last** параметры с символом решётки имеют другой смысл — они обозначают N-ое предыдущее значение, таким образом, с учётом заданных значений 30, 70, 20, 60, 50 (от самого последнего к наименее последнему значению):

-   `last(/узел сети/ключ,#2)` вернёт «70»
-   `last(/узел сети/ключ,#5)` вернёт «50»

[comment]: # ({/233dadf7-cf9e09bb})

[comment]: # ({bf48db7f-6699e631})
##### Сдвиг времени

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

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

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

::: noteimportant
Сдвиг времени, указанный в месяцах (M) и годах (y), поддерживается только для [функций динамики изменений](/manual/appendix/functions/trends). 
Остальные функции поддерживают секунды (s), минуты (m), часы (h), дни (d) и недели (w).
:::

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

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

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

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

|Параметр|Описание|
|--|--------|
|1d:now/d|Вчера|
|1d:now/d+1d|Сегодня|
|2d:now/d+1d|Последние 2 дня|
|1w:now/w|Последняя неделя|
|1w:now/w+1w|Текущая неделя|

[comment]: # ({/bf48db7f-6699e631})

[comment]: # ({afa2064a-c5d3ec54})
##### Другие выражения

Параметры функций могут содержать другие выражения в соответствии со следующим синтаксисом:

```default
min(min(/узел сети/ключ,1h),min(/узел сети2/ключ2,1h)*10)
```

Обратите внимание, что другие выражения нельзя использовать, если функция ссылается на историю элемента данных.
Например, следующий синтаксис **не** разрешён:

~~`min(/узел сети/ключ,#5*10)`~~

[comment]: # ({/afa2064a-c5d3ec54})

[comment]: # ({5aa16694-10bc91a2})
#### Операторы

Следующие операторы поддерживаются триггерами **(представлены по убыванию приоритета выполнения)**:

|Приоритет|Оператор|Определение|**Заметки по [неизвестным значениям](/manual/config/triggers/expression#выражения-с-неизвестными-операндами)**|Принудительное преобразование операнда в дробное число ^**1**^|
|-|-|----|----------------|--|
|**1**|**-**|Унарный минус|**-**Неизвестно → Неизвестно|Да|
|**2**|**not**|Логическое НЕ|**not** Неизвестно → Неизвестно|Да|
|**3**|**\***|Умножение|0 **\*** Неизвестно → Неизвестно<br>(да, Неизвестно, не 0 — чтобы не потерять<br>Неизвестно в арифметических операциях)<br>1.2 **\*** Неизвестно → Неизвестно|Да|
|<|**/**|Деление|Неизвестно **/** 0 → ошибка<br>Неизвестно **/** 1.2 → Неизвестно<br>0.0 **/** Неизвестно → Неизвестно|Да|
|**4**|**+**|Арифметический плюс|1.2 **+** Неизвестно → Неизвестно|Да|
|<|**-**|Арифметический минус|1.2 **-** Неизвестно → Неизвестно|Да|
|**5**|**\<**|Меньше чем. Этот оператор можно представить в виде:<br><br>A<B ⇔ (A<B-0.000001)|1.2 **<** Неизвестно → Неизвестно|Да|
|<|**<=**|Меньше чем или равно. Этот оператор можно представить в виде:<br><br>A<=B ⇔ (A≤B+0.000001)|Неизвестно **<=** Неизвестно → Неизвестно|Да|
|<|**>**|Больше чем. Этот оператор можно представить в виде:<br><br>A>B ⇔ (A>B+0.000001)| |Да|
|<|**>=**|Больше чем или равно. Этот оператор можно представить в виде:<br><br>A>=B ⇔ (A≥B-0.000001)| |Да|
|**6**|**=**|Равно. Этот оператор можно представить в виде:<br><br>A=B ⇔ (A≥B-0.000001) и (A≤B+0.000001)| |Нет ^**1**^|
|<|**<>**|Не равно. Этот оператор можно представить в виде:<br><br>A<>B ⇔ (A<B-0.000001) или (A>B+0.000001)||Нет ^**1**^|
|**7**|**and**|Логическое И|0 **and** Неизвестно → 0<br>1 **and** Неизвестно → Неизвестно<br>Неизвестно **and** Неизвестно → Неизвестно|Да|
|**8**|**or**|Логическое ИЛИ|1 **or** Неизвестно → 1<br>0 **or** Неизвестно → Неизвестно<br>Неизвестно **or** Неизвестно → Неизвестно|Да|

^**1**^ Строковый операнд по-прежнему приводится к числовому значению, если:

-   другой операнд числовой
-   над операндом используется оператор, отличный от **=** или **<>**

При операторах сравнения (`<`, `<=`, `>`, `>=`): если приведение завершается с ошибкой (например, для `""`), результатом выражения будет Неизвестно (без сравнения строковых значений).

При операторах равенства (`=`, `<>`): если приведение завершается с ошибкой, то оба операнда сравниваются как сырые строковые значения.

Операторы **not**, **and** и **or** зависят от регистра и должны быть в нижнем регистре.
Они также должны быть окружены символами пробелов или круглыми скобками.

Все операторы, кроме унарных **-** и **not**, имеют ассоциативность слева направо.
Унарные **-** и **not** не ассоциативны (имеется в виду, что нужно использовать **-(-1)** и **not (not 1)** вместо **--1** и **not not 1**).

Результат вычисления:

-   Операторы **<**, **<=**, **>**, **>=**, **=**, **<>** должны возвращать '1' в выражении триггера, если указанное соотношение правдиво, и '0', если оно ложно.
Если по крайней мере один операнд Неизвестен, то и результат будет Неизвестно;
-   **and** по известным операндам должен возвращать «1», если оба из этих операндов сравнения не равны «0»; в противном случае, будет давать «0»; для неизвестных операндов **and** вернёт «0», только если один из операндов сравнения равен «0»; в противном случае, он вернёт «Неизвестно»;
-   **or** по известным операндам должен возвращать «1», если какой-либо из этих операндов сравнения не равен «0»; в противном случае, будет возвращать «0»; для неизвестных операндов **or** вернёт «1», только если один из операндов сравнения не равен «0»; в противном случае, он вернёт «Неизвестно»;
-   Результат логического операнда отрицания **not** для известного операнда равен «0», если значение этого операнда сравнения не равно «0»; «1», если значение его операнда сравнения равно «0».
Для неизвестных операндов **not** вернёт «Неизвестно».

[comment]: # ({/5aa16694-10bc91a2})

[comment]: # ({0e2466bf-195c3f4f})
#### Кэширование значений

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

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

[comment]: # ({/0e2466bf-195c3f4f})

[comment]: # ({abac99e3-abac99e3})
#### Примеры триггеров

[comment]: # ({/abac99e3-abac99e3})

[comment]: # ({56e707cf-17b607dc})
##### Пример 1

Высокая загрузка процессора на сервере Zabbix.

```default
last(/Zabbix server/system.cpu.load[all,avg1])>5
```

Используя функцию «last()», мы ссылаемся на самое последнее значение.
`/Zabbix server/system.cpu.load[all,avg1]` представляет короткое имя наблюдаемого параметра.
Эта строка указывает, что сервер — «Zabbix server», а наблюдаемый ключ — «system.cpu.load\[all,avg1\]».
Наконец, `>5` означает, что триггер будет переходить в состояние ПРОБЛЕМА всякий раз, когда самое последнее измерение загрузки процессора на сервере Zabbix server будет превышать 5.

[comment]: # ({/56e707cf-17b607dc})

[comment]: # ({eb26dc13-9a129732})
##### Пример 2

www.example.com перегружен.

```default
last(/www.example.com/system.cpu.load[all,avg1])>5 or min(/www.example.com/system.cpu.load[all,avg1],10m)>2 
```

Это выражение будет истинным, когда либо текущая загрузка процессора станет более 5, либо загрузка процессора больше значения 2 в течение последних 10 минут.

[comment]: # ({/eb26dc13-9a129732})

[comment]: # ({c3efce1a-49592749})
##### Пример 3

/etc/passwd был изменён.

```default
last(/www.example.com/vfs.file.cksum[/etc/passwd],#1)<>last(/www.example.com/vfs.file.cksum[/etc/passwd],#2)
```

Это выражение будет истинным, когда предыдущее значение контрольной суммы файла /etc/passwd отличается от самого нового значения.

Аналогичные выражения могут быть полезны для мониторинга изменений в важных файлах, таких как /etc/passwd, /etc/inetd.conf, /kernel и других.

[comment]: # ({/c3efce1a-49592749})

[comment]: # ({2c152827-46e72843})
##### Пример 4

Кто-то в данный момент скачивает из Интернета большой файл.

Используется функция min:

```default
min(/www.example.com/net.if.in[eth0,bytes],5m)>100K
```

Это выражение будет истинным, когда количество полученных байт на eth0 превышает 100 КБ за последние 5 минут.

[comment]: # ({/2c152827-46e72843})

[comment]: # ({914aa064-7956e04e})
##### Пример 5

Оба узла кластера SMTP серверов недоступны.

Обратите внимание на то, что в выражении используются два разных узла сети:

```default
last(/smtp1.example.com/net.tcp.service[smtp])=0 and last(/smtp2.example.com/net.tcp.service[smtp])=0
```

Это выражение будет истинным, когда оба SMTP сервера недоступны — и на smtp1.example.com, и на smtp2.example.com.

[comment]: # ({/914aa064-7956e04e})

[comment]: # ({461ff958-62cfb014})
##### Пример 6

Zabbix агент нуждается в обновлении.

Используется функция find():

```default
find(/example.example.com/agent.version,,"like","beta8")=1
```

Это выражение будет истинным, когда версия Zabbix агента содержит «beta8».

[comment]: # ({/461ff958-62cfb014})

[comment]: # ({b25c8bb8-567b88a9})
##### Пример 7

Сервер недоступен.

```default
count(/example.example.com/icmpping,30m,,"0")>5
```

Это выражение будет истинным, если узел сети «example.example.com» недоступен более пяти раз за последние 30 минут.

[comment]: # ({/b25c8bb8-567b88a9})

[comment]: # ({c264178f-2f13cb92})
##### Пример 8

Нет данных за последние 3 минуты.

Используется функция nodata():

```default
nodata(/example.example.com/tick,3m)=1
```

Для того, чтобы этот триггер заработал, элемент данных «tick» должен быть определён как элемент данных с типом Zabbix [траппер](/manual/config/items/itemtypes/trapper).
Узел сети должен периодически отправлять данные этому элементу данных, используя zabbix\_sender. Если никаких данных не было получено за последние 180 секунд, значение триггера станет ПРОБЛЕМА.

*Обратите внимание*, что «nodata» можно использовать с любым типом элементов данных.

[comment]: # ({/c264178f-2f13cb92})

[comment]: # ({663a1265-2c48905a})
##### Пример 9

Активность CPU в ночное время.

Используется функция time():

```default
min(/Zabbix server/system.cpu.load[all,avg1],5m)>2 and time()<060000
```

Триггер может изменить свое состояние в ПРОБЛЕМА только в ночное время (00:00 — 06:00).

[comment]: # ({/663a1265-2c48905a})

[comment]: # ({2a28e303-7e0ba13a})
##### Пример 10

Активность CPU в любое время с исключением.

Используется функция time() и оператор **not**:

```default
min(/zabbix/system.cpu.load[all,avg1],5m)>2
and not (dayofweek()=7 and time()>230000)
and not (dayofweek()=1 and time()<010000)
```

Триггер может изменить свое состояние на Проблема в любое время, за исключением интервала в 2 часа при изменении недели (воскресенье, 23:00 — понедельник, 01:00).

[comment]: # ({/2a28e303-7e0ba13a})

[comment]: # ({dbb498df-0e6bfc51})
##### Пример 11

Проверка синхронизации времени на клиенте со временем на Zabbix сервере.

Используется функция fuzzytime():

```default
fuzzytime(/MySQL_DB/system.localtime,10s)=0
```

Триггер изменит состояние на проблему тогда, когда локальное время на сервере MySQL\_DB и Zabbix сервере будут различаться более чем на 10 секунд.
Обратите внимание, что с Zabbix агентом «system.localtime» должен быть настроен как [пассивная проверка](/manual/appendix/items/activepassive#пассивные-проверки); с Zabbix агентом 2 может быть настроено и как активная проверка.

[comment]: # ({/dbb498df-0e6bfc51})

[comment]: # ({4f63a3b1-47b2e2fd})
##### Пример 12

Сравнение средней загрузки сегодня со средним значением загрузки за это же время вчера (использование сдвига времени в виде `now-1d`).

```default
avg(/server/system.cpu.load,1h)/avg(/server/system.cpu.load,1h:now-1d)>2
```

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

[comment]: # ({/4f63a3b1-47b2e2fd})

[comment]: # ({536c07d9-bb0f5278})
##### Пример 13

Использование значения другого элемента данных в качестве порогового значения триггера:

```default
last(/Template PfSense/hrStorageFree[{#SNMPVALUE}])<last(/Template PfSense/hrStorageSize[{#SNMPVALUE}])*0.1
```

Триггер изменит свое состояние на проблему, если количество свободного пространства на диске упадёт ниже 10 процентов.

[comment]: # ({/536c07d9-bb0f5278})

[comment]: # ({e67109f1-0cc34ec7})
##### Пример 14

Использование [результата вычисления](#операторы) для получения количества триггеров больше порога:

```default
(last(/server1/system.cpu.load[all,avg1])>5) + (last(/server2/system.cpu.load[all,avg1])>5) + (last(/server3/system.cpu.load[all,avg1])>5)>=2
```

Этот триггер сработает, если по крайней мере два триггера в выражении будут в состоянии ПРОБЛЕМА.

[comment]: # ({/e67109f1-0cc34ec7})

[comment]: # ({3d70b4b9-adfc6b9d})
##### Пример 15

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

Проблема: создание оповещения, если версия Ubuntu отличается от версии на другом узле сети

```default
last(/NY Zabbix server/vfs.file.contents[/etc/os-release])<>last(/LA Zabbix server/vfs.file.contents[/etc/os-release])
```

[comment]: # ({/3d70b4b9-adfc6b9d})

[comment]: # ({18b8548e-c2b4949f})
##### Пример 16

Сравнение двух строковых значений — операнды здесь:

-   функция, которая возвращает строку
-   комбинация макросов и строк

Проблема: обнаружение изменений в DNS запросе

Ключ элемента данных:

```default
net.dns.record[192.0.2.0,{$WEBSITE_NAME},{$DNS_RESOURCE_RECORD_TYPE},2,1]
```

с макросами, заданными как

```default
{$WEBSITE_NAME} = example.com
{$DNS_RESOURCE_RECORD_TYPE} = MX
```

который обычно возвращает:

```default
example.com           MX       0 mail.example.com
```

Итак, наше выражение триггера определяет, отклоняется ли результат DNS запроса от ожидаемого значения:

```default
last(/Zabbix server/net.dns.record[192.0.2.0,{$WEBSITE_NAME},{$DNS_RESOURCE_RECORD_TYPE},2,1])<>"{$WEBSITE_NAME}           {$DNS_RESOURCE_RECORD_TYPE}       0 mail.{$WEBSITE_NAME}"
```

Обратите внимание на кавычки вокруг второго операнда.

[comment]: # ({/18b8548e-c2b4949f})

[comment]: # ({3c7c7fa3-60fad4fc})
##### Пример 17

Сравнение двух строковых значений — операнды здесь:

-   функция, которая возвращает строку
-   строковая константа со специальными символами \\ и "

Проблема: определить, идентично ли содержимое файла `/tmp/hello` следующим данным:

```default
\" //hello ?\"
```

Опция 1. Указать строку напрямую:

```default
last(/Zabbix server/vfs.file.contents[/tmp/hello])="\\\" //hello ?\\\""
```

Обратите внимание на то, как экранируются символы \\ и " при сравнении строки напрямую.

Опция 2. Использование макроса

```default
{$HELLO_MACRO} = \" //hello ?\"
```

в выражении:

```default
last(/Zabbix server/vfs.file.contents[/tmp/hello])={$HELLO_MACRO}
```

[comment]: # ({/3c7c7fa3-60fad4fc})

[comment]: # ({9351ce5e-6906462b})
##### Пример 18

Сравнение длительных периодов.

Проблема: Загрузка Exchange сервера увеличилась более чем на 10% за последний месяц

```default
trendavg(/Exchange/system.cpu.load,1M:now/M)>1.1*trendavg(/Exchange/system.cpu.load,1M:now/M-1M)
```

Вы можете также использовать поле [Имени события](/manual/config/triggers/trigger#настройка) в настройках триггера, чтобы создать осмысленное сообщение оповещения, например, для получения примерно следующего

`"Load of Exchange server increased by 24% in July (0.69) comparing to June (0.56)"`

имя события должно быть определено следующим образом:

```default
Load of {HOST.HOST} server increased by {{?100*trendavg(//system.cpu.load,1M:now/M)/trendavg(//system.cpu.load,1M:now/M-1M)}.fmtnum(0)}% in {{TIME}.fmttime(%B,-1M)} ({{?trendavg(//system.cpu.load,1M:now/M)}.fmtnum(2)}) comparing to {{TIME}.fmttime(%B,-2M)} ({{?trendavg(//system.cpu.load,1M:now/M-1M)}.fmtnum(2)})
```

Также для подобных проблем полезно было бы разрешить закрывать триггер вручную в настройках самого триггера.

[comment]: # ({/9351ce5e-6906462b})

[comment]: # ({0927c71d-contribute})

::: note-contribute
Есть пример выражений триггера, который может быть полезен другим? Используйте [Форму предложения примера](#report-example), чтобы отправить его разработчикам Zabbix.
:::

[comment]: # ({/0927c71d-contribute})

[comment]: # ({6e5624e6-3f1b1c81})
#### Гистерезис

Порой нам необходим некоторый интервал между состояниями ОК и Проблема, а не просто порог.
Например, если мы хотим задать триггер, который переходит в состояние Проблема, когда температура в серверной комнате становится больше 20°C, и мы хотим, чтобы он оставался в этом состоянии, пока температура не опустится ниже 15°C, то просто порога в 20°C для триггера будет недостаточно.

Вместо этого нам нужно сначала задать выражение триггера для события проблемы (температура выше 20°C).
Затем нам нужно задать дополнительное условие восстановления (температура ниже 15°C).
Это можно сделать, задавая дополнительный параметр *Выражение восстановления* в [настройках](/manual/config/triggers/trigger) триггера.

В этом случае восстановление проблемы будет проходить в два этапа:

-   Во-первых, выражение проблемы (температура выше 20°C) должно быть вычислено в значение ЛОЖЬ
-   Во-вторых, выражение восстановления (температура ниже 15°C) должно быть вычислено в значение ИСТИНА

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

::: notewarning
Выражение восстановления, которое в состоянии ИСТИНА, не решает проблему, если выражение проблемы по-прежнему равно ИСТИНА!
:::

[comment]: # ({/6e5624e6-3f1b1c81})

[comment]: # ({e401ef55-942a7e0e})
##### Пример 1

Температура в серверной комнате слишком высокая.

Выражение проблемы:

```default
last(/server/temp)>20
```

Выражение восстановления:

```default
last(/server/temp)<=15
```

[comment]: # ({/e401ef55-942a7e0e})

[comment]: # ({489d9e1d-bddf0717})
##### Пример 2

Очень мало свободного места на диске.

Выражение проблемы: если меньше 10ГБ за последние 5 минут

```default
max(/server/vfs.fs.size[/,free],5m)<10G
```

Выражение восстановления: если больше 40ГБ за последние 10 минут

```default
min(/server/vfs.fs.size[/,free],10m)>40G
```

[comment]: # ({/489d9e1d-bddf0717})

[comment]: # ({91453a7f-6fc2eb1c})
#### Выражения с неизвестными операндами

В большинстве случаев, неизвестный операнд (такой как неподдерживаемый элемент данных) в выражении незамедлительно изменит значение триггера на `Неизвестно`.

Однако, в некоторых случаях неизвестные операнды (неподдерживаемые элементы данных, ошибки функций) при вычисления выражений допустимы:

-   Функция `nodata()` вычисляется независимо от того, поддерживается элемент данных, на который она ссылается, или же не поддерживается.
-   Логические выражения с ИЛИ и И могут быть вычислены в известные значения независимо от неизвестных операндов в двух случаях:
    -  **Случай 1**: "1 `or` некая\_функция(неподдерживаемый\_элемент\_данных1) `or` некая\_функция(неподдерживаемый\_элемент\_данных2) `or` ..." может быть вычислено с известным результатом («1» или "Проблема"),
    -  **Случай 2**: "0 `and` некая\_функция(неподдерживаемый\_элемент\_данных1) `and` некая\_функция(неподдерживаемый\_элемент\_данных2) `and` ..." может быть вычислено с известным результатом («0» или "OK").<br>
        Zabbix пытается вычислить такие логические выражения, принимая неподдерживаемые элементы данных как неизвестные операнды.
        В двух случаях, упомянутых выше, будет производиться известное значение; в остальных случаях значением триггера будет `Неизвестно`.
-   Если вычисление функции по поддерживаемому элементу данных приведёт к ошибке, значением функции будет `Неизвестно` и оно будет частью дальнейшего вычисления выражения как неизвестный операнд.

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

::: noteimportant
Выражение, приводящее к `Неизвестно`, не меняет состояние триггера («Проблема/OK»). 
Таком образом, если он был в состоянии «Проблема» (смотрите Случай 1), то остаётся в том же проблемном состоянии, даже если известная часть разрешается («1» становится «0»), потому что выражение теперь вычисляется в `Неизвестно`, а это не меняет состояние триггера.
:::

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

[comment]: # ({/91453a7f-6fc2eb1c})
