# 降低可见性的 AI 代理告警变更

能够调优监控项的代理，也能隐藏事故。修复噪声阈值所用的同一凭据，可能还能暂停评估、设置大范围静音、移除通知路由或删除规则。如果把这些调用都当成普通配置写入，代理对证据的控制权就会超出大多数团队的本意。

安全边界应以操作效果为准。提高可见性的变更通常可以使用常规控制。降低真实故障被人发现概率的变更，需要更严格的审核、更窄的范围，以及可验证的恢复方式。阈值编辑、静音和删除必须分开，因为它们的失效方式和恢复方式都不同。

即使代理发出了技术上完全正确的 API 请求，这一点仍然重要。监控产品会暴露不同资源，但权限往往依然很宽。代理也可能用一个 API 凭据访问多个产品。凭据周围的网关或工作流必须理解请求的实际效果，向审核者展示危险部分，并在执行后检查结果。“允许更新监控吗？”这种笼统提示没有任何帮助。

## 对信号抵达人之前的整条路径建模

告警是一条流水线，任何阶段的变更都可能降低可见性。从采集到的信号开始，依次检查评估、状态创建、路由、通知投递和留存。如果代理能更改其中一个阶段，即使告警规则仍然存在，它也能改变运维人员是否会得知事故。

Prometheus 文档清楚地说明了这种分工。Prometheus 告警规则负责评估表达式并向下游发送正在触发的告警，Alertmanager 负责分组、抑制、静音和投递。这是有用的设计区分，也说明了“可以编辑告警”为什么是一种危险的模糊权限。编辑 PromQL 阈值与创建 Alertmanager 静音会触及不同阶段，也会留下不同证据。

盘点代理操作时，可以使用五类效果：

- 评估变更会改变一个条件是否进入待定或触发状态。阈值、查询表达式、评估窗口、缺失数据行为和暂停标志都属于这一类。
- 抑制变更允许评估继续进行，但会停止或缩小通知范围。静音、暂停通知、维护窗口和抑制规则通常属于这一类，不过不同产品的语义会有差异。
- 路由变更会改变谁能收到正在触发的告警。联系点、升级路径、标签匹配器和通知策略都属于这一类。
- 破坏性变更会移除规则、路由或抑制记录，也会移除最容易使用的回滚目标。
- 证据变更会影响历史记录、审计导出或保留期。它们会影响事后重建，因此应接受与删除相同的审核。

不要只根据 HTTP 动词分类。把 `isPaused` 从 `false` 改为 `true` 的 `PUT`，可能比删除一条已过期静音的 `DELETE` 更危险。创建一个覆盖所有生产服务匹配器的 `POST`，可能比删除一条测试规则压掉更多页面。效果取决于变更前状态、拟议状态，以及资源在流水线中的位置。

清单应记录 API 操作、资源类型、环境、所属服务、当前配置、拟议配置和预期效果。如果网关无法获取当前状态，就无法生成语义差异。遇到这种情况，应拒绝降低可见性的写入，或者把请求交给能直接检查监控系统的人。

## 阈值编辑需要语义差异

阈值编辑应展示检测行为如何改变，而不只是哪些 JSON 字段发生了变化。把 CPU 饱和度从 85% 提高到 95% 很直观。把查询窗口从五分钟改为三十分钟、把缺失数据视为健康、增加限制性标签过滤条件，或延长待定时长，都可能产生同样的实际结果，但在原始差异中看起来并不起眼。

审核者需要一个标准化的变更前后视图。对于指标规则，应包括查询、比较符、阈值、评估窗口、待定时长、缺失数据行为、覆盖标签和通知目标。对于日志规则，应包括搜索表达式及所有分组或基数限制。对于复合规则，应包括依赖项变更。在分配风险之前，先把供应商字段名转换为这些稳定概念。

网关可以生成如下审核对象。格式只是示例，但每个字段都有明确用途：

```json
{
  "action": "alert.threshold.update",
  "resource": "payments-api/high-error-rate",
  "environment": "production",
  "before": {"threshold": 2, "window": "5m", "pending": "2m"},
  "after": {"threshold": 8, "window": "15m", "pending": "10m"},
  "effect": {
    "visibility": "decrease",
    "reasons": ["threshold raised", "window widened", "pending duration increased"]
  },
  "precondition": {"revision": "184", "config_sha256": "9a8e..."},
  "requested_by": {"agent_session": "run-7f31", "task": "reduce duplicate pages"}
}
```

