claudecode学习 第 20 章 · 遥测与可观测性

1 阅读4分钟

目标:讲清 Claude Code 的遥测体系——1710 个 tengu_* 事件、两层分发(be/pe/M/Ne)、本地失败事件存储、事件命名规范与分类、遥测对用户体验的反向作用(/plugin stats/cost、session 分析)。这是运行时纵深的第三章——从"发生什么"到"怎么知道发生了什么"。 受众:专业程序员。本机版本 2.1.220


20.1 发现:1710 个遥测事件

二进制 strings 中提取的 tengu_* 事件名共 1710 个。Claude Code 几乎在所有操作上都打点。


20.2 两层遥测体系

层级函数名含义目标
Behaviorbe("event_name")正常操作发生了Anthropic 服务器
Problempe("event_name")操作失败了服务器 + 本地磁盘
MetricM("event_name", data)带结构化数据的指标服务器
NegativeNe("event_name")只在对应 flag 开启时上报调试用途

pebe 的区别:

  • be("skill_invoke") — skill 被成功调用。正常事件。
  • pe("skill_invoke_not_found") — skill 没找到。问题事件。

20.3 本地存储

~/.claude/telemetry/
├── 1p_failed_events.<sessionId>.<uuid>.json   ← 发送失败的事件
├── 1p_failed_events.<sessionId>.<uuid>.json
└── ...(33 个文件)

1p_failed_events = 第一方 failed events。正常事件直接上报 Anthropic 服务器。如果发送失败(网络问题、服务端暂时不可用),事件写入本地 JSON 文件,下次启动时重试上报

文件名包含 sessionId 和随机 uuid——同一次 session 可能产生多个失败批次。


20.4 事件命名规范

所有事件以 tengu_ 为前缀(Claude Code 内部代号)。三段式命名:

tengu_<category>_<detail>

按 category 分类统计

类别数量示例
API~80tengu_api_querytengu_api_opus_fallback_triggeredtengu_api_slow_first_byte
Plugin~45tengu_plugin_official_marketplace_fetchtengu_plugin_*
Session~48tengu_session_search_toggledtengu_session_*
Agent~30tengu_agent_tool_selectedtengu_agent_tool_completedtengu_agent_stop_hook_*
Skill~8tengu_skill_tool_invocationtengu_skill_invoke_not_foundtengu_skill_tool_fork_recursion_blocked
Hook~6tengu_hook_plugin_metricstengu_agent_stop_hook_success
ASM(内部)~30tengu_amber_latticetengu_amber_flinttengu_alder_compass

ASM 是什么? amber_*alder_* 是 ASM(Agent Safety Monitor)的内部事件。这些不是用户可见功能——它们是 Anthropic 内部的安全和监控基础设施。


20.5 事件样例

正常事件(be)

be("skill_invoke")                    ← skill 被成功调用
be("plugin_official_marketplace_fetch") ← 官方 marketplace 拉取成功
be("workflow_discover")               ← workflow 发现完成
be("agent_launcher")                  ← agent 启动

问题事件(pe)

pe("skill_invoke_not_found")          ← skill 名称不存在
pe("skill_invoke_empty_name")         ← skill 调用时传了空名
pe("skill_invoke_model_disabled")     ← skill 被禁止通过模型调用
pe("plugin_official_marketplace_fetch") ← marketplace 拉取失败(重试后)
pe("agent_stop_hook_max_turns")       ← agent hook 达到最大轮次限制

带数据的指标事件(M)

M("tengu_skill_tool_invocation", {
  command_name: "frontend-design",
  execution_context: "inline",
  invocation_trigger: "claude-proactive",
  query_depth: 0,
  ...
})

Skill 每次被调用时上报触发方式(主动/嵌套)、执行环境(inline/fork)、触发深度。这些数据在 /plugin stats 中聚合显示。


20.6 遥测的反向作用

遥测不是单向的"发出去"。它反过来支撑用户可见的功能:

/plugin stats

显示每个 skill 的:

  • 过去 7 天的 token 消耗
  • 总调用次数(永不清零)
  • 上次使用时间

这些数据来自 tengu_skill_tool_invocation 事件的本地聚合。

/cost

每次 API 调用的 tengu_api_query 事件携带 token 数和模型。/cost 按 session 汇总显示。

Session 分析

tengu_session_* 事件记录会话层面的交互——搜索切换、分支过滤、项目切换。Anthropic 用这些数据优化 CLI 体验。

用户直接感知到的遥测

事件触发条件用户体验
tengu_api_opus_fallback_triggeredOpus 不可用"正在 fallback 到备用模型"
tengu_skill_invoke_not_foundSkill 名不存在"Unknown skill: X. Did you mean Y?"
tengu_agent_stop_hook_blockingStop hook 阻止停止"Agent hook condition was not met"
tengu_skill_tool_fork_recursion_blockedFork 递归被阻止,提示原因

20.7 用户控制

settings.json 中可禁用遥测(Ch06 提到过 API metrics opt-out)。事件种类和上报目标不可自定义——这是最终用户的二进制,不是开发者的 SDK。无法添加自定义事件或更改上报 endpoint。


20.8 本章核心带走

  1. 1710 个 tengu_* 事件——每个操作都打点。三段式命名:category_detail。

  2. 两层分发:正常事件(be)→ 直接上报;失败事件(pe)→ 写入本地 1p_failed_events.*.json,下次重试。

  3. /plugin stats/cost 的数据源是遥测,不是配置文件。skill 用量和 token 消耗来自事件聚合。

  4. 事件名是功能的反向索引。从 tengu_skill_tool_fork_recursion_blocked 可以确认"skill fork 防递归"存在。事件名验证了前 19 章讨论的大部分机制。

  5. 用户不可扩展——这是 black-box 遥测,不是 OpenTelemetry。只能开关,不能自定义。