Claude Code kann OpenTelemetry (OTel) exportieren um Usage, Costs und Tool-Activity zu tracken. Das ist opt-in und erfordert explizite Konfiguration.
Quick Start
1. Aktiviere Telemetry
export CLAUDE_CODE_ENABLE_TELEMETRY=1
Oder in .claude/settings.json:
{
"env": {
"CLAUDE_CODE_ENABLE_TELEMETRY": "1"
}
}
2. Waehle Exporters
# Metriken exportieren
export OTEL_METRICS_EXPORTER=otlp
# Events/Logs exportieren
export OTEL_LOGS_EXPORTER=otlp
# Oder console zum Debuggen
export OTEL_METRICS_EXPORTER=console
3. Konfiguriere Endpoint
export OTEL_EXPORTER_OTLP_PROTOCOL=grpc
export OTEL_EXPORTER_OTLP_ENDPOINT=http://localhost:4317
4. Optional: Authentication
export OTEL_EXPORTER_OTLP_HEADERS="Authorization=Bearer your-token"
5. Starte Claude Code
claude
Metriken und Events werden jetzt an deinen Collector exportiert.
Exporter Optionen
OTLP (OpenTelemetry Protocol)
Standard Protocol — funktioniert mit den meisten Backends.
export OTEL_EXPORTER_OTLP_PROTOCOL=grpc
export OTEL_EXPORTER_OTLP_ENDPOINT=http://localhost:4317
Backends:
- OpenTelemetry Collector
- Datadog
- New Relic
- Honeycomb
- Jaeger
Prometheus
Fuer Metriken direct in Prometheus:
export OTEL_METRICS_EXPORTER=prometheus
Startet einen Prometheus-Endpoint auf Port 8888.
Console
Zum Debuggen — Metriken werden in der Console ausgegeben:
export OTEL_METRICS_EXPORTER=console
export OTEL_METRIC_EXPORT_INTERVAL=10000 # Every 10 seconds
Konfiguration
Environment Variables
| Variable | Beschreibung | Beispiel |
|---|---|---|
CLAUDE_CODE_ENABLE_TELEMETRY |
Aktiviert Telemetry (MUSS gesetzt sein) | 1 |
OTEL_METRICS_EXPORTER |
Metriken-Exporter | otlp, prometheus, console |
OTEL_LOGS_EXPORTER |
Logs/Events-Exporter | otlp, console |
OTEL_EXPORTER_OTLP_ENDPOINT |
OTLP Collector Endpoint | http://localhost:4317 |
OTEL_EXPORTER_OTLP_PROTOCOL |
OTLP Protocol | grpc, http/json, http/protobuf |
OTEL_EXPORTER_OTLP_HEADERS |
Auth Headers | Authorization=Bearer token |
OTEL_METRIC_EXPORT_INTERVAL |
Export-Interval in ms | 60000 (default) |
OTEL_LOGS_EXPORT_INTERVAL |
Logs Export-Interval | 5000 (default) |
Cardinality Control
Reduziere Metriken-Cardinality (weniger Storage):
export OTEL_METRICS_INCLUDE_SESSION_ID=false
export OTEL_METRICS_INCLUDE_ACCOUNT_UUID=false
export OTEL_METRICS_INCLUDE_VERSION=false
Verfuegbare Metriken
Sessions
claude_code.session.count
Zaehler: Neue Sessions gestartet.
Attributes:
session.iduser.emailorganization.id
Code Changes
claude_code.lines_of_code.count
Zaehler: Lines hinzugefuegt/entfernt.
Attributes:
type:"added"oder"removed"
Commits
claude_code.commit.count
Zaehler: Git Commits erstellt.
Pull Requests
claude_code.pull_request.count
Zaehler: PRs erstellt.
Token Usage
claude_code.token.usage
Zaehler: Tokens verwendet.
Attributes:
type:"input","output","cacheRead","cacheCreation"model: Model verwendet
Cost
claude_code.cost.usage
Zaehler: Geschaetzte Kosten in USD.
Attributes:
model: Model
Tool Decisions
claude_code.code_edit_tool.decision
Zaehler: Code-Edit Genehmigungen (accept/reject).
Attributes:
tool_name:"Edit","Write","NotebookEdit"decision:"accept"oder"reject"language: Programmiersprache
Active Time
claude_code.active_time.total
Zaehler: Aktive Zeit in Sekunden (ohne Idle).
Attributes:
type:"user"(Tastatur) oder"cli"(Tool Execution)
Verfuegbare Events
User Prompt Event
Wenn Benutzer einen Prompt eingibt.
Feld: claude_code.user_prompt
Daten:
prompt_lengthprompt(optional, aktiviere mitOTEL_LOG_USER_PROMPTS=1)
Tool Result Event
Wenn ein Tool ausfuehrung abschliesst.
Feld: claude_code.tool_result
Daten:
tool_namesuccess: true/falseduration_mserror(wenn fehlgeschlagen)
API Request Event
Fuer jeden Claude API Request.
Feld: claude_code.api_request
Daten:
modelcost_usdduration_msinput_tokensoutput_tokenscache_read_tokenscache_creation_tokens
API Error Event
Wenn API Request fehlschlaegt.
Feld: claude_code.api_error
Daten:
modelerrorstatus_codeattempt(Retry-Nummer)
Dynamic Headers (Enterprise)
Fuer Organisationen mit dynamischen Authentifizierung (Token Refresh):
{
"otelHeadersHelper": "/bin/generate_headers.sh"
}
Script muss JSON-Header zurueckgeben:
#!/bin/bash
echo "{\"Authorization\": \"Bearer $(get-token.sh)\"}"
Wird alle 29 Minuten refreshed. Interval konfigurierbar:
export CLAUDE_CODE_OTEL_HEADERS_HELPER_DEBOUNCE_MS=900000
Dashboards & Analyse
Mit Prometheus/Grafana
- Exportiere Metriken zu Prometheus
- Erstelle Grafana Dashboard
- Query Metriken:
rate(claude_code_token_usage_total{type="input"}[5m])
Mit Datadog
Verbinde Datadog OTel Receiver:
export OTEL_EXPORTER_OTLP_ENDPOINT=http://datadog-agent:4317
export OTEL_EXPORTER_OTLP_HEADERS="Authorization=Bearer $DD_API_KEY"
Metriken erscheinen automatisch in Datadog.
Mit Honeycomb
Einfach Honeycomb als OTLP Receiver:
export OTEL_EXPORTER_OTLP_ENDPOINT=https://api.honeycomb.io
export OTEL_EXPORTER_OTLP_HEADERS="x-honeycomb-team=$HC_API_KEY"
Team Multi-Tenancy
Fuer Organisationen mit mehreren Teams:
export OTEL_RESOURCE_ATTRIBUTES="department=engineering,team.id=platform,cost_center=eng-123"
Alle Metriken werden mit diesen Attributen tagged.
Formatting-Regeln:
- Komma-getrennte key=value Paare
- Keine Spaces in Values
- Percent-encode spezielle Zeichen
# FALSCH
export OTEL_RESOURCE_ATTRIBUTES="team=My Team"
# RICHTIG
export OTEL_RESOURCE_ATTRIBUTES="team=my_team"
ROI Measurement
Basis-Metriken
| Metrik | Beschreibung | Formel |
|---|---|---|
| LOC/Session | Code per Session | total_lines_added / session_count |
| Cost/LOC | Kosten pro Zeile | total_cost / total_lines_added |
| Time Saved | Geschaetzte Zeit | commits_count * avg_commit_time |
| Commits/Day | Velocity | commits_count / days |
Berechnung von ROI
ROI % = ((Time_Saved * Hourly_Rate) - Total_Cost) / Total_Cost * 100
Beispiel:
- Time Saved: 40 Stunden (400 commits × 6 min each)
- Hourly Rate: $100
- Total Cost: $500 (Tokens)
ROI = ((40 × 100) - 500) / 500 × 100 = 7,900%
Cost Optimization
# Reduziere Export-Interval wenn unnoetiger Overhead
export OTEL_METRIC_EXPORT_INTERVAL=120000 # 2 minutes statt 60s
# Deaktiviere Session-ID wenn cardinality ein Problem
export OTEL_METRICS_INCLUDE_SESSION_ID=false
# Reduziere Event-Logging
export OTEL_LOG_USER_PROMPTS=0
export OTEL_LOG_TOOL_DETAILS=0
Security & Privacy
Was wird gecollected
IMMER:
- Session ID
- User Email (wenn OAuth)
- Organization ID
- Token Counts
- Cost
- Tool Names
NUR wenn aktiviert:
- User Prompt Content (
OTEL_LOG_USER_PROMPTS=1) - MCP/Skill Names (
OTEL_LOG_TOOL_DETAILS=1)
Was wird NICHT gecollected
- File Contents
- Raw Code
- Secrets/API Keys
- Passwords
Redaction & Filtering
Dein Backend kann Telemetry filtern:
# Nur Public Metrics
rate(claude_code_cost_usage_total[5m])
# Exclude sensitive orgs
rate(claude_code_token_usage_total{organization_id!="private"}[5m])
Troubleshooting
Metriken kommen nicht an
-
Pruefen ob enabled:
echo $CLAUDE_CODE_ENABLE_TELEMETRY -
Pruefen ob Endpoint erreichbar:
curl http://localhost:4317/healthz -
Checken ob Exporter konfiguriert:
echo $OTEL_METRICS_EXPORTER
Zu viele Metriken (Cardinality Issue)
Problem: claude_code.session.count mit jedem Session-ID wird 10000+ Time Series.
Loesungen:
# Deaktiviere Session ID
export OTEL_METRICS_INCLUDE_SESSION_ID=false
# Oder nutze organisationID aggregation
export OTEL_RESOURCE_ATTRIBUTES="organization.id=org-1"
Authentisierung fehlgeschlagen
# Pruefen ob Token valid
echo $OTEL_EXPORTER_OTLP_HEADERS
# Test mit curl
curl -H "$OTEL_EXPORTER_OTLP_HEADERS" \
http://your-collector:4317/metrics
Weitere Ressourcen
Stand: 2026-03-21 | Claude Code Monitoring & Telemetry Reference
