Quick start
Configure OpenTelemetry using environment variables:claude_code.session.count metric, which Claude Code emits when a session starts. To verify a logs-only setup, submit a prompt and check for the claude_code.user_prompt event.
If nothing arrives, run claude --debug and check the debug log. Claude Code reports failures from the exporters you configure as [3P telemetry] errors, where 3P means third-party. Lines prefixed [Anthropic telemetry] describe Anthropic’s separate operational telemetry and don’t indicate a problem with your setup.
For full configuration options, see the OpenTelemetry specification.
Administrator configuration
Administrators can configure OpenTelemetry settings for all users through the managed settings file. See the settings precedence for more information about how settings are applied. Example managed settings configuration:OTEL_* environment variables to the subprocesses it spawns, including the Bash tool, hooks, MCP servers, and language servers. An OpenTelemetry-instrumented application that you run through the Bash tool doesn’t inherit Claude Code’s exporter endpoint or headers, so set those variables directly in the command if that application needs to export its own telemetry.
How managed settings lock the OTLP destination
When you set anOTEL_EXPORTER_OTLP_* variable in managed settings, Claude Code removes conflicting developer-set variables at startup and logs a warning you can see with claude --debug. What it removes depends on which variable you set:
-
Endpoints: when you set
OTEL_EXPORTER_OTLP_ENDPOINT, Claude Code removes every developer-set per-signal endpoint. Developers can’t point one signal at a different collector, so you don’t need to also set the per-signal endpoint variables in managed settings. -
Protocols: when you set
OTEL_EXPORTER_OTLP_PROTOCOL, Claude Code removes every developer-set per-signal protocol. -
Credentials: when you set
OTEL_EXPORTER_OTLP_HEADERS,OTEL_EXPORTER_OTLP_CLIENT_KEY, orOTEL_EXPORTER_OTLP_CLIENT_CERTIFICATE, Claude Code removes the developer-set per-signal versions of that variable, plus every developer-set endpoint variable, generic or per-signal, since those credentials would otherwise reach a collector the managed settings didn’t choose. -
Exporter selectors:
OTEL_METRICS_EXPORTER,OTEL_LOGS_EXPORTER, and the betaOTEL_TRACES_EXPORTERfollow normal per-key precedence. A developer’s setting can still disable a signal or switch it to the console exporter, so set the selectors in managed settings too if you need them locked. Across admin sources,OTEL_LOGS_EXPORTERfollows the telemetry unit while the other two selectors merge per key. Requires Claude Code v2.1.223 or later. -
Beta tracing endpoints: with detailed beta tracing active, Claude Code exports logs and traces to
BETA_TRACING_ENDPOINTinstead of through the logs and traces exporters. Claude Code therefore removes a developer-setBETA_TRACING_ENDPOINTwhenever any of these managed settings decides either signal’s destination:- A generic or logs/traces endpoint or credential
- An
otelHeadersHelper - A logs or traces exporter selector set to
none,console, or empty, values that keep the signal off a collector CLAUDE_CODE_ENABLE_TELEMETRYturned off
BETA_TRACING_ENDPOINTredirected the logs and traces that detailed beta tracing exports even when managed settings pinned the collector.
Configuration details
Common configuration variables
These variables configure exporters, endpoints, and export behavior for all deployments. If you set a per-signal endpoint or protocol variable, such asOTEL_EXPORTER_OTLP_METRICS_ENDPOINT, Claude Code uses it instead of the generic variable for that signal. If you set a per-signal headers variable, such as OTEL_EXPORTER_OTLP_METRICS_HEADERS, Claude Code merges it with the generic OTEL_EXPORTER_OTLP_HEADERS for that signal. On machines with managed settings, see How managed settings lock the OTLP destination for what Claude Code removes.
For the
http/protobuf and http/json protocols, Claude Code sends each export request with a Content-Length header. Before v2.1.212, Claude Code versions from v2.1.191 onward sent these requests with chunked transfer encoding; Azure Monitor and other endpoints that require a declared length rejected them with 411 Length Required or 400 errors.
mTLS authentication
How you configure client certificates for the OTLP exporter depends on the OTLP protocol in use for that signal, set viaOTEL_EXPORTER_OTLP_PROTOCOL or the per-signal override. The same configuration applies to metrics, logs, and traces.
For
grpc, the OpenTelemetry SDK reads the standard OTLP variables directly, so existing configurations that set the per-signal metrics variables continue to work. On machines with managed settings, Claude Code may remove developer-set per-signal credentials and endpoints at startup.
Metrics cardinality control
The following environment variables control which attributes are included in metrics to manage cardinality:
Lower cardinality generally means better performance and lower storage costs but less granular data for analysis.
Traces (beta)
Distributed tracing exports spans that link each user prompt to the API requests and tool executions it triggers, so you can view a full request as a single trace in your tracing backend. Tracing is off by default. To enable it, set bothCLAUDE_CODE_ENABLE_TELEMETRY=1 and CLAUDE_CODE_ENHANCED_TELEMETRY_BETA=1, then set OTEL_TRACES_EXPORTER to choose where spans are sent. Traces reuse the common OTLP configuration for endpoint, protocol, headers, and mTLS. On machines with managed settings, Claude Code may remove developer-set per-signal credentials and endpoints at startup.
Spans redact user prompt text, tool input details, and tool content by default. Set
OTEL_LOG_USER_PROMPTS=1, OTEL_LOG_TOOL_DETAILS=1, and OTEL_LOG_TOOL_CONTENT=1 to include them.
When tracing is active, Bash and PowerShell subprocesses automatically inherit a TRACEPARENT environment variable containing the W3C trace context of the active tool execution span. This lets any subprocess that reads TRACEPARENT parent its own spans under the same trace, enabling end-to-end distributed tracing through scripts and commands that Claude runs.
When tracing is active and Claude Code is connected directly to the Anthropic API, each model request carries a W3C traceparent header set to the claude_code.llm_request span’s context, and the API’s traceresponse header is recorded as a span link. Together these connect Claude Code’s client-side spans to the server-side trace through any compliant intermediary. Outbound HTTP MCP requests carry traceparent the same way. The header is not sent to third-party providers.
By default, the traceparent header on model and HTTP MCP requests is sent only when ANTHROPIC_BASE_URL is unset or points at the Anthropic API, since some proxies reject unrecognized headers. The subprocess TRACEPARENT variable is controlled by the same switch for consistency. If you run Claude Code through a custom ANTHROPIC_BASE_URL proxy and want trace context propagated, set CLAUDE_CODE_PROPAGATE_TRACEPARENT=1.
In Agent SDK and non-interactive sessions started with -p, Claude Code also reads TRACEPARENT and TRACESTATE from its own environment when starting each interaction span. This lets an embedding process pass its active W3C trace context into the subprocess so Claude Code’s spans appear as children of the caller’s distributed trace. Interactive sessions ignore inbound TRACEPARENT to avoid accidentally inheriting ambient values from CI or container environments.
The inbound trace context also applies to events. In Agent SDK and -p sessions with TRACEPARENT set, each OTLP event log record carries trace_id and span_id values that join it to your application’s trace, even when the traces exporter isn’t configured, so your logging backend can correlate events with the rest of the trace.
A record emitted while an interaction is active carries the interaction span’s IDs, even when Claude Code emits it outside the span’s async context, such as in a permission prompt callback or for a record buffered during startup and exported later. A record emitted with no active interaction span carries the inbound TRACEPARENT IDs directly. Before v2.1.214, records emitted outside the span’s async context carried the inbound TRACEPARENT IDs instead of the span’s IDs. Before v2.1.212, event records emitted outside an active span didn’t carry trace_id or span_id.
Span hierarchy
Each user prompt starts aclaude_code.interaction root span. API calls, tool calls, and hook executions are recorded as its children. Tool spans have two child spans of their own: one for the time spent waiting on a permission decision and one for the execution itself. When the Agent tool, or legacy Task tool, spawns a subagent, the subagent’s API and tool spans nest under the parent’s claude_code.tool span.
claude -p sessions, claude_code.interaction itself becomes a child of the caller’s span when TRACEPARENT is set in the environment.
When a PreToolUse hook defers a tool call, Claude Code saves the trace context of the turn that deferred it. When you resume the session and the tool re-runs, the tool’s spans join that earlier turn’s trace as children of the turn’s claude_code.interaction span.
Span attributes
Every span carries the standard attributes plus aspan.type attribute matching its name. The tables below list the additional attributes set on each span. The llm_request, tool.execution, and hook spans set OpenTelemetry status ERROR when they record a failure; the other spans always end with status UNSET.
claude_code.interaction
claude_code.llm_request
Each retry attempt is also recorded as a
gen_ai.request.attempt span event with attempt and client_request_id attributes.
claude_code.tool
When
OTEL_LOG_TOOL_CONTENT=1, this span also records a tool.output span event whose attributes contain the tool’s input and output bodies, truncated at the content limit (60 KB by default) per attribute.
claude_code.tool.blocked_on_user
claude_code.tool.execution
claude_code.hook
This span appears only when detailed beta tracing is active, which requires ENABLE_BETA_TRACING_DETAILED=1 and BETA_TRACING_ENDPOINT, a pair that also changes where your logs and traces go. Set the pair in your shell, user settings, or managed settings; both variables are ignored in project and local settings. CLAUDE_CODE_ENHANCED_TELEMETRY_BETA alone doesn’t produce it.
In interactive CLI sessions, detailed beta tracing also requires your organization to be allowlisted for the feature. Agent SDK and non-interactive -p sessions don’t require allowlisting.
Additional content-bearing attributes such as
new_context, system_prompt_preview, user_system_prompt, tool_input, and response.model_output are emitted only when detailed beta tracing is active. They are not part of the stable span schema.user_system_prompt additionally requires OTEL_LOG_USER_PROMPTS=1. It carries only the system prompt text you provide via the systemPrompt SDK option or --system-prompt and --append-system-prompt flags, truncated at the content limit (60 KB by default), and is emitted once per session rather than per request.Dynamic headers
For enterprise environments that require dynamic authentication, you can configure a script to generate headers dynamically. Dynamic headers apply only to thehttp/protobuf and http/json protocols. With the grpc protocol, Claude Code uses only the static headers variables, OTEL_EXPORTER_OTLP_HEADERS and its per-signal variants.
Settings configuration
Add to your.claude/settings.json, replacing the path with your own script:
Script requirements
The script must output valid JSON with string key-value pairs representing HTTP headers:/statusoutput- The debug log, when running with
--debugor after running/debugin the session - stderr, in non-interactive sessions started with
-p
Refresh behavior
The headers helper script runs at startup and periodically thereafter to support token refresh. By default, the script runs every 29 minutes. Customize the interval with theCLAUDE_CODE_OTEL_HEADERS_HELPER_DEBOUNCE_MS environment variable.
Multi-team organization support
Organizations with multiple teams or departments can add custom attributes to distinguish between different groups using theOTEL_RESOURCE_ATTRIBUTES environment variable:
- Filter metrics by team or department
- Track costs per cost center
- Create team-specific dashboards
- Set up alerts for specific teams
vcs.* repository attributes, custom keys never override the standard attributes such as user.id or session.id: when a key collides, Claude Code keeps the built-in value.
Each custom key becomes a label on every metric series, so high-cardinality values increase storage cost in your metrics backend. To send custom attributes in the resource block only and omit them from datapoint labels, set OTEL_METRICS_INCLUDE_RESOURCE_ATTRIBUTES=false. See Metrics cardinality control.
Example configurations
Set these environment variables before runningclaude. Each scenario below shows a complete configuration, and each variable is described under Common configuration variables. To confirm a configuration took effect, check your backend for the claude_code.session.count metric after starting a session; the Quick start covers logs-only verification and what to check when nothing arrives.
For console debugging with a 1-second export interval:
http://localhost:9464/metrics:
/metrics endpoint instead.
To send metrics to multiple exporters:
Available metrics and events
Standard attributes
All metrics and events share these standard attributes:
When Claude Code is signed in to a Claude apps gateway, the CLI stamps exports with the authenticated identity from the gateway session:
user.id is the IdP subject rather than an anonymous installation identifier, user.email is the signed-in email, and user.groups carries IdP group membership as a comma-separated string. Each export also carries identity.source: gateway-oidc. The gateway identity is applied last, so user.* and identity.* keys set through OTEL_RESOURCE_ATTRIBUTES are ignored on gateway sessions.
Events additionally include the following attributes. These are never attached to metrics because they would cause unbounded cardinality:
prompt.id: UUID correlating a user prompt with all subsequent events until the next prompt. See Event correlation attributes.workspace.host_paths: host workspace directories selected in the desktop app, as a string arrayworkflow.run_id: run identifier, prefixedwf_, on the API and tool events emitted by agents that belong to a Workflow tool run. Filtering events by oneworkflow.run_idreconstructs that run’s API requests and tool results. The identifier covers the agents the workflow script spawns and any agents those spawn in turn, such as skill invocations. It matches the run identifier reported in the Workflow tool result. Absent on all other events. Requires Claude Code v2.1.202 or laterworkflow.name: name of the workflow, its script’smeta.name, emitted alongsideworkflow.run_id. Built-in workflow names appear verbatim when the run executes the unmodified built-in script. User-authored names, including edited copies of built-in scripts, are replaced withcustomunlessOTEL_LOG_TOOL_DETAILS=1is set. Requires Claude Code v2.1.202 or later
Repository attributes
SetOTEL_METRICS_INCLUDE_REPOSITORY=true to tag metrics and events with the identity of the session’s repository, so a shared collector can attribute usage per repository. Requires Claude Code v2.1.269 or later.
Claude Code derives these attributes once per session from the repository’s origin remote. The HTTPS and SSH remotes of one repository produce identical values:
Values are lowercased, and credentials, query strings, and fragments from the remote URL never appear in them. The attributes are omitted when the session has no
origin remote, when the remote isn’t URL-shaped, or when the only enclosing repository is your home directory.
A vcs.* key you declare in OTEL_RESOURCE_ATTRIBUTES replaces the derived value for that key. If you declare vcs.repository.url.full, Claude Code never reads the remote and reports only the keys you declare.
The attributes flow only to your own exporters; Anthropic’s telemetry drops every vcs.* key.
Metrics
Claude Code exports the following metrics. The Unit column shows the OpenTelemetry unit string attached to each metric; count metrics carry none.
When
prometheus is the only exporter listed in OTEL_METRICS_EXPORTER, Claude Code omits the USD, tokens, and s units from the exported metrics so the scrape stays valid Prometheus text format. Metric names don’t change, and configurations that combine exporters, such as otlp,prometheus, keep the units. Before v2.1.216, the Prometheus scrape included OpenMetrics-only # UNIT lines that some scrapers rejected.
Metric details
Each metric includes the standard attributes listed above. Metrics with additional context-specific attributes are noted below.Session counter
Incremented at the start of each session. Attributes:- All standard attributes
start_type: How the session was started. One of"fresh","resume","continue", or"agents_view". The"agents_view"value identifies theclaude agentsdashboard process, a user-launched local UI rather than a conversational session. Filter on this value to separate UI process launches from conversational sessions in your dashboards.
Lines of code counter
Incremented when code is added or removed. Attributes:- All standard attributes
type: ("added","removed")model: Model identifier for the model that made the change (for example, “claude-sonnet-5”)
Pull request counter
Incremented when Claude Code creates a pull request or merge request through a shell command or an MCP tool. Attributes:Commit counter
Incremented when creating git commits via Claude Code. Attributes:Cost counter
Incremented after each API request. Attributes:- All standard attributes
model: Model identifier (for example, “claude-sonnet-5”)query_source: Category of the subsystem that issued the request. One of"main","subagent", or"auxiliary"speed:"fast"when the request used fast mode. Absent otherwiseeffort: Effort level applied to the request:"low","medium","high","xhigh", or"max". Absent when the model doesn’t support effort.agent.name: Subagent type that issued the request. Built-in agent names and agents from official-marketplace plugins appear verbatim. Other user-defined agent names are replaced with"custom". Absent when the request was not issued by a named subagent type.skill.name: Skill active for the request, set by the Skill tool, a/command, or inherited by a spawned subagent. Built-in, bundled, user-defined, and official-marketplace plugin skill names appear verbatim. Third-party plugin skill names are replaced with"third-party". Absent when no skill is active.plugin.name: Owning plugin when the active skill or subagent is provided by a plugin. Official-marketplace plugin names appear verbatim. Third-party plugin names are replaced with"third-party". Absent when neither the skill nor the subagent has an owning plugin.marketplace.name: Marketplace the owning plugin was installed from. Only emitted for official-marketplace plugins. Absent otherwise.mcp_server.name: MCP server whose tool result this request consumed. Built-in, claude.ai-proxied, and official-registry server names appear verbatim. User-configured server names are replaced with"custom". Absent when the request consumed no MCP tool result. Before v2.1.222, Claude Code set this attribute on every request after an MCP tool call, not only on requests that consumed a tool result, so dashboards that aggregate it show a step down after you upgrade.mcp_tool.name: MCP tool whose result this request consumed, with the same redaction and version behavior asmcp_server.name. Absent when the request consumed no MCP tool result.
Token counter
Incremented after each API request. Attributes:- All standard attributes
type: ("input","output","cacheRead","cacheCreation")model: Model identifier (for example, “claude-sonnet-5”)query_source: Category of the subsystem that issued the request. One of"main","subagent", or"auxiliary"speed:"fast"when the request used fast mode. Absent otherwiseeffort: Effort level applied to the request. See Cost counter for details.agent.name,skill.name,plugin.name,marketplace.name,mcp_server.name,mcp_tool.name: Skill, plugin, agent, and MCP attribution for the request. See Cost counter for definitions and redaction behavior.
Code edit tool decision counter
Incremented when user accepts or rejects Edit, Write, or NotebookEdit tool usage. Attributes:- All standard attributes
tool_name: Tool name ("Edit","Write","NotebookEdit")decision: User decision ("accept","reject")source: Where the decision came from. One of"config","hook","user_permanent","user_temporary","user_abort", or"user_reject". See the Tool decision event for what each value means.language: Programming language of the edited file, such as"TypeScript","Python","JavaScript", or"Markdown". Returns"unknown"for unrecognized file extensions.
Active time counter
Tracks actual time spent actively using Claude Code, excluding idle time. This metric is incremented during user interactions, such as typing and reading responses, and during CLI processing, such as tool execution and AI response generation. Attributes:- All standard attributes
type:"user"for keyboard interactions,"cli"for tool execution and AI responses
Events
Claude Code exports the following events via OpenTelemetry logs/events (whenOTEL_LOGS_EXPORTER is configured):
Event correlation attributes
When a user submits a prompt, Claude Code may make multiple API calls and run several tools. Theprompt.id attribute lets you tie all of those events back to the single prompt that triggered them.
To trace all activity triggered by a single prompt, filter your events by a specific
prompt.id value. This returns the user_prompt event, any api_request events, and any tool_result events that occurred while processing that prompt.
For message-level reconstruction, each event class carries a key that matches a field in the session transcript. The transcript entry format is internal to Claude Code and changes between versions, so a pipeline that joins on these fields can break on any release; treat the joins as version-specific rather than a stable contract:
message.uuidonuser_promptandassistant_responserequest_idon the API events, persisted asrequestIdon the transcript’s assistant entriestool_use_idontool_resultandtool_decisionevents
User prompt event
Logged when a user submits a prompt. Event Name:claude_code.user_prompt
Attributes:
- All standard attributes
event.name:"user_prompt"event.timestamp: ISO 8601 timestampevent.sequence: monotonically increasing counter for ordering events within a sessionprompt_length: Length of the promptprompt: Prompt content. Redacted by default. SetOTEL_LOG_USER_PROMPTS=1to include itmessage.uuid: UUID of the resulting user message, matching the persisted transcript entry. Absent on command dispatches, which can produce zero or many messages. Requires Claude Code v2.1.214 or latercommand_name: Command name when the prompt invokes one. Built-in and bundled command names such ascompactordebugare emitted as-is; aliases such asresetemit as typed rather than the canonical name. Custom, plugin, and MCP command names collapse tocustomormcpunlessOTEL_LOG_TOOL_DETAILS=1is setcommand_source: Origin of the command when present:builtin,custom, ormcp. Plugin-provided commands report ascustom
Assistant response event
Logged after each API request that returns text content from the model. Only the response’s text blocks are included; thinking blocks and tool-use blocks are excluded. Requires Claude Code v2.1.193 or later. Event Name:claude_code.assistant_response
Attributes:
- All standard attributes
event.name:"assistant_response"event.timestamp: ISO 8601 timestampevent.sequence: monotonically increasing counter for ordering events within a sessionresponse_length: Length of the response text in charactersresponse: Response text, truncated at the content limit (60 KB by default). Redacted to<REDACTED>by default. SetOTEL_LOG_ASSISTANT_RESPONSES=1to include it. WhenOTEL_LOG_ASSISTANT_RESPONSESis unset,OTEL_LOG_USER_PROMPTScontrols it instead, so setOTEL_LOG_ASSISTANT_RESPONSES=0to keep responses redacted while prompt logging is onmodel: Model identifier (for example, “claude-sonnet-5”)request_id: Anthropic API request ID from the response’srequest-idheader. Present only when the API returns onemessage.uuid: UUID of the response’s final transcript entry. An API response is persisted as one transcript entry per content block; this is the last one, which the next turn’sparentUuidchains from. Requires Claude Code v2.1.214 or laterquery_source: Subsystem that issued the request, such as"repl_main_thread","compact", or a subagent name
Tool result event
Logged when a tool completes execution. Not emitted if the tool call was rejected; see the Tool decision event for rejections. Event Name:claude_code.tool_result
Attributes:
- All standard attributes
event.name:"tool_result"event.timestamp: ISO 8601 timestampevent.sequence: monotonically increasing counter for ordering events within a sessiontool_name: Name of the tooltool_use_id: Unique identifier for this tool invocation. Matches thetool_use_idpassed to hooks, allowing correlation between OTel events and hook-captured data.success:"true"or"false"duration_ms: Execution time in millisecondserror_type: Error category string when the tool failed, such as"Error:ENOENT"or"ShellError"error(whenOTEL_LOG_TOOL_DETAILS=1): Full error message when the tool faileddecision_type: Always"accept", since this event is only emitted after the tool runs. Rejected calls don’t produce a tool resultdecision_source: Where the permission decision came from. One of"config","hook","user_permanent", or"user_temporary". See the Tool decision event for what each value means. The reject-only sources"user_abort"and"user_reject"never appear on this event.tool_input_size_bytes: Size of the JSON-serialized tool input in bytestool_result_size_bytes: Size of the tool result in bytesmcp_server_scope: MCP server scope identifier (for MCP tools)vcs.ref.head.revision,vcs.ref.head.name,vcs.ref.head.type(whenOTEL_LOG_TOOL_DETAILS=1): the commit identity of a successfulgit commitrun by the Bash or PowerShell tool.vcs.ref.head.revisionis the commit SHA,vcs.ref.head.nameis the branch it was committed on, andvcs.ref.head.typeisbranch. The name and type are omitted when the commit was made on a detached HEAD. Requires Claude Code v2.1.269 or latertool_parameters(whenOTEL_LOG_TOOL_DETAILS=1): JSON string containing tool-specific parameters. For Claude Desktop’s built-in servers, in sessions Claude Desktop owns, themcp_server_name/mcp_tool_namepair is included even with the flag off, the same host-authored exception as the Tool decision event, requiring Claude Code v2.1.214 or later. The parameters vary by tool:- For Bash tool: includes
bash_command,full_command,timeout,description, anddangerouslyDisableSandbox, plusgit_commit_idandgit_branchwhen agit commitcommand succeeds.git_commit_idis the full commit SHA when the commit is the HEAD of the session’s working directory, and git’s abbreviated SHA otherwise.git_branchis the branch it was committed on, omitted on a detached HEAD - For the desktop app’s workspace Bash tool, which also reports
tool_nameasBash: includes onlybash_command,full_command, andtimeout - For MCP tools: includes
mcp_server_name,mcp_tool_name - For Skill tool: includes
skill_name - For Agent tool or legacy Task tool: includes
subagent_type
- For Bash tool: includes
tool_input(whenOTEL_LOG_TOOL_DETAILS=1): JSON-serialized tool arguments. Individual values over 512 characters are truncated, and the full payload is bounded to ~4 K characters. Applies to all tools including MCP tools.
API request event
Logged for each API request to Claude. Event Name:claude_code.api_request
Attributes:
- All standard attributes
event.name:"api_request"event.timestamp: ISO 8601 timestampevent.sequence: monotonically increasing counter for ordering events within a sessionmodel: Model used (for example, “claude-sonnet-5”)cost_usd: Estimated cost in USDcost_usd_micros: Estimated cost in millionths of a US dollar, emitted as an integerduration_ms: Request duration in millisecondsinput_tokens: Number of input tokensoutput_tokens: Number of output tokenscache_read_tokens: Number of tokens read from cachecache_creation_tokens: Number of tokens used for cache creationrequest_id: Anthropic API request ID from the response’srequest-idheader, such as"req_011...". Present only when the API returns one.client_request_id: Client-generated UUID sent as thex-client-request-idrequest header; see the event correlation attributes table for when it’s present. Requires Claude Code v2.1.214 or laterspeed:"fast"or"normal", indicating whether fast mode was activequery_source: Subsystem that issued the request, such as"repl_main_thread","compact", or a subagent nameeffort: Effort level applied to the request:"low","medium","high","xhigh", or"max". Absent when the model doesn’t support effort.agent.name,skill.name,plugin.name,marketplace.name,mcp_server.name,mcp_tool.name: Skill, plugin, agent, and MCP attribution for the request. See Cost counter for definitions and redaction behavior.
API error event
Logged when an API request to Claude fails. Event Name:claude_code.api_error
Attributes:
- All standard attributes
event.name:"api_error"event.timestamp: ISO 8601 timestampevent.sequence: monotonically increasing counter for ordering events within a sessionmodel: Model used (for example, “claude-sonnet-5”)error: Error messagestatus_code: HTTP status code as a number. Absent for non-HTTP errors such as connection failures.duration_ms: Request duration in millisecondsattempt: Total number of attempts made, including the initial request (1means no retries occurred)request_id: Anthropic API request ID from the response’srequest-idheader, such as"req_011...". Present only when the API returns one.client_request_id: Client-generated UUID sent as thex-client-request-idrequest header. Available even when a failure such as a timeout or connection error never produced a serverrequest_id; see the event correlation attributes table for when it’s present. Requires Claude Code v2.1.214 or laterspeed:"fast"or"normal", indicating whether fast mode was activequery_source: Subsystem that issued the request, such as"repl_main_thread","compact", or a subagent nameeffort: Effort level applied to the request. Absent when the model doesn’t support effort.agent.name,skill.name,plugin.name,marketplace.name,mcp_server.name,mcp_tool.name: Skill, plugin, agent, and MCP attribution for the request. See Cost counter for definitions and redaction behavior.
API refusal event
Logged when an API request returnsstop_reason: "refusal". Refusals arrive on a successful response stream rather than as an HTTP error, so the api_error event doesn’t fire for them. This event lets you track refusal frequency and group refusals by the same attributes as api_request and api_error.
Event Name: claude_code.api_refusal
Attributes:
- All standard attributes
event.name:"api_refusal"event.timestamp: ISO 8601 timestampevent.sequence: monotonically increasing counter for ordering events within a sessionmodel: Model identifier from the requestrequest_id: Anthropic API request ID from the response’srequest-idheader, such as"req_011...". Present only when the API returns one.query_source: Subsystem that issued the request, such as"repl_main_thread","compact", or a subagent name. Seeapi_requestfor definitions.speed: Either"fast"when Fast mode is active, or"normal"attempt: Retry attempt number. The first attempt is1.effort: Effort level applied to the request. Absent when the model doesn’t support effort.server_fallback_hop:truewhen the API’s server-side model fallback already retried this refusal on a different model, so the user did not see this particular refusal.falsewhen the request ended in a refusal. A single turn can emit both atruehop event and a laterfalsefinal event when the fallback model also refuses.has_category:truewhen the API response carried astop_details.categoryof"cyber","bio","frontier_llm", or"reasoning_extraction".falsewhen the response carried no category or a value outside that set. Absent whenserver_fallback_hopistrue, because hop blocks don’t carrystop_details.has_explanation:truewhen the API response carried astop_details.explanation, otherwisefalse. Absent whenserver_fallback_hopistrue.category: Thestop_details.categoryvalue from the API response. One of"cyber","bio","frontier_llm", or"reasoning_extraction". Only present whenOTEL_LOG_TOOL_DETAILS=1is set andhas_categoryistrue.agent.name,skill.name,plugin.name,marketplace.name,mcp_server.name,mcp_tool.name: Skill, plugin, agent, and MCP attribution for the request. See Cost counter for definitions and redaction behavior.
API request body event
Logged for each API request attempt whenOTEL_LOG_RAW_API_BODIES is set. One event is emitted per attempt, so retries with adjusted parameters each produce their own event.
Event Name: claude_code.api_request_body
Attributes:
- All standard attributes
event.name:"api_request_body"event.timestamp: ISO 8601 timestampevent.sequence: monotonically increasing counter for ordering events within a sessionbody: JSON-serialized Messages API request parameters, such as the system prompt, messages, and tools, truncated at the content limit (60 KB by default). Extended-thinking content in prior assistant turns is redacted. Emitted only in inline mode (OTEL_LOG_RAW_API_BODIES=1).body_ref: Absolute path to a<dir>/<uuid>.request.jsonfile containing the untruncated body. Emitted only in file mode (OTEL_LOG_RAW_API_BODIES=file:<dir>).body_length: Untruncated body length. UTF-8 bytes whenOTEL_LOG_RAW_API_BODIES=file:<dir>, or UTF-16 code units when=1body_truncated:"true"when inline truncation occurred. Absent in file mode and when no truncation occurred.model: Model identifier from the request parametersquery_source: Subsystem that issued the request (for example,"compact")
API response body event
Logged for each successful API response whenOTEL_LOG_RAW_API_BODIES is set.
Event Name: claude_code.api_response_body
Attributes:
- All standard attributes
event.name:"api_response_body"event.timestamp: ISO 8601 timestampevent.sequence: monotonically increasing counter for ordering events within a sessionbody: JSON-serialized Messages API response, including the id, content blocks, usage, and stop reason, truncated at the content limit (60 KB by default). Extended-thinking content is redacted. Emitted only in inline mode (OTEL_LOG_RAW_API_BODIES=1).body_ref: Absolute path to a<dir>/<request_id>.response.jsonfile containing the untruncated body. Emitted only in file mode (OTEL_LOG_RAW_API_BODIES=file:<dir>).body_length: Untruncated body length. UTF-8 bytes whenOTEL_LOG_RAW_API_BODIES=file:<dir>, or UTF-16 code units when=1body_truncated:"true"when inline truncation occurred. Absent in file mode and when no truncation occurred.model: Model identifierquery_source: Subsystem that issued the requestrequest_id: Anthropic API request ID from the response’srequest-idheader, such as"req_011...". Present only when the API returns one.
Tool decision event
Logged when a tool permission decision is made (accept/reject). Event Name:claude_code.tool_decision
Attributes:
- All standard attributes
event.name:"tool_decision"event.timestamp: ISO 8601 timestampevent.sequence: monotonically increasing counter for ordering events within a sessiontool_name: Name of the tool (for example, “Read”, “Edit”, “Write”, “NotebookEdit”)tool_use_id: Unique identifier for this tool invocation. Matches thetool_use_idpassed to hooks, allowing correlation between OTel events and hook-captured data.decision: Either"accept"or"reject"tool_source: Always present. The tool’s provenance, as a closed set of CLI-authored values. Requires Claude Code v2.1.214 or later"builtin": the CLI’s own tools"mcp": MCP servers generally"sdk_host_builtin_mcp": an in-process server built into Claude Desktop itself, in a session Claude Desktop owns. Claude Desktop owns a session it started from one of its own entrypoints,claude-desktop,claude-desktop-3p, orlocal-agent, when that session isn’t a nested child; nested sessions, including sessions Claude Code itself spawns, report these servers as"mcp"
source: Where the decision came from:"config": Decided automatically without prompting, based on project settings, allow or deny rules in the user’s personal settings, enterprise managed policy,--allowedToolsor--disallowedToolsflags, the active permission mode, a session-scoped grant from an earlier prompt in the same interactive CLI session, or because the tool is inherently safe. The event doesn’t indicate which of these sources matched. Claude Code also reports"config"when the permission prompt request itself fails, for example when the Agent SDK’scanUseToolcallback or the--permission-prompt-tooltool returns an invalid result, or when the input stream closes while the request is pending. Before v2.1.216, Claude Code reported these failures as"user_reject"."hook": APreToolUseorPermissionRequesthook returned the decision."user_permanent": Emitted when the user chose “Yes, and don’t ask again for …” at a permission prompt, which saves an allow rule to their personal settings. In the interactive CLI this is emitted only for that choice itself; later calls that match the saved rule emit"config"instead. In Agent SDK or non-interactive-psessions, both the initial choice and later rule matches emit"user_permanent". Treated as an accept."user_temporary": Emitted when the user chose “Yes” at a permission prompt for a one-time approval, or chose an option that grants access for the rest of the session on a file edit or read prompt. In the interactive CLI this is emitted only for the choice itself; later calls allowed by that session-scoped grant emit"config"instead. In Agent SDK or non-interactive-psessions, both the choice and later matches emit"user_temporary". Treated as an accept."user_abort": Emitted when the user dismissed the permission prompt without answering. In Agent SDK and non-interactive-psessions, this includes interrupting the turn while acanUseToolor--permission-prompt-toolpermission request is pending; before v2.1.216, Claude Code reported that interrupt as"user_reject". Treated as a reject."user_reject": Emitted when the user chose “No” when prompted. In the interactive CLI this is emitted only for that choice itself; calls that match a deny rule in the user’s personal settings emit"config"instead. In Agent SDK or non-interactive-psessions, calls that match a deny rule in personal settings emit"user_reject". Treated as a reject.
tool_parameters(whenOTEL_LOG_TOOL_DETAILS=1): JSON string containing tool-specific parameters. Same shape as the Tool result event, minus post-execution fields such asgit_commit_id. Values may differ fromtool_resultfor an accepted call if the permission decision rewrites the tool input viaupdatedInput. Use this attribute to see which command was rejected whendecisionis"reject".- For
"sdk_host_builtin_mcp"tools:mcp_server_nameandmcp_tool_nameare included even whenOTEL_LOG_TOOL_DETAILSis off, because the host application defines these names; without them, a rejected call to one of these built-in servers would be unattributable on the default stream. For user-configured MCP servers, the event’stool_nameis always the literal"mcp_tool", and the server and tool names appear only intool_parameterswith the flag on; argument content requires the flag everywhere. Requires Claude Code v2.1.214 or later - For Bash tool: includes
bash_command,full_command,timeout,description,dangerouslyDisableSandbox. The desktop app’s workspace bash tool also reportstool_nameasBash, but includes onlybash_command,full_command, andtimeout - For MCP tools: includes
mcp_server_name,mcp_tool_name - For Skill tool: includes
skill_name - For Agent tool or legacy Task tool: includes
subagent_type
- For
Permission mode changed event
Logged when the permission mode changes, for example fromShift+Tab cycling, exiting plan mode, or an auto mode gate check.
Event Name: claude_code.permission_mode_changed
Attributes:
- All standard attributes
event.name:"permission_mode_changed"event.timestamp: ISO 8601 timestampevent.sequence: monotonically increasing counter for ordering events within a sessionfrom_mode: The previous permission mode, for example"default","plan","acceptEdits","auto", or"bypassPermissions"to_mode: The new permission modetrigger: What caused the change. One of"shift_tab","exit_plan_mode","auto_gate_denied", or"auto_opt_in". Absent when the transition originates from the SDK or bridge
Auth event
Logged when/login or /logout completes.
Event Name: claude_code.auth
Attributes:
- All standard attributes
event.name:"auth"event.timestamp: ISO 8601 timestampevent.sequence: monotonically increasing counter for ordering events within a sessionaction:"login"or"logout"success:"true"or"false"auth_method: Authentication method, such as"oauth"error_category: Categorical error kind when the action failed. The raw error message is never includedstatus_code: HTTP status code as a string when the action failed with an HTTP error
MCP server connection event
Logged when an MCP server connects, disconnects, or fails to connect. Event Name:claude_code.mcp_server_connection
Attributes:
- All standard attributes
event.name:"mcp_server_connection"event.timestamp: ISO 8601 timestampevent.sequence: monotonically increasing counter for ordering events within a sessionstatus:"connected","failed", or"disconnected"transport_type: Server transport, such as"stdio","sse", or"http"server_scope: Scope the server is configured at, such as"user","project", or"local"duration_ms: Connection attempt duration in millisecondserror_code: Error code when the connection failedis_plugin:truewhen the server is provided by a plugin,falseotherwiseplugin_id_hash(whenis_pluginistrue): Stable hash of the plugin name and marketplace, for grouping events by plugin without exposing the name. Claude Code computes it as described under the plugin loaded eventplugin.name(whenis_pluginistrue): Name of the plugin that provides the server. For third-party plugins this is the literal string"third-party"unlessOTEL_LOG_TOOL_DETAILS=1; this protects third-party plugin names from appearing in logs by default. Plugins from official Anthropic sources are always identified by name. Theplugin_id_hashandplugin.nameattributes flow to your own monitoring backend and are not sent to Anthropicserver_name(whenOTEL_LOG_TOOL_DETAILS=1): Configured server nameerror(whenOTEL_LOG_TOOL_DETAILS=1): Full error message when the connection failed
Internal error event
Logged when Claude Code catches an unexpected internal error. Only the error class name and an errno-style code are recorded. The error message and stack trace are never included. This event is not emitted when running against Amazon Bedrock, Google Cloud’s Agent Platform, or Microsoft Foundry, or whenDISABLE_ERROR_REPORTING is set.
Event Name: claude_code.internal_error
Attributes:
- All standard attributes
event.name:"internal_error"event.timestamp: ISO 8601 timestampevent.sequence: monotonically increasing counter for ordering events within a sessionerror_name: Error class name, such as"TypeError"or"SyntaxError"error_code: Node.js errno code such as"ENOENT"when present on the error
Plugin installed event
Logged when a plugin finishes installing, from both theclaude plugin install CLI command and the interactive /plugin UI.
Event Name: claude_code.plugin_installed
Attributes:
- All standard attributes
event.name:"plugin_installed"event.timestamp: ISO 8601 timestampevent.sequence: monotonically increasing counter for ordering events within a sessionmarketplace.is_official:"true"if the marketplace is an official Anthropic marketplace,"false"otherwiseinstall.trigger:"cli"or"ui"plugin.name: Name of the installed plugin. For third-party marketplaces this is included only whenOTEL_LOG_TOOL_DETAILS=1plugin.version: Plugin version when declared in the marketplace entry. For third-party marketplaces this is included only whenOTEL_LOG_TOOL_DETAILS=1marketplace.name: Marketplace the plugin was installed from. For third-party marketplaces this is included only whenOTEL_LOG_TOOL_DETAILS=1
Plugin loaded event
Logged once per enabled plugin at session start. Use this event to inventory which plugins are active across your fleet, as a complement toplugin_installed which records the install action itself.
Event Name: claude_code.plugin_loaded
Attributes:
- All standard attributes
event.name:"plugin_loaded"event.timestamp: ISO 8601 timestampevent.sequence: monotonically increasing counter for ordering events within a sessionplugin.name: name of the plugin. For plugins outside the official marketplace and built-in bundle the value is"third-party"unlessOTEL_LOG_TOOL_DETAILS=1marketplace.name: marketplace the plugin was installed from, when known. Redacted to"third-party"under the same condition asplugin.nameplugin.version: version from the plugin manifest. Included only when the name is not redacted and the manifest declares a versionplugin.scope: provenance category for the plugin:"official","community","org","user-local", or"default-bundle"enabled_via: how the plugin came to be enabled:"default-enable","org-policy","admin-install","seed-mount", or"user-install". The"admin-install"value means the plugin is set to required or auto-install for your organization in Organization settings > Plugins. Before v2.1.246, Claude Code reported these plugins as"user-install"or"seed-mount"plugin_id_hash: deterministic hash of the plugin name and marketplace, sent only to your configured exporter. Lets you count the distinct third-party plugins loaded across your fleet without recording their names. For plugins synced from claude.ai, Claude Code hashes the plugin name with the marketplace name that claude.ai reports for the plugin, or withsyncedotherwise. Before v2.1.246, Claude Code didn’t use the marketplace name claude.ai reports in the hashhas_hooks: whether the plugin contributes hookshas_mcp: whether the plugin contributes MCP servershost_owned_mcp:truewhen the SDK host manages this plugin’s MCP connections and Claude Code skipped reading the plugin’s MCP server configuration,falseotherwise. Requires Claude Code v2.1.172 or laterskill_path_count: number of skill directories the plugin declarescommand_path_count: number of command directories the plugin declaresagent_path_count: number of agent directories the plugin declaressafe_mode:"true"when the session was started with--safe-mode,"false"otherwise. In safe mode this event reports configured inventory only; the plugin’s commands, skills, hooks, and MCP servers don’t load. Requires Claude Code v2.1.169 or later
Skill activated event
Logged when a skill is invoked, whether Claude calls it through the Skill tool or you run it as a/ command.
Event Name: claude_code.skill_activated
Attributes:
- All standard attributes
event.name:"skill_activated"event.timestamp: ISO 8601 timestampevent.sequence: monotonically increasing counter for ordering events within a sessionskill.name: Name of the skill. For user-defined and third-party plugin skills the value is the placeholder"custom_skill"unlessOTEL_LOG_TOOL_DETAILS=1invocation_trigger: How the skill was triggered ("user-slash","claude-proactive", or"nested-skill")skill.source: Where the skill was loaded from (for example,"bundled","userSettings","projectSettings","plugin")skill.kind:"workflow"when the skill is a workflow skill. Absent otherwiseplugin.name(whenOTEL_LOG_TOOL_DETAILS=1or the plugin is from an official marketplace): Name of the owning plugin when the skill is provided by a pluginmarketplace.name(whenOTEL_LOG_TOOL_DETAILS=1or the plugin is from an official marketplace): Marketplace the owning plugin was installed from, when the skill is provided by a plugin
At mention event
Logged when Claude Code resolves an@-mention in a prompt. Not every mention emits an event: early-exit paths such as permission denials, oversized files, PDF reference attachments, and directory listing failures return without logging.
Event Name: claude_code.at_mention
Attributes:
- All standard attributes
event.name:"at_mention"event.timestamp: ISO 8601 timestampevent.sequence: monotonically increasing counter for ordering events within a sessionmention_type: Type of mention ("file","directory","agent","mcp_resource","peer"). The"peer"value means you mentioned one of your other Claude Code sessions. Requires Claude Code v2.1.232 or latersuccess: Whether the mention resolved successfully ("true"or"false")
API retries exhausted event
Logged once when an API request fails after more than one attempt. Emitted alongside the finalapi_error event.
Event Name: claude_code.api_retries_exhausted
Attributes:
- All standard attributes
event.name:"api_retries_exhausted"event.timestamp: ISO 8601 timestampevent.sequence: monotonically increasing counter for ordering events within a sessionmodel: Model usederror: Final error messagestatus_code: HTTP status code as a number. Absent for non-HTTP errors.total_attempts: Total number of attempts madetotal_retry_duration_ms: Total wall-clock time across all attemptsspeed:"fast"or"normal"
Hook registered event
Logged once per configured hook at session start. Use this event to inventory which hooks are active across your fleet, as a complement to the per-executionhook_execution_start and hook_execution_complete events.
Event Name: claude_code.hook_registered
Attributes:
- All standard attributes
event.name:"hook_registered"event.timestamp: ISO 8601 timestampevent.sequence: monotonically increasing counter for ordering events within a sessionhook_event: hook event type, such as"PreToolUse"or"PostToolUse"hook_type: hook implementation type:"command","prompt","mcp_tool","http", or"agent"hook_source: where the hook is defined:"userSettings","projectSettings","localSettings","flagSettings","policySettings", or"pluginHook"safe_mode:"true"when the session was started with--safe-mode,"false"otherwise. Requires Claude Code v2.1.169 or laterhook_matcher(whenOTEL_LOG_TOOL_DETAILS=1): the matcher string from the hook configuration, when one is setplugin.name(whenhook_sourceis"pluginHook"): name of the contributing plugin. For plugins outside the official marketplace and built-in bundle the value is"third-party"unlessOTEL_LOG_TOOL_DETAILS=1plugin_id_hash(whenhook_sourceis"pluginHook"): deterministic hash of the plugin name and marketplace, sent only to your configured exporter. Lets you count distinct contributing plugins without recording their names. Claude Code computes it as described under the plugin loaded event
Hook execution start event
Logged when one or more hooks begin executing for a hook event. Event Name:claude_code.hook_execution_start
Attributes:
- All standard attributes
event.name:"hook_execution_start"event.timestamp: ISO 8601 timestampevent.sequence: monotonically increasing counter for ordering events within a sessionhook_event: Hook event type, such as"PreToolUse"or"PostToolUse"hook_name: Full hook name including matcher, such as"PreToolUse:Write"num_hooks: Number of matching hook commandsmanaged_only:"true"when only managed-policy hooks are permittedhook_source:"policySettings"or"merged"safe_mode:"true"when the session was started with--safe-mode,"false"otherwise. Requires Claude Code v2.1.169 or laterhook_definitions: JSON-serialized hook configuration. Included only when both detailed beta tracing andOTEL_LOG_TOOL_DETAILS=1are enabled
Hook execution complete event
Logged when all hooks for a hook event have finished. Event Name:claude_code.hook_execution_complete
Attributes:
- All standard attributes
event.name:"hook_execution_complete"event.timestamp: ISO 8601 timestampevent.sequence: monotonically increasing counter for ordering events within a sessionhook_event: Hook event typehook_name: Full hook name including matchernum_hooks: Number of matching hook commandsnum_success: Count that completed successfullynum_blocking: Count that returned a blocking decisionnum_non_blocking_error: Count that failed without blockingnum_cancelled: Count cancelled before completiontotal_duration_ms: Wall-clock duration of all matching hooksmanaged_only:"true"when only managed-policy hooks are permittedhook_source:"policySettings"or"merged"safe_mode:"true"when the session was started with--safe-mode,"false"otherwise. Requires Claude Code v2.1.169 or laterhook_definitions: JSON-serialized hook configuration. Included only when both detailed beta tracing andOTEL_LOG_TOOL_DETAILS=1are enabled
Hook plugin metrics event
Logged when an official-marketplace plugin hook emits per-invocation metrics. Only plugins installed from an official Anthropic marketplace can emit these. Third-party marketplace plugins and user-configured hooks don’t emit to this event. Use this event to monitor plugin behavior such as finding rates, costs, and durations from your own observability stack. Event Name:claude_code.hook_plugin_metrics
Attributes:
- All standard attributes
event.name:"hook_plugin_metrics"event.timestamp: ISO 8601 timestampevent.sequence: monotonically increasing counter for ordering events within a sessionplugin_id: plugin identifier in<name>@<marketplace>formhook_event: hook event type that emitted the metrics- Up to 20 plugin-emitted metric keys. Names match
^[a-z][a-z0-9_]{0,39}$. Values are boolean or number.
Compaction event
Logged when conversation compaction completes. Event Name:claude_code.compaction
Attributes:
- All standard attributes
event.name:"compaction"event.timestamp: ISO 8601 timestampevent.sequence: monotonically increasing counter for ordering events within a sessiontrigger:"auto"or"manual"success:"true"or"false"duration_ms: Compaction durationpre_tokens: Approximate token count before compactionpost_tokens: Approximate token count after compactionerror: Error message when compaction failedprecompute_reuse: Only set whentriggeris"manual". Auto-compaction can prepare a summary in the background before the context window fills, and this attribute records whether/compactreused 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. Requires Claude Code v2.1.153 or later
Subagent completed event
Logged when a subagent finishes and returns its result to the conversation that started it. Use it to roll up tool use and run time by subagent type; for token or cost rollups, use the token counter and cost counter filtered toquery_source "subagent", since this event’s total_tokens covers only the final request. The "subagent" category also counts requests from agent-based hooks, which emit no subagent event.
Event Name: claude_code.subagent_completed
Attributes:
- All standard attributes
event.name:"subagent_completed"event.timestamp: ISO 8601 timestampevent.sequence: monotonically increasing counter for ordering events within a sessionagent_type: The subagent type. Built-in agent names and agents from official-marketplace plugins appear verbatim; other agent names are replaced with"custom"unlessOTEL_LOG_TOOL_DETAILS=1is setagent.source: Where the agent definition came from:built-in,plugin, or the settings source that defined a custom agent, such asuserSettingsorprojectSettingsis_built_in: Whether the subagent is a built-in agent typeis_async: Whether the subagent ran in the backgroundtotal_tokens: The token footprint of the subagent’s final API request: that one request’s input, cache creation, cache read, and output tokens, roughly the subagent’s context size at completion. Not a sum across the runtotal_tool_uses: Number of tool calls the subagent made across the whole runduration_ms: Run time in millisecondsmodel: The model the subagent was resolved to runfinal_model: The model that produced the subagent’s final response, which differs frommodelafter a mid-run switch such as a fallback. Requires Claude Code v2.1.212 or latermodel_swapped: Whether more than one model served the subagent’s requests. Requires Claude Code v2.1.212 or laterplugin_id_hash,plugin.name: Present for plugin-provided agents. Official-marketplace plugin names appear verbatim; other plugin names are replaced with"third-party"unlessOTEL_LOG_TOOL_DETAILS=1is set
Feedback survey event
Logged when a session quality survey is shown or answered. See Session quality surveys for what the surveys collect and how to control them. Event Name:claude_code.feedback_survey
Attributes:
- All standard attributes
event.name:"feedback_survey"