log-center/docs/log-collection-extension-plan.md
zyc 0d4b2d634c
All checks were successful
Build and Deploy Log Center / build-and-deploy (push) Successful in 2m24s
feat: 扩展日志收集,支持 CI/CD 构建错误和 K8s 部署错误
新增两种日志来源(cicd / deployment),使日志中台覆盖"构建→部署→运行"全链路:

后端变更:
- models.py: 新增 LogSource 枚举和 source 字段,file_path/line_number 改为可选
- main.py: 按来源生成不同指纹策略,所有查询端点支持 source 筛选,仪表盘新增来源分布统计
- database.py: 新增 4 条迁移 SQL(source 字段、索引、字段可空)
- task_manager.py: 修复 Agent 仅拉取 runtime 来源的缺陷

新增组件:
- k8s-monitor/: K8s Pod 健康监控脚本(Python),每 5 分钟检测异常 Pod 并上报
- k8s/monitor-cronjob.yaml: CronJob + RBAC 部署清单
- scripts/report-cicd-error.sh: CI/CD 错误上报 Bash 脚本
- scripts/gitea-actions-example.yaml: Gitea Actions 集成示例

前端变更:
- api.ts: 类型定义更新,支持 source 字段
- BugList.tsx: 新增来源筛选标签页和来源列
- BugDetail.tsx: 按来源条件渲染(CI/CD 信息、部署信息),非 runtime 禁用修复按钮
- Dashboard.tsx: 新增来源分布表格
- index.css: 来源标签样式(source-badge)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-24 10:20:16 +08:00

198 lines
7.8 KiB
Markdown
Raw 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.

