Skip to main content
Claude Code has built-in OpenTelemetry support that exports metrics and logs. Axiom natively ingests OTLP data, making the two a natural fit. This guide covers the Axiom-specific configuration to connect Claude Code telemetry to Axiom.

Prerequisites

How Axiom routes OpenTelemetry data

Axiom routes data to datasets via headers, and the header differs by signal type:
  • Logs use x-axiom-dataset
  • Metrics use x-axiom-metrics-dataset
This means signal-specific header configuration is required rather than a single shared OTEL_EXPORTER_OTLP_HEADERS value. The /v1/metrics endpoint only supports the application/x-protobuf content type.

Configure environment variables

Create a file named setup-otel.sh with the following content:
Don’t execute the script directly. Source the script instead. The exported variables must exist in the current shell where Claude inherits them.
setup-otel.sh
Replace API_TOKEN with the Axiom API token you have generated. For added security, store the API token in an environment variable.Replace AXIOM_DOMAIN with the base domain of your edge deployment. For more information, see Edge deployments.Replace METRICS_DATASET_NAME with the name of the Axiom dataset for metrics.Replace LOGS_DATASET_NAME with the name of the Axiom dataset for logs.

Verify the integration

1

Source the script and start Claude Code

Run the following command in your terminal:
2

Interact with Claude Code

Use Claude Code for 15 to 20 seconds to generate telemetry data. Ask questions, run commands, or perform any typical tasks.
3

Observe telemetry in Axiom

In Axiom, go to your datasets and observe the telemetry data:
  • The logs dataset shows events like claude_code.user_prompt, claude_code.tool_result, and claude_code.api_request.
  • The metrics dataset shows counters like claude_code.session.count and claude_code.token.usage, updating on the 10-second interval configured above.
If one signal arrives but the other doesn’t, double-check the headers. The most common mistake is using x-axiom-dataset for metrics instead of x-axiom-metrics-dataset.

Production considerations

When moving from testing to production, consider these adjustments:
  • Disable prompt logging: Remove OTEL_LOG_USER_PROMPTS=1 unless prompt content is needed in your observability backend. This reduces the volume of sensitive data stored.
  • Use managed settings for teams: For team deployments, administrators can set these variables in Claude Code’s managed settings file instead of relying on each developer to source a script.
  • Add resource attributes: Use OTEL_RESOURCE_ATTRIBUTES to tag all telemetry with department, team, or cost center identifiers for filtering and alerting in Axiom.
  • Adjust export intervals: For production, consider using longer intervals to reduce overhead:

Reference

Environment variables

Expected telemetry data

Claude Code exports the following telemetry: Logs:
  • claude_code.user_prompt: User prompts sent to Claude Code.
  • claude_code.tool_result: Results from tool executions.
  • claude_code.api_request: API requests made by Claude Code.
Metrics:
  • claude_code.session.count: Number of Claude Code sessions.
  • claude_code.token.usage: Token usage counters.