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

# Harness FME 变更集成

> 通过 Harness FME（原 Split）的 Audit log Outgoing Webhook，将功能开关（Feature Flag）的变更同步到 Flashduty On-call，作为变更事件与告警、故障关联。

<Tip>**版本要求**：此功能需要 On-call 标准版及以上订阅。[了解更多](https://flashcat.cloud/flashduty/price/)</Tip>

Split 现已并入 Harness，产品名为 Harness Feature Management & Experimentation（FME）。通过 FME 的 **Outgoing webhook (Audit log)**，把每次功能开关（Flag）的修改同步到 Flashduty On-call，例如修改定向规则、调整灰度比例、Kill 开关。

FME 推送的是已经生效的变更，因此每条变更都直接记录为 **Done**。

指标劣化告警使用另一个 Webhook（Metric Alerts），请参考 [Split 告警集成](/zh/on-call/integration/alert-integration/alert-sources/split-io)。两者可以同时配置，互不影响。

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

  ***

  1. 进入 Flashduty 控制台，选择 **集成中心 → 变更事件**
  2. 选择 **Harness FME**，填写集成名称
  3. 如需把变更分派到指定协作空间，在集成的 **路由** 中按标签（例如 `flag`、`environment`）配置规则
  4. 点击 **保存**，复制生成的 **推送地址**
</div>

## 在 Harness FME 中配置

***

<Steps>
  <Step title="添加 Outgoing webhook (Audit log)">
    <Note>
      在 Harness FME 免费版中，Marketplace 页签里的 **Outgoing Webhook (Audit Logs)** 显示的是 **Upgrade** 按钮而不是 **Add**。Audit log 的 Outgoing webhook 需要付费版 FME 套餐。
    </Note>

    1. 点击左侧导航栏底部的 **用户头像缩写**，选择 **Admin settings**
    2. 点击 **Integrations**，进入 **Marketplace** 标签页
    3. 找到 **Outgoing webhook (Audit log)**，点击 **Add**，选择需要推送的 Split 项目
  </Step>

  <Step title="选择环境并填写推送地址">
    1. 勾选需要推送变更的环境，每个项目分别配置
    2. **URL**：粘贴 Flashduty 集成的完整推送地址，Flashduty 通过推送地址中的 `integration_key` 鉴权
    3. 点击 **Save**
  </Step>
</Steps>

FME 没有测试推送按钮。保存后在任一已勾选环境中修改一个 Flag 并保存，即可在 Flashduty 变更列表中看到记录。

## 一条变更是什么

***

| FME 对象 | 变更标识（change\_key） | 说明 |
| - | - | - |
| 一次 Flag 修改 | `<环境名>/<Flag 名>@<changeNumber>`，例如 `Prod/new_checkout@1790560800123` | `changeNumber` 是修改之后该 Flag 定义的版本号；每次保存都会产生新版本，对应一条 Flashduty 变更。同一个 Flag 在不同环境的修改是不同的变更 |

推送内容里没有单独的变更 ID，因此用环境名、Flag 名和版本号组合。如果在 FME 中重命名环境，之后的修改会以新环境名记录。推送内容不含项目名：只有不同项目中的同名 Flag、环境名相同且版本号也相同时，才会被当作同一条变更。

## 状态映射

***

| FME 推送 | Flashduty 变更状态 |
| - | - |
| Flag 的任何修改（定向规则、灰度比例、Kill、创建等） | Done |

以下推送返回成功但不生成变更：`type` 不是 `split` 的推送。

## 变更内容

***

| 字段 | 内容 |
| - | - |
| 标题 | `<Flag 名> in <环境名>`，例如 `new_checkout in Prod` |
| 描述 | FME 对本次修改的文字摘要（`description`） |
| 链接 | FME 中该 Flag 的页面；推送没有链接时为空 |
| 变更时间 | 推送中的 `time`（秒或毫秒） |

标签可用于路由和在变更列表中筛选：

| 标签 | 说明 |
| - | - |
| `flag` | Flag 名称 |
| `environment` | 环境名称，例如 `Prod` |
| `change_number` | 修改后的版本号 |
| `actor` | 修改人（`editor`）；如果 `editor` 是邮箱地址则不写入 |

## 常见问题

***

<AccordionGroup>
  <Accordion title="FME 重试推送会重复记录吗？">
    不会。推送收到非 200 响应时，FME 会等待 300 毫秒后重试一次，重试内容与原推送相同，Flashduty 只记录一次。
  </Accordion>

  <Accordion title="没有收到某个环境的变更？">
    Webhook 按项目和环境分别配置。确认该项目已添加 Outgoing webhook (Audit log)，并勾选了该环境。
  </Accordion>

  <Accordion title="Segment 或指标的修改会记录吗？">
    不会。Audit log Webhook 只推送 Flag 的修改。
  </Accordion>

  <Accordion title="推送返回 InvalidParameter 错误？">
    * `name is missing`、`environmentName is missing`、`changeNumber is missing`：推送内容缺少必要字段，请确认推送来自 FME 的 Outgoing webhook (Audit log)
    * `invalid time`：`time` 不是整数

    这类推送不会生成变更；FME 对非 200 响应只重试一次。
  </Accordion>
</AccordionGroup>