# Log Center 日志收集扩展方案
## 背景
当前 Log Center 仅通过 `POST /api/v1/logs/report` 收集**运行时错误**(应用代码中捕获的异常)。以下两类重要错误场景未被覆盖:
1. **CI/CD 构建错误** — Gitea Actions 构建失败Docker build、npm build、测试失败等
2. **部署错误** — K3s 集群中 Pod 异常状态CrashLoopBackOff、OOMKilled、ImagePullBackOff 等)
目标:扩展 Log Center使其成为覆盖"构建→部署→运行"全链路的错误收集平台。
---
## 实施方案
### 第一部分:后端 API 扩展
#### 1.1 模型变更 — `app/models.py`
- 新增 `LogSource` 枚举:`runtime`(默认) / `cicd` / `deployment`
- `ErrorLog` 表新增 `source` 字段(带索引,默认 `runtime`
- `file_path` 改为 `Optional[str] = None`CI/CD 和部署错误无文件路径)
- `line_number` 改为 `Optional[int] = None`
- `ErrorLogCreate` 新增 `source: str = "runtime"` 字段
> 向后兼容:现有调用方不传 `source` 时自动为 `runtime`,无需任何修改。
#### 1.2 指纹去重逻辑 — `app/main.py:27` `generate_fingerprint()`
`source` 分别计算指纹:
| Source | 指纹组成 | 去重逻辑 |
|--------|----------|----------|
| `runtime` | `project_id \| error_type \| file_path \| line_number` | 不变 |
| `cicd` | `project_id \| cicd \| error_type \| job_name \| step_name` | 同一 Job 的同一 Step 同类错误去重 |
| `deployment` | `project_id \| deployment \| error_type \| namespace \| deployment_name` | 同一 Deployment 同类异常去重 |
#### 1.3 API 端点变更 — `app/main.py`
| 端点 | 变更 |
|------|------|
| `POST /api/v1/logs/report` (L33) | 构建 `ErrorLog` 时写入 `source` 字段 |
| `GET /api/v1/bugs` (L220) | 新增 `source` 可选查询参数,加筛选条件 |
| `GET /api/v1/tasks/pending` (L79) | 新增 `source` 可选查询参数 |
| `GET /api/v1/dashboard/stats` (L187) | 新增 `source` 过滤 + 返回 `source_distribution` |
#### 1.4 数据库迁移 — `app/database.py:27` `init_db()` 的 migrations 列表追加
```sql
ALTER TABLE errorlog ADD COLUMN source VARCHAR(20) DEFAULT 'runtime';
ALTER TABLE errorlog ALTER COLUMN file_path DROP NOT NULL;
ALTER TABLE errorlog ALTER COLUMN line_number DROP NOT NULL;
CREATE INDEX ix_errorlog_source ON errorlog (source);
```
沿用现有 try/except 幂等模式,零停机。
---
### 第二部分CI/CD 构建错误上报
#### 2.1 上报脚本 — 新建 `scripts/report-cicd-error.sh`
Bash 脚本CI 环境天然有 `curl` + `jq`,无需额外依赖。
- 输入:`project_id``step_name`、错误消息或日志文件路径
- 自动读取 Gitea Actions 环境变量(`GITHUB_WORKFLOW``GITHUB_JOB``GITHUB_SHA` 等)
- 根据 step 名称推断 `error_type`DockerBuildError / NpmBuildError / TestFailure 等)
- 发送到 `/api/v1/logs/report``source: "cicd"`
- 超时 10s失败静默不影响流水线
#### 2.2 Gitea Actions 集成示例 — 新建 `scripts/gitea-actions-example.yaml`
在构建步骤后加 `if: failure()` 条件步骤:
```yaml
- name: Report Build Failure
if: failure()
run: |
curl -s -X POST "${LOG_CENTER_URL}/api/v1/logs/report" \
-H "Content-Type: application/json" \
-d '{ "project_id": "xxx", "source": "cicd", ... }' \
--max-time 10 || true
```
---
### 第三部分K8s 部署错误监控CronJob
#### 3.1 目录结构
```
log_center/k8s-monitor/
├── monitor.py # 监控脚本
├── Dockerfile # 镜像构建
└── requirements.txt # kubernetes + requests
```
#### 3.2 监控脚本 — `k8s-monitor/monitor.py`
- 使用 `kubernetes` Python 客户端(支持 in-cluster config
- 扫描指定命名空间的所有 Pod
- 检测异常状态:`CrashLoopBackOff``ImagePullBackOff``OOMKilled``Error``CreateContainerConfigError`
- 通过 Pod label `app` 映射到 `project_id`(如 `rtc-backend``rtc_backend`
- 获取容器日志(优先 `previous=True` 拿崩溃前日志)
- 上报到 `/api/v1/logs/report``source: "deployment"``level: "CRITICAL"`
- context 携带namespace、pod_name、container_name、deployment_name、restart_count
#### 3.3 K8s 部署 — 新建 `k8s/monitor-cronjob.yaml`
- CronJob每 5 分钟执行(`*/5 * * * *`
- RBACServiceAccount + ClusterRole`pods``pods/log` 的 get/list 权限)
- 资源限制64Mi/50m → 128Mi/100m
- 参考 `rtc_backend/k8s/backend-deployment-prod.yaml` 的 label 和格式风格
---
### 第四部分:前端 Dashboard 更新
#### 4.1 类型定义 — `web/src/api.ts`
- `ErrorLog` 接口新增 `source: string``file_path``line_number` 改为可选
- `getBugs` 参数新增 `source?: string`
- `getStats` 支持 `source` 参数
- `DashboardStats` 新增 `source_distribution`
#### 4.2 缺陷列表 — `web/src/pages/BugList.tsx`
- 在项目筛选和状态筛选之间新增**来源筛选**行(全部来源 / 运行时 / CI/CD / 部署)
- 表格新增「来源」列,显示彩色标签
- 「文件」列处理 null`file_path ? \`${file_path}:${line_number}\` : '-'`
#### 4.3 缺陷详情 — `web/src/pages/BugDetail.tsx`
- 元信息新增来源显示
- 文件位置区域条件渲染(仅 runtime 有 file_path 时显示)
- CI/CD 错误显示工作流名称、Job、Step、CI 日志链接
- 部署错误显示命名空间、Pod 名称、容器、重启次数
- 非 runtime 错误禁用「触发修复」按钮,显示提示
#### 4.4 仪表盘 — `web/src/pages/Dashboard.tsx`
- 新增「来源分布」表格(运行时/CI/CD/部署各多少条)
#### 4.5 样式 — `web/src/index.css`
- 新增 `.source-badge``.source-runtime` / `.source-cicd` / `.source-deployment` 颜色
- 新增 `.source-tabs` 筛选行样式(复用 `.project-tab` 风格)
---
### 第五部分Repair Agent 适配
#### 5.1 仅修改一处 — `repair_agent/agent/task_manager.py:33`
`fetch_pending_bugs()` 的请求参数增加 `"source": "runtime"`,确保修复 Agent 只拉取运行时错误,忽略 CI/CD 和部署错误。
---
## 文件变更清单
| 文件 | 操作 | 说明 |
|------|------|------|
| `app/models.py` | 修改 | LogSource 枚举、source 字段、可选字段 |
| `app/main.py` | 修改 | 指纹逻辑、source 过滤、stats 扩展 |
| `app/database.py` | 修改 | 追加 4 条迁移 SQL |
| `web/src/api.ts` | 修改 | 类型 + API 函数 |
| `web/src/pages/BugList.tsx` | 修改 | 来源筛选 + 来源列 |
| `web/src/pages/BugDetail.tsx` | 修改 | 来源展示 + 条件渲染 |
| `web/src/pages/Dashboard.tsx` | 修改 | 来源分布表格 |
| `web/src/index.css` | 修改 | 来源标签样式 |
| `repair_agent/agent/task_manager.py` | 修改 | 加 source=runtime 过滤 |
| `scripts/report-cicd-error.sh` | **新建** | CI/CD 错误上报脚本 |
| `scripts/gitea-actions-example.yaml` | **新建** | Gitea Actions 集成示例 |
| `k8s-monitor/monitor.py` | **新建** | K8s Pod 监控脚本 |
| `k8s-monitor/Dockerfile` | **新建** | 监控镜像 |
| `k8s-monitor/requirements.txt` | **新建** | Python 依赖 |
| `k8s/monitor-cronjob.yaml` | **新建** | CronJob + RBAC |
---
## 验证方案
1. **后端**:启动 API分别用 `curl` 发送 runtime/cicd/deployment 三种 source 的错误,验证入库和去重
2. **前端**:访问 Dashboard验证来源筛选和来源标签显示正常
3. **CI/CD**:在某项目的 Gitea Actions 中故意制造构建失败,确认 Log Center 收到 cicd 错误
4. **K8s Monitor**:本地用 `kubectl` 模拟 CrashLoopBackOff Pod运行 monitor.py确认上报
5. **Repair Agent**:运行 `python -m repair_agent list`,确认只返回 runtime 来源的 Bug
---
## 实施顺序
1. 后端变更(模型 + API + 迁移)→ 部署
2. 前端更新 → 部署
3. CI/CD 上报脚本 → 提交到仓库,集成到各项目流水线
4. K8s Monitor → 构建镜像,部署 CronJob