Bible Network Crypto DeFi Onchain RWA AI Agent Stablecoin Chain SAFU CryptoTax DeFAI AGI Claude Me Claude Skill Claude Design Claude Cowork
獨立知識媒體
與任何項目無關聯
學會用 Claude,每件事都做得更好
claudeskill-me.com
最新
用 OpenTelemetry 看 Claude Code 的壓縮與 hook:compaction、hook_execution_complete 與 precompute_reuse 欄位怎麼讀  ·  Bash 權限規則的盲區:deny 擋不住 /bin/rm、bash -c 與 git -C,devbox run * 還會放行內層任何命令  ·  CLAUDE.md 太長了怎麼辦:用 .claude/rules/ 與 paths 讓規則只在碰到特定檔案時才載入  ·  沙盒裡跑 Chromium 出現 No usable sandbox!:--no-sandbox、excludedCommands、allowNestedUserNamespaces 三種解法各放棄什麼  ·  Claude Code v2.1.309:沙盒啟動檔不再在沙盒外執行、denyWrite 經 symlink 失效等一批沙盒與權限缺口修正  ·  auto mode 的 $defaults 陷阱:autoMode.soft_deny 少放一個字串,內建的 force push 攔截規則就整批消失
advanced

用 OpenTelemetry 看 Claude Code 的壓縮與 hook:compaction、hook_execution_complete 與 precompute_reuse 欄位怎麼讀

30 秒速讀
別只用 OpenTelemetry 看 token 與成本;壓縮有沒有重用預備摘要、hook 有沒有默默失敗,事件裡都有欄位。

完整解析 +
01 · 為什麼發生?

最快怎麼確認事件有出來?

設 CLAUDE_CODE_ENABLE_TELEMETRY=1 與 OTEL_LOGS_EXPORTER=console,啟動後送一個 prompt,看輸出裡有沒有 claude_code.user_prompt。這是文件的驗證方式;我沒有實際跑過。

02 · 運作原理是什麼?

precompute_reuse 是什麼?

文件說自動壓縮可以在 context window 填滿前先在背景準備摘要,這個欄位記錄壓縮有沒有重用它:hit 為重用,miss_custom_instructions、miss_hook、miss_not_ready 為重算的原因。

03 · 如何應用

怎麼知道 hook 有沒有默默失敗?

看 hook_execution_complete 的 num_non_blocking_error,大於 0 表示有 hook 失敗但沒有阻擋動作。這是依欄位定義的推論,不是官方文件的診斷建議。

04 · 我該怎麼做?

不是工程師,這跟我有什麼關係?

如果你的團隊要知道 Claude Code 在做什麼、哪裡出問題,這些事件就是儀表板的原料。不需要看懂每個欄位,但可以請工程師確認有沒有開、誰在看。

完整內容 +

Claude Code 可以把自己的行為輸出成 OpenTelemetry 事件。多數介紹都停在「可以看 token 與成本」,但官方監控文件還列了壓縮、hook、工具決定等事件,對「為什麼這個 session 變慢/變貴/被擋」很有用。本文整理其中三組事件的欄位與用法。欄位名稱與說明來自官方 Monitoring 文件;我沒有架過收集器實測,所以「怎麼用」一節是我的推論,會標明。

先把事件開起來

文件的最小設定:CLAUDE_CODE_ENABLE_TELEMETRY=1 是必要的,再用 OTEL_LOGS_EXPORTER 選 otlp、console 或 none。先用 console 看看輸出最省事:

export CLAUDE_CODE_ENABLE_TELEMETRY=1
export OTEL_LOGS_EXPORTER=console   # options: otlp, console, none
claude

要送進收集器就改成 OTLP:

export CLAUDE_CODE_ENABLE_TELEMETRY=1
export OTEL_LOGS_EXPORTER=otlp
export OTEL_EXPORTER_OTLP_PROTOCOL=grpc
export OTEL_EXPORTER_OTLP_ENDPOINT=http://localhost:4317
export OTEL_LOGS_EXPORT_INTERVAL=5000   # default 5000 ms

文件說只開事件(logs)時,送出一個 prompt 後應該看到 claude_code.user_prompt 事件,就代表通了。工具參數等細節預設不記,需要設 OTEL_LOG_TOOL_DETAILS=1。

事件一:claude_code.compaction

每次壓縮完成時記錄一筆,欄位包括 trigger(auto 或 manual)、success、duration_ms、pre_tokens、post_tokens(都是近似值)、失敗時的 error,以及 precompute_reuse。最後這個值得細看:文件說自動壓縮可以在 context window 填滿之前,先在背景準備好摘要,precompute_reuse 記錄這次壓縮有沒有重用那份預先準備的摘要。"hit" 表示重用;"miss_custom_instructions"、"miss_hook"、"miss_not_ready" 說明為什麼改成現算一份。這個欄位只在 trigger 是 manual,或是閒置壓縮(idle compaction,會把 trigger 報成 auto)時才有。