代理任务的标题只是上下文，不是证据。“减少重复呼叫”不能证明 8% 的错误率阈值合理。应要求提供与已观察条件相关的理由，例如某次部署改变了已知基线，并附上代理实际检查的监控项状态。绝不能让代理自行断言变更风险较低。

方向很重要。降低延迟阈值、缩短评估窗口，或把缺失数据从健康改为告警，都会提高敏感度。这些编辑可能产生噪声或成本，但不会隐藏同一类故障。提高阈值、扩大窗口、延长待定时长、排除标签、禁用重复通知，或把缺失数据映射为健康，都会降低可见性。这些编辑应进入更严格的审核。

有些编辑是混合的。查询可能加入一个区域并排除另一个区域，也可能降低阈值的同时延长待定期。不要把这些效果平均为“中性”。只要任何重要范围失去覆盖，就应把提案归类为可见性下降，并展示受影响范围。审核者可以批准边界明确的取舍，但不该在长表达式里自行发现它。

前置条件不可缺少。从审核到执行之间，其他操作员或代理可能已经修改了同一个监控项。在写入前立即比较不可变修订号、实体标签或标准化配置的哈希值。如果两者不同，就取消审批并重新生成差异。对修订版 184 的批准，不代表批准五分钟后碰巧存在的任何版本。

## 静音必须有边界且可观察

只有在范围、开始时间、到期时间、负责人和原因都明确时，静音才算安全。临时抑制适用于计划维护和已知噪声条件。代理很适合准备这些记录，因为它可以计算受影响标签和维护时间，但不应拥有无需审核即可设置无限期或全局静音的路径。

产品术语可能掩盖不同的行为。Datadog 的停机文档指出，停机会静音告警和通知，但监控项状态仍会继续转换。Google Cloud Monitoring 对暂停通知的描述影响更强：有效的暂停会阻止通知和事故创建，把它应用于基于指标或 SQL 的策略时，还会关闭相关事故。如果代理把两种操作都称为“静音”，审核者就看不到这个重要差别。

Prometheus Alertmanager 静音使用匹配器和时间范围。官方文档指出，传入告警必须匹配有效静音的所有匹配器，通知才会停止。因此，匹配器扩张是主要风险。`service="checkout"` 范围很窄。`service=~".*"` 或缺少环境匹配器可能覆盖整个系统。审核卡应使用当前告警标签解析匹配器，显示数量和代表性名称，而不是简单重复正则表达式。

每个由代理创建的抑制都应具备以下属性：

- 到期时间有限，且处于组织规定的上限内，代理无法绕过。
- 范围绑定到具名服务、环境、区域或告警标识符。
- 人类可读的原因要指出维护或事故，不能只写“减少噪声”。
- 指定负责人，在到期前和静音结束时收到通知。
- 使用后置条件查询证明抑制记录和到期时间都正确。

周期性窗口需要单独处理。工作日维护计划可能合理，但它会在最初审核很久以后持续制造盲区。应把重复规则、时区、结束日期和覆盖资源作为一项持久策略变更来审批。不要把它伪装成一系列临时静音。移除结束日期的变更，应接受与无限期静音相同的审核。

确认事故不等于将策略静音。Google Cloud 的事故文档指出，确认事故不会停止重复通知，暂停或禁用策略才会。操作名称和权限必须保留这一差别。代理可以确认自己已经开始处理事故，但不能因此获得停止所有人呼叫的权限。

静音到期时，不要让它删除自己的轨迹。保留请求范围、解析后的范围、创建者身份、审批、开始时间、结束时间和最终状态。复盘事故时，过期静音常常正是解释信号为什么没有到达值班人员的证据。

## 删除前必须先提供恢复证据

删除监控项是一项没有自动结束时间的控制面变更。人可以重建简单阈值，但评论、标识符、路由关系、仪表板引用和历史记录可能无法恢复。因此，即使代理声称规则已经过时，删除的审批标准也应高于有边界的静音。

