[comment]: # translation:outdated

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

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

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

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

虽然 监控项 用于收集系统数据，但始终关注这些数据以等待某个需要警报或注意的条件是极其不切实际的。数据“评估”的任务可以交给触发器表达式。

触发器表达式允许定义数据状态的“可接受”阈值。因此，如果传入数据超过可接受状态，触发器将“触发”——或将其状态更改为问题（PROBLEM）。

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

| 状态 | 描述 |
|-----|-----------|
| OK     | 这是正常的触发器状态。 |
| 问题（Problem） | 某些事情发生了。例如，处理器负载过高。 |
| 未知（Unknown） | 无法计算触发器值。请参阅 [未知状态](#unknown-status)。 |

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

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

```
    avg(/host/key,5m)>2
```

如果五分钟平均值*超过* 2，此触发器将“触发”（变为问题状态 PROBLEM）。

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

无法为具有二进制值的 监控项 创建触发器。

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

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

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

[comment]: # ({4d0d2ac7-a45a4e79})
大多数触发器函数是基于监控项值的[history](/manual/config/items/history_and_trends)数据进行计算的，而一些用于长期分析的触发器函数，例如**trendavg()**、**trendcount()**等，则使用趋势数据。

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

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

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

此外，当接收到新值时，以及在表达式中使用了 [date and time](/manual/appendix/functions/time) 和/或 [nodata()](/manual/appendix/functions/history#nodata) 函数的情况下，每 30 秒都会重新计算一次触发器。

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

仅引用趋势函数的触发器，每表达式中最小时间周期计算一次。另见 [trend functions](/manual/appendix/functions/trends)。

[comment]: # ({/3296f4fc-6781ee38})

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

评估周期用于引用监控项历史的函数中。  
它允许我们指定感兴趣的区间。评估周期可以指定为时间段（如30秒、10分钟、1小时）或值范围（如\#5，表示最近的五个值）。

评估周期的测量截止到“当前”（"now"），这里的“当前”是指触发器的最新重新计算时间（参见上面的[计算时间](#calculation_time)）；“当前”并不是服务器的实时时间。

评估周期可以指定为以下两种情况之一：

- 考虑“当前 - 时间周期”到“当前”之间的所有值（或者，如果有时间偏移，则为“当前 - 时间偏移 - 时间周期”到“当前 - 时间偏移”之间）
- 考虑最多不超过过去num个值，截止到“当前”
  - 如果在指定的时间周期或num个值范围内没有0可用值，则使用该函数的触发器或计算监控项将变为不支持状态

请注意：

- 如果触发器中仅使用了一个引用数据历史的函数，“当前”始终是最新接收到的值。例如，如果最后一个值是在一小时前接收的，评估周期将被视为截止到一小时前的最新值。
- 一旦接收到第一个值，就会立即计算新触发器（历史函数）；它将在30秒内为[date and time](/manual/appendix/functions/time)和[nodata()](/manual/appendix/functions/history#nodata)函数进行计算。因此，即使设定的评估周期（例如一小时）尚未从触发器创建时经过，触发器也会被计算。即使评估范围被设置为例如最近十个值，在接收到第一个值后也会进行计算。

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

[comment]: # ({53f36bf7-cad1df72})
#### 未知状态

在以下情况下，触发器表达式中可能会出现未知的操作数：

-   使用了不支持的 监控项
-   对于支持的 监控项，其函数评估结果出现错误

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

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

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