事件二:hook 的三個事件

  • claude_code.hook_registered:session 開始時,每個設定好的 hook 記一筆,文件說用來盤點整個團隊啟用了哪些 hook。欄位有 hook_event(如 PreToolUse)、hook_type(command、prompt、mcp_tool、http、agent)、hook_source(userSettings、projectSettings、localSettings、flagSettings、policySettings、pluginHook)與 safe_mode。
  • claude_code.hook_execution_start:一個 hook 事件開始執行,帶 hook_name(含 matcher,如 PreToolUse:Write)與 num_hooks。
  • claude_code.hook_execution_complete:該事件的所有 hook 結束時記一筆,有 num_success、num_blocking(回傳阻擋決定的數量)、num_non_blocking_error(失敗但沒有阻擋)、num_cancelled、total_duration_ms。v2.1.280 起另有 stdout_chars、additional_context_chars、system_message_chars 等字元數,以及超過 10,000 字元上限而被存成檔案的 num_outputs_persisted。

事件三:工具決定與其他

claude_code.tool_decision 記錄每次工具核准或拒絕:decision 是 accept 或 reject,source 是 config、hook、user_permanent、user_temporary、user_abort 或 user_reject,tool_source 是 builtin、mcp 或 sdk_host_builtin_mcp。v2.1.307 的更新說明另寫:修正了多數 auto mode 分類器阻擋的事件缺少 classifier_category,並新增 claude_code.safety_event,對每個被權限規則、auto mode、安全檢查、hook 或沙盒擋下、詢問或退回的工具呼叫發出。我沒有查到 safety_event 的欄位清單,所以不在此列。文件還列了 at_mention、api_retries_exhausted、子代理完成與 Skill 啟用等事件。

我的推論:這些欄位可以回答什麼問題

以下是我依欄位意義做的推論,沒有實測:

  • 「壓縮是不是太頻繁?」看 compaction 事件的次數,與 pre_tokens/post_tokens 的比例;success=false 搭配 error 是需要處理的。
  • 「預先準備的摘要有幫上忙嗎?」看 precompute_reuse 的 hit 與各種 miss 的比例;大量 miss_hook 暗示壓縮相關的 hook 讓預備摘要作廢(這是我對欄位名稱的解讀)。
  • 「我的 hook 有沒有在默默失敗?」hook_execution_complete 的 num_non_blocking_error 大於 0,表示有 hook 失敗但沒擋住動作;這和之前 hooks 預設 fail-open 的行為相呼應。
  • 「團隊裡誰載入了哪些 hook?」用 hook_registered 的 hook_source 與 Plugin.name 看專案、使用者與外掛各貢獻了什麼。

注意兩件事:這些事件是 session 層級的行為紀錄,不是稽核的完整證據;官方文件也沒有保證每個欄位在所有環境都存在,像 hook_definitions 就要同時開啟詳細追蹤與 OTEL_LOG_TOOL_DETAILS=1 才有。

資料來源:Monitoring - Claude Code Docs、Claude Code changelog - Claude Code Docs
圖解
Claude Code OpenTelemetry 事件地圖:compaction、hook、tool_decision從環境變數開啟到收集器,三組事件的重點欄位,以及依欄位定義做的推論(未實測)Claude Code OpenTelemetry events worth watchingClaude CodeCLAUDE_CODE_ENABLE_TELEMETRY=1OTEL_LOGS_EXPORTEROTLPCollector orconsole outputclaude_code.compactiontrigger: auto | manualpre_tokens / post_tokensduration_ms, success, errorprecompute_reuse:hit | miss_not_ready |miss_hook | miss_custom_instructionsclaude_code.hook_*hook_registered (inventory)hook_execution_starthook_execution_complete:num_success, num_blocking,num_non_blocking_error,total_duration_msclaude_code.tool_decision: decision (accept | reject), source, tool_sourcev2.1.307: classifier_category fixed, new claude_code.safety_eventMy inference, untested: num_non_blocking_error > 0 means a hook failed without blocking (fail-open)Many miss_hook may mean a hook invalidates the prepared summary (reading of the field name)Tool parameters are off by default: set OTEL_LOG_TOOL_DETAILS=1Claude Skill Me · claudeskill-me.com
歡迎截圖分享,轉載請註明來源
提問
請至少輸入 10 個字
相關文章
你的 rm -rf 保護可能從沒生效過:用 bash -c 包一層,Claude Code 的安全提示直接被繞過
advanced · 10/05
Hook 明明顯示「blocking error」,檔案卻還是被改了?PostToolUse 跟 PreToolUse 的「阻擋」根本不是同一件事
practice · 09/28
Fork 子代理不再從空白開始、直接繼承整段對話——v2.1.302 起在 VS Code、桌面版與 headless 預設開啟
advanced · 10/19
設了 Auto Mode 就以為安全了?權限模式跟沙盒邊界是兩道完全不同的防線,混為一談會出事
advanced · 09/28
相關新聞
更多相關主題