> ## 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.

# Mezmo 告警集成

> 通过 Webhook Alert 把 Mezmo（原 LogDNA）日志视图的匹配结果同步到 Flashduty On-call。

Mezmo（原 LogDNA）的 Webhook Alert 集成在日志视图（View）匹配到设定的行数时调用 Webhook，请求体由您自己填写的模板渲染。本集成把同一个 View 的匹配同步为 Flashduty 上的一条告警：同一 View、同一查询条件的多次匹配会合并进同一条告警。

<Info>
  Mezmo 官方文档明确 `autoresolve`（自动恢复）"只适用于 PagerDuty"，Webhook 通道没有恢复事件。因此这条告警不会自动恢复，只能等超时自动关闭或手动关闭。请务必完成下方"开启超时自动关闭"这一步。
</Info>

<div className="hide">
  ## 在 Flashduty On-call

  ***

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

  ### 使用专属集成

  1. 进入 Flashduty 控制台，选择 **协作空间**，打开一个协作空间
  2. 选择 **配置** → **集成数据** → **专属集成**，点击 **新增一个集成**
  3. 选择 **Mezmo**，点击 **保存**
  4. 打开生成的集成卡片，复制 **推送地址**

  ### 使用共享集成

  1. 进入 Flashduty 控制台，选择 **集成中心 → 告警事件**
  2. 选择 **Mezmo**，填写集成名称
  3. 配置默认路由并选择协作空间；创建后可在 **路由** 中增加更多规则
  4. 点击 **保存**，复制生成的 **推送地址**
</div>

## 在 Mezmo 中配置

***

