[comment]: # ({e02835c7-e02835c7})
# 3 触发器

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

[comment]: # ({38df9f3c-d4a1b8b6})
#### 概述

触发器是用于"评估"由监控项收集的数据的逻辑表达式，用于表示当前系统状态。

虽然监控项用于收集系统数据，但实时跟踪这些数据以等待出现需要告警或值得关注的情况是极不现实的。数据"评估"的工作可以交由触发器表达式来完成。

触发器表达式允许定义数据状态的"可接受"阈值。因此，当传入数据超出可接受状态时，触发器将被"触发"——即其状态变更为PROBLEM。

触发器可能具有以下状态：

| 状态 | 描述 |
|-----|-----------|
| OK     | 这是触发器的正常状态。 |
| Problem | 发生了异常情况。例如处理器负载过高。 |
| Unknown | 无法计算触发器值。参见[未知状态](#unknown-status)。 |

在一个简单触发器中，我们可能希望为某些数据的五分钟平均值设置阈值，例如CPU负载。这可以通过定义触发器表达式来实现，其中：

-   对监控项键接收的值应用'avg'函数
-   使用五分钟的评估周期
-   设置'2'作为阈值

```
    avg(/host/key,5m)>2
```
如果五分钟平均值*超过*2，该触发器将"触发"(变为PROBLEM状态)。

在更复杂的触发器中，表达式可能包含多个函数和多个阈值的**组合**。另请参阅：[Trigger
expression](/manual/config/triggers/expression)。

[comment]: # ({/38df9f3c-d4a1b8b6})

[comment]: # ({eb55c29b-7c263ca6})


::: notetip
在启用触发器（将其配置状态从*禁用*更改为*启用*）后，只要其中的监控项接收到值或处理[date and time](/manual/appendix/functions/time)和/或nodata()函数的时间到达，就会立即评估触发器表达式。

:::

[comment]: # ({/eb55c29b-7c263ca6})

[comment]: # ({4d0d2ac7-a45a4e79})


大多数触发器函数基于监控项值[history](/manual/config/items/history_and_trends)数据进行评估，而部分用于长期分析的触发器函数（例如**trendavg()**、**trendcount()**等）则使用趋势数据。

[comment]: # ({/4d0d2ac7-a45a4e79})

[comment]: # ({0ce5c86a-6781ee38})
#### 计算时间

每次当Zabbix server接收到表达式组成部分的新值时，触发器都会重新计算。当接收到新值时，表达式中包含的每个函数都会重新计算（不仅仅是接收到新值的那个函数）。

此外，触发器在每次接收到新值时都会重新计算，**并且**如果表达式中使用了[date and time](/manual/appendix/functions/time)和/或nodata()函数，则每30秒也会重新计算一次。

[Date and time](/manual/appendix/functions/time)和/或nodata()函数由Zabbix历史同步器进程每30秒重新计算一次。

仅引用趋势函数的触发器会根据表达式中的最小时间周期进行一次评估。另请参阅[trend functions](/manual/appendix/functions/trends)。

[comment]: # ({/0ce5c86a-6781ee38})

[comment]: # ({c970c392-1fa7644e})
#### 评估周期

评估周期用于引用监控项历史数据的函数中。
它允许指定我们关注的时间区间。可以
表示为时间段（30s、10m、1h）或数值范围（\#5 - 表示
最近的五个值）。

评估周期计算至"当前时刻" - 这里的"当前时刻"指
触发器最近重新计算的时间（参见上文[计算时间](#calculation_time)）；
"当前时刻"并非服务器的实时时间。

评估周期可指定以下两种方式：

- 考虑"当前时刻-时间段"到"当前时刻"之间的所有值（或应用时间偏移时，
  计算"当前时刻-时间偏移-时间段"到"当前时刻-时间偏移"之间的值）
- 最多考虑过去指定数量的值（不超过num个）

    to "now"
    -   If there are 0 available values for the time period or num count
        specified - then the trigger or calculated item that uses this
        function becomes unsupported

需注意：

- 若触发器中仅使用单个（引用历史数据的）函数时，"当前时刻"始终是最近接收的值。
  例如，若最后一个值是一小时前接收的，评估周期将计算至一小时前的最新值。
- 新触发器在收到第一个值时立即计算（历史函数类）；对于[date and time](/manual/appendix/functions/time)和nodata()
  函数将在30秒内完成计算。因此即使自触发器创建后尚未达到
  设定的评估周期（例如一小时），触发器仍会被计算。即使评估范围设置为
  例如最近十个值，触发器也会在收到第一个值后立即计算。

[comment]: # ({/c970c392-1fa7644e})

[comment]: # ({53f36bf7-e5de9dea})


#### 未知状态

如果触发器表达式中出现未知操作数，可能是由于以下情况：

-   使用了不支持的监控项
-   对支持的监控项进行函数评估时出现错误

这种情况下触发器通常会评估为"unknown"（尽管存在一些例外）。更多详细信息，请参阅[含有未知操作数的表达式](/manual/config/triggers/expression#含有未知操作数的表达式)。

可以对未知触发器进行[get notified](/manual/config/events/sources#internal-events)操作。

[comment]: # ({/53f36bf7-e5de9dea})

