名称: 存储调试仪表化 描述: 为后端存储层(PostgreSQL、ChromaDB)和启动指标添加全面的调试和可观测性工具。包括存储漂移检测、原始数据检查端点以及Next.js管理仪表板。
存储调试仪表化
目的
通过暴露以下内容,实现对存储状态、同步健康状况和后端性能瓶颈的快速诊断:
- 来自PostgreSQL和ChromaDB的原始文章检查
- 存储漂移检测(缺失/悬空条目)
- 详细的启动时间线细分(数据库初始化、缓存预加载、向量存储、RSS刷新)
- 整合所有诊断信息的一页式调试仪表板
范围
- 后端:
app/services/startup_metrics.py,app/main.py,app/vector_store.py,app/database.py,app/api/routes/debug.py - 前端:
frontend/lib/api.ts,frontend/app/debug/page.tsx - 无模式更改;纯增量的仪表化和调试路由
工作流程
1. 创建启动指标服务
文件: backend/app/services/startup_metrics.py
- 实现线程安全的
StartupMetrics类以记录阶段时间 - 暴露
record_event(name, started_at, detail, metadata)用于阶段捕获 - 支持
add_note(key, value)用于任意注释 - 导出单例
startup_metrics供应用全局使用
2. 仪表化向量存储初始化
文件: backend/app/vector_store.py
- 导入
startup_metrics - 在
VectorStore.__init__()中,用time.time()计时器包装初始化过程 - 记录带有元数据的事件:
host,port,collection,documents - 捕获连接错误并为其添加注释
3. 仪表化FastAPI启动序列
文件: backend/app/main.py
- 在
on_startup()开始时调用startup_metrics.mark_app_started() - 用
record_event()包装每个阶段(数据库初始化、调度器、缓存预加载、RSS刷新、迁移) - 包含元数据:
cache_size,article_count,oldest_article_hours - 在结束时调用
startup_metrics.mark_app_completed() - 通过
add_note()添加应用版本注释
4. 添加数据库分页助手
文件: backend/app/database.py
- 实现
fetch_articles_page()以支持:- 限制/偏移分页
- 可选来源过滤器
- 仅缺失嵌入标志
- 发布日期范围过滤器
- 排序方向(升序/降序)
- 返回最旧/最新时间戳边界
- 实现
fetch_article_chroma_mappings()以返回所有文章→Chroma ID映射,用于漂移分析
5. 添加向量存储分页助手
文件: backend/app/vector_store.py
- 实现
list_articles(limit, offset)以返回带有元数据和预览的分页Chroma文档 - 实现
list_all_ids()以返回所有存储的Chroma ID用于漂移检测(由/debug/storage/drift使用)
6. 暴露调试API端点
文件: backend/app/api/routes/debug.py
- 添加
GET /debug/startup→ 返回启动指标时间线(事件+注释) - 添加
GET /debug/chromadb/articles→ 返回带有限制/偏移的分页原始Chroma条目 - 添加
GET /debug/database/articles→ 返回带有过滤器(来源、嵌入、日期范围、排序)的分页Postgres行 - 添加
GET /debug/storage/drift→ 比较Chroma ID与Postgres映射,返回缺失/悬空计数+样本
7. 添加前端API绑定
文件: frontend/lib/api.ts
- 导出类型:
StartupEventMetric,StartupMetricsResponse,ChromaDebugResponse,DatabaseDebugResponse,StorageDriftReport - 导出获取函数:
fetchStartupMetrics(),fetchChromaDebugArticles(),fetchDatabaseDebugArticles(),fetchStorageDrift() - 确保响应字段的snake_case→camelCase映射
8. 构建调试仪表板页面
文件: frontend/app/debug/page.tsx
- 创建带有多标签检查UI的
/debug路由 - 渲染启动时间线:阶段名称、持续时间、元数据徽章(缓存大小、向量、迁移记录)
- 显示Chroma浏览器:带有ID、标题、来源、预览的分页表格
- 显示Postgres浏览器:带有过滤器(来源、日期范围、仅缺失嵌入标志)的分页表格
- 显示漂移报告:缺失于Chroma和悬空于Chroma条目的样本表格
- 包含用于快速指标(启动时间、文章总数、向量计数、漂移计数)的摘要卡片
实施清单
- [ ] 创建
backend/app/services/startup_metrics.py - [ ] 仪表化
backend/app/vector_store.py::VectorStore.__init__() - [ ] 仪表化
backend/app/main.py::on_startup()(所有阶段) - [ ] 将
fetch_articles_page()和fetch_article_chroma_mappings()添加到backend/app/database.py - [ ] 将
list_articles()和list_all_ids()添加到backend/app/vector_store.py - [ ] 将
/debug/startup,/debug/chromadb/articles,/debug/database/articles,/debug/storage/drift添加到backend/app/api/routes/debug.py - [ ] 将类型和获取函数添加到
frontend/lib/api.ts - [ ] 创建带有仪表板布局的
frontend/app/debug/page.tsx - [ ] 运行
uvx ruff check backend→ 所有检查通过 - [ ] 在curl或Postman中测试端点以验证响应结构
验证清单
- [ ]
GET http://localhost:8000/debug/startup返回带有事件和注释的有效时间线 - [ ]
GET http://localhost:8000/debug/chromadb/articles?limit=50&offset=0返回分页的Chroma文档 - [ ]
GET http://localhost:8000/debug/database/articles?source=bbc&missing_embeddings_only=false正确过滤 - [ ]
GET http://localhost:8000/debug/storage/drift比较计数并返回漂移样本 - [ ]
http://localhost:3000/debug无错误加载并显示所有四个部分 - [ ] 刷新按钮并行触发所有四个API调用
- [ ] 分页控件正确更新限制/偏移
- [ ] 数据库过滤器(来源、日期范围)更新并刷新数据
- [ ] 如果后端刚刚启动,启动时间线显示非零阶段持续时间
未来增强
- 通过SSE流式传输启动指标(启动期间的实时跟踪)
- 将启动报告导出为JSON/CSV以进行随时间变化的性能跟踪
- 自动漂移警报(如果悬空条目 > 阈值,则发布到Slack/电子邮件)
- 性能图表(启动时间趋势、文章吞吐量)
- 按需同步操作(按钮强制刷新缺失文章的向量存储)