Files
ai-ops/specs/功能清单.md

287 lines
16 KiB
Markdown
Raw Permalink Normal View History

2026-05-12 17:47:32 +08:00
# AI-Ops 功能清单(模块级)
> 版本v1.1
> 日期2026-05-11
> 说明:模块级功能清单,仅到达"功能级"精度。具体的按钮、动画、色彩、字体等前端实现细节由 Engineer 和前端工程师在开发阶段自行决定,不在 PM 规划范围内。
>
> **PM 范围:**模块定义、功能边界、数据模型、接口契约、验收标准。
> **Engineer 范围:**代码实现、前端组件选型、动画/交互细节、测试用例实现。
>
> **总工期估算**34 人天(含 20% 协调缓冲) + 15% 风险缓冲 = **39 人天**。
> 估算方法:简单任务 0.5d / 中等任务 1d / 复杂任务 2d模块级汇总后加缓冲。
---
## Phase 1监控看板 + 日志查询(不触发自动动作)
> **工期估算**8 人天(含 20% 协调缓冲)
### 模块 1.1:监控首页
#### 1.1.1 首页基础布局
- [ ] **任务**:实现首页路由 `/ops/dashboard`,返回监控首页 HTML 模板
#### 1.1.2 指标数据获取
- [ ] **任务**:实现 `GET /api/v1/ai-ops/metrics/realtime` 接口,返回当前 QPS、平均延迟、P99、错误率
- [ ] **任务**:实现 `GET /api/v1/ai-ops/metrics/suppliers/count` 接口,返回活跃供应商数量
- [ ] **任务**:实现 `GET /api/v1/ai-ops/alerts/open/count` 接口,返回未关闭告警数量
#### 1.1.3 指标下钻
- [ ] **任务**:实现 `GET /api/v1/ai-ops/metrics/query` 接口,支持 service/path/supplier 维度过滤
### 模块 1.2:日志查询
#### 1.2.1 日志查询页
- [ ] **任务**:实现日志查询页路由 `/ops/dashboard/logs`
#### 1.2.2 日志结果展示
- [ ] **任务**:日志列表以表格展示,每行显示:时间 / 服务名 / 路径 / 状态码 / 延迟 / 用户ID / 供应商ID
- [ ] **任务**:日志列表支持分页,每页 100 条,显示总条数
- [ ] **任务**:实现日志查询结果"导出 CSV"按钮,导出上限 10000 条
#### 1.2.3 日志查询性能
- [ ] **任务**:日志查询接口添加查询超时逻辑,超时返回部分结果并提示
- [ ] **任务**实现日志查询结果缓存Redis5分钟 TTL同一筛选条件命中缓存时直接返回
---
## Phase 2告警规则引擎 + 通知渠道(告警只通知,不执行自愈)
> **工期估算**12 人天(含 20% 协调缓冲)
### 模块 2.1:告警规则管理
#### 2.1.1 告警规则列表页
- [ ] **任务**:实现告警规则列表页路由 `/ops/dashboard/alerts/rules`
- [ ] **任务**:规则列表支持分页,每页 50 条
#### 2.1.2 创建/编辑告警规则
- [ ] **任务**:实现规则创建页路由 `/ops/dashboard/alerts/rules/create`
- [ ] **任务**实现规则创建表单包含字段规则名称必填、监控指标下拉QPS/延迟/错误率/供应商健康度/Token消耗、阈值类型下拉> / < / = / 正则匹配、阈值数值必填、持续时间分钟必填、告警级别下拉P0/P1/P2/P3必填、通知渠道多选Webhook/邮件/飞书/企微)
- [ ] **任务**:编辑页路由 `/ops/dashboard/alerts/rules/{rule_id}/edit`,回填已有数据
#### 2.1.3 告警规则引擎(后端)
- [ ] **任务**:实现规则引擎从 PostgreSQL 加载所有启用规则,每 30 秒刷新
- [ ] **任务**:实现规则引擎对每个指标数据点执行阈值评估
- [ ] **任务**:实现持续时间判定(指标超阈值必须持续 N 分钟才触发)
- [ ] **任务**:实现告警事件生成,写入 `ai_ops_alert_events` 表,状态 = triggered
- [ ] **任务**:实现同一规则同一目标 5 分钟抑制期逻辑5 分钟内相同告警不重复生成)
- [ ] **任务**实现告警升级逻辑P2 持续 2 小时未确认 → 升级 P1
### 模块 2.2:告警事件与处置
#### 2.2.1 告警事件列表
- [ ] **任务**:实现告警事件列表页路由 `/ops/dashboard/alerts/events`
- [ ] **任务**事件列表每行显示事件ID / 规则名称 / 级别 / 触发时间 / 持续时长 / 状态 / 操作
#### 2.2.2 告警集群聚合
- [ ] **任务**:实现告警聚合逻辑:同一服务/资源 1 分钟内触发 >20 条告警时,生成 1 条集群告警
- [ ] **任务**集群告警列表每行显示集群ID / 涉及规则数 / 累计告警数 / 首条时间 / 最新时间 / 级别
### 模块 2.3:通知渠道配置
#### 2.3.1 通知配置页
- [ ] **任务**:实现通知配置页路由 `/ops/dashboard/alerts/channels`
#### 2.3.2 通知发送后端
- [ ] **任务**:实现通知发送队列(内存队列 + Redis 持久化)
- [ ] **任务**:实现 P0/P1 通知 30 秒内发送P2 通知 120 秒内发送
- [ ] **任务**实现通知失败时自动切换备用渠道Webhook 失败 → 邮件 → 飞书 → 企微)
- [ ] **任务**:实现通知日志记录,每次发送记录成功/失败原因到 `ai_ops_notification_logs`
---
## Phase 3自愈引擎 + 审计回滚
> **工期估算**14 人天(含 20% 协调缓冲)
### 模块 3.1:自愈规则配置
#### 3.1.1 自愈规则创建
- [ ] **任务**:在告警规则创建/编辑页,添加"自愈动作"可选配置区块
- [ ] **任务**:自愈动作类型下拉:无 / 切换备用路由 / 限流 / 重启实例 / 触发脚本
- [ ] **任务**:当选择"切换备用路由"时,显示供应商下拉框(选择目标备用供应商)
- [ ] **任务**:配置"沙盒模式"开关,默认开启(沙盒模式下自愈动作仅记录,不实际执行)
- [ ] **任务**"保存"按钮同时保存告警规则和自愈动作配置
#### 3.1.2 自愈执行后端
- [ ] **任务**:自愈引擎监听 triggered 状态的告警事件
- [ ] **任务**:当告警关联自愈动作且沙盒模式关闭时,执行自愈动作
- [ ] **任务**:执行切换备用路由:调用 gateway 管理接口,将流量切换到备用供应商
- [ ] **任务**:执行限流:调用 gateway 管理接口,设置速率限制
- [ ] **任务**:执行重启实例:通过 K8s API 或主机 agent 调用重启指定服务实例,配置超时 60 秒、最大重试 2 次
- [ ] **任务**:执行触发脚本:在隔离环境中执行指定的 shell/Python 脚本,超时 30 秒
- [ ] **任务**:自愈动作执行后 60 秒内评估监控指标是否恢复正常
- [ ] **任务**:自愈成功:事件状态更新为 resolved记录动作结果
- [ ] **任务**:自愈失败(重试 1 次仍失败):升级为 P0 人工告警(电话/短信),事件状态更新为 escalated
#### 3.1.3 自愈级联失败处理
- [ ] **任务**:切换备用路由后,监控新路由健康状态 2 分钟
- [ ] **任务**:若新路由也触发告警,立即回退到原始路由
- [ ] **任务**:回退完成后,升级为 P0 人工告警(电话/短信),注明"自愈级联失败"
### 模块 3.2:配置审计
#### 3.2.1 审计日志查询页
- [ ] **任务**:实现审计日志页路由 `/ops/dashboard/audit`
- [ ] **任务**审计列表每行显示审计ID / 操作时间 / 操作人 / 操作类型 / 资源类型 / 资源ID / 操作后值摘要
- [ ] **任务**:审计列表支持导出(最多 10000 条,按时间范围导出)
#### 3.2.2 审计后端
- [ ] **任务**拦截所有配置变更操作CREATE/UPDATE/DELETE在事务内同步写入审计日志
- [ ] **任务**:审计日志写入使用追加模式(不支持 UPDATE/DELETE数据库层设置禁止删除策略
- [ ] **任务**:审计日志保留期 >= 90 天,后台 job 每天清理过期数据
### 模块 3.3:配置回滚
#### 3.3.1 回滚操作入口
- [ ] **任务**:回滚成功提示:"回滚成功,已恢复到 {时间} 的状态,耗时 X 秒"
- [ ] **任务**:回滚失败时显示错误码和原因(如 OPS_AUD_4101
#### 3.3.2 回滚后端
- [ ] **任务**:实现回滚接口,根据审计记录 ID 查找操作前值
- [ ] **任务**:回滚前检查目标资源是否仍存在,不存在时返回错误码 `AUDIT_ROLLBACK_TARGET_LOST`
- [ ] **任务**:回滚操作在独立事务中执行,更新目标资源值
- [ ] **任务**:回滚成功后生成新审计记录,关联原始审计记录 ID字段 `rolled_back_from_audit_id`
---
## Phase 4容量主板与高级分析
### 模块 4.1:容量视图
#### 4.1.1 容量主页
- [ ] **任务**:实现容量主页路由 `/ops/dashboard/capacity`
#### 4.1.2 容量数据后端
- [ ] **任务**:实现容量数据聚合 job每小时执行将原始指标聚合为小时级数据
- [ ] **任务**:实现增长率计算算法(基于过去 7 天数据线性回归)
- [ ] **任务**:实现负载等级判定(可配置阈值,默认为:正常 < 60% 利用率 < 警告 < 80% < 过载)
---
## 全局模块
### 模块 G1认证与权限
- [ ] **任务**:实现登录页路由 `/ops/login`,支持账号密码登录
- [ ] **任务**:实现 JWT Token 签发Token 有效期 8 小时
- [ ] **任务**:实现中间件,所有 `/api/v1/ai-ops/*` 接口需携带有效 JWT
- [ ] **任务**实现角色权限中间件查看者GET only、运维人员可写告警规则、管理员可回滚、可管理用户
- [ ] **任务**:实现权限不足时返回 HTTP 403响应体包含错误码 `OPS_AUTH_1001`
### 模块 G2健康检查
- [ ] **任务**:实现 `GET /actuator/health` 接口,返回整体健康状态
- [ ] **任务**:实现 `GET /actuator/health/live` 接口,用于 K8s liveness probe
- [ ] **任务**:实现 `GET /actuator/health/ready` 接口,用于 K8s readiness probe依赖 DB + Redis 连通性)
### 模块 G3OpenAPI 文档
- [ ] **任务**:实现 OpenAPI 3.0 JSON spec 生成,端点 `/openapi.json`
- [ ] **任务**:确保所有对外 API路由/请求/响应/错误码)均在 spec 中体现
---
## 技术基础设施(各 Phase 共享)
### T1项目骨架
- [ ] **任务**:初始化 Go module `github.com/lijiaoliao/ai-ops`
- [ ] **任务**:创建 `cmd/ai-ops/main.go` 入口,支持 `api``worker` 两种运行模式
- [ ] **任务**:创建 `internal/` 目录结构domain/service/handler/infrastructure/repository
- [ ] **任务**:配置 Viper 读取 `config.yaml`,支持环境变量覆盖
- [ ] **任务**:配置 `log/slog` 结构化日志,输出 JSON 格式
- [ ] **任务**:创建 PostgreSQL schema migration使用 golang-migrate表前缀 `ai_ops_`
- [ ] **任务**:创建 Redis 连接池配置
- [ ] **任务**:配置 Dockerfile 和 docker-compose.yml
- [ ] **任务**:编写 `DEPLOYMENT.md` 中的 docker-compose 启动命令
### T2单元测试骨架
- [ ] **任务**:为每个 domain 层函数编写单元测试,覆盖率 >= 70%
- [ ] **任务**:为每个 service 层函数编写单元测试,覆盖率 >= 80%
- [ ] **任务**:配置 CIGitHub ActionsPR 必须通过全部测试和覆盖率检查
### T3IntegrationPlugin 接口
- [ ] **任务**:实现 `IntegrationPlugin` 接口(`Init() error` / `Serve() error` / `Shutdown() error`
- [ ] **任务**:实现插件模式下各模块的开关配置(`viper` 读取 `ops.enabled_modules`
- [ ] **任务**:编写集成测试:插件模式启动,所有功能正常运作
---
## 任务估算汇总
| Phase | 模块 | 任务数 | 估计工时 |
|-------|------|--------|---------|
| Phase 1 | 1.1 首页 + 1.2 日志查询 | 28 | 3 人天 |
| Phase 2 | 2.1 告警规则 + 2.2 事件处置 + 2.3 通知渠道 | 30 | 4 人天 |
| Phase 3 | 3.1 自愈引擎 + 3.2 审计 + 3.3 回滚 + 3.4 供应商切换 | 26+16=42 | 4 人天 + 2 人天 |
| Phase 4 | 4.1 容量视图 | 10 | 1.5 人天 |
| 全局 | G1 认证 + G2 健康 + G3 文档 | 14 | 1.5 人天 |
| 技术基础设施 | T1 骨架 + T2 测试 + T3 插件 | 14 | 2 人天 |
| **合计** | | **122+16=138** | **~16+2=18 人天** |
---
### 模块 3.4:供应商智能切换(参考 FreeRide 思路)
> FreeRide 是 OpenClaw 的自动模型切换插件,核心思路:实时排行 → 自动选择 → Fallback 链 → 限速无感知切换。对应到 AI-Ops 的供应商切换场景,可以把这个思路产品化。
#### 3.4.1 供应商质量监控
- [ ] **任务**:定时任务(每 5 分钟)调用各中转供应商的 `/models` 接口,记录可用模型列表
- [ ] **任务**:对每个供应商执行探测请求(测试请求),记录响应时间和错误率
- <a name="343-health-probe"></a>**任务**:探测结果写入 `supplier_health`记录字段supplier_id、probe_at、latency_ms、error_rate、available_models、elo_score
- [ ] **任务**`GET /api/v1/ai-ops/suppliers/health` 接口返回所有供应商的实时健康状态
- [ ] **任务**`GET /api/v1/ai-ops/suppliers/health/{supplier_id}` 接口返回指定供应商的详细健康状态
- [ ] **任务**:在供应商管理页显示健康状态标签(健康 / 延迟高 / 错误率高 / 不可用)
- [ ] **任务**:健康状态数据保留 7 天,支持趋势查看
#### 3.4.2 供应商 Fallback 链管理
- [ ] **任务**:为每个接入的模型配置主供应商 + 备用供应商列表(至少 1 主 + 1 备)
- [ ] **任务**:供应商配置数据结构:
```go
type SupplierChain struct {
Model string // 模型名
Primary string // 主供应商ID
Fallbacks []string // 备用供应商ID列表按优先级排序
CooldownSec int // 故障后多少秒内不切换回来默认300s
}
```
- [ ] **任务**:配置页支持拖拽排序 Fallback 顺序
- [ ] **任务**:切换后的冷却期内,即使主供应商恢复也不同质(避免震荡)
- [ ] **任务**:切换记录写入审计日志,包含:切换时间、原供应商、目标供应商、切换原因
#### 3.4.3 智能切换策略
- [ ] **任务**:切换策略下拉:成本优先 / 质量优先 / 延迟优先 / 手动
- [ ] **任务****成本优先**:按 `input_cost_per_token + output_cost_per_token` 排序,选择最低者
- [ ] **任务****质量优先**:按最近 24h 成功率排序,选择最高者
- [ ] **任务****延迟优先**:按最近 probe 的 `latency_ms` 排序,选择最低者
- [ ] **任务****手动**:每次切换需人工确认
- [ ] **任务**当主供应商触发告警P1/P2自动检查 Fallback 链是否可用
- [ ] **任务**:选择最佳备用供应商后,自动执行切换(若策略不是"手动"
- [ ] **任务**:切换完成后发送通知(飞书/企微/钉钉),告知:原供应商、目标供应商、切换原因
#### 3.4.4 供应商切换执行
- [ ] **任务**`POST /api/v1/ai-ops/suppliers/switch` 接口:传入 model + target_supplier执行切换
- [ ] **任务**:调用 gateway 的 `/internal/suppliers/switch` 接口完成实际路由切换
- [ ] **任务**:切换后立即执行一次探针验证,确认新供应商可服务工作
- [ ] **任务**:验证失败时,回退到上一个供应商,并记录切换失败原因
- [ ] **任务**供应商切换作为自愈动作之一可关联告警规则Phase 3.1 已覆盖)
#### 3.4.5 供应商健康看板
- [ ] **任务**:路由 `/ops/dashboard/suppliers` 显示供应商健康一览
- [ ] **任务**:卡片展示:今日切换次数 / 当前不可用供应商数 / 各供应商平均延迟 / 各供应商错误率
- [ ] **任务**:表格展示所有供应商:名称 / 健康状态 / 最后探针时间 / 平均延迟 / 24h 成功率 / 可用模型数
- [ ] **任务**:支持按健康状态筛选(全部 / 健康 / 延迟高 / 不可用)
#### 3.4.6 参考 FreeRide 的非破坏性配置更新
- [ ] **任务**:供应商配置更新采用原子替换策略:写临时文件 → 验证 → 原子替换
- [ ] **任务**:防止配置损坏导致系统不可用
- [ ] **任务**:配置更新前先在内存中验证 JSON Schema不合法则拒绝更新