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

# 华为云 AOM 告警集成

> 通过 SMN 通知或 AOM Webhook 数据订阅，将华为云 AOM 告警事件同步到 Flashduty On-call

华为云应用运维管理（Application Operations Management，AOM）可以通过 SMN 消息通知或 Webhook 数据订阅，将告警与恢复事件发送到 Flashduty On-call。两种方式使用同一个 AOM 集成推送地址。

<Info>
  推荐使用 **SMN 消息通知**，该方式适用于常规账号。AOM Webhook 数据订阅目前受限开放，仅在您的账号已开通该能力时使用。
</Info>

<div className="hide">
  ## 在 Flashduty On-call 创建集成

  您可通过以下两种方式获取集成推送地址，任选其一。

  ### 使用专属集成

  当您不需要将告警事件路由到不同的协作空间时，优先选择此方式。

  <AccordionGroup>
    <Accordion title="展开">
      1. 进入 Flashduty 控制台，选择 **协作空间**，进入目标协作空间。
      2. 选择 **集成数据**，单击 **添加一个集成**。
      3. 选择 **华为云 AOM** 集成，单击 **保存**。
      4. 打开生成的集成卡片，复制 **推送地址**。
    </Accordion>
  </AccordionGroup>

  ### 使用共享集成

  当您需要根据告警 Payload 将事件路由到不同的协作空间时，选择此方式。

  <AccordionGroup>
    <Accordion title="展开">
      1. 进入 Flashduty 控制台，选择 **集成中心 > 告警事件**。
      2. 选择 **华为云 AOM** 集成并填写集成名称。
      3. 配置默认路由并选择协作空间。创建后可在 **路由** 中继续配置路由规则。
      4. 单击 **保存**，复制生成的 **推送地址**。
    </Accordion>
  </AccordionGroup>
</div>

## 接入前准备

* 已在 Flashduty 创建 **华为云 AOM** 集成并取得 HTTPS 推送地址。
* 已在华为云创建或准备好 AOM 告警规则。
* 使用 SMN 时，当前账号需要具备创建主题、订阅主题以及查看主题的权限。
* 告警规则需要同时发送 **告警触发** 和 **告警恢复** 通知。

## 方式一：通过 SMN 接入

### 创建 SMN 主题与订阅

<Steps>
  <Step title="创建 SMN 主题">
    1. 登录华为云控制台，进入 **消息通知服务 SMN**。
    2. 选择 **主题管理 > 主题**，单击 **创建主题**。
    3. 将主题名称设置为 **Flashduty**，然后保存。

           <Frame>
             <img src="https://download.flashcat.cloud/flashduty/doc/huawei-lts-1.png" alt="在华为云 SMN 中创建 Flashduty 主题" />
           </Frame>
  </Step>

  <Step title="添加 HTTPS 订阅">
    1. 在 Flashduty 主题中单击 **添加订阅**。
    2. 协议选择 **HTTPS**。
    3. 在订阅终端中填写 Flashduty AOM 集成的 **推送地址**，然后保存。

           <Frame>
             <img src="https://download.flashcat.cloud/flashduty/doc/huawei-lts-3.png" alt="为 SMN 主题添加 Flashduty HTTPS 订阅" />
           </Frame>

       Flashduty 会验证 SMN 的订阅确认请求并自动访问华为云确认地址。订阅状态变为 **已确认** 后，SMN 才会发送告警。
  </Step>
</Steps>

### 配置 AOM 消息模板

在 AOM 2.0 控制台进入 **告警中心 > 告警通知 > 消息模板**。部分控制台版本中的入口名称为 **告警 > 告警行动规则 > 消息模板**。

创建消息模板时，通知方式选择 **HTTP/HTTPS**。Flashduty 支持以下两种正文格式：

