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

7.8 KiB
Raw Blame History

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] = NoneCI/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 列表追加

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_idstep_name、错误消息或日志文件路径
  • 自动读取 Gitea Actions 环境变量(GITHUB_WORKFLOWGITHUB_JOBGITHUB_SHA 等)
  • 根据 step 名称推断 error_typeDockerBuildError / NpmBuildError / TestFailure 等)
  • 发送到 /api/v1/logs/reportsource: "cicd"
  • 超时 10s失败静默不影响流水线

2.2 Gitea Actions 集成示例 — 新建 scripts/gitea-actions-example.yaml

在构建步骤后加 if: failure() 条件步骤:

- 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
  • 检测异常状态:CrashLoopBackOffImagePullBackOffOOMKilledErrorCreateContainerConfigError
  • 通过 Pod label app 映射到 project_id(如 rtc-backendrtc_backend
  • 获取容器日志(优先 previous=True 拿崩溃前日志)
  • 上报到 /api/v1/logs/reportsource: "deployment"level: "CRITICAL"
  • context 携带namespace、pod_name、container_name、deployment_name、restart_count

3.3 K8s 部署 — 新建 k8s/monitor-cronjob.yaml

  • CronJob每 5 分钟执行(*/5 * * * *
  • RBACServiceAccount + ClusterRolepodspods/log 的 get/list 权限)
  • 资源限制64Mi/50m → 128Mi/100m
  • 参考 rtc_backend/k8s/backend-deployment-prod.yaml 的 label 和格式风格

第四部分:前端 Dashboard 更新

4.1 类型定义 — web/src/api.ts

  • ErrorLog 接口新增 source: stringfile_pathline_number 改为可选
  • getBugs 参数新增 source?: string
  • getStats 支持 source 参数
  • DashboardStats 新增 source_distribution

4.2 缺陷列表 — web/src/pages/BugList.tsx

  • 在项目筛选和状态筛选之间新增来源筛选行(全部来源 / 运行时 / CI/CD / 部署)
  • 表格新增「来源」列,显示彩色标签
  • 「文件」列处理 nullfile_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