Skip to content

fix+observability: 修复部署失败 + 日志落盘 + explain 全链路打点#60

Merged
bob798 merged 2 commits into
mainfrom
claude/performance-investigation-cXVqZ
May 26, 2026
Merged

fix+observability: 修复部署失败 + 日志落盘 + explain 全链路打点#60
bob798 merged 2 commits into
mainfrom
claude/performance-investigation-cXVqZ

Conversation

@bob798

@bob798 bob798 commented May 26, 2026

Copy link
Copy Markdown
Owner

Summary

围绕「为什么 tease 解读这么慢 + 部署起不来 + 服务器看不到日志」三个问题的一次性修复:

  • 修复部署失败:补齐 frontend/src/components/translate/tokenize.js(PR2 计划的分词工具,spec 测试与引用早已合入,但实现文件漏推 → Rollup 解析失败 → Vite 构建中断 → 镜像无产物)。11 个 vitest 测试全过、npm run build 成功。
  • 日志落盘app/logger.pyRotatingFileHandler(默认 10MB×5 轮转),stdout 不动;LOG_DIR 等 env 可配;Dockerfile/docker-compose/.gitignore 同步调整,容器日志挂到 /app/logs
  • explain 链路盲区打点app/services/explain_service.py 在入口 / cache HIT|MISS / prompt 拼装大小 / LLM 耗时 / JSON 解析 / 总耗时 + LLM 占比 等关键节点加 logger.info/debug。stream_sentence_explanation 同步覆盖。
  • 移除 Fly.io 残留:删除 fly.toml.dockerignore.omc / docs/decisions 里的指引同步更新成 VPS + docker-compose + Caddy。

改动文件

文件 改动
frontend/src/components/translate/tokenize.js 新增 52 行,对齐 spec §4.3
app/logger.py 加文件 handler + env 配置
app/services/explain_service.py _get_user_level / _cache_get / _cache_set / explain_text / stream_sentence_explanation 全链路 timing 打点
Dockerfile 创建 /app/logs /app/data
docker-compose.yml logs:/javarun/logslogs:/app/logs,加 LOG_DIR env
.gitignore logs/
.dockerignore 移除 fly.toml
fly.toml 删除
.omc/specs/* .omc/plans/* docs/decisions/* Fly.io 描述改成「已迁出」

一次解读请求会留下的日志样例

explain_text 入口 kind=word text_len=5 preview='tease' user=user_xxx force=False
cache_get MISS kind=word level=B1 耗时=0.019s
explain_text LLM 完成 kind=word output_len=52 耗时=0.05s
explain_text 完成 kind=word 来源=llm 总耗时=0.09s (LLM 占比=59%)

下次再有人反馈「某个词解读慢」,直接 docker compose exec dev-web tail -f /app/logs/app.log 就能立刻定位是 LLM 慢、cache 没命中、还是 prompt 太大。

Test plan

  • cd frontend && npx vitest run — tokenize.spec.js 11/11 通过
  • cd frontend && npm run build — Vite + PWA precache 构建成功,无 Could not resolve
  • pytest tests/test_v05_explain.py tests/test_v011_explain_refresh.py tests/test_v011_liaison_kb.py tests/test_v08_explain_autosave.py tests/test_v08_explain_stream_autosave.py tests/test_llm_logger.py — 42 通过;2 预先存在的 FakeClient mock 失败(stash 前同样失败,与本 PR 无关)
  • python -c "from main import app" 干净启动,104 路由
  • 端到端 mock LLM 跑 explain_text 两次(cache miss + hit),logs/app.log 真实写入完整链路日志
  • 全仓库 grep -i fly 已无指引性残留(仅保留 3 处「已迁出」历史标注)
  • 部署后在 VPS 上验证:docker compose exec dev-web ls /app/logs && tail -n 50 /app/logs/app.log

Generated by Claude Code

claude added 2 commits May 26, 2026 05:48
TranslateResult.vue 与 tokenize.spec.js 引用了
frontend/src/components/translate/tokenize.js,但该文件未提交,
导致 Rollup 解析失败 → Vite 构建中断 → 部署无产物。

按 docs/superpowers/specs/2026-05-19-translate-deepl-redesign-design.md
§4.3 实现:CJK 逐字 + 英文词(含 don't / well-known)+ 空白/标点
逐字符 token。每个 token 输出 {kind, text, interactive, index},
与 __tests__/tokenize.spec.js 的字段断言对齐(11 测试全过)。

space / punct 显式 interactive=false,便于父容器事件委托快速过滤。
1) 日志落盘(app/logger.py)
   - StreamHandler 旁路加 RotatingFileHandler(默认 10MB×5 轮转)
   - 通过 LOG_DIR / LOG_FILE / LOG_TO_FILE 等 env 配置
   - 目录创建失败时降级为仅 stdout,不阻断启动
   - Dockerfile 创建 /app/logs;docker-compose 挂 logs volume 并设 LOG_DIR=/app/logs
   - .gitignore 加 logs/,避免 dev 日志污染仓库

2) explain 链路盲区打点(app/services/explain_service.py)
   - 入口 / cache HIT|MISS / prompt 拼装大小 / LLM 耗时
     / JSON 解析 / cache 写入 / 总耗时 + LLM 占比
   - explain_text 与 stream_sentence_explanation 同步覆盖
   - 之前线上看 "tease 解读慢" 完全黑盒,现在能直接定位是 LLM
     慢、cache 没命中、还是 prompt 太大(liaison KB 占比)

3) 移除 Fly.io 残留(部署已切到 VPS + docker-compose + Caddy)
   - 删除 fly.toml
   - .dockerignore / .omc 规划文档 / docs/decisions 同步更新
   - 历史决策文档保留 "已迁出" 说明,便于回溯
@bob798 bob798 merged commit d406c1d into main May 26, 2026
1 check passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants