E06第 1 / 1 课时未开始内容版本 1.0.0 · 核验于 2026-10-26

日志、指标与排错

日志、指标与排错 · 阅读后完成下方实验与检查题,再用「标记完成」记录进度。

学习目标

读完本课你能:用「类别 + 关联标识 + 指标」三件套组织可观测数据;沿一条真实失败路径完成从症状到原因的诊断;给日志系统立下「错误必须可枚举」的纪律。

问题场景

用户(就是你自己)报了个障:「AI 回答到一半断了」。你打开代码开始从头读——这是最慢的排错方式。五分钟后你想起来:服务端有 ai_call 表记着每次调用,消息表里有状态字段,前端错误事件带着类别。两分钟定位:cancelled,是你自己上周点过一次停止。排错的速度取决于记录的质量,本课把本站的记录系统串成一条诊断路径。

核心解释

可观测性三件套在本站的对应物(全部真实存在):

1. 结构化日志 = 带类别的记录。 错误不是一段文案,是一个可枚举的类别。AI 链路七类(not_configured / unreachable / quota / rate_limit / model_error / cancelled / unknown),代码执行五类(ok / timeout / tool_missing / syntax_error / runtime_error)。类别可枚举,才能聚合出「哪类失败最多」;自由文本只能人肉翻。

2. 关联标识 = 把散落的记录串成一条线。 一次对话有 conversation_id,一条消息有 message_id,一次模型调用记账时两个都带上(ai_call 表有这两列)。症状(「那条回答断了」)→ 消息 → 调用记录,一条标识跳到底。

3. 指标 = 面向问题的聚合。 日志回答「发生了什么」,指标回答「总体怎么样」:

-- 失败类别分布:排错的第一张图
SELECT COALESCE(error, '(ok)') AS err, COUNT(*) AS n, ROUND(AVG(latency_ms)) AS avg_ms
FROM ai_call
WHERE created_at > datetime('now', '-7 days')
GROUP BY err ORDER BY n DESC;

一条真实诊断路径(从症状到原因):

症状:回答中断,界面显示错误提示
 ↓ 前端 error 事件带 category(A10 协议:错误是控制信号不是正文)
 ↓ 按 message_id 查 ai_message:status 是 error / cancelled / 卡在 streaming?
 ↓ 按 message_id 查 ai_call:这条消息的调用记了什么类别?created_at 是几点?
 ↓ 对齐时间点查服务端日志(npm run start 的终端输出)
 ↓ 结论落进三个桶之一:本机问题(unreachable)/ 上游问题(rate_limit、quota)/
   预期内行为(cancelled 是用户自己停的,不算故障)

注意最后一步的纪律:cancelled 是正常分支(A12 的结论),混进故障统计会把「用户主动停止」算成事故,污染下一轮复盘(A40)。

示例拆解

复现并诊断一次真实失败(本机可做,五分钟):

# 1. 制造故障:把 .env.local 的 AI_BASE_URL 改成不存在的端口,重启
npm run dev

# 2. 发一条消息 → 界面出现错误提示(读类别:unreachable)

# 3. 查记录:这条消息和调用留下了什么?
#    ai_message:该 assistant 消息 status='error'(或因无内容被删除)
#    ai_call:无记录——请求没到模型就失败,账本如实反映「没有调用」

# 4. 修复:改回正确地址重启,重发消息 → done 事件 + ai_call 新记录

关键点:「ai_call 无记录」本身就是有效观测——它证明失败发生在连接层而非模型层,两层的修法完全不同(本机网络配置 vs 上游额度限流)。数据之间能互相印证,观测系统才算立住了:前端类别、消息状态、调用账本三者对得上,诊断才算闭环。

动手任务

  1. 按示例复现一次 unreachable,走完四步诊断路径,把每一层看到的内容记下来。
  2. 跑上面的聚合 SQL,报告最近 7 天的失败类别分布;如果有 cancelled,确认它被你排除在故障外。
  3. 挑一次历史失败,用关联标识把消息、调用、日志串成完整时间线,写成一段排错笔记。

常见错误

  • 错误只存文案不存类别:文案改一个字统计就断,类别才是稳定的统计键。
  • 排错先读代码:代码告诉你「可能怎么错」,数据告诉你「这次是什么错」——先看数据。
  • cancelled 算进故障率:用户主动停止是产品行为,算故障会误触发「优化」。
  • 日志与库对不上:改了落库字段忘了同步日志输出,时间线断链,诊断退化成猜测。

检查与复盘

  • 能报出 AI 链路七类错误和执行五类,并说出各自的处理方向
  • 沿「症状 → 消息 → 调用 → 日志」的路径完成过至少一次真实诊断
  • 失败统计里 cancelled 被正确排除

参考资料

检查题共 2 题,提交后立即显示解析
答案由服务端判定;答错的题会自动进入复习计划。
Q1故障定位中等

bug 现场:用户反馈「练习跑不过」,但服务端日志里只有零散的执行报错,无法确定对应哪一次运行;前端只显示「执行失败」。最有效的改造是?

Q2多选中等(多选,全部选对才算正确)

为代码执行器设计服务端日志。下列哪些字段是排错时真正必需的?(多选)

读完这一课了?

标记完成后,工作台会安排接下来的学习。

Command Palette

Search for a command to run...