<Tabs>
  <Tab title="HTML">
    HTML 模板支持中文和英文。建议在正文第一行增加上报类型，Flashduty 将优先使用该字段识别告警与恢复。

    **中文模板**

    ```text theme={null}
    上报类型：${clear_type};
    通知类型：${event_type};
    事件级别：${event_severity};
    事件名称：${event_name_alias};
    发生时间：${starts_at};
    事件源：$event.metadata.resource_provider;
    资源类型：$event.metadata.resource_type;
    资源标识：${resources_new};
    可能原因：${alarm_probableCause_zh};
    附加信息：${message};
    修复建议：${alarm_fix_suggestion_zh};
    ```

    **英文模板**

    ```text theme={null}
    Clear Type:${clear_type};
    Alarm Name:${event_name_alias};
    Alarm ID:${id};
    Notification Rule:${action_rule};
    Occurred:${starts_at};
    Event Severity:${event_severity};
    Alarm Info:${alarm_info};
    Resource Identifier:${resources_new};
    Suggestion:${alarm_fix_suggestion_zh};
    ```

    <Tip>
      每个字段单独占一行并保留结尾分号。资源标识可以跨多行，Flashduty 会解析其中的键值对并生成标签。
    </Tip>
  </Tab>

  <Tab title="JSON">
    数据类型选择 **JSON** 后，保留 AOM 自动生成的默认 JSON 正文。Flashduty 会从 SMN 外层报文的 <code>message</code> 字段中解析该 JSON。

    AOM 默认 JSON 包含以下核心字段。请保留标记为必填的字段；可选字段有值时，Flashduty 会将其用于标签或恢复判断。

    | 字段                           | 是否必填 | 用途                               |
    | ---------------------------- | ---- | -------------------------------- |
    | `id`                         | 否    | AOM 事件 ID；有值时保存为 `event_id` 标签   |
    | `starts_at`                  | 是    | 告警发生时间，Unix 毫秒时间戳                |
    | `ends_at`                    | 否    | 大于 0 时表示恢复；缺失、空值或 0 时继续参考 SMN 主题 |
    | `metadata.event_name`        | 是    | 告警名称                             |
    | `metadata.event_severity`    | 是    | 告警等级                             |
    | `metadata.event_type`        | 是    | 事件类型，通常为 `alarm`                 |
    | `metadata.resource_provider` | 是    | 事件源，例如 `AOM` 或 `CCE`             |
    | `metadata.resource_type`     | 是    | 资源类型                             |
    | `metadata.resource_id`       | 是    | 资源标识                             |

    <Warning>
      不要把 SMN 外层的 <code>signature</code>、<code>subject</code>、<code>topic\_urn</code> 等字段手动写入 AOM JSON 模板。SMN 会自动生成外层通知报文和签名。
    </Warning>
  </Tab>
</Tabs>

### 创建告警通知规则

<Steps>
  <Step title="关联 SMN 主题与消息模板">
    1. 在 AOM 2.0 控制台进入 **告警中心 > 告警通知**。
    2. 在 **通知规则管理** 中创建告警通知规则。
    3. 选择前面创建的 **Flashduty** SMN 主题和 AOM 消息模板。
  </Step>

  <Step title="发送触发与恢复通知">
    在 AOM 告警规则中启用通知，并确保通知场景同时包含 **告警触发** 和 **告警恢复**。
  </Step>

  <Step title="验证接入">
    触发一条测试告警，然后恢复该告警。回到 Flashduty 集成页面，确认最新事件时间已更新，并在告警详情中检查等级、资源和恢复状态。
  </Step>
</Steps>

## 方式二：通过 AOM Webhook 数据订阅

<Warning>
  AOM Webhook 数据订阅目前受限开放。如果控制台没有 Webhook 告警订阅选项，请提交华为云工单申请开通，或使用上面的 SMN 方式。
</Warning>

账号已开通该能力时，可在 AOM 2.0 控制台进入 **设置 > 全局设置 > 数据订阅**，创建 Webhook 告警订阅规则，并将目标地址设置为同一个 Flashduty AOM 集成推送地址。

Webhook 请求需要使用 AOM 官方的结构化事件格式：

```json theme={null}
{
  "events": [
    {
      "id": "4346299651651991683",
      "starts_at": 1664001830491,
      "ends_at": 0,
      "timeout": 300000,
      "resource_group_id": "project-id",
      "metadata": {
        "event_name": "Pod memory OOM",
        "event_severity": "Major",
        "event_type": "alarm",
        "resource_provider": "CCE",
        "resource_type": "service",
        "resource_id": "clusterName=production;kind=Pod;namespace=default;name=example;uid=example-uid"
      },
      "annotations": {
        "alarm_probableCause_zh_cn": "Pod 内存不足",
        "message": "pod was OOM killed",
        "alarm_fix_suggestion_zh_cn": "提高容器内存限制"
      }
    }
  ],
  "project_id": "project-id"
}
```

单次请求最多包含 100 个事件。结构化数据中的 <code>id</code>、<code>starts\_at</code> 以及六个核心 <code>metadata</code> 字段必须有有效值。

## 告警与恢复关联

Flashduty 按以下优先级识别恢复：

