可观测性要回答的三个问题
当一个 Skill/Agent 上线后,你迟早会遇到:
- 失败了:卡在哪一步?谁触发的?能否重试?
- 变贵了:哪一步调用次数暴涨?哪段上下文膨胀?
- 变慢了:是外部工具慢还是模型慢?是缓存 miss 还是限流?
可观测性就是把这些问题变成“看日志就能回答”。
Trace 的最小字段集(建议全链路一致)
建议你至少在每次请求/每次工具调用/每次模型调用里带这些字段:
task_id:一次业务任务的唯一 IDrun_id:一次执行实例(重试会不同)step_id:第几步skill_name/skill_versiontool_name/tool_call_iduser_id(如有)tenant_id(如有)budget_tokens/budget_costlatency_msok/error_type
这些字段决定了你是否能聚合统计与定位问题。
结构化日志:别写“自由文本”
日志建议输出 JSON(或等价结构),例如:
{
"task_id": "t_123",
"run_id": "r_456",
"step_id": "s_03",
"event": "tool_call",
"tool_name": "github.get_pull_request",
"latency_ms": 231,
"ok": true
}
错误日志:
{
"task_id": "t_123",
"run_id": "r_456",
"event": "tool_error",
"tool_name": "github.get_pull_request",
"ok": false,
"error_type": "TOOL_RATE_LIMIT",
"retryable": true
}
指标:先做 6 个就够用
上线初期,先把 6 个指标做出来:
- 成功率(per skill)
- 失败类型分布(INVALID_INPUT/TOOL_TIMEOUT/…)
- P50/P95 延迟(per skill、per tool)
- 平均调用次数(模型调用次数、工具调用次数)
- 平均成本(tokens/cost)
- 缓存命中率(如果有缓存)
这些指标能覆盖大部分运营与优化决策。
动手做:用“事件流”还原一次执行
建议你把一次执行拆成事件流:
task_startmodel_call(可选:planning/generation)tool_calltool_resulttask_end
任何排障都能通过按 task_id 聚合事件流来回放发生了什么。
工程化清单
- trace 字段全链路一致(请求/模型/工具)
- 日志结构化(可聚合查询)
- 指标最小集合齐全(成功率、延迟、成本、调用次数)
- error_type 枚举化(便于统计与告警)
常见坑
- 只打“文本日志”:无法聚合统计,也很难回放
- tool_call 不记录参数与摘要:排障时无法复现(注意脱敏)
- 没有预算字段:成本失控后无法回溯原因
下一篇:安全与护栏:越权、注入、数据泄漏。