Unclear Which event records the module leaves out is not settled.
What
OpenTelemetry is the standard Claude Code uses to send usage data to a collector you set up. Plugins can register hooks, small pieces of code that run when certain events happen. Telemetry now runs through that same hook system.
- New built-in plugin
cc-plugin-otlp, registered next to "sec-default", "agents-md" and "telemetry". It registers atelemetry.loghook on the "collector" stream and sends each record from core or built-in origins to the OpenTelemetry log exporter. When it is loaded and hookstelemetry.log, Claude Code's own event records go through that hook; otherwise they take the old path. - It is available only when
CLAUDE_CODE_ENABLE_TELEMETRYis set, a further check is false, and the gatetengu_basalt_ploverpasses. That gate's built-in fallback is off, and nothing has been read about it for this release. - Plugins get a telemetry interface:
$.telemetry.logtakes an entry{ to?, event, props? }or a collector record, and$.telemetry.marktakes{ feature, kind, reason?, props? }. Calls run through the handler chain and can be denied.telemetry.logandtelemetry.markbecome hookable events, and a hook's return value must have avaluekey. - A telemetry hook's
tomust be a plain string, or list of them, from "anthropic" and "collector". Anything else is rejected with a message naming what was written (for example "a template string" or "the variable x"). A hook that changestois rejected as "a changed to (pinned)". - A hook with no
tostands on every stream. The "anthropic" stream is reserved for plugins built into the CLI: a non-built-in plugin on it is refused and told to writeon("telemetry.log", { to: "collector" }, hook). - Wildcard hook patterns from non-built-in plugins no longer match
telemetry.*events unless the pattern itself starts withtelemetry..
Why
Plugin authors who write telemetry hooks must now add { to: "collector" }, and third-party plugins cannot tap Anthropic's telemetry stream through a broad wildcard. The built-in plugin shows telemetry export becoming a plugin rather than fixed code, though it only runs when its gate passes.
Which event records the module leaves out is not settled.