Claude Code SDK #35:Monitoring 全解——OTel metrics × events × traces,把 AI 编程从黑箱变成可观测系统
July 3, 2026 · 9:17 AM

Claude Code SDK #35:Monitoring 全解——OTel metrics × events × traces,把 AI 编程从黑箱变成可观测系统

Claude Code 的 Monitoring 把用量、成本、工具活动和调用链导出到 OpenTelemetry。本篇拆解 metrics、events、traces 的分工、最小接入配置、隐私开关和团队落地顺序,帮助开发者把 AI 编程从个人黑箱变成可观察的工程系统。

今天这期讲一个很多团队会晚做、但一旦出了问题就会后悔没早做的能力:Claude Code 的 Monitoring。
如果你只是个人用 Claude Code 写代码,看到「OpenTelemetry」可能会下意识跳过。但团队里只要出现这些问题,它就不再是运维锦上添花,而是排障入口:谁的会话最烧钱?哪个子 Agent 在反复失败?为什么一次看似普通的 prompt 触发了多次模型请求和工具调用?Claude Code 官方把用量、成本、工具活动导出到 OpenTelemetry,metrics 走时间序列协议,events 走 logs/events 协议,traces 目前是可选 beta。1
我的建议很直接:先接 metrics 和 events,等你真的需要追一条请求链路,再开 traces。不然你会先被观测数据淹没,而不是先解决团队最关心的成本、失败率和工具权限问题。

1. Monitoring 到底在监控什么?

Claude Code 的监控不是「截屏式回放」,也不是把整段对话默认传到后台。官方文档给出的主线是三层:metrics、events、traces。1
层级你拿到什么适合回答的问题
Metrics会话数、代码改动行数、PR 数、commit 数、成本、token、编辑工具决策、活跃时间等指标。2哪些团队、入口、模型、子 Agent 最耗资源?趋势有没有异常?
Eventsuser_promptassistant_responsetool_resultapi_requestapi_error 等事件。3某一次失败发生在哪一步?工具是被拒绝、失败,还是模型请求报错?
Traces每个 prompt 到 API 请求、工具执行、hook、子 Agent 的 span 树。tracing 默认关闭,需要额外打开 beta 开关。4一次复杂任务为什么慢?子 Agent、工具、模型请求之间的调用链是什么?
这里有个容易混淆的点:Monitoring 和 /doctor 不是一回事。/doctor 是本机健康检查,能检查安装、settings、MCP server 和 context usage;如果 claude 启动不了,可以在 shell 里跑 claude doctor5 Monitoring 则是把运行数据持续导出给你的监控后端,用来做团队级观察、告警和审计。

2. 最小可用配置:先让 metrics 和 logs 出来

官方 quick start 用环境变量启用 telemetry:设置 CLAUDE_CODE_ENABLE_TELEMETRY=1,再按需选择 OTEL_METRICS_EXPORTEROTEL_LOGS_EXPORTER,OTLP exporter 可以配置协议、endpoint 和认证 header。6 文档还写明,metrics 默认 60 秒导出一次,logs 默认 5 秒导出一次;调试时可以缩短,生产环境要记得调回去。6
可以把它理解成两条管道:
# 1. 打开 Claude Code telemetry
export CLAUDE_CODE_ENABLE_TELEMETRY=1

# 2. 指标:适合进 Prometheus / OTLP collector / 可视化看板
export OTEL_METRICS_EXPORTER=otlp

# 3. 事件:适合排查某次 prompt、tool、API 请求
export OTEL_LOGS_EXPORTER=otlp

# 4. OTLP 目的地
export OTEL_EXPORTER_OTLP_PROTOCOL=grpc
export OTEL_EXPORTER_OTLP_ENDPOINT=http://localhost:4317

claude
如果只是本机试跑,官方示例也支持把 metrics exporter 设成 console,或者只开 metrics、只开 events/logs。7 这对第一次接入很有用:先确认字段长什么样,再决定要不要送进正式 collector。
团队部署时,不建议让每个开发者手动 export。管理员可以把 OpenTelemetry 相关环境变量写进 managed settings,并通过 MDM 或设备管理方式下发;文档明确说 managed settings 里的环境变量优先级高,用户不能覆盖。8 Settings 文档也给出同样的优先级:Managed 最高,其次是命令行参数、Local、Project、User。9

