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

# 过滤条件

> 通过条件匹配过滤特定告警或故障，应用于分派策略、静默、抑制、路由、标签增强等功能

## 在哪里使用过滤条件？

***

过滤条件应用于以下场景：

| 场景       | 说明                                                   |
| -------- | ---------------------------------------------------- |
| **分派策略** | 同一个协作空间允许创建多个分派策略，每个分派策略可以设置不同的过滤条件，针对不同的故障设定不同的分派对象 |
| **静默规则** | 设置过滤条件来匹配特定的故障，满足条件的故障将会被静默                          |
| **抑制规则** | 设置过滤条件，分别匹配新触发的故障和已有的活跃故障，当新故障满足条件，将被抑制              |
| **告警聚合** | 设置过滤条件匹配特定的告警，并针对这部分告警设置新的聚合维度                       |
| **路由规则** | 使用集成中心的告警集成时，设置全局路由匹配规则，将不同的告警路由到特定协作空间              |
| **标签增强** | 设置过滤条件来匹配特定的告警，满足条件的告警按照规则进行标签的生成                    |
| **告警处理** | 设置过滤条件来匹配特定的告警，满足条件的告警将按照规则进行处理                      |

## 如何配置过滤条件？

***

### 规则设计

Flashduty On-call 将整个过滤条件做了抽象，期望做到最小化配置且满足大部分场景需求。

整体判断逻辑分为多组条件：

* **组内条件**：`AND` 关系，即每一个条件均匹配，整个组才为匹配
* **组与组之间**：`OR` 关系，即任一组条件匹配，整体即为匹配

每一个条件内部，分字段（field）、操作符（oper）以及目标值（values）：

* **匹配**（`IN`）：目标可以有多个 value，任一 value 满足条件，则该条件匹配
* **不匹配**（`NOTIN`）：目标可以有多个 value，所有 value 均不满足条件，则该条件匹配

<Tip>
  操作符仅支持上述两种：**匹配**（`IN`）与 **不匹配**（`NOTIN`），没有单独的 `equal`、`regex`、`contains` 等算子。具体的匹配语义由下方的目标值格式决定。
</Tip>

#### 可选字段（field）

过滤条件的 key 分为两类：

| 类别   | Key              | 含义                                                      |
| ---- | ---------------- | ------------------------------------------------------- |
| 内置属性 | `data_source_id` | 集成，value 为集成实例 ID                                       |
| 内置属性 | `severity`       | 严重程度（Critical / Warning / Info）                         |
| 内置属性 | `title`          | 告警/故障标题                                                 |
| 内置属性 | `description`    | 告警/故障描述                                                 |
| 动态标签 | `labels.<name>`  | 以 `labels.` 为前缀的任意标签键，例如 `labels.service`、`labels.host` |

<Note>
  历史上曾分别使用 `alert_severity`（告警严重级别）和 `incident_severity`（故障严重级别）两个字段。目前已统一为 `severity`，加载旧规则时系统会自动将这两个 key 迁移为 `severity`，您无需手动修改，正常保存即可持久化新 key。
</Note>

<Tip>
  条件中的目标值 value，全部为字符串，支持**精确**、**正则**、**通配**、**IP 段**和**数值大小**等多种匹配方式。
</Tip>

![过滤条件示例](https://download.flashcat.cloud/flashduty/kb/filter.png)

如上图所示，我们有两组条件，每组条件内有两个条件，条件匹配值有多个。表达式如下：

```
( severity == Critical|Warning && labels.check == Binlog同步延迟 )
or
( labels.check == /cpu/|/io/|/disk/ && labels.value == num:gt:90 )
```

### 匹配方式

<Tabs>
  <Tab title="正则匹配">
    当 value 字符串以 `/` 为前后缀，整个 value 将被识别为**正则**。

    **示例**：

    * `labels.check`：`/宕机/` — check 标签包含"宕机"时，即匹配

    <Note>
      Flashduty 全平台使用 `RE2` 正则规范，部分 `Perl` 语法可能无法匹配。您可使用 AI Chatbot 生成表达式，并前往 [RE2 Playground](https://re2js.leopard.in.ua/) 进行验证。
    </Note>
  </Tab>

  <Tab title="通配匹配">
    当 value 字符串包含 `*` 或 `?` 且没有 `/` 前后缀，整个 value 将被识别为**通配**。

    * `*` 可匹配零个或多个任意字符
    * `?` 可匹配单个任意字符

    **示例**：

    * `labels.check`：`宕机*` — check 标签以"宕机"作为前缀，即匹配

    <Tip>
      您可使用 `*` 来判断一个字段**存在**或**不存在**：

      * 字段 `匹配 *`：表示您需要该字段存在
      * 字段 `不匹配 *`：表示您需要该字段不存在
    </Tip>
  </Tab>

  <Tab title="IP 段匹配">
    当 value 以 `cidr` 作为前缀，整个 value 将被识别为 **IP 段**。

    **示例**：

    * `labels.host`：`cidr:10.0.0.206/24` — ip 标签在"10.0.0.206/24"这个 IP 段内，即匹配

    <Warning>
      此过滤条件在以下情况不适用：故障列表按 labels 筛选、告警列表按 labels 筛选、以及告警抑制规则对于活跃告警的筛选。
    </Warning>
  </Tab>

  <Tab title="数值匹配">
    当 value 以 `num:[gt|ge|lt|le]:` 作为前缀，整个 value 将被识别为**数值大小匹配**。

    | 前缀   | 含义   |
    | ---- | ---- |
    | `gt` | 大于   |
    | `ge` | 大于等于 |
    | `lt` | 小于   |
    | `le` | 小于等于 |

    **示例**：

    * `labels.value`：`num:ge:90` — value 标签大于等于 90，即匹配

    <Warning>
      此过滤条件在以下情况不适用：故障列表按 labels 筛选、告警列表按 labels 筛选、以及告警抑制规则对于活跃告警的筛选。
    </Warning>
  </Tab>

  <Tab title="精确匹配">
    当 value 不满足上述任意格式，即被视为**精确匹配**。此时，仅当字符串完全相等时，才算匹配通过。
  </Tab>
</Tabs>

## 常见问题

***

<AccordionGroup>
  <Accordion title="为什么系统不提示我可选标签？">
    Flashduty On-call 接受大量数据上报，为了保证系统的稳定性，系统仅查找过去 24 小时内，最多 500 条告警事件进行标签的去重操作。因此提取到的标签范围可能会动态变化，甚至在过去 24 小时没有新数据时提取不到任何标签。

    这种情况下，**您可以手动输入标签**。
  </Accordion>

  <Accordion title="我的正则已经在线下通过校验，为什么在系统中无法匹配？">
    Flashduty 全平台使用 `RE2` 正则规范，部分 `Perl` 语法可能无法匹配。您可使用 AI Chatbot 生成表达式，并前往 [RE2 Playground](https://re2js.leopard.in.ua/) 进行验证。
  </Accordion>
</AccordionGroup>