| 接入格式         | 恢复判断                                              |
| ------------ | ------------------------------------------------- |
| SMN HTML     | 优先读取 `上报类型` 或 `Clear Type`；无法识别时再读取 SMN `subject` |
| SMN JSON     | `ends_at > 0` 表示恢复；缺失、空值或 0 时再读取 SMN `subject`    |
| Webhook 数据订阅 | `ends_at > 0` 表示恢复                                |

华为云中文模板的 `clear_type` 枚举值为 `触发` 和 `恢复`；英文模板的枚举值为 `generated` 和 `cleared`。Flashduty 优先使用这些值判断告警与恢复。

<Note>
  SMN HTML 没有可用的上报类型时，主题中包含“恢复”、<code>\_resolved</code>、<code>\_recovered</code> 或 <code>\_clear</code> 也会被识别为恢复。
</Note>

告警与恢复必须保持以下字段一致：

* <code>metadata.event\_type</code>
* <code>metadata.event\_name</code>
* <code>metadata.resource\_provider</code>
* <code>metadata.resource\_type</code>
* <code>metadata.resource\_id</code>

Flashduty 使用这些字段生成告警指纹。<code>id</code> 会保存为标签，但不参与告警与恢复关联，因此告警通知和恢复通知的 ID 可以不同。

如果两个独立告警的上述五个字段完全相同，Flashduty 会将其视为同一告警。请确保 <code>metadata.event\_name</code> 或 <code>metadata.resource\_id</code> 能区分需要独立处理的告警。

## 字段与等级映射

常用 AOM 字段会转换为 Flashduty 标签：

| AOM 字段                        | Flashduty 标签              |
| ----------------------------- | ------------------------- |
| `id`                          | `event_id`                |
| `metadata.event_name`         | `event_name`、`check`      |
| `metadata.event_severity`     | `event_severity`          |
| `metadata.resource_provider`  | `resource_provider`       |
| `metadata.resource_type`      | `resource_type`           |
| `metadata.resource_id`        | `resource_id`，并拆分其中的资源键值对 |
| `policy.alarm_rule_name`      | `alarm_rule_name`         |
| `annotations.tms_tags`        | `tms_tags`                |
| `annotations.generator_url`   | `generator_url`           |
| 英文 HTML 的 `Notification Rule` | `notification_rule`       |

告警等级映射如下：

| AOM 等级               | Flashduty 等级 | 状态 |
| -------------------- | ------------ | -- |
| Critical、Major、紧急、重要 | Critical     | 严重 |
| Minor、Warning、次要、警告  | Warning      | 警告 |
| Info、提示              | Info         | 提醒 |

## 常见问题

<AccordionGroup>
  <Accordion title="SMN 订阅为什么一直没有确认？">
    确认订阅终端使用完整的 HTTPS 集成推送地址，并且地址中的 <code>integration\_key</code> 未被修改。Flashduty 仅会自动访问合法的华为云 HTTPS 确认地址。
  </Accordion>

  <Accordion title="为什么手动重放 SMN 请求会提示签名无效？">
    SMN 的 <code>signature</code> 与消息正文、消息 ID、<code>subject</code>、主题、时间和消息类型绑定。修改任一字段后，原签名都会失效。请通过 AOM 和 SMN 发送真实测试通知，不要复制并修改历史请求。
  </Accordion>

  <Accordion title="告警为什么没有被恢复？">
    确认告警规则发送了恢复通知。HTML 模板建议加入 <code>\$\{clear\_type}</code>；SMN JSON 优先读取大于 0 的 <code>ends\_at</code>，缺失、空值或 0 时需要确保 <code>subject</code> 能表明恢复；Webhook 数据订阅必须提供大于 0 的 <code>ends\_at</code>。同时检查告警和恢复的五个关联字段是否一致。
  </Accordion>

  <Accordion title="SMN JSON 和 Webhook 数据订阅有什么区别？">
    SMN JSON 是 SMN 通知报文中的 <code>message</code> 字段，外层仍包含签名和主题。Webhook 数据订阅直接发送 <code>\{"events":\[...]}</code> 结构，不包含 SMN 外层字段。不要把两种外层结构混合在同一个请求中。
  </Accordion>
</AccordionGroup>

## 华为云相关文档

* [创建 AOM 告警通知规则](https://support.huaweicloud.com/usermanual-aom2/mon_01_0015.html)
* [配置消息通知模板](https://support.huaweicloud.com/bestpractice-aom2/aom_05_0023.html)
* [订阅 AOM 指标或告警数据](https://support.huaweicloud.com/usermanual-aom2/mon_01_0039.html)
* [上报事件数据](https://support.huaweicloud.com/api-aom/PushEvents.html)
