> ## Documentation Index
> Fetch the complete documentation index at: https://docs.molesignal.com/llms.txt
> Use this file to discover all available pages before exploring further.

# 告警规则

> 在规则工作台中创建阈值规则和异常规则，用真实数据测试，按主机或服务拆分，并决定事件如何恢复。

规则说明什么不该发生。MoleSignal 按间隔评估规则，条件成立时开启[事件](https://docs.molesignal.com/zh-Hans/alerting/incidents.md)。打开 **告警 → 规则**。读取规则需要 `alerts.read`，创建或修改规则需要 `alerts.manage`。

## 规则类型

| 类型 | 评估对象 | 创建位置 |
| - | - | - |
| **阈值规则** | SQL 或 PromQL 查询、[APM 指标](https://docs.molesignal.com/zh-Hans/apm#按-apm-指标告警)或 [RUM 指标](https://docs.molesignal.com/zh-Hans/rum/alerts.md)，按间隔与固定阈值比较。 | 规则工作台。 |
| **异常检测** | 查询、APM 指标或 RUM 指标，与根据其历史学到的基线比较。 | 异常规则编辑器。 |
| **实时规则** | 在接入路径上对到达的记录计数。 | 仅 API。参见[实时规则](#实时规则)。 |

## 规则列表

**规则** 列出每条规则的数据源、触发条件、状态和最近评估时间。可以按规则、服务或数据源搜索，并在 **全部**、**已启用** 和 **已停用** 之间切换。

| 状态 | 含义 |
| - | - |
| **尚未评估** | 规则还没有运行过。 |
| **正常** | 最近一次评估没有满足条件。 |
| **等待持续** | 条件已成立，但持续时间还不够。 |
| **触发中** | 规则有打开的事件。 |
| **已停用** | 规则保存为草稿，不会运行。 |

点击规则，或点击行中的 **编辑**，即可打开规则。

## 创建阈值规则

点击 **新建规则 → 阈值规则** 打开规则工作台。

**1. 选择规则类型**

选择 **指标告警**、**日志告警**、**链路告警**、**APM 告警** 或 **RUM 告警**。**快速开始** 中的预设会填入典型查询，例如 **错误率过高**、**P95 延迟过高**、**错误日志激增** 或 **无数据告警**。APM 告警和 RUM 告警选择服务或应用以及一项指标，而不是写查询；参见[按 APM 指标告警](https://docs.molesignal.com/zh-Hans/apm#按-apm-指标告警)与 [RUM 告警](https://docs.molesignal.com/zh-Hans/rum/alerts.md)。

**2. 填写基本信息**

**规则名称** 用作事件标题，例如 `api_high_error_rate`。**服务** 把规则关联到某个服务，用于归属和跨信号上下文。**说明** 描述规则保护的内容。

**3. 编写查询**

设置 **目标数据流**、**评估间隔**（每 1、5 或 10 分钟）、**查询语言**（指标用 **PromQL**，其他用 **SQL**）和 **查询**。查询要返回一个数值：评估器读取第一行的第一列。可以按需填写[**按维度拆分**](#按维度拆分)。

**4. 设置触发条件**

每一行是一个严重度：**当结果** 以运算符与 **阈值** 比较，**并持续** 若干分钟。**添加级别** 可以再加一行。命中的最高严重度生效，高严重度不能比低严重度更容易命中。分钟数会换算为评估次数。在下方设置 [**恢复条件** 和 **没有数据时**](#恢复条件与没有数据)。

**5. 添加处理指南**

在 **Notify 与处理** 中填写 **处理指南 / Runbook URL**，事件处理人员可以从事件列表直接打开。通知谁由[升级策略](https://docs.molesignal.com/zh-Hans/alerting/on-call.md#升级策略)和[通知策略](https://docs.molesignal.com/zh-Hans/notification-channels#创建模板和策略)决定，而不是由规则决定。

**6. 测试规则**

点击 **测试规则**。查询会在最近 6 小时的真实数据上运行，**查询预览** 绘制结果，并显示阈值线、当前值、预计触发次数、扫描行数和耗时。按维度拆分的规则会显示分成了多少组。

**7. 保存**

**创建前检查** 必须全部通过：已填写名称、当前查询测试成功、阈值有效、Runbook URL 有效。然后点击 **保存并启用**，或点击 **保存草稿** 只保存不运行。

在规则工作台中创建的规则使用名为 `default` 的升级策略。组织中没有这条策略时，开出的事件不会升级给任何人，请先创建它。参见[默认策略](https://docs.molesignal.com/zh-Hans/alerting/on-call.md#默认策略)。

## 按维度拆分

基于 SQL 或 PromQL 查询的定时规则可以按结果里的列拆分，例如按主机或服务。在规则工作台填写**按维度拆分**，或在[创建规则](https://docs.molesignal.com/zh-Hans/api/alerting/create-rule.md#按列拆分的规则)时设置 `query.group_by`。之后每组取值都像一条独立的规则。

| 部分 | 行为 |
| - | - |
| 组 | 这些列取值相同的行。列名与结果的列名匹配时不区分大小写。 |
| 值 | 组内第一行给出值：除这些列和时间列以外的第一个数值列。 |
| 触发条件 | 每组各自与触发条件或各档阈值比较，各自累计 `for_periods`。 |
| 事件 | 每组开自己的事件，标签和标题里带上这一组的取值，例如 `Errors per host · web-1`。这一组满足恢复条件时，事件被解决。不在结果里的组算作没有值，按规则的没有数据处理方式处理。 |
| 上限 | 最多 8 列，每轮最多 100 组。超过 100 组时其余的组这一轮不评估，结果里没有的组这一轮也保留它的事件。 |

每组返回一行，最严重的排在前面：

```sql theme={null}
SELECT host, count(*) AS errors
FROM app_logs
WHERE level = 'error'
GROUP BY host
ORDER BY errors DESC
```

PromQL 里序列的标签就是它的列，因此 `sum by (instance) (rate(http_requests_total{status=~"5.."}[5m]))` 按 `instance` 拆分。结果有行却没有这个名字的列时，这一轮评估失败，什么都不改变。在规则工作台测试查询时会检查这些列。APM、RUM、实时与异常规则不能拆分。

## 恢复条件与没有数据

每条规则都要说清开着的事件什么时候恢复，以及一次评估没有值时算作什么。在规则工作台的**恢复条件**和**没有数据时**里设置，或在[创建规则](https://docs.molesignal.com/zh-Hans/api/alerting/create-rule.md#恢复条件与没有数据)时设置 `trigger.recovery` 和 `trigger.no_data`。

* \*\*恢复阈值：\*\*开着的事件要等值越过这条线才恢复，例如高于 90 触发的规则低于 80 才恢复。数值在阈值附近来回时，不会再反复触发、反复恢复。
* \*\*恢复持续时间：\*\*值要在健康的一侧保持这么久，事件才恢复。
* \*\*没有数据时：\*\*查询没有返回值，或按维度拆分的规则里某一组不在结果里。

| 处理方式 | 结果 |
| - | - |
| 当作恢复 | 这次评估算作不命中，开着的事件恢复。默认选项。 |
| 保持原状态 | 什么都不变，规则显示**无数据**。异常规则的默认选项。 |
| 开无数据事件 | 保持原状态，没有数据持续够了时间就开一个标着**无数据**的事件，通知标题为 `NO DATA · <标题>`。数据回来时它自动解决。主机或服务确实下线时请手动解决它：数据回来之前不会再开。 |
| 按 0 计算 | 把缺的值当作 0 比较，适合计数。 |

实时规则不能设置这两项：计数一回落就恢复。

## 异常规则

异常规则在数值偏离其历史所预测的范围时触发，因此不需要固定阈值。点击 **新建规则 → 异常检测规则**。

| 分组 | 字段 | 规则 |
| - | - | - |
| 标识 | **规则名称**、**级别**、**服务** | 服务可选，用于提供跨信号上下文。 |
| 检测查询 | **数据源** | **查询**、某个服务或端点的 **APM 指标**，或某个应用的 **RUM 指标**。参见[对 APM 指标设置异常检测告警](https://docs.molesignal.com/zh-Hans/apm/insights.md#对-apm-指标设置异常检测告警)与 [RUM 异常规则](https://docs.molesignal.com/zh-Hans/rum/alerts.md#异常规则)。 |
| | **数据流**、**数据流类型**、**查询语言**、**查询** | 返回单个数值的查询，例如平均值、P95 或计数。 |
| | **评估窗口** | 1、5 或 15 分钟，或 1 小时。 |
| 检测器 | **算法** | **MAD**（鲁棒中位数）或 **EWMA**（跟踪近期漂移）。 |
| | **回看天数** | 同一时段 1 到 30 天的历史，默认 7 天。 |
| | **灵敏度（k·σ）** | 与基线的距离超过 k 倍离散度时触发。越大越不敏感，默认 3。 |
| | **平滑系数（α）** | 仅 EWMA，取值 `(0, 1]`。越大越看重近期样本。 |
| | **触发所需连续周期** | 开启事件前需要连续异常的评估次数。 |
| | **周季节性** | 只与相同星期几的历史比较，避免工作日与周末之间的误报。需要至少 7 天回看，28 天以上效果最好。 |

## 实时规则

实时规则在接入路径上运行，而不是按定时器运行。intake 节点接收的每条记录都会与所在数据流的实时规则匹配，匹配结果进入长度为 `period_secs` 秒的滑动窗口。窗口内的匹配数达到触发条件时规则立即触发，计数不再满足条件时事件被解决。

| 部分 | 行为 |
| - | - |
| 语句 | SQL 的 `SELECT count(*) FROM <stream> [WHERE <condition>]`。表名是规则的 `stream`。条件用字段与字面量比较（`=`、`!=`、`<`、`<=`、`>`、`>=`），并支持 `IN`、`BETWEEN`、`LIKE`、`ILIKE` 与 `IS [NOT] NULL`，用 `AND`、`OR`、`NOT` 与括号连接。缺失或为 null 的字段在比较中永远不匹配。 |
| 窗口 | `period_secs` 取 1 到 3600。 |
| 触发条件 | `operator` 为 `gt` 或 `gte`，`for_periods` 为 `0` 或 `1`。`thresholds` 中的各档按计数决定严重程度。 |
| 事件 | 事件遵循通常的生命周期：每条规则只有一个活动事件、`silence_secs` 冷却、升级与通知。 |

[创建规则](https://docs.molesignal.com/zh-Hans/api/alerting/create-rule.md)会以 `400` 拒绝超出上述限制的实时规则。计数保存在每个 intake 节点的内存中，重启后从零开始。在分角色集群中，每个 intake 节点各自统计自己收到的记录，因此请按单个节点来确定阈值。

## 修改、暂停或删除规则

打开规则即可修改，修改后再次 **测试规则** 并保存。**保存草稿** 让规则保持停用，**保存并启用** 重新启用它。删除规则请调用[删除规则](https://docs.molesignal.com/zh-Hans/api/alerting/delete-rule.md)。如果只想暂时屏蔽某条规则的通知而不修改它，请使用[静默](https://docs.molesignal.com/zh-Hans/alerting/silences.md)。

[告警规则 API](https://docs.molesignal.com/zh-Hans/api/alerting/create-rule.md) 可以在脚本中创建、测试和触发规则。


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.