AWS 把 `cloudwatch:DeleteAlarms` 记录为独立权限，代理凭据也应保留这种分离。CloudWatch 的 `DeleteAlarms` API 还能接收多个告警名称，即使其中一个名称错误，正确名称仍可能被删除。AWS 建议之后调用 `DescribeAlarms` 确认删除。这些细节说明，笼统的成功消息并不安全，网关必须记录请求集合并逐项验证结果集合。

Grafana 的告警配置 API 同样为告警规则提供独立的更新和删除端点，还能删除整个规则组。单条规则删除和规则组删除绝不能共用同一段审批文字。应展示组内规则数量、文件夹、环境和活动状态。如果审批后清单发生变化，就拒绝删除规则组。

代理删除生产监控项之前，必须生成可恢复的导出并检查依赖。导出应包含完整规则、通知引用、标签，以及重建所需的来源信息。把它存放在代理无法写入的位置，并把摘要附到审批记录中。截图不是备份，代理撰写的摘要也无法重建复杂查询。

依赖检查应查找引用该监控项标识符的仪表板、复合告警、运行手册、部署检查、服务目录和通知路由。并非每个产品都能暴露所有关系，因此应说明执行了哪些检查，以及哪些检查无法执行。未知依赖会提高风险，不代表一切正常。

删除流程分为两个部分：

1. 代理提出删除，提供当前导出，说明规则过时的原因，并在存在替代项时指出替代项。
2. 审核者批准确切的资源修订版，随后网关执行删除，独立验证资源已不存在，同时保留导出。

对于过时的非生产规则，团队可以按负责人和仓库路径批量审核。生产删除应逐项展示，除非这些规则来自同一项已审核配置移除，并共享同一种回滚方式。方便并不是把 80 个无关监控项放进一次审批的理由。

如果目的是在调查期间停止噪声，删除就是错误操作，应使用有边界的静音。如果目的是调节敏感度，应编辑阈值。如果目的是退役覆盖范围，只有在明确替代方案或接受覆盖损失后才删除。这些路径不应被折叠成一个“修复告警”工具。

## 风险取决于可见性损失

实用策略会根据可见性损失的程度、范围和持续时间来排列操作风险。环境标签有帮助，但仅看是否为生产环境还不够。预发布告警可能保护发布关卡，而生产环境中的警告可能根本没有呼叫目标。应根据效果和上下文计算风险。

使用单调规则：任何扩大范围、延长时间或增加不可逆性的因素，只能维持或提高审核级别。这样可以防止宽泛静音因为端点称其为计划而得到更轻的处理，也能防止删除因为目标目前健康而显得普通。

初始矩阵可以这样定义：

- 提高可见性，例如降低阈值或添加目标：会话授权和审计。
- 中性元数据，例如语义不变的描述编辑：会话授权和审计。
- 窄范围临时下降，例如将一条非生产告警静音 30 分钟：明确的一键审核。
- 生产可见性下降，例如提高阈值或排除一个生产区域：带语义差异的严格审核。
- 广泛或周期性下降，例如全局匹配器或每周静音：严格审核并指定负责人。

“严格审核”不能只是多一个确认对话框。把审批绑定到操作摘要、当前资源修订版、解析后的范围、持续时间和已认证代理会话。对于最高层级，应要求 Touch ID 等本人确认，或组织批准的第二位审核者。不要允许代理把宽泛请求拆成许多低于阈值的小调用。应在较短审核窗口内汇总相关提案，并计算它们的总范围。

当分类器缺少会改变语义的字段时，默认拒绝。如果网关无法判断 `noDataState: OK` 是否会让特定规则变得更安静，就不能根据字段名推断安全。添加理解这些语义的产品适配器，或要求人工直接处理。“未知”是一种分类结果，不是低风险类别。

策略还必须覆盖路由和凭据。代理可以保留所有阈值，却通过移除值班目标、替换接收方，或更改标签使规则不再匹配路由来压掉事故。能够编辑监控配置的凭据，不应自动获得编辑审计留存或通知身份的能力。先在供应商侧拆分权限，再在操作网关中强化这种拆分。

用规避方式测试矩阵。检查代理能否通过暂停评估代替静音、设置不可能达到的阈值代替删除、添加负向匹配器代替移除路由，或创建持续时间超过事故的静音。通往同一种可见性损失的每条路径，都应进入相同或更高的审核层级。

## 审批必须说明后果

