Files
ai-ops/prd/PRD.md
2026-05-12 17:48:22 +08:00

462 lines
25 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 智能运维系统 PRD
> 版本v1.0
> 负责人PM
> 目标读者TechLead、QA、SRE、运营人员
> 状态:待 TechLead 评审
---
## 1. 概述
### 一句话价值
通过自动化监控、告警辅助决策、故障自愈与配置变更管理,将立交桥平台的运维从人工排查转为机器主导的实时保障,降低 MTTR、减少人工成本、提升运行稳定性。
### 用户问题
1. 当前运维严重依赖人工定期检查日志问题发现与处置耗时过长MTTR 超过 30 分钟。
2. 告警规则缺乏分类与阈值动态调整,导致要么漏告警、要么误告警爆炸。
3. 故障发生时无自动恢复机制,必须等待运维人员手动参与,产生可避免的服务中断。
4. 配置变更无审计追溯能力,回滚窗口不明确,引发过多次生产故障。
5. 规模扩张中缺乏量化的容量管理视角,出现无计划的资源短缺。
### 业务意义
- 从 Demo 级运维向生产级运维过渡,建立可重复、可审计、可回滚的运维体系。
- 在人员规模不增的前提下支撑接入商家数、API 调用量与 Token 数量级的增长。
---
## 2. 目标
### 业务目标
1. 将平台核心故障 MTTR 从 >30min 压缩至 <10min。
2. 自动化处理覆盖 P1/P2 级告警事件的 60%以上(含自愈和故障匿离)。
3. 告警噪声率降低至 5% 以下(误告警 / 总告警数)。
4. 实现 100% 生产配置变更的审计追溯,回滚时间窗口 <5min。
### 用户目标
| 用户 | 目标 |
|---|---|
| SRE | 不再 7x24 手动守候日志,告警可触达、可分类、可动作化 |
| 运营人员 | 缺陷发现后能在同一平台完成定位、分析、处置,无需切换多套工具 |
| 平台管理员 | 对任何配置变更能看到影响范围、执行记录、快速回滚能力 |
| 技术负责人 | 获取量化的运维健康度指标,支撑容量与稳定性决策 |
### 成功定义
- 必要条件:运维主控台可访问、监控数据可查、告警规则可配。
- 充分条件:自愈规则生效、告警噪声率 <5%、审计日志完整。
- 失败判定:开发期间任何一周内告警噪声率 >20%或自愈规则误触发导致生产事故,即判定失败。
---
## 3. 范围
### In Scope
1. 立交桥平台本身的运行时监控(不含下游大模型服务),包含但不限于:
- gateway/ 请求量、延迟、错误率、降级/稳定性规则命中率
- supply-api/ 供应商健康状态与审计异常
- platform-token-runtime/ 令牌耗尽、资源约束触发、异常恢复周期
2. 告警规则引擎多维度阈值、分级告警P0/P1/P2/P3、告警抑制与聚合。
3. 故障自愈引擎:自动重启、切换路由、限流、隔离异常节点。
4. **供应商智能切换In Scope**:含供应商健康探测、故障时的多级 Fallback 切换、策略化路由调度、切换后的健康状态监测与回滚。
5. 配置管理与审计:配置变更审计日志、版本化、回滚。
6. 容量视图:以 Token 数量、QPS、响应延迟、资源利用率为核心指标的容量主板。
7. 日志/指标查询与下钻:支持按时间范围、服务、错误码、用户维度筛选。
### Out of Scope
1. 下游大模型服务的监控与告警(如 OpenAI、Claude 本身的稳定性)。
2. 基础设施层监控(如物理机器 CPU/内存/磁盘,由云厂商或 Prometheus Node Exporter 覆盖)。
3. **AI 负载预测/自动规模扩缩(本阶段仅提供容量视图与阈值提示,不做自动扩容决策)。**
- 供应商智能切换如故障时切换到备用供应商属于故障应对策略In Scope。
- 自动规模扩缩(如 K8s HPA 类似的自动扩缩容决策属于资源调度策略Out of Scope。
4. 外部监控系统(如 Datadog、New Relic的整合仅提供标准 Prometheus 格式接口供自取。
### 假设与依赖
1. 假设已有 Prometheus 或类似时序数据库存储指标,可接受定期 PromQL 查询。
2. 假设平台日志已统一格式化,可通过标准化查询接口读取。
3. 假设 gateway/internal/metrics/ 与 gateway/internal/alert/ 现有模块的接口契约在本项目中可延续或克隆。
4. 依赖 supply-api/ 的供应商健康检查接口与审计日志接口。
5. 依赖 platform-token-runtime/ 的运行时状态与异常恢复状态接口。
---
## 4. 用户场景
### 主流程
#### 场景 A监控实时看板查看平台健康状态
1. SRE 登录运维主控台。
2. 首页展示实时 QPS、平均延迟、P99 延迟、错误率、活跃供应商数量、异常告警数量。
3. SRE 点击任意指标卡片,下钻至分钟级趋势图与按服务/路径/供应商的分布。
4. 如果某指标超过预设阈值,卡片变红并显示最近 3 条相关告警摘要。
#### 场景 B配置审计与回滚
1. 平台管理员修改供应商接口地址或路由规则。
2. 系统自动记录操作人、操作前后值、时间戳、IP 地址,并生成唯一审计 ID。
3. 管理员可以在审计日志中搜索该变更。
4. 发现变更引发异常后,管理员在审计页面选择该记录执行回滚,系统在 60 秒内恢复原值并验证恢复后状态。
#### 场景 C告警接收与处置
1. 监控引擎检测到 P1 告警触发条件(如某供应商错误率 >10%持续 2min
2. 告警在 30 秒内通过配置的通知渠道Webhook/邮件/飞书/企业微信)发送给负责人。
3. 自愈引擎判断该 P1 告警是否存在已配置自愈动作:
- 若有:执行自愈(如切换备用供应商、限流、重启异常实例),并在事件中记录动作结果。
- 若无:仅发送通知,等待人工处理。
4. SRE 在控台中对该告警进行确认/忽略/规避,并填写处置结果。
5. 告警事件自动关闭或转为持续告警,根据反馈调整当前期的实时效果。
### 异常流程
#### 场景 D自愈动作失败
1. 自愈引擎尝试执行自愈动作(如切换供应商接口)。
2. 动作执行失败API 返回非 200 或超时)。
3. 系统在 10 秒内尝试重试 1 次,若仍失败,停止自动尝试并升级为 P0 人工告警(电话/短信)。
4. 记录失败原因与日志,保留事件状态供人工排查。
#### 场景 E告警飙升波浪式告警
1. 某基础故障导致成百上千个服务实例同时触发告警。
2. 告警引擎检测到同一资源/服务在 1 分钟内触发 >20 条告警。
3. 自动触发聚合:生成一条 "集群告警",将细节收拢为附件,停止单条通知爆炸。
4. SRE 在控台中批量确认/忽略/属于同一根因的告警。
#### 场景 F回滚失败
1. 管理员发起回滚。
2. 回滚目标值已被后续修改覆盖(关联记录不存在或已被删除)。
3. 系统拒绝执行,返回明确错误码 `OPS_AUD_4101`(回滚目标不存在)。
4. 记录回滚失败事件,告警通知技术负责人。
### 边缘流程
#### 场景 G无人处理的持续告警
1. P2 告警持续 2 小时未被确认。
2. 系统自动将该告警升级为 P1并通知上级负责人。
#### 场景 H监控数据源丢失
1. 指标采集器在 5 分钟内未收到任何新数据点。
2. 控制台显示 "数据源丢失"标识,不显示过期数据,触发 P2 级别的内部告警。
3. 恢复后自动补入缺失时段的空值标记,不伪造数据。
#### 场景 I运维人员误触发配置变更
1. 管理员提交一个将某供应商日请求上限从 10000 降为 10 的变更。
2. 系统检测到该变更带来的影响面 > 预设阈值(比如触发将导致 90% 流量被拒绝)。
3. 在审计日志中标记该变更为 "高风险",并在执行前弹窗警告管理员需要二次确认。
### 用户故事
- 作为 SRE我希望在午夜收到有效告警而不是噪音以便在 10 分钟内完成定位和处置,避免影响生产。
- 作为运营人员,我希望能在同一个控制台查看所有服务的健康状态和日志,而不需要登录多套系统。
- 作为平台管理员,我希望任何配置变更都有日志和回滚能力,让我在发生问题时能快速恢复而不会黄乱找原始值。
- 作为技术负责人,我希望看到量化的运维健康指标,以便在要求增量资源时有数据支撑。
---
## 5. 验收标准AC
### AC-1 实时监控看板
- 当访问运维主控台时,首页加载时间 <2s。
- 首页必须显示以下 6 个指标数值:当前 QPS、平均响应延迟(ms)、P99 响应延迟(ms)、5xx 错误率(%)、活跃供应商数量、未关闭告警数量。
- 每个指标卡片需在数据更新后 15s 内刷新显示。
### AC-2 指标下钻
- 点击任何指标卡片后,页面展示该指标过去 1 小时的分钟级趋势图。
- 趋势图支持按 `service`gateway/supply-api/platform-token-runtime`path`URL path`supplier`(供应商 ID维度下钻分割。
- 下钻结果查询时间 <3s。
### AC-3 告警规则配置
- 控制台支持创建、编辑、启用、禁用告警规则。
- 单条规则必须包含:规则名称、监控指标、阈值类型(>、<、=、匹配正则)、持续时间(min)、级别P0/P1/P2/P3、通知渠道。
- 规则变更后 30s 内生效,无需重启服务。
- 最少支持同时运行 50 条告警规则。
### AC-4 告警通知触达
- P0/P1 级告警必须在触发后 30s 内完成通知发送。
- P2 级告警必须在 120s 内完成通知发送。
- 通知渠道必须支持 Webhook、邮件、飞书/企业微信至少 2 种。
- 通知模板必须包含:告警级别、规则名称、触发时间、当前值、阈值、事件 ID、查看链接。
### AC-5 告警聚合与抑制
- 当同一资源/服务在 1 分钟内触发 >20 条告警时,系统必须自动生成 1 条集群告警,停止单条通知爆炸。
- 集群告警的通知内容必须包含:累计数量、涉及规则列表、时间范围。
- 抑制周期:同一规则同一目标在 5 分钟内只发送 1 次告警(除非级别升级)。
### AC-6 自动自愈
- 系统必须支持为每个告警规则配置可选的自愈动作:无、切换备用路由、限流、重启实例、触发程序化脚本。
- 自愈动作必须在告警触发后 60s 内执行完成(含重试 1 次的时间)。
- 自愈执行结果(成功/失败/拒绝)必须记录在告警事件中。
- 自愈动作触发后,监控必须在 2 分钟内评估是否解除告警条件,若未解除则升级为人工告警。
### AC-7 配置审计日志
- 任何对生产配置的增、删、改操作必须在 1s 内生成审计日志记录。
- 审计日志必须包含:唯一 ID、操作人、操作类型、目标资源类型与 ID、操作前值(JSON)、操作后值(JSON)、时间戳(到毫秒)、IP 地址、请求 ID。
- 审计日志必须不可篡改,存储保留期 >=90 天。
- 控制台必须支持按时间范围、操作人、资源类型、关键词筛选查询,结果返回时间 <3s。
### AC-8 配置回滚
- 对于任何审计日志记录,只要目标资源仍存在且操作前值有效,必须支持执行回滚。
- 回滚执行时间必须 <60s并在执行前显示所有会被覆盖的子资源列表。
- 回滚必须生成新的审计记录,关联原始操作 ID。
- 回滚失败时必须返回明确错误码,不得静默失败。
### AC-9 容量主板
- 容量主板必须显示过去 7 天的 Token 数量、QPS、P99 延迟、各供应商资源利用率趋势。
- 必须对每个服务标出当前负载等级:正常/警告/过载,判定依据可配置阈值。
- 提供 "按当前增长率预测触达资源上限时间"的算法结果(仅供参考,不自动执行扩容)。
### AC-10 日志/指标查询
- 控制台必须支持按时间范围、服务名称、HTTP 状态码、错误码、用户 ID、供应商 ID、关键词筛适日志。
- 日志查询结果支持分页,单页最大 100 条,首页返回时间 <3s。
- 支持将日志结果导出为 CSV 文件,单次导出上限 10000 条。
### AC-11 监控数据保存
- 原始指标数据必须保留 >=7 天,用于短期查询与告警评估。
- 分钟级聚合数据必须保留 >=30 天,用于趋势分析。
- 小时级聚合数据必须保留 >=90 天,用于容量规划与月度报告。
### AC-12 角色与权限
- 必须支持以下角色及其基本权限控制:
- 查看者:可查看监控看板、日志、告警事件,不可修改配置。
- 运维人员:可确认/忽略/规避告警,可管理告警规则,不可执行回滚。
- 管理员:可执行所有操作,包括回滚与高风险变更确认。
---
## 6. 边缘情况与失败路径
| 编号 | 边缘/失败场景 | 系统行为 | 人工介入时机 |
|---|---|---|---|
| F-1 | 自愈动作重试均失败 | 停止自动尝试,升级为 P0 人工告警 | 立即,电话/短信通知 |
| F-2 | 告警通知渠道失效(如 Webhook 8xx/5xx | 记录发送失败,使用备用渠道(邮件→飞书→短信) | 三次切换后仍失败,通知 TechLead |
| F-3 | 回滚目标已不存在 | 拒绝回滚,返回错误码 `OPS_AUD_4101` | 需要运维人员手动修复或联系开发人员 |
| F-4 | 指标采集器连续 5min 无数据 | 显示数据源丢失标识,触发内部 P2 告警 | 检查采集器/网络/存储状态 |
| F-5 | 审计日志存储满盘/写入失败 | 丢弃非关键字段或改为异步上报,不阻断业务操作 | 存储计量触发预警SRE 扩容或清理 |
| F-6 | 自愈动作触发后形成级联故障(如切换路由后导致新节点故障) | 自动恢复上一步操作前的状态(回退),然后升级为人工告警 | 立即,电话通知 |
| F-7 | 监控数据库丢失(全面中断) | 控制台进入只读/降级模式,告警引擎依赖本地缓存持续运行 | 立即,检查存储层 |
| F-8 | 实时看板指标计算结果超时 | 显示上次成功结果并标注时间戳,不等待当前请求 | 检查查询引擎性能或检索时间范围 |
---
## 7. 上线与运营准备
### 发布策略
- 阶段 1监控看板 + 日志/指标查询。只提供可视化,不触发任何自动动作。
- 阶段 2告警规则引擎 + 通知渠道,告警只通知、不执行自愈。
- 阶段 3自愈引擎 + 审计回滚。
- 阶段 4容量主板与高级分析。
### 灰度与回滚
- 每个阶段必须在单个可控集群部署 >=72h无 P1 以上告警才进入下一环境。
- 自愈规则必须通过 "沙盒模式"验证:先在非生产环境模拟触发 10 次以上,确认动作结果符合预期后才允许关联生产告警规则。
- 回滚能力必须在发布前进行 1 次演练,涉及至少 3 个不同资源类型。
- 如阶段 3 中自愈规则出现误触发导致生产事故,立即停用自愈引擎(通过权限开关),所有告警退化为仅通知模式。
### 埋点与监控
- 必须实现以下事件埋点:
- `运维控制台页面加载``指标下钻``日志查询执行``告警规则创建/编辑/删除``告警确认/忽略/规避``自愈动作执行``自愈失败``回滚执行``回滚失败`
- 必须对自身监控层(指标采集器、告警引擎、通知发送器)进行健康检查,检查失败时触发内部 P2 告警。
### FAQ预先准备
| 问题 | 答案 |
|---|---|
| 告警通知没收到怎么办? | 检查通知渠道配置中的接收地址/密钥;检查通知日志中的发送结果与失败原因。 |
| 自愈动作为什么没有触发? | 确认规则中已开启自愈动作并选择了具体动作;确认沙盒测试已通过。 |
| 回滚为什么报错 `OPS_AUD_4101` | 该配置在变更后已被删除或覆盖,无法找到操作前状态,需要手动恢复。 |
| 数据看板为什么卡住? | 检查页面顶部是否有 "数据源丢失"标识;尝试缩小时间范围或筛选条件。 |
| 如何避免误触发自愈规则? | 在非生产环境测试自愈规则 10 次以上并验证结果正确后才关联生产告警规则。 |
---
## 8. 商业化与价值闭环
### 收益路径
1. 内部效益:减少运维人员 7x24 值班压力,释放人力至产品功能开发。
2. 外部收益:提升平台 SLA 从 99.5% 至 99.9%,支撑企业客户签约与续费。
3. 成本节省:将运维人工时长每月减少 40% 以上,可量化计算为节省人力成本。
### 北极星指标
- 平台核心故障 MTTR从 >30min 到 <10min
- 自动化处理覆盖率(目标 >=60%)。
- 告警噪声率(目标 <5%)。
### 失败判定线
- 上线 30 天内 MTTR 未下降至 <20min。
- 自动化覆盖率 <30%。
- 告警噪声率 >15%。
- 自愈规则误触发导致 1 次生产故障事件。
任意一项触发,即进入救援模式。
### 止损条件
- 自愈引擎误触发导致 2 次以上生产事故:立即锁定自愈功能,退回仅通知模式,启动事故复盘。
- 监控数据丢失超过 24h停用依赖监控数据的自动化规则级联退化至人工处理。
---
## 9. 依赖与风险
### 技术依赖
| 依赖 | 风险等级 | 备选方案 |
|---|---|---|
| Prometheus 或类似时序数据库 | 高 | 支持 VictoriaMetrics / Thanos 作为替代后端,提供存储适配层,不锁死单一存储 |
| 通知渠道Webhook/邮件/飞书) | 中 | 必须支持多渠道且自动切换,单渠道不得作为唯一依赖 |
| 审计日志存储 | 中 | 主存储失败时转至本地文件缓存 + 异步上报,不阻断业务 |
| supply-api/ 审计接口 | 中 | 如接口不可用,运维平台自己写审计记录,后续补同步 |
### 业务风险
1. 自愈规则设计不当导致正常流量被掩断或重定向,影响客户请求。
2. 告警规则过于敏感或缺乏抑制,导致噪音爆炸,运营人员麻木对待真实故障。
3. 回滚操作不当导致配置状态更深层次的损坏,如回滚了一个依赖于新配置的下游变更。
4. 审计日志丢失导致故障定责和合规审查受阻。
### 缓解措施
1. 自愈规则必须经历 "沙盒模式"验证才能生效。
2. 所有自愈动作支持通过权限开关一键关闭,关闭后所有告警退化为仅通知。
3. 回滚执行前显示子资源影响范围,必须经二次确认。
4. 审计日志存储采用主备双写,存储期 >=90 天。
---
## 10. 技术栈与集成约束
### 统一技术栈
本项目必须与立交桥主项目保持一致:
- **语言**: Go 1.22+
- **HTTP框架**: 标准库 `net/http` + 自定义中间件(禁止引入 Gin/Echo 等第三方框架,保持与 gateway/ 和 supply-api/ 的一致性)
- **数据库**: PostgreSQL 15+ ,驱动 `jackc/pgx/v5`
- **缓存**: Redis客户端 `redis/go-redis/v9`
- **配置**: YAML + Viper环境变量覆盖敏感字段
- **日志/审计**: 结构化日志,审计事件模型与 supply-api/ 一致
- **错误码**: `{SOURCE}_{CATEGORY}_{CODE}` 格式,例如 `OPS_ALT_4001`
- **健康检查**: `/actuator/health``/actuator/health/live``/actuator/health/ready`
- **测试**: Go testing + testify覆盖率门槛 domain ≥ 70%、service/handler ≥ 80%
### 独立运行与集成运行
本系统必须同时支持两种运行模式:
| 模式 | 特征 | 部署方式 | 适用场景 |
|------|------|---------|---------|
| **独立运行** | 自有 `cmd/ai-ops/main.go`,独立数据库 schema独立 docker-compose | `docker-compose up` 或单独容器 | 外部用户只需要运维能力,不想接入立交桥全套 |
| **集成运行** | 作为 Go module 被 `gateway/``supply-api/` 引入,共享数据库连接池和配置,通过内部接口注册 | 编译时作为子模块编译,运行时挂载到立交桥主进程 | 立交桥用户希望获得一体化运维能力 |
**集成约束**:
- 独立运行时,系统必须提供完整的 HTTP API 和管理后台。
- 集成运行时,系统必须提供 `IntegrationPlugin` 接口,允许主程序通过配置开关启用/禁用各模块。
- 数据库 schema 必须使用独立的 `ai_ops_` 前缀,避免与主项目表名冲突。
- 配置文件必须支持分离加载:独立运行时读取自己的 `config.yaml`,集成运行时合并到主项目配置。
### NewAPI / Sub2API 适配支持
本系统的核心能力必须能够对接 NewAPI 和 Sub2API 系统:
- **监控数据推送**: 提供 Prometheus 格式的 `/metrics` 接口NewAPI/Sub2API 可通过 Prometheus scrape 获取运维数据。
- **告警回调**: 支持 Webhook 告警通知NewAPI/Sub2API 可配置接收本系统的告警事件。
- **自愈脚本扩展**: 自愈动作中的"触发程序化脚本"支持调用 NewAPI/Sub2API 的管理 API如切换供应商、限流配置、重启实例
- **独立部署时**: 通过配置文件指定 NewAPI/Sub2API 的管理端点地址和鉴权信息,本系统通过适配层与之交互。
- **集成部署时**: 若立交桥 gateway/ 已接入 NewAPI/Sub2API本系统通过 gateway/ 的内部路由接口操作上游状态。
### 对外接口契约
- 必须提供 OpenAPI 3.0 接口文档,确保 NewAPI/Sub2API 开发者可以独立接入。
- 接口路径前缀默认为 `/api/v1/ai-ops/`,集成运行时可通过配置改为 `/internal/ai-ops/`
---
## 11. 阶段门控结论
### 当前状态
- 需求范围已明确界定In Scope / Out of Scope 清晰。
- 验收标准已精确到可测试粒度,包含时间、数值、错误码、状态等维度。
- 异常流程、边缘流程、失败路径已全面覆盖。
- 上线策略、灰度方案、回滚路径、埋点检查已明确。
- 技术栈与集成约束已明确(统一 Go 标准库、独立/集成双模式、NewAPI/Sub2API 适配)。
- 北极星指标与失败判定线已量化。
- 依赖与风险已识别,缓解措施已制定。
### 门控结论
可进入 TechLead 阶段。
> 备注TechLead 阶段需要完成的事项
> 1. 确认现有 gateway/internal/metrics/ 与 gateway/internal/alert/ 的契约可延续性。
> 2. 确认存储层技术选型Prometheus / VictoriaMetrics / 自建时序库)。
> 3. 确认通知渠道具体实现方案Webhook / 飞书 / 邮件)。
> 4. 确认审计日志与回滚是否复用 supply-api/ 既有审计能力还是独立实现。
> 5. 确认角色权限体系是否复用平台统一认证系统。
---
## 自检清单
- [x] 已明确真实目标,不是只复述功能
- [x] 已写清 In Scope / Out of Scope
- [x] 每个 AC 都可被 QA 或测试用例直接验证
- [x] 已覆盖异常流、边缘流与失败路径
- [x] 已补齐上线、运营、监控、回滚要求
- [x] 已定义商业化/价值闭环
- [x] 已明确成功指标与失败判定线
- [x] 已明确当前可进入 TechLead 阶段
- [x] 没有使用"优化、支持、友好、尽量、快速"等模糊词替代明确要求
---
---
## 附:供应商智能切换(参考 FreeRide 思路)
### 背景
[FreeRide](https://github.com/openclaw/skills/tree/main/skills/shaivpidadi/free-ride) 是 OpenClaw 的一个 Skill 插件,核心功能:
- 实时拉取 OpenRouter 免费模型列表,按 ELO 评分排序
- 自动选择最强模型作为主模型
- 配置 5 个高质量备用模型作为 Fallback 链
- 主模型限速 → 自动切换下一个,用户无感知
- 非破坏性配置更新,只改 model 相关字段
FreeRide 的设计哲学(自动选择 + 智能降级)对 AI-Ops 的供应商切换场景有直接参考价值。
### 智能供应商切换 vs FreeRide
| 维度 | FreeRide | AI-Ops 供应商切换 |
|------|----------|-------------------|
| **目标用户** | 个人用户/极客 | 企业运维团队 |
| **模型来源** | OpenRouter 免费模型 | 多供应商中转 API |
| **核心价值** | 零成本用最强模型 | 供应商故障无感切换 |
| **Failover 粒度** | 模型级别 | 供应商级别 |
| **切换策略** | 固定轮询 | 成本优先/质量优先/延迟优先/手动 |
| **监控告警** | 无 | 多渠道告警 + 运维大盘 |
| **用量统计** | 无 | 成本分摊到部门/项目 |
| **自愈能力** | 仅切换 | 切换 + 通知 + 锁定 + 升级 |
### 供应商切换策略
| 策略 | 决策依据 | 适用场景 |
|------|----------|----------|
| **成本优先** | input_cost + output_cost 最低 | 预算敏感型业务 |
| **质量优先** | 最近 24h 成功率最高 | 高可用要求业务 |
| **延迟优先** | 最近 probe 响应时间最低 | 低延迟要求业务 |
| **手动** | 每次切换需人工确认 | 高风险变更管控 |
### 设计约束(继承 HLD
- 切换后冷却期默认 300s防止震荡同一供应商反复切换
- 每次切换写入审计日志(切换时间、原供应商、目标供应商、切换原因)
- 供应商配置更新采用原子替换(写临时文件 → 验证 → 原子替换),防止配置损坏
- 切换执行后立即验证新供应商可服务性,失败则回退并升级告警
### 参考实现
供应商探针任务(每 5 分钟执行):
```go
type SupplierProbe struct {
SupplierID string `json:"supplier_id"`
ProbeAt time.Time `json:"probe_at"`
LatencyMs int `json:"latency_ms"`
ErrorRate float64 `json:"error_rate"` // 0.0~1.0
ELOHistory []float64 `json:"elo_history"` // 最近7天 ELO 趋势
}
```
供应商 Fallback 链配置:
```go
type SupplierChain struct {
Model string `json:"model"`
Primary string `json:"primary"` // 主供应商ID
Fallbacks []string `json:"fallbacks"` // 备用供应商列表(按优先级排序)
CooldownSec int `json:"cooldown_sec"` // 冷却秒数默认300
Strategy string `json:"strategy"` // cost/quality/latency/manual
}
```