3. Metrics:先盯住成本、token 和工具决策

Monitoring 最值得先落地的是 metrics,因为它不会逼你一上来处理海量文本事件。
Claude Code 导出的指标里,claude_code.cost.usage 记录会话成本,claude_code.token.usage 记录 token 用量,claude_code.active_time.total 记录用户交互和 CLI 处理产生的活跃时间;它还会导出 claude_code.code_edit_tool.decision,统计 Edit、Write、NotebookEdit 这类代码编辑工具的权限决策。2
这几个指标足够搭第一版看板:
看板问题建议字段你能发现什么
成本有没有突然升高?claude_code.cost.usage,按 modelquery_sourcespeedeffort 聚合。10某个子 Agent、某个模式或某类请求在烧钱。
token 是否被上下文拖大?claude_code.token.usage,按 input、output、cacheRead、cacheCreation 区分。11是输入上下文太大,还是输出过长,或者缓存命中结构不对。
编辑工具为什么频繁卡住?claude_code.code_edit_tool.decision,按 tool_namedecisionsourcelanguage 看。12是权限规则太紧、hook 拦截太多,还是用户在高频拒绝某类改动。
开发者到底有没有在等?claude_code.active_time.totalusercli 区分。13时间花在用户输入阅读,还是 CLI/工具执行。
字段维度别贪多。官方提供了 OTEL_METRICS_INCLUDE_SESSION_IDOTEL_METRICS_INCLUDE_VERSIONOTEL_METRICS_INCLUDE_ACCOUNT_UUIDOTEL_METRICS_INCLUDE_ENTRYPOINTOTEL_METRICS_INCLUDE_RESOURCE_ATTRIBUTES 这组开关来控制 metrics 里的 attributes;文档也提醒,降低 cardinality 通常能换来更好的查询性能和更低的存储成本。14
说人话:不要第一天就把每个 session、每个团队、每个自定义资源字段都塞进 label。Prometheus 类系统最怕 label 爆炸,Claude Code 这种交互式工具又天然会产生很多会话维度。先按团队、入口、模型、请求来源做粗粒度聚合,等问题真的需要下钻,再放开更细字段。

4. Events:用 prompt.id 串起一次任务

Events 是排障用的,不是拿来天天盯大盘的。
官方文档说,用户提交 prompt 后,Claude Code 可能发起多次 API 请求并运行多个工具;prompt.id 是把这些事件关联回同一个 prompt 的 UUID。15 它不会挂到 metrics 上,因为每个 prompt 都会生成唯一 ID,放进指标会造成无限增长的时间序列;文档建议把它用于 event-level 分析和审计。15
排障时可以按这个顺序查:
  1. 先用 api_error 看模型请求有没有失败。这个事件会记录 model、error、status_code、duration_ms、attempt、request_id、speed、query_source、effort 等信息。16
  2. 再用 tool_result 看工具是否执行成功。它会记录 tool_name、tool_use_id、success、duration_ms、error_type、输入输出大小,以及权限决策来源等字段。17
  3. 最后看 assistant_response 是否真的产出了文本。这个事件只包含模型响应里的文本块,不包含 thinking block 和 tool-use block;它要求 Claude Code v2.1.193 或更高版本。18
注意隐私开关。OTEL_LOG_USER_PROMPTS 默认关闭;OTEL_LOG_ASSISTANT_RESPONSES 默认也不会直接暴露响应文本,且未设置时会跟随 OTEL_LOG_USER_PROMPTSOTEL_LOG_TOOL_DETAILS 会打开 Bash 命令、MCP server/tool 名称、skill 名称和工具输入等细节。19 更重的 OTEL_LOG_RAW_API_BODIES 会导出完整 Messages API 请求和响应 JSON,文档明确说 bodies 包含完整 conversation history,打开它等同于同意暴露 prompt、tool details 和 tool content 会揭示的所有内容。19
所以团队默认策略可以很保守:metrics 常开,events 常开但内容默认脱敏;只有在隔离环境、短时间排障、并且明确告知开发者时,才打开 prompt、tool input 或 raw body 级别的内容。

5. Traces:只在你需要「调用链」时打开