审核者应在几秒内理解失去了哪些覆盖，然后无需离开审批界面即可检查细节。先展示拟议后果，再展示证据。原始请求正文应放在可展开区域，因为供应商负载常常把重要字段埋在默认值和展示元数据中。

一项有用的阈值上调审批会写明：“支付高错误率告警将在错误率高于 8% 并持续 10 分钟时触发；当前是在高于 2% 并持续 2 分钟时触发。”随后列出生产环境、受影响区域、当前触发状态、请求原因和回滚方式。静音审批应说明哪些告警会停止通知、评估和事故创建是否继续，以及抑制何时结束。删除审批应说明规则会被永久移除，并指出已保存的导出。

在模糊批次到达人之前拒绝它们，可以减少审批疲劳。代理提出“清理告警”并不可审核。要求代理明确选择三种意图之一：调优检测、临时抑制通知或退役覆盖范围。每种意图都有必需的证据形态。人应判断运维取舍，而不是反向推导代理计划。

审批文字必须来自可信计算。代理可以提供理由和任务上下文，但变更前状态、差异、可见性方向、范围、持续时间、活动事故和操作摘要应由网关计算。明确标记代理提供的文字，否则受损代理可以把全局静音标成无害的描述编辑。

把审批绑定到较短的执行窗口。随着部署、事故和规则修订发生变化，一个有效决定也可能过期。执行时重新获取资源、比较前置条件、确认静音没有扩大，并确保已认证进程与审核的会话一致。任何绑定项不同，都应停止并重新询问。

拒绝结果应有用，但不能暴露规避方法。返回结构化原因，例如 `REVIEW_REQUIRED_VISIBILITY_DECREASE`、分类效果和代理必须补充的字段。不要返回内部阈值，让代理学会如何刚好避开批量限制。代理可以修改提案，但不能修改策略决定。

紧急处理需要独立路径。事故进行时，值班人员可能需要快速设置有边界的静音来控制呼叫风暴。预先定义较窄的最大范围和持续时间，对操作员进行强认证，记录事故标识符，并立即通知团队。紧急速度应缩短交互，不能抹掉归属信息或到期时间。

## 把提案与执行分开

代理应能准备监控变更，但不应拥有随时可用的执行路径。把工作流拆成读取、提案、审批、执行和验证。代理可以用读取权限诊断噪声并生成精确提案。网关持有写凭据，只有提案满足策略后才使用。

提案是不可变文档，不是对话中的承诺。为它分配标识符和摘要。包含供应商账户、资源标识符、操作类别、标准化的变更前后状态、资源修订版、解析后的范围、原因、任务引用、回滚方式和验证计划。如果代理更改任何字段，就创建新摘要并使旧审批失效。

可以用如下紧凑策略片段表达边界：

```yaml
actions:
  alert.threshold.update:
    classify: semantic_diff
    require_review_when: visibility == "decrease"
    bind: [resource_revision, proposal_digest, agent_session]
  alert.mute.create:
    require: [scope, starts_at, ends_at, owner, reason]
    deny_when: ends_at == null
    aggregate_by: [agent_session, environment]
  alert.rule.delete:
    require_review: always
    require: [restorable_export, dependency_check, rollback_owner]
    bind: [resource_revision, proposal_digest, agent_session]
```

这是设计产物，不是对某个特定策略引擎的描述。它可以防止三种常见故障：批准过期的阈值差异、创建无限期静音，以及在没有恢复材料的情况下删除规则。词汇应保持精简，让每个适配器都能把供应商操作映射到相同含义。

执行时应使用完成所选操作所需的最小权限凭据。阈值更新不需要删除权限，静音创建者不需要控制通知目标。如果供应商无法表达这种分离，网关就必须强制执行狭窄的允许操作，并自行构造出站请求，而不是转发任意代理生成的 HTTP。

即使时间很短，也不要把供应商密钥交给代理。占位符替换仍然允许工具围绕强权限凭据构造任意请求。更安全的模式是按能力执行：代理提供经过验证的参数，可信代码注入凭据并调用已知端点。也要限制响应数据，因为监控 API 可能暴露联系地址、内部标签和运维备注。

幂等性和重试同样重要。超时的创建调用可能已经成功，盲目重试会用不同标识符安装重复静音。供应商支持时应分配请求标识符，重试前先搜索目标状态，并记录每次尝试。对于删除，任何模糊响应之后都要查询精确请求集合，再决定是否重试。

