What is the fastest way to confirm events are flowing?
Set CLAUDE_CODE_ENABLE_TELEMETRY=1 and OTEL_LOGS_EXPORTER=console, start Claude Code, send a prompt and look for claude_code.user_prompt. That is the docs' verification method; I have not run it.
What is precompute_reuse?
The docs say auto-Compaction can prepare a summary in the background before the window fills, and this field records whether the compaction reused it: hit means reused, and miss_custom_instructions, miss_hook, miss_not_ready give the reason for recomputing.
How do I tell whether a hook is failing silently?
Look at num_non_blocking_error in hook_execution_complete; above zero means a hook failed without blocking the action. That is inference from the field definition, not a diagnostic recommendation from the docs.
I'm not an engineer. Why does this matter to me?
If your team needs to know what Claude Code is doing and where it goes wrong, these events are the raw material for a dashboard. You do not need to read every field, but you can ask an engineer whether it is on and who is watching.
Claude Code can export its own behavior as OpenTelemetry events. Most introductions stop at "you can see tokens and cost", but the official monitoring docs also list Compaction, hook and tool-decision events that help answer why a session got slow, expensive or blocked. This article covers the fields of three groups of events. Field names and descriptions come from the official Monitoring page; I did not stand up a collector to test, so the "how to use it" section is my inference and says so.
The docs' minimal setup: CLAUDE_CODE_ENABLE_TELEMETRY=1 is required, then pick otlp, console or none with OTEL_LOGS_EXPORTER. Console is the easiest way to look first:
export CLAUDE_CODE_ENABLE_TELEMETRY=1
export OTEL_LOGS_EXPORTER=console # options: otlp, console, none
claude
To send to a collector, switch to 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
The docs say that for a logs-only setup, submitting a prompt should produce a claude_code.user_prompt event, which confirms it works. Tool parameters and similar detail are not recorded by default; set OTEL_LOG_TOOL_DETAILS=1 for them.
One record per completed compaction, with trigger (auto or manual), success, duration_ms, pre_tokens and post_tokens (both approximate), error on failure, and precompute_reuse. The last one deserves a close look: the docs say auto-compaction can prepare a summary in the background before the Context Window fills, and precompute_reuse records whether this compaction reused that prepared summary. "hit" means it was reused; "miss_custom_instructions", "miss_hook" and "miss_not_ready" give the reason a fresh summary was computed instead. The attribute is set only when trigger is manual or for an idle compaction, which reports trigger as auto.
claude_code.hook_registered: one record per configured hook at session start, which the docs say is for inventorying active hooks across a fleet. Fields include hook_event (such as PreToolUse), hook_type (command, prompt, mcp_tool, http, agent), hook_source (userSettings, projectSettings, localSettings, flagSettings, policySettings, pluginHook) and safe_mode.claude_code.hook_execution_start: hooks begin executing for a hook event, with hook_name (including the matcher, such as PreToolUse:Write) and num_hooks.claude_code.hook_execution_complete: all hooks for the event have finished, with num_success, num_blocking (returned a blocking decision), num_non_blocking_error (failed without blocking), num_cancelled and total_duration_ms. From v2.1.280 there are also character counts such as stdout_chars, additional_context_chars and system_message_chars, plus num_outputs_persisted for outputs over the 10,000-character cap that were saved to a file.claude_code.tool_decision records each tool approval or rejection: decision is accept or reject, source is config, hook, user_permanent, user_temporary, user_abort or user_reject, and tool_source is builtin, mcp or sdk_host_builtin_mcp. The v2.1.307 release notes add that they fixed classifier_category missing from most Auto Mode classifier blocks and added claude_code.safety_event, emitted for each tool call that a permission rule, auto mode, a safety check, a hook or the Sandbox stopped, prompted or sent back. I could not find a field list for safety_event, so I do not list one. The docs also list at_mention, api_retries_exhausted, Subagent-completed and Skill-activated events.
The following is inference from what the fields mean; I have not tested it:
compaction events and look at the pre_tokens to post_tokens ratio; success=false with an error needs attention.precompute_reuse hits with the various misses; many miss_hook values suggest a compaction-related hook is invalidating the prepared summary (my reading of the field name).num_non_blocking_error above zero in hook_execution_complete means a hook failed without stopping the action, which echoes the earlier fail-open default for hooks.hook_source and Plugin.name from hook_registered to see what project, user and plugins each contribute.Two cautions: these events are a session-level behavior record, not complete audit evidence, and the docs do not promise every field exists everywhere; hook_definitions, for example, appears only when detailed beta tracing and OTEL_LOG_TOOL_DETAILS=1 are both on.