Tracing 的价值很大,但别把它当第一步。
官方定义里,distributed tracing 会把每个 user prompt 链接到它触发的 API request 和 tool execution,让你在 tracing backend 里看到一条完整 request。它默认关闭;要启用,需要同时设置 CLAUDE_CODE_ENABLE_TELEMETRY=1CLAUDE_CODE_ENHANCED_TELEMETRY_BETA=1,再设置 OTEL_TRACES_EXPORTER4
它的 span 树很适合分析复杂任务。文档给出的层级是:claude_code.interaction 作为 root span,下面挂 API request、tool call、hook;tool span 又有等待权限决策和实际执行两个子 span;Agent tool 或 legacy Task tool 生成子 Agent 时,子 Agent 的 API 和 tool spans 会嵌套在父级 claude_code.tool span 下面。20
还有一个工程上很有用的细节:tracing 开启后,Bash 和 PowerShell 子进程会自动继承 TRACEPARENT,这样读这个变量的子进程可以把自己的 spans 挂到同一条 trace 下面。4 如果 Claude Code 直接连 Anthropic API,模型请求还会携带 W3C traceparent header;通过自定义 ANTHROPIC_BASE_URL proxy 时,默认不传播,需要设置 CLAUDE_CODE_PROPAGATE_TRACEPARENT=14
这意味着你可以把 Claude Code 变成现有分布式链路的一部分,而不是在 IDE 旁边另起一个黑箱。但这也意味着 traces 的信息量更大、治理要求更高。开之前先回答三个问题:谁能看 trace?保留多久?哪些字段必须保持 redacted?

6. 一个可落地的接入顺序

如果我是给一个 20 人研发团队接 Claude Code Monitoring,我会按这个顺序来:
  1. 本机 console 试跑一天:只开 metrics 或 logs 的 console exporter,确认字段和事件量。官方示例支持 console、otlp、prometheus、metrics only、events/logs only 等配置。7
  2. 接 OTLP collector:把 OTEL_METRICS_EXPORTER=otlpOTEL_LOGS_EXPORTER=otlp 送到统一 collector,先保留默认导出间隔。quick start 里默认 metrics 为 60000ms、logs 为 5000ms。6
  3. 下发团队维度:用 OTEL_RESOURCE_ATTRIBUTESdepartment=engineering,team.id=platform,cost_center=eng-123 这类自定义属性。文档要求它是逗号分隔的 key=value,不能有空格;需要空格时用下划线、camelCase 或 percent-encoding。21
  4. 收紧 cardinality:默认先不要打开所有 session 级细分;如果自定义资源字段太多,可以用 OTEL_METRICS_INCLUDE_RESOURCE_ATTRIBUTES=false 让它们只进 resource block,不进入每条 metric series 的 label。21
  5. 只给排障窗口开明文字段:需要查一次事故时,再短期开 OTEL_LOG_TOOL_DETAILS 或相关文本开关;查完关闭。prompt、工具输入、raw API bodies 都不是默认该开的东西。19
  6. 最后再上 traces:当 metrics 告诉你「慢」,events 告诉你「哪次失败」,但你还不知道「调用链为什么变成这样」,再打开 tracing beta。4
还有一个坑:Claude Code 不会把 OTEL_* 环境变量传给它启动的 Bash tool、hooks、MCP servers 和 language servers。也就是说,你通过 Bash tool 跑了一个自己带 OpenTelemetry 的应用,它不会自动继承 Claude Code 的 exporter endpoint 或 headers;需要在那个命令里单独设置。8

7. 今天就能做的最小动作

别从「我要搭完整观测平台」开始。今天先做三件事:
  • 在一台测试机上打开 CLAUDE_CODE_ENABLE_TELEMETRY=1,把 metrics exporter 指到 console 或 OTLP collector。6
  • 做一张只包含成本、token、活跃时间、编辑工具决策的看板。官方已经导出这些 metrics,足够判断 Claude Code 在团队里是不是失控。2
  • 写一条隐私规则:默认不记录 prompt 原文、assistant response、tool input 和 raw API bodies;只有明确排障窗口才开。相关开关在官方变量表里都有列出,且多个内容字段默认关闭。19
Claude Code 真正进入团队开发后,最危险的不是「它不会写代码」,而是「它做了很多事,但你不知道它为什么这么做、花了多少钱、卡在哪一步」。Monitoring 解决的就是这个问题:把 AI 编程从一个聪明的终端,变成能被团队观察、复盘和约束的工程系统。

More from this channel

Related content

  • Sign in to comment.