<Steps>
  <Step title="创建或编辑一个 View">
    在 Mezmo 里创建一个基于查询条件的 View（例如查询 `level:error`），或者打开一个已有的 View。如果打算给多个 View 复用同一份 Webhook 配置，也可以先创建一个 [Preset Alert 模板](https://docs.mezmo.com/docs/add-alerts-to-views#configure-a-preset-alert-template) 再关联到各个 View。
  </Step>

  <Step title="添加 Webhook Alert">
    1. 打开 View 的 Alert 弹窗，选择 **Webhook**
    2. 设置匹配行数和观察周期，例如"30 秒内匹配到 10 行"
    3. **Method** 选择 **POST**
    4. **URL** 粘贴 Flashduty 集成的完整推送地址，地址中需包含 `integration_key`
    5. **Headers** 中添加一条：`Content-Type: application/json`
  </Step>

  <Step title="替换默认 Body">
    Mezmo 会预先填好一份默认 Body，请清空后粘贴下面这份模板。字段全部来自 Mezmo 官方文档列出的 [Body Tokens](https://docs.mezmo.com/docs/webhook-alert-integration#body-tokens)：

    ```json theme={null}
    {
      "view_name": "{{ name }}",
      "query": "{{ query }}",
      "matches": "{{ matches }}",
      "level": "{{ level }}",
      "app": "{{ app }}",
      "host": "{{ host }}",
      "tag": "{{ tag }}",
      "line": "{{ line }}",
      "url": "{{ url }}"
    }
    ```

    保存前点击编辑框下方的 **Validate JSON** 按钮，确认模板渲染后仍是合法 JSON。

    <Warning>
      模板中的字段名（`view_name`、`query`……）和大小写必须与上面完全一致，Flashduty 按这些字段名解析请求体；花括号内的 Mezmo token（`{{ name }}` 等）不要改名。不要额外加入 `{{ lines }}` 或 `{{ line_objects }}`：前者是未转义的多行原文，可能包含引号或换行，插入到 JSON 字符串里可能得到非法 JSON 而被 Flashduty 拒收；后者官方文档说明会插入一个数组，不能作为字符串字段的值。
    </Warning>
  </Step>

  <Step title="开启超时自动关闭">
    Mezmo 的 Webhook Alert 没有恢复事件（[Update Alert API](https://docs.mezmo.com/api-reference/configuration/update-alert.md) 中 `autoresolve` 字段的说明是"This property only applies to PagerDuty."，即只对 PagerDuty 通道生效）。同一 View、同一查询条件的多次匹配会合并进同一条告警，但这条告警不会自己恢复。请在接收这些告警的协作空间中开启 [超时自动关闭](/zh/on-call/channel/create-edit)，建议超时时长 **12 小时**，计时起点选择 **故障触发**。告警关闭后，若问题仍未解决，View 在下一个观察周期再次匹配时会开出一条新告警。
  </Step>

  <Step title="验证">
    点击 Alert 编辑面板顶部的 **Test** 链接，确认 Flashduty 收到一条 200 响应，并会在 Flashduty 中开出一条告警（Mezmo 用同一份模板渲染测试数据，Flashduty 无法把它和真实告警区分开，需要手动关闭或等待超时自动关闭）。再让 View 的查询条件真正匹配到日志，确认 Flashduty 收到对应的真实告警。
  </Step>
</Steps>

## Alert Key

***

Mezmo 的 Webhook Alert 请求体里没有告警 ID、View ID 或去重键——[Body Tokens 列表](https://docs.mezmo.com/docs/webhook-alert-integration#body-tokens) 里的 12 个 token（`name`、`matches`、`lines`、`level`、`url`、`query`、`app`、`host`、`tag`、`line`、`line_objects`、`first_line_object`）都不是标识符。View 名称和它运行的查询条件是这个检查项在多次匹配之间不变的身份——官方文档把 `query` 定义为"the query of the View to which this alert is attached"（该告警所关联 View 的查询条件）——因此 Flashduty 用 `MD5(view_name, query)` 作为 Alert Key：同一个 View、同一条查询条件的多次匹配会合并进同一条告警（首行匹配日志、匹配行数、级别等字段变化不影响这个 Key）；不同的 View，或者同一 View 但查询条件被改过，会各自开出自己的告警。

## 告警等级

***

Mezmo 官方文档对 `{{ level }}` 的说明是"Severity level (info, warn, error, etc)"（首行匹配日志的日志级别），并未给出完整枚举。Flashduty 按下表映射，未出现在表中的值（包括空值，即日志没有解析出级别）按 **Warning** 处理：

| Mezmo `level`（不区分大小写） | Flashduty 等级 |
| :- | :- |
| `error` / `err` / `fatal` / `critical` / `crit` / `emergency` / `emerg` / `alert` | Critical |
| `warn` / `warning` / `notice` | Warning |
| `info` / `informational` / `debug` / `trace` / `verbose` | Info |
| 空值或其他未识别的值 | Warning |

## 标签

***

| 标签 | 来源 |
| :- | :- |
| `view` | View 名称（`{{ name }}`） |
| `query` | View 的查询条件（`{{ query }}`） |
| `level` | 首行匹配日志的级别（`{{ level }}`） |
| `app` | 首行匹配日志的应用（`{{ app }}`） |
| `host` | 首行匹配日志的主机（`{{ host }}`） |
| `tag` | 首行匹配日志的标签（`{{ tag }}`） |
| `matches` | 本次匹配的行数（`{{ matches }}`） |
| `url` | 首行匹配日志在 Mezmo 中的详情页（`{{ url }}`） |

告警标题为 View 名称；描述内容优先展示首行匹配日志的原文（`{{ line }}`），并附上查询条件。

## 常见问题

***

<AccordionGroup>
  <Accordion title="同一个 View 反复匹配，会开出很多条告警吗？">
    不会。只要 View 名称和查询条件不变，Flashduty 用它们算出的 Alert Key 也不变，反复匹配会合并进同一条告警（更新匹配行数、级别等字段，不会另开一条）。但这条告警不会自动恢复，超时自动关闭之后，如果问题还在，下一次匹配会开出一条新告警——这也是本集成必须开启超时自动关闭的原因。
  </Accordion>

  <Accordion title="告警为什么不会自动恢复？">
    Mezmo 官方文档里 `autoresolve` 字段只适用于 PagerDuty 通道，Webhook 通道没有对应机制，也没有文档说明的恢复 token。请开启协作空间的超时自动关闭，或在 Flashduty 中手动关闭。
  </Accordion>

  <Accordion title="Body 里为什么不用 {{ lines }}？">
    `{{ lines }}` 是全部匹配行的原始文本，可能包含换行或双引号；Mezmo 官方文档没有说明它在插入 JSON 字符串时会做转义。如果直接把 `"lines": "{{ lines }}"` 写进模板，遇到包含引号或换行的日志就可能渲染出非法 JSON，导致 Flashduty 收到该次推送时报错、丢弃这次匹配。上面的模板只使用 `{{ line }}`（首行匹配日志的原文），信息量已经足够定位问题；如果确实需要完整的多行内容，请自行在 Mezmo 的编辑框里用 **Validate JSON** 反复测试确认转义正确后再加入。
  </Accordion>

  <Accordion title="Mezmo 返回 Webhook 请求失败怎么办？">
    确认推送地址完整、包含 `integration_key`，且推送地址不是内网 IP（Mezmo 不允许 Webhook 指向 `192.168.x.x`、`10.x.x.x`、`172.16.x.x`–`172.31.x.x` 或跳转到这些地址）。
  </Accordion>
</AccordionGroup>

更多字段含义请参阅 [Webhook Alert Integration](https://docs.mezmo.com/docs/webhook-alert-integration) 和 [Update Alert API](https://docs.mezmo.com/api-reference/configuration/update-alert)。
