# AI-Ops 智能运维系统 — 高层设计文档 (HLD) > 版本:v1.0 > 负责人:TechLead > 目标读者:后端开发、SRE、QA > 状态:初稿 --- ## 1. 设计目标与约束 ### 1.1 核心目标 | 指标 | 基线值 | 目标值 | 验证方式 | |------|--------|--------|---------| | 核心故障 MTTR | >30 min | <10 min | 从告警触发到服务恢复的 P99 时长 | | P1/P2 自动化处理覆盖率 | 0% | >=60% | 自愈成功事件数 / (P1+P2 总事件数) | | 告警噪声率 | >20% | <5% | 误告警数 / 总告警数 | | 配置回滚时间窗口 | 无 | <5 min | 回滚指令发出到验证通过的时长 | | 审计日志保留期 | 无 | >=90 天 | 存储系统自动清理策略 | ### 1.2 技术约束(强制性) - **语言**: Go 1.22+ - **HTTP 框架**: 标准库 `net/http` + 自定义中间件(禁止引入 Gin/Echo) - **数据库**: 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% - **Store 接口**: 必须包含版本控制(乐观锁) - **条件能力**: 默认关闭,需要在 `BuildServer` / `BuildRuntime` 中显式挂载才算已交付 ### 1.3 运行模式 系统必须同时支持两种运行模式: | 模式 | 特征 | 部署方式 | |------|------|---------| | **独立运行** | 自有 `cmd/ai-ops/main.go`,独立数据库 schema,独立 docker-compose | `docker-compose up` 或单独容器 | | **集成运行** | 作为 Go module 被 `gateway/` 或 `supply-api/` 引入,共享数据库连接池和配置,通过内部接口注册 | 编译时作为子模块编译,运行时挂载到立交桥主进程 | **集成约束**: - 独立运行时,系统提供完整的 HTTP API 和管理后台。 - 集成运行时,系统提供 `IntegrationPlugin` 接口,允许主程序通过配置开关启用/禁用各模块。 - 数据库 schema 必须使用独立的 `ai_ops_` 前缀,避免与主项目表名冲突。 - 配置文件必须支持分离加载:独立运行时读取自己的 `config.yaml`,集成运行时合并到主项目配置。 --- ## 2. 系统架构总览 ### 2.1 逻辑架构图 ``` +---------------------+ +---------------------+ +---------------------+ | 运维控制台 (Web) | | 外部系统调用者 | | 通知渠道 | | - 监控看板 | | - NewAPI/Sub2API | | - Webhook | | - 告警管理 |<--->| - 企业微信/飞书 |<--->| - 邮件 | | - 日志查询 | | - Prometheus | | - 短信 | +----------+----------+ +----------+----------+ +----------+----------+ | | | v v v +---------------------+ +---------------------+ +---------------------+ | HTTP API Layer | | /metrics (Prom) | | Notification | | (标准库 net/http) | | /api/v1/ai-ops/ | | Dispatcher | +----------+----------+ +----------+----------+ +----------+----------+ | | | v v v +-----------------------------------------------------------------------------+ | AI-Ops Core Domain Layer | | +----------------+ +----------------+ +----------------+ +-----------+ | | | Metric Service | | Alert Service | | Healing Engine | | Capacity | | | | (指标采集/查询) | | (告警规则/触发) | | (自愈动作执行) | | Service | | | +----------------+ +----------------+ +----------------+ +-----------+ | | +----------------+ +----------------+ +----------------+ +-----------+ | | | Audit Service | | Config Service | | Log Service | | Authz | | | | (审计/回滚) | | (配置变更) | | (日志查询) | | Service | | | +----------------+ +----------------+ +----------------+ +-----------+ | +-----------------------------------------------------------------------------+ | v +-----------------------------------------------------------------------------+ | Infrastructure Layer | | +----------------+ +----------------+ +----------------+ +-----------+ | | | Metric Store | | PostgreSQL | | Redis | | Time-Series| | | | (Prom/Victoria)| | (主审计/配置) | | (缓存/状态) | | DB | | | +----------------+ +----------------+ +----------------+ +-----------+ | +-----------------------------------------------------------------------------+ | v +-----------------------------------------------------------------------------+ | Bridge Integration Layer | | +----------------+ +----------------+ +----------------+ +-----------+ | | | Token Gateway | | Channel Manager| | Provider Health| | Runtime | | | | (请求量/延迟) | | (供应商/路由) | | (健康检查) | | Status | | | +----------------+ +----------------+ +----------------+ +-----------+ | +-----------------------------------------------------------------------------+ ``` ### 2.2 服务边界与职责 | 服务 | 职责 | 对应 PRD 场景 | 对应 AC | |------|------|--------------|---------| | **Metric Service** | 采集 gateway/、supply-api/、platform-token-runtime/ 的指标,提供 PromQL 查询、分钟级聚合 | A, H | AC-1, AC-2, AC-11 | | **Alert Service** | 维护告警规则状态机,执行阈值评估,生成告警事件,负责聚合与抑制 | C, E, G | AC-3, AC-4, AC-5 | | **Healing Engine** | 执行自愈动作:切换备用路由、限流、重启实例、触发脚本;记录执行结果 | C, D, F | AC-6 | | **Audit Service** | 捕获所有配置变更,写入不可篡改审计日志,支持按原始操作记录回滚 | B, F, I | AC-7, AC-8 | | **Config Service** | 管理告警规则、通知渠道、自愈策略的 CRUD,支持版本化与验证 | B, I | AC-7, AC-8 | | **Log Service** | 按时间范围、服务、状态码、用户 ID 等维度筛选日志,支持 CSV 导出 | A, H | AC-10 | | **Capacity Service** | 汇总过去 7 天 Token/QPS/延迟/利用率趋势,计算负载等级与增长率预测 | - | AC-9 | | **Authz Service** | 角色鉴权:查看者/运维人员/管理员;控制台访问控制 | - | AC-12 | | **Notification Dispatcher** | 将告警事件路由到配置的通知渠道,支持主备自动切换 | C, E | AC-4, AC-5 | --- ## 3. 核心模块设计 ### 3.1 自动运维流水线 (AutoOps Pipeline) 运维流水线是系统的主干,接收指标数据,经过规则引擎评估,生成告警事件,触发自愈动作,并验证效果。 ``` 指标数据流 | v +-------------------+ +-------------------+ +-------------------+ | Metric Ingestor | --> | Rule Engine | --> | Alert Event | | (报文解析/格式化) | | (阈值评估/分级) | | Generator | +-------------------+ +-------------------+ +---------+---------+ | v +-------------------+ +-------------------+ +-------------------+ | Validation Loop | <-- | Healing Engine | <-- | Notification | | (2min 效果评估) | | (自愈动作执行) | | Dispatcher | +-------------------+ +-------------------+ +-------------------+ ``` **流水线状态机**: | 状态 | 转移条件 | 超时 | |------|---------|------| | `triggered` | 规则阈值被触发 | - | | `notified` | 通知已发送 | 30s (P0/P1), 120s (P2) | | `healing` | 自愈动作执行中 | 60s 内完成 | | `resolved` | 监控指标回复正常 | - | | `escalated` | 自愈失败或未配置自愈 | 立即 | | `acknowledged` | 人工确认 | 2h 未确认则自动升级 | ### 3.2 健康探针 (Health Probe) 参考 LiteLLM 的多层级健康检查设计,对于集成运行模式提供以下端点: | 端点 | 用途 | 检查内容 | 失败策略 | |------|------|---------|---------| | `/actuator/health` | 综合健康 | DB、Redis、时序库连接性 | 返回 503,触发内部告警 | | `/actuator/health/live` | 存活探针 | 进程是否运行 | Kubernetes 重启 Pod | | `/actuator/health/ready` | 就绪探针 | 所有依赖是否可服务 | 从负载均衡移除 | | `/actuator/health/backlog` | 队列积压 | 告警事件队列长度 | >100 时触发内部告警 | | `/actuator/health/datasource` | 数据源状态 | 最近 5min 内是否有新数据点 | 触发 P2 内部告警 | 独立运行时,系统自身提供以上端点。集成运行时,通过 `IntegrationPlugin` 将检查逻辑注入到主程序的健康检查中。 ### 3.3 异常自动恢复 (Healing Engine) 自愈引擎的核心是动作执行器。每个动作是一个独立的可执行单元,支持沙盘模式验证。 **自愈动作类型**: | 动作 | 说明 | 执行时间限制 | 回退策略 | |------|------|-----------|---------| | `switch_provider` | 将流量从主路由切换到备用供应商 | 30s | 自动恢复原路由,升级人工告警 | | `throttle` | 对目标服务/供应商启动限流 | 15s | 解除限流,升级人工告警 | | `restart_service` | 重启异常服务(通过调用管理 API) | 45s | 不可回退,升级人工告警 | | `invoke_script` | 执行用户配置的程序化脚本 | 60s | 脚本自身决定回退逻辑 | | `isolate_node` | 将异常节点从负载均衡中移除 | 20s | 恢复节点到负载均衡 | **沙盘模式**: - 所有自愈动作必须在沙盒环境中模拟触发 >=10 次,所有次数的执行结果符合预期,才能关联到生产告警规则。 - 沙盒模式下,动作不会真正修改生产状态,而是记录 "dry-run" 结果。 - 每个动作的沙盒执行结果必须包含:预期变更、实际变更、差异说明、风险标记。 **级联故障防护**(对应 PRD 场景 F-6): - 每次自愈动作执行前,系统记录当前状态快照(包含相关配置版本号)。 - 若自愈动作执行后 2min 内触发新的 P1 以上告警,系统自动检测是否为级联故障。 - 检测到级联故障时,自动回退上一步操作,然后升级为 P0 人工告警。 ### 3.4 规模调度与容量视图 (Capacity Board) 容量服务不执行自动扩缩容决策(当前版本 Out of Scope),仅提供量化视图与趋势预测。 **容量指标**: | 指标 | 采集频率 | 保留时长 | 负载等级判定 | |------|---------|---------|-----------| | Token 消耗量 | 1 min | 7 天(原始) / 30 天(分钟级) / 90 天(小时级) | 超过日上限 80% 为警告,100% 为过载 | | QPS | 1 min | 同上 | 超过设计值 80% 为警告,100% 为过载 | | P99 延迟 | 1 min | 同上 | 超过 5000ms 为警告,超过 10000ms 为过载 | | 供应商资源利用率 | 5 min | 同上 | 超过 80% 为警告,超过 95% 为过载 | **增长率预测算法**: - 采用简单线性回归,基于过去 7 天的分钟级数据计算日均增长率。 - 计算公式:`days_to_limit = (limit - current) / daily_growth`,其中 `daily_growth = (latest - earliest) / 7`。 - ⚠️ **免责声明**:结果仅供**参考,不作为扩容决策依据**。线性回归无法捕捉季节性波动和突增流量(如大促、热点事件),实际容量规划应以人工判断为主。 - 建议在 UI 界面上也同步显示同样免责声明,控制台显示为 "预计 X 天达到上限(仅供参考,不作为扩容决策依据)"。 ### 3.5 知识库管理 (审计与回滚) 审计服务是运维系统的可信基础。所有生产配置变更必须被捕获并不可篡改地存储。 **审计事件模型**(与 supply-api/ 审计规范一致): ```go type AuditEvent struct { EventID string `json:"event_id"` TenantID string `json:"tenant_id"` // 工作区 ID ObjectType string `json:"object_type"` // 例如 "alert_rule", "route_policy" ObjectID string `json:"object_id"` Action string `json:"action"` // "create", "update", "delete", "rollback" BeforeState map[string]any `json:"before_state"` AfterState map[string]any `json:"after_state"` RequestID string `json:"request_id"` ResultCode string `json:"result_code"` // "OK", "OPS_AUD_4001" SourceIP string `json:"source_ip"` ActorID string `json:"actor_id"` // 操作人 ID CreatedAt time.Time `json:"created_at"` } ``` **高风险变更检测**(对应 PRD 场景 I): - 对于每次配置变更,系统计算 "影响面分数"。 - 影响面计算方式:变更后将导致被拒绝的请求占比。若估算拒绝率 > 50%,标记为高风险。 - 高风险变更在执行前必须弹出二次确认窗口,管理员角色才能继续。 **回滚机制**: - 回滚操作不是简单的 "恢复原值",而是一个新的审计事件(Action="rollback"),生成新的版本。 - **fail-closed 设计**:任何配置变更操作必须先完成审计日志写入(ai_ops_audits 插入),审计记录写入成功后才能执行业务操作。若审计写入失败,业务操作立即中止并返回错误。回滚时先写入回滚审计记录,再执行回滚操作,确保审计链路始终先于业务执行。 - 回滚前必须检查目标资源是否仍然存在。若不存在,返回错误码 `OPS_AUD_4101`。若目标已被后续修改覆盖,返回 `OPS_AUD_4102`。 - 回滚执行前必须显示将被覆盖的子资源列表,并要求管理员二次确认。 - 回滚必须在 60s 内完成并通过验证。 --- ## 4. 数据模型设计 ### 4.1 核心实体关系图 (ER) ``` +----------------+ +----------------+ +----------------+ | ai_ops_rules |<----->| ai_ops_alerts |<----->| ai_ops_healings| +----------------+ +----------------+ +----------------+ | | | v | v +----------------+ | +----------------+ | ai_ops_channels| | | ai_ops_snapshots| +----------------+ | +----------------+ | | v v +----------------+ +----------------+ | ai_ops_audits | | ai_ops_configs | +----------------+ +----------------+ | v +----------------+ | ai_ops_metrics | +----------------+ ``` > **说明**:ER 图中已删除 `ai_ops_events` 和 `ai_ops_notifys` 两张表。 > - `ai_ops_events` 的功能已被 `ai_ops_alerts` 表的状态变化(triggered→notified→healing→resolved)和 `ai_ops_healings` 表的执行记录覆盖。 > - `ai_ops_notifys` 的功能已被 `ai_ops_channels` 表(渠道配置)以及 `ai_ops_alerts` 表的通知状态字段覆盖。 > - `ai_ops_configs` 和 `ai_ops_snapshots` 保留在 ER 图中,将在 migration 中补齐表结构。 ### 4.2 数据表结构 > **安全约束**:所有数据库交互必须使用参数化/预编译查询(prepared statements)。任何动态构建 SQL 的场景(如日志查询的模糊匹配、自定义规则的条件编译查询)必须通过应用层的 Query Builder 构建,禁止任何字符串拼接 SQL 的方式。Code Review 时必须检查所有数据库操作是否使用参数化查询。 #### 4.2.1 `ai_ops_rules` — 告警规则 | 字段 | 类型 | 约束 | 说明 | |------|------|------|------| | `id` | UUID | PK, 默认 gen_random_uuid() | 规则唯一标识 | | `name` | VARCHAR(128) | NOT NULL, UNIQUE | 规则名称 | | `metric_source` | VARCHAR(64) | NOT NULL | 指标来源:gateway/supply-api/platform-token-runtime | | `metric_name` | VARCHAR(128) | NOT NULL | 指标名称:qps/latency_p99/error_rate/… | | `threshold_type` | VARCHAR(16) | NOT NULL, CHECK IN ('>', '<', '=', 'regex') | 阈值类型 | | `threshold_value` | TEXT | NOT NULL | 阈值(支持正则表达式) | | `duration_min` | INT | NOT NULL, DEFAULT 1, CHECK >=1 | 持续触发时长(分钟) | | `level` | VARCHAR(8) | NOT NULL, CHECK IN ('P0','P1','P2','P3') | 告警级别 | | `channel_ids` | UUID[] | NOT NULL, DEFAULT '{}' | 关联通知渠道 ID 列表 | | `healing_action` | VARCHAR(32) | DEFAULT NULL | 自愈动作类型(可选) | | `healing_config` | JSONB | DEFAULT NULL | 自愈动作参数 | | `is_sandboxed` | BOOLEAN | NOT NULL, DEFAULT FALSE | 是否已通过沙盒验证 | | `enabled` | BOOLEAN | NOT NULL, DEFAULT TRUE | 是否启用 | | `created_by` | VARCHAR(64) | NOT NULL | 创建人 | | `created_at` | TIMESTAMPTZ | NOT NULL, DEFAULT NOW() | 创建时间 | | `updated_at` | TIMESTAMPTZ | NOT NULL, DEFAULT NOW() | 更新时间 | | `version` | INT | NOT NULL, DEFAULT 1 | 乐观锁版本 | **索引**:`CREATE INDEX idx_rules_enabled ON ai_ops_rules(enabled);` #### 4.2.2 `ai_ops_alerts` — 告警事件 | 字段 | 类型 | 约束 | 说明 | |------|------|------|------| | `id` | UUID | PK | 告警事件 ID | | `rule_id` | UUID | NOT NULL, FK -> ai_ops_rules | 触发规则 | | `level` | VARCHAR(8) | NOT NULL | 告警级别(可能升级) | | `resource_type` | VARCHAR(64) | NOT NULL | 资源类型:service/provider/model | | `resource_id` | VARCHAR(128) | NOT NULL | 资源标识 | | `current_value` | TEXT | NOT NULL | 触发时的实际值 | | `threshold_value` | TEXT | NOT NULL | 触发时的阈值 | | `status` | VARCHAR(16) | NOT NULL, DEFAULT 'triggered' | triggered/notified/healing/resolved/escalated/acknowledged | | `is_aggregated` | BOOLEAN | NOT NULL, DEFAULT FALSE | 是否为聚合告警 | | `aggregated_count` | INT | DEFAULT 0 | 聚合的子告警数量 | | `parent_alert_id` | UUID | NULL, FK -> ai_ops_alerts | 父聚合告警 ID | | `started_at` | TIMESTAMPTZ | NOT NULL | 开始时间 | | `resolved_at` | TIMESTAMPTZ | NULL | 解除时间 | | `acknowledged_by` | VARCHAR(64) | NULL | 确认人 | | `acknowledged_at` | TIMESTAMPTZ | NULL | 确认时间 | **索引**: ```sql CREATE INDEX idx_alerts_status ON ai_ops_alerts(status); CREATE INDEX idx_alerts_started_at ON ai_ops_alerts(started_at DESC); CREATE INDEX idx_alerts_resource ON ai_ops_alerts(resource_type, resource_id); ``` #### 4.2.3 `ai_ops_healings` — 自愈执行记录 | 字段 | 类型 | 约束 | 说明 | |------|------|------|------| | `id` | UUID | PK | 自愈执行 ID | | `alert_id` | UUID | NOT NULL, FK -> ai_ops_alerts | 关联告警 | || `action_type` | VARCHAR(32) | NOT NULL | switch_route/throttle/restart_instance/invoke_script/isolate_node | | `config` | JSONB | NOT NULL | 执行时的参数快照 | | `status` | VARCHAR(16) | NOT NULL, DEFAULT 'pending' | pending/succeeded/failed/rolled_back | | `dry_run` | BOOLEAN | NOT NULL, DEFAULT FALSE | 是否沙盒执行 | | `result_detail` | JSONB | NULL | 执行结果详情 | | `error_code` | VARCHAR(16) | NULL | 失败时的错误码 | | `started_at` | TIMESTAMPTZ | NOT NULL | 开始时间 | | `completed_at` | TIMESTAMPTZ | NULL | 完成时间 | #### 4.2.4 `ai_ops_channels` — 通知渠道 | 字段 | 类型 | 约束 | 说明 | |------|------|------|------| | `id` | UUID | PK | 渠道 ID | | `name` | VARCHAR(128) | NOT NULL | 渠道名称 | | `channel_type` | VARCHAR(32) | NOT NULL, CHECK IN ('webhook','email','feishu','wechat','sms') | 渠道类型 | | `config` | JSONB | NOT NULL | 渠道配置(URL/密钥/接收人等) | | `priority` | INT | NOT NULL, DEFAULT 1 | 优先级(低数 = 高优先) | | `enabled` | BOOLEAN | NOT NULL, DEFAULT TRUE | 是否启用 | | `created_at` | TIMESTAMPTZ | NOT NULL | 创建时间 | #### 4.2.5 `ai_ops_audits` — 审计日志 | 字段 | 类型 | 约束 | 说明 | |------|------|------|------| | `id` | UUID | PK | 审计事件 ID | | `tenant_id` | VARCHAR(64) | NOT NULL | 工作区 ID | | `object_type` | VARCHAR(64) | NOT NULL | 目标资源类型 | | `object_id` | VARCHAR(128) | NOT NULL | 目标资源 ID | | `action` | VARCHAR(32) | NOT NULL | create/update/delete/rollback | | `before_state` | JSONB | NULL | 变更前状态 | | `after_state` | JSONB | NULL | 变更后状态 | | `request_id` | VARCHAR(64) | NOT NULL | HTTP 请求 ID | | `result_code` | VARCHAR(16) | NOT NULL | OK 或错误码 | | `source_ip` | VARCHAR(45) | NOT NULL | 操作人 IP | | `actor_id` | VARCHAR(64) | NOT NULL | 操作人 ID | | `risk_level` | VARCHAR(8) | NOT NULL, DEFAULT 'normal' | normal/high/critical | | `parent_audit_id` | UUID | NULL, FK -> ai_ops_audits | 回滚时关联原始审计 | | `created_at` | TIMESTAMPTZ | NOT NULL, DEFAULT NOW() | 创建时间 | **索引**: ```sql CREATE INDEX idx_audits_tenant_created ON ai_ops_audits(tenant_id, created_at DESC); CREATE INDEX idx_audits_object ON ai_ops_audits(object_type, object_id); CREATE INDEX idx_audits_actor ON ai_ops_audits(actor_id, created_at DESC); CREATE INDEX idx_audits_request ON ai_ops_audits(request_id); ``` #### 4.2.6 `ai_ops_metrics` — 时序指标缓存 该表仅在未接入独立时序数据库时作为落地缓存,主时序数据仍然推荐存储在 Prometheus/VictoriaMetrics 中。 | 字段 | 类型 | 约束 | 说明 | |------|------|------|------| | `id` | BIGSERIAL | PK | 自增 ID | | `metric_name` | VARCHAR(128) | NOT NULL | 指标名称 | | `labels` | JSONB | NOT NULL, DEFAULT '{}' | 标签(service/path/supplier 等) | | `value` | DOUBLE PRECISION | NOT NULL | 指标值 | | `recorded_at` | TIMESTAMPTZ | NOT NULL | 采集时间 | **索引**:`CREATE INDEX idx_metrics_name_time ON ai_ops_metrics(metric_name, recorded_at DESC);` **分区策略**:按 `recorded_at` 分区,每日一个分区,自动删除 > 7 天的分区。 ### 4.3 实体关系说明 - **Rule -> Alert** (1:N):一条规则在不同时间可触发多个告警事件。 - **Alert -> Healing** (1:1):每个告警事件最多执行一次自愈动作(失败后升级人工处理)。 - **Alert -> Alert** (1:N, 聚合):父告警聚合多个子告警。 - **Audit -> Audit** (1:1, 回滚):回滚审计记录通过 `parent_audit_id` 关联原始记录。 - **Rule -> Channel** (N:M):通过 `channel_ids` 数组实现多对多关系。 --- ## 5. 关键流程设计 ### 5.1 异常检测 → 诊断 → 恢复 → 验证 → 回复 ``` Metric Ingestor Rule Engine Alert Service Healing Engine Validation Loop | | | | | | 1. 推送指标数据 | | | | |---------------------->| | | | | | 2. 评估阈值规则 | | | | |---------------------->| | | | | | 3. 生成告警事件 | | | | |--------------------->| | | | | 4. 检查自愈配置 | | | | |--------------------->| | | | | | 5. 执行自愈动作 | | | | |--------------------->| | | | | 6. 记录执行结果 | | | |<---------------------| | | | | 7. 发送通知 | | | | |------------------------------------------------>| | | | | | 8. 2min 后验证 | | | |<---------------------| | | | 9a. 解除告警 | | | | |<---------------------| | | | | 9b. 升级人工告警 | | | | |<---------------------| | ``` **流程说明**: 1. **指标采集** (<=15s): Metric Ingestor 每 15s 拉取一次 Prometheus 数据,或通过 Pushgateway 接收推送数据。 2. **规则评估** (<=5s): Rule Engine 对每个启用的规则评估阈值条件。触发条件时,检查是否已在当前持续时间窗口内已存在未关闭的同类告警(抑制重复触发)。 3. **告警生成** (<=1s): 创建 Alert 记录,状态为 `triggered`。 4. **自愈检查** (<=1s): 检查规则是否配置了自愈动作,且已通过沙盒验证。 5. **自愈执行** (<=60s): 执行自愈动作,包含最多 1 次重试。 6. **结果记录** (<=1s): 将自愈执行结果写入 Healing 表,更新 Alert 状态为 `healing`。 7. **通知发送** (P0/P1 <=30s, P2 <=120s): Notification Dispatcher 路由到配置的通知渠道。 8. **效果验证** (2min 后): Validation Loop 查询监控指标,检查告警条件是否仍然满足。 9. **终态处理**: - 9a. 若指标恢复正常,Alert 状态变为 `resolved`。 - 9b. 若指标仍未恢复,Alert 状态变为 `escalated`,通知升级为 P0 人工告警。 ### 5.2 告警聚合流程 ``` Alert Service | | 1. 检测到新告警 v +-----------+ +----------------+ +----------------+ | 同一资源 | --> | 1min 内数量 >20 | --> | 生成集群告警 | | 在 1min | | 条? | | (is_aggregated) | | 内的告警 | +----------------+ +--------+-------+ +-----------+ | | 2. 将子告警关联到父告警 v +--------+-------+ | 停止单条通知 | | 发送,只发集群 | +----------------+ ``` **聚合规则**: - 触发条件:同一 `resource_type` + `resource_id` 在 60s 内触发 > 20 条告警。 - 聚合行为:生成一条新的 Alert,`is_aggregated=TRUE`,`aggregated_count=N`,将所有子告警的 `parent_alert_id` 设为该聚合告警 ID。 - 通知行为:只发送一条集群告警通知,包含涉及的规则列表和时间范围。 - 抑制周期:同一规则同一目标在 5min 内只发送 1 次通知(除非级别升级)。 ### 5.3 配置回滚流程 ``` Admin Console | | 1. 选择审计记录,点击回滚 v Audit Service | | 2. 检查目标资源是否存在 v +-----------+ +----------------+ +----------------+ | 目标存在? | --> | 是 | --> | 显示子资源影响面 | +-----------+ +----------------+ +--------+-------+ | | | 否 | 3. 管理员确认 v v +-----------+ +--------+-------+ | 返回错误 | | 执行回滚 | | OPS_AUD_ | | (BeforeState | | 4101 | | -> current) | +-----------+ +--------+-------+ | | 4. 生成新审计记录 v +--------+-------+ | 验证回滚后 | | 状态,返回结果 | +----------------+ ``` --- ## 6. 技术选型与备选方案 ### 6.1 时序数据库 | 方案 | 选择 | 理由 | 备选 | |------|------|------|------| | Prometheus | 推荐 | 已为 PRD 假设依赖,生态成熟,支持 PromQL,与 NewAPI/Sub2API 的 `/metrics` 集成自然 | VictoriaMetrics(更高性能,更低资源占用) | | PostgreSQL 时序表 | 落地缓存 | 作为 Prometheus 不可用时的降级方案,保存最近 7 天原始指标 | - | **决策理由**: - 主指标存储使用 Prometheus,提供 `/metrics` 端点供外部 scrape。 - 在 PostgreSQL 中保存分钟级聚合指标(用于控制台快速查询)。 - 若 Prometheus 丢失,系统进入只读降级模式,告警引擎依赖本地缓存持续运行。 ### 6.2 告警状态缓存 | 方案 | 选择 | 理由 | 备选 | |------|------|------|------| | Redis + 本地内存 (DualCache) | 推荐 | 参考 LiteLLM 的 DualCache 模式,Redis 保证多实例共享状态,本地内存降低延迟 | 单纯 Redis | **设计细节**: - 告警抑制状态存储在 Redis 中,TTL 为 5min。 - 告警聚合计数器存储在 Redis 中,TTL 为 1min。 - 本地内存作为 L1 缓存,命中失败时才访问 Redis(L2)。 ### 6.3 告警批量处理 | 方案 | 选择 | 理由 | 备选 | |------|------|------|------| | 内存批量队列 + 定时刷盘 | 推荐 | 参考 LiteLLM CustomBatchLogger,每 10s 或队列长度 > 50 时刷盘,避免告警爆炸时的 IO 瓶颈 | 单条同步发送 | ### 6.4 通知渠道 | 渠道 | 优先级 | 备份策略 | |------|--------|---------| | Webhook | 1 | 失败时降级到邮件 | | 邮件 | 2 | 失败时降级到飞书/企业微信 | | 飞书/企业微信 | 3 | 失败时降级到短信 | | 短信 | 4 | 失败时通知 TechLead | --- ## 7. 与立交桥主系统的集成点 ### 7.1 Token Gateway (gateway/) **数据提供**: - gateway/ 需要通过 Prometheus 指标暴露以下数据: - `gateway_requests_total` (标签: path, method, status) - `gateway_request_duration_seconds` (标签: path, method, quantile) - `gateway_error_rate_5xx` (标签: path) - `gateway_degradation_hits_total` (标签: rule_id) **集成接口**: - gateway/ 提供内部 HTTP 接口供 AI-Ops 调用: - `GET /internal/gateway/health` — 查询服务健康状态 - `GET /internal/gateway/routes` — 获取当前路由配置,用于影响面分析 - `POST /internal/gateway/routes` — 修改路由策略(如切换供应商、限流配置),自愈动作调用 - `GET /internal/gateway/metrics` — 获取请求量统计 **集成方式**: - 独立运行时:通过配置文件 `gateway.internal_endpoint` 指定地址,使用 API Key 鉴权。 - 集成运行时:通过 `IntegrationPlugin` 直接调用 gateway/ 的内部方法,跳过 HTTP 层。 ### 7.2 Channel Manager (supply-api/) **集成接口**: - supply-api/ 提供以下内部 HTTP 接口供 AI-Ops 调用: - `GET /internal/supply/accounts/health` — 供应商健康状态 - `GET /internal/supply/audit/schema` — 审计日志格式定义,确保事件格式一致 **审计事件对接**: - AI-Ops 的审计事件格式与 supply-api/ 保持一致。 - 集成运行时,可选择复用 supply-api/ 的 AuditStore 接口,或使用独立的 `ai_ops_audits` 表(推荐独立表,避免 schema 冲突)。 ### 7.3 Platform Token Runtime **集成接口**: - platform-token-runtime/ 提供以下内部 HTTP 接口供 AI-Ops 调用: - `GET /internal/runtime/token-usage` — 获取 Token 消耗指标 - `GET /internal/runtime/capacity` — 获取容量使用率 --- ## 8. 安全设计 ### 8.1 角色与权限控制 (RBAC) | 角色 | 监控查看 | 日志查询 | 告警确认/忽略 | 告警规则管理 | 配置回滚 | 高风险变更 | |------|---------|---------|-------------|-------------|---------|-----------| | 查看者 (viewer) | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ | | 运维人员 (operator) | ✅ | ✅ | ✅ | ✅ | ❌ | ❌ | | 管理员 (admin) | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | **实现方案**: - 独立运行时,系统自带角色表 `ai_ops_roles`。 - 集成运行时,通过 `IntegrationPlugin` 接口从主程序获取当前用户角色,或复用主程序的 IAM 系统。 - 每个 HTTP 请求必须经过 Authz Middleware 检查,在响应头中返回 `X-Permitted-Actions` 列表。 ### 8.2 审计与日志安全 - 审计日志必须使用只读存储,禁止任何用户/管理员直接修改 `ai_ops_audits` 表。 - 审计日志保留期 >= 90 天,通过 PostgreSQL 分区表 + 自动清理实现。 - 敏感字段脱敏:审计日志中的 `BeforeState` / `AfterState` 包含密钥、密码时,必须通过 Sanitizer 脱敏处理。 - 所有管理端点必须记录访问日志,包含操作人 IP、时间戳、操作类型。 ### 8.3 数据隔离 - 所有数据查询必须带有 `tenant_id` / `workspace_id` 过滤条件,防止跨租户数据泄露。 - 数据库层面使用 Row Level Security (RLS) 作为最后一道防线(可选,根据性能决策)。 --- ## 9. 性能考量 ### 9.1 并发能力 | 指标 | 目标值 | 验证方式 | |------|--------|---------| | 告警规则评估吞吐量 | >= 50 条规则 / 15s | 压力测试 | | 并发告警处理 | >= 100 事件/s | 压力测试 | | 控制台首页加载 | < 2s | 性能测试 | | 日志查询首页返回 | < 3s | 性能测试 | | 审计日志查询 | < 3s | 性能测试 | ### 9.2 扩展性 - **水平扩展**:AI-Ops 服务无状态(状态存储在 Redis/PostgreSQL),可通过增加 Pod 数量水平扩展。 - **告警引擎分片**:当规则数量 > 200 条时,可将规则按 `metric_source` 分片到不同的评估器实例。 - **时序库扩展**:Prometheus 采用 Remote Write 到 VictoriaMetrics 或 Thanos,支持长期存储扩展。 ### 9.3 存储估算 **指标数据**(以 Prometheus 为主存储): - 假设 10 个指标,每个指标 10 个标签组合,采集频率 15s。 - 每天数据量: 10 * 10 * (86400/15) * 8 bytes = 4.6 MB/天 - 7 天原始数据: ~32 MB - 30 天分钟级聚合: ~200 MB - 90 天小时级聚合: ~150 MB **审计日志**(PostgreSQL): - 假设每天 1000 次配置变更,每条记录平均 2 KB。 - 每天: 2 MB - 90 天: ~180 MB **告警事件**(PostgreSQL): - 假设每天 500 条告警,每条记录平均 1 KB。 - 每天: 500 KB - 90 天: ~45 MB **总存储估算**: - 指标时序库:500 MB(含小时级聚合) - PostgreSQL (审计+告警+配置): 500 MB - Redis (状态缓存): 100 MB 总计: ~1.1 GB(无压缩),实际生产环境建议预留 5 GB 磁盘空间。 --- ## 10. 风险评估与缓解策略 | 风险编号 | 风险描述 | 严重级别 | 发生概率 | 缓解策略 | |---------|---------|---------|---------|---------| | R-1 | 自愈规则设计不当导致正常流量被截断或重定向 | 高 | 中 | 沙盒模式强制验证;高风险变更二次确认;自愈引擎支持一键关闭 | | R-2 | 告警规则过于敏感或缺乏抑制,导致噪音爆炸 | 高 | 中 | 告警聚合机制;抑制周期 5min;噪声率监控与自动告警;间隔 2h 未确认自动升级避免麻木 | | R-3 | 回滚操作不当导致配置状态更深层次损坏 | 中 | 低 | 回滚前显示子资源影响面;二次确认;回滚后自动验证;高风险变更二次确认 | | R-4 | 审计日志丢失导致故障定责和合规审查受阻 | 中 | 低 | 主备双写;异步文件缓存作为降级;90 天保留期;存储监控与预警 | | R-5 | 时序数据库全面中断 | 高 | 低 | 控制台降级为只读模式;告警引擎依赖本地缓存持续运行;PostgreSQL 落地缓存作为最后防线 | | R-6 | 通知渠道全部失效 | 中 | 低 | 主备自动切换机制;4 层降级;最终通知 TechLead;通知失败记录保留在事件中 | ### 10.1 威胁建模 | 威胁场景 | 攻击/故障路径 | 影响 | 控制措施 | 验证要求 | |---------|---------------|------|---------|---------| | 自愈误触发 | 错误规则或坏数据触发切流/限流/重启 | 生产流量中断、雪崩放大 | 沙盒演练、双人确认、高风险动作默认关闭、回滚快照 | 每个高风险动作必须有沙盒验证和回滚演练 | | 告警洪泛 | 外部噪声或错误规则导致告警风暴 | 值班麻木、真实故障被淹没 | 聚合、抑制、静默窗口、升级策略、噪声率告警 | 压测和回放验证 50 条并发规则下噪声可控 | | 越权运维操作 | 低权限用户执行回滚/规则修改/高风险变更 | 生产配置被误改 | RBAC、二次确认、审计、资源级鉴权、响应头返回 permitted actions | QA 必测 viewer/operator/admin 差异权限 | | 审计链路失真 | 审计未先写入或被篡改 | 无法追责、回滚依据失效 | 审计先写后执行业务;审计存储防篡改;失败阻断高风险操作 | 审计写失败时高风险变更必须拒绝 | || 外部适配层被滥用 | `/metrics`、Webhook、管理 API 适配暴露过多能力 | 信息泄露、被动放大攻击面 | 最小暴露面、签名校验、限流、只读隔离、错误码映射 | 合同测试覆盖外部接口鉴权与字段边界 | || **LLM 模型错误输出导致配置损坏** | AI 生成的自愈配置、回滚策略、影响面分析等包含错误信息,被直接认可后执行 | 配置被误写,影响所有依赖该配置的服务 | **人在环路中心**:任何 LLM 生成的动作或配置必须经过人工审批,不得直接自动执行;对生成内容进行语法/语义校验;限制 LLM 的功能范围(只读/分析/推荐,不写/不执行) | QA 必测 LLM 生成配置的审批流程和拒绝逻辑 | || **LLM 提示注入挑战** | 攻击者通过日志字段、Webhook 输入、审计查询参数等渠道注入恶意提示,诱导 LLM 生成危险配置或泄露敏感信息 | 身份认证绕过、审计信息泄露 | 对所有 LLM 输入进行输入验证和过滤;严格区分"系统提示”与"用户输入”;LLM 调用使用独立的系统角色,不能获取用户的任何权限;输出经过模板化处理 | QA 必测 LLM 输入渠道的注入防御 | ### 10.2 设计阶段门控结论 **结论:REQUEST_CHANGES(已转化为以下行动项)** **已完成的修复:** - [x] 错误码统一:PRD / HLD / INTERFACE 回滚错误码统一为 `OPS_AUD_4101` / `OPS_AUD_4102` - [x] 低级笔误修复:测试策略中的"游戏化事务" → "编程式事务",HLD 中的"预畈" → "预留" - [x] 数据库 migration SQL:补齐 `tech/migrations/000001_init_schema.up.sql` / `.down.sql`,覆盖核心 6 张表 + 审计防篡改触发器 + 分区策略 - [x] 功能清单裁剪:删除 66 条 PM 越界按钮级任务,添加 PM/Engineer 范围边界说明 **进入开发前必须补齐:** - [ ] 威胁建模验证要求转化为可执行测试: - 每个威胁场景在 TEST_DESIGN 中必须有对应的 CI 阻断测试用例 - 毒性:自愈误触发 → TC-6.5 沙盒模式验证、TC-6.7 级联故障回退 - 毒性:告警洪泛 → TC-5.1 聚合测试、TC-5.3 抑制周期测试 - 毒性:越权运维 → TC-12.1~12.3 角色权限矩阵 - 毒性:审计鏈路失真 → TC-7.2 审计不可篡改、TC-7.1 审计写入时效 - 毒性:外部适配层被滥用 → TOPS-ADP-01~03 适配层验证 - [ ] `BuildServer` / `BuildRuntime` 显式挂载约束必须落实为 QA 的阻断检查项: - 每个模块在 `BuildServer` 中必须有对应的 `Register()` 调用,否则 CI 失败 - 每个条件能力在 `BuildRuntime` 中必须有对应的 `Enable()` 调用,否则 CI 失败 - [ ] 独立运行 / 集成运行 / IntegrationPlugin / OpenAPI / 适配层要求必须进入测试阻断矩阵: - TOPS-RUN-01~04 必须通过 CI - TOPS-PLG-01~03 必须通过 CI - TOPS-OAS-01~03 必须通过 CI - TOPS-ADP-01~03 必须通过 CI - [ ] 高风险变更必须 fail-closed: - 影响面 > 50% 的变更在审计写入失败时必须拒绝执行,有单独的 CI 测试用例验证 **阻断条件(任一触发则不得进入开发):** - 自愈动作没有沙盒、快照与回滚闭环。 - 审计日志不能保证先写审计再执行业务。 - 无法证明集成模式中路由、worker、健康检查全部真实挂载。 --- ## 11. 可重用的设计模式 | 设计模式 | 来源 | 应用场景 | |---------|------|---------| | **CustomBatchLogger** | LiteLLM | 告警事件批量处理,避免高并发下的 IO 瓶颈 | | **DualCache** | LiteLLM | 告警状态缓存(内存 + Redis),确保告警可靠性 | | **DigestEntry** | LiteLLM | 告警聚合,避免滥发 | | **AlertType + AlertTypeConfig** | LiteLLM | 可扩展的告警类型系统,支持按类型配置不同策略 | | **OutageModel + ProviderRegionOutageModel** | LiteLLM | 故障状态机,支持模型级和区域级故障检测 | | **Cooldown 机制** | LiteLLM | 故障部署自动移除,作为自愈动作的一种 | | **FreeRide SupplierChain** | FreeRide (OpenClaw) | 供应商多级 Fallback 链 + 冷却期,防止震荡 | | **SupplierProbe + ELOHistory** | FreeRide (OpenClaw) | 供应商探针定时任务 + 质量趋势记录 | | **Repository + Service + Handler** | Bridge 主项目 | 分层架构,领域层定义接口,应用层实现业务逻辑,HTTP 层处理协议转换 | | **Optimistic Locking** | supply-api/ | 配置变更时防止并发覆盖,Store 接口必须包含 expectedVersion | | **Circuit Breaker** | 行业实践 | 自愈动作执行失败时,避免连续重试导致级联故障 | | **Snapshot + Rollback** | 行业实践 | 自愈动作执行前记录状态快照,支持自动回退 | --- ## X 技术选型(前端) ### 前端技术栈 - **框架**:React 18+(或与 gateway 现有前端保持一致) - **组件库**:Tailwind CSS + Headless UI(或现有 UI 框架) - **图表**:ECharts 5.x(已在功能清单中使用) - **构建工具**:Vite - **状态管理**:React Query(用于 API 数据获取和缓存) ### 前端工作范围 - 监控首页(6 个指标卡片 + 实时刷新) - 指标下钻页(ECharts 趋势图 + 维度筛选) - 日志查询页(表格 + 分页 + 导出) - 告警规则管理页(CRUD 表单) - 告警事件列表页(状态 Tab + 集群聚合) - 配置审计与回滚页 - 容量主板(多图表 + 预测卡片) ### 约束 - 前端不做后端逻辑,所有数据通过 `/api/v1/ai-ops/` REST 接口获取 - 前端与后端通过 JWT Token 认证,Token 由后端签发 --- ## 12. 技术栈与集成约束 ### 12.1 统一技术栈 本项目必须与立交桥主项目保持一致: - **语言**: 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% ### 12.2 独立运行与集成运行 本系统必须同时支持两种运行模式: | 模式 | 特征 | 部署方式 | 适用场景 | |------|------|---------|---------| | **独立运行** | 自有 `cmd/ai-ops/main.go`,独立数据库 schema,独立 docker-compose | `docker-compose up` 或单独容器 | 外部用户只需要运维能力,不想接入立交桥全套 | | **集成运行** | 作为 Go module 被 `gateway/` 或 `supply-api/` 引入,共享数据库连接池和配置,通过内部接口注册 | 编译时作为子模块编译,运行时挂载到立交桥主进程 | 立交桥用户希望获得一体化运维能力 | **集成约束**: - 独立运行时,系统必须提供完整的 HTTP API 和管理后台。 - 集成运行时,系统必须提供 `IntegrationPlugin` 接口,允许主程序通过配置开关启用/禁用各模块。 - 数据库 schema 必须使用独立的 `ai_ops_` 前缀,避免与主项目表名冲突。 - 配置文件必须支持分离加载:独立运行时读取自己的 `config.yaml`,集成运行时合并到主项目配置。 ### 12.3 NewAPI / Sub2API 适配支持 本系统的核心能力必须能够对接 NewAPI 和 Sub2API 系统: - **监控数据推送**: 提供 Prometheus 格式的 `/metrics` 接口,NewAPI/Sub2API 可通过 Prometheus scrape 获取运维数据。 - **告警回调**: 支持 Webhook 告警通知,NewAPI/Sub2API 可配置接收本系统的告警事件。 - **自愈脚本扩展**: 自愈动作中的“触发程序化脚本”支持调用 NewAPI/Sub2API 的管理 API(如切换供应商、限流配置、重启实例)。 - **独立部署时**: 通过配置文件指定 NewAPI/Sub2API 的管理端点地址和鉴权信息,本系统通过适配层与之交互。 - **集成部署时**: 若立交桥 gateway/ 已接入 NewAPI/Sub2API,本系统通过 gateway/ 的内部路由接口操作上游状态。 ### 12.4 对外接口契约 - 必须提供 OpenAPI 3.0 接口文档,确保 NewAPI/Sub2API 开发者可以独立接入。 - 接口路径前缀默认为 `/api/v1/ai-ops/`,集成运行时可通过配置改为 `/internal/ai-ops/`。 --- ## 13. 变更日志 | 版本 | 日期 | 修改人 | 内容 | |------|------|--------|------| | v1.0 | 2026-04-27 | TechLead | 初稿:完成系统架构、模块设计、数据模型、流程设计、技术选型、集成点、安全、性能、风险、设计模式 | --- ## 附录 Y:参考文档与外部依赖 | 参考项目 | 版本/日期 | URL | 用途 | |---------|---------|-----|------| | LiteLLM | v1.40.0 (2026-03) | https://docs.litellm.ai/ | 模型接口标准化、健康检查设计 | | Sub2API | main分支 (2026-04) | https://github.com/WeI-Shaw/sub2api | 公告系统、用户体系参考 | | Intercom | - | https://www.intercom.com/ | 客服体验对标 | | Prometheus | 3.x (2026-Q1) | https://prometheus.io/ | 时序数据存储 | | VictoriaMetrics | 1.100.x (2026-Q1) | https://victoriametrics.com/ | 时序数据备选存储 | | Playwright | 1.50.x (2026-Q1) | https://playwright.dev/ | 浏览器自动化 | | Qdrant | 1.12.x (2026-Q1) | https://qdrant.tech/ | 向量数据库备选 | | PGVector | 0.8.x (2026-Q1) | https://github.com/pgvector/pgvector | PostgreSQL向量扩展 | 注:以上版本号为评审时(2026-04-28)的最新稳定版,随着项目开发应定期更新。