## 验证必须测试可见性已经恢复

HTTP 成功响应只能证明供应商接受了请求，不能证明监控仍在工作。验证必须检查目标状态，以及本应保留的可见性不变量。条件允许时，应通过独立读取路径执行验证，使用无法修改所观察结果的凭据。

对于阈值编辑，重新获取规则，把标准化配置与已批准提案进行比较。确认规则仍然启用、目标仍能解析，并且查询语法有效。如果供应商提供规则评估或预览，就在已知的近期时间范围内运行。除非服务已经有固定合成信号，否则不要只为测试编辑而制造生产事故。

对于静音，验证确切匹配器或策略集合、开始时间、结束时间、负责人和状态。可行时安排两次检查，一次在到期前不久，一次在刚过期后。到期后检查应证明抑制已经失效，匹配告警能够再次创建预期状态。如果第二条重叠静音仍覆盖同一批告警，仅看到“已过期”标签还不够。

对于删除，逐项验证资源已不存在，并保留导出的配置。CloudWatch 建议在 `DeleteAlarms` 后调用 `DescribeAlarms`，这是合理的最低标准，但不存在本身不能证明替代覆盖已经存在。如果提案指定了替代项，应获取它，确认它已启用，并比较其范围与退役规则。

让验证结果可供机器读取：

```json
{
  "proposal_id": "chg-2025",
  "execution": "accepted",
  "checks": [
    {"name": "approved revision applied", "status": "pass"},
    {"name": "rule enabled", "status": "pass"},
    {"name": "notification route resolves", "status": "pass"},
    {"name": "production regions covered", "status": "fail", "missing": ["eu-west"]}
  ],
  "final_status": "failed_closed",
  "remediation": "rollback_requested"
}
```

不变量检查失败后应触发预定义响应。安全选项包括自动回滚到绑定导出、禁止该代理会话继续写入，以及呼叫监控负责人。自动化上线前，应按操作类型完成选择。不要让造成故障的同一个代理决定故障是否重要。

验证还能发现供应商 API 的语义漂移。Grafana 为告警规则记录了 `isPaused` 字段，产品升级或适配器缺陷可能在往返过程中漏掉它。即使更新端点返回成功，标准化后置条件也能发现意外暂停。为适配器保留捕获的请求与响应固件，当未知字段影响评估、抑制、路由或删除时默认拒绝。

## 审计轨迹必须不受代理控制

审计记录应让事故审核者重建代理看到了什么、提出了什么、谁批准了它、实际执行了什么，以及验证发现了什么。供应商审计日志有帮助，但很少包含完整语义差异或代理会话身份。应在代理写权限之外保留独立操作记录。

如果操作系统可以提供进程身份和代码签名颁发方，就记录这些信息，而不只记录代理自报名称。把该身份绑定到提出和执行操作的会话。存储供应商账户、资源修订版、提案摘要、审批方式、审核者、时间戳、出站操作、脱敏响应、验证检查和回滚结果。哈希链或只写存储能让后续篡改更容易被发现。

Datadog 的 Audit Trail 文档提供了监控项创建、修改、删除和解决的独立查询，也能显示配置差异。这些供应商证据很有用，但应与网关记录关联。供应商可以显示哪个服务账户修改了监控项，网关则解释哪个代理进程使用了该账户，以及哪个人批准了确切效果。

当支持 MCP 的代理通过 HTTP 访问监控 API 时，Sallyport 适合充当这条边界：其保险库不向代理交出 API 凭据；每次调用密钥可以要求每次使用都审批；Sessions 和 Activity 日志则来自只写、加密并带哈希链的记录。这个机制不会替你分类监控语义，调用工具仍需区分阈值更新、静音和删除，并展示正确的审核证据。

拒绝的尝试也要审计。反复尝试用不可能达到的阈值代替删除、扩大静音匹配器，或把一个宽泛静音拆成小调用，可能说明计划有问题或进程已经受损。拒绝记录应包括分类结果和提案摘要，但不能存储密钥。

最后要演练恢复。选一条非生产规则，导出它，应用有边界的抑制，验证到期，在审核下删除，再从捕获产物恢复。确认轨迹连接了每个阶段。如果团队连受控演练都无法重建，代理悄悄降低可见性之后，就更不可能重建真实事故。
