All checks were successful
Build and Deploy Log Center / build-and-deploy (push) Successful in 2m24s
新增两种日志来源(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>
7.8 KiB
7.8 KiB
Log Center 日志收集扩展方案
背景
当前 Log Center 仅通过 POST /api/v1/logs/report 收集运行时错误(应用代码中捕获的异常)。以下两类重要错误场景未被覆盖:
- CI/CD 构建错误 — Gitea Actions 构建失败(Docker build、npm build、测试失败等)
- 部署错误 — 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] = NoneErrorLogCreate新增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_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() 条件步骤:
- 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
- 使用
kubernetesPython 客户端(支持 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 * * * *) - RBAC:ServiceAccount + 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?: stringgetStats支持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 |
验证方案
- 后端:启动 API,分别用
curl发送 runtime/cicd/deployment 三种 source 的错误,验证入库和去重 - 前端:访问 Dashboard,验证来源筛选和来源标签显示正常
- CI/CD:在某项目的 Gitea Actions 中故意制造构建失败,确认 Log Center 收到 cicd 错误
- K8s Monitor:本地用
kubectl模拟 CrashLoopBackOff Pod,运行 monitor.py,确认上报 - Repair Agent:运行
python -m repair_agent list,确认只返回 runtime 来源的 Bug
实施顺序
- 后端变更(模型 + API + 迁移)→ 部署
- 前端更新 → 部署
- CI/CD 上报脚本 → 提交到仓库,集成到各项目流水线
- K8s Monitor → 构建镜像,部署 CronJob