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

837 lines
47 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.
# 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 缓存,命中失败时才访问 RedisL2
### 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的最新稳定版随着项目开发应定期更新。