Bỏ qua để đến nội dung

Giám sát với OpenTelemetry

Bài viết được dịch tự động từ bài viết gốc, chưa được kiểm tra lại bởi con người. Chỉ những bài viết có dấu tick xanh cạnh tiêu đề là đã được kiểm tra.

Theo dõi usage, chi phí và hoạt động tool của Claude Code trên toàn tổ chức bằng cách export dữ liệu telemetry qua OpenTelemetry (OTel). Claude Code export metrics dạng time series qua metrics protocol chuẩn, events qua logs/events protocol, và tùy chọn distributed traces qua traces protocol (beta). Bạn cấu hình backend cho metrics, logs, traces theo nhu cầu giám sát của mình.

Cấu hình OpenTelemetry bằng biến môi trường:

Terminal window
# 1. Bật telemetry
export CLAUDE_CODE_ENABLE_TELEMETRY=1
# 2. Chọn exporter (cả hai đều tùy chọn - chỉ cấu hình cái bạn cần)
export OTEL_METRICS_EXPORTER=otlp # Tùy chọn: otlp, prometheus, console, none
export OTEL_LOGS_EXPORTER=otlp # Tùy chọn: otlp, console, none
# 3. Cấu hình OTLP endpoint (cho exporter otlp)
export OTEL_EXPORTER_OTLP_PROTOCOL=grpc
export OTEL_EXPORTER_OTLP_ENDPOINT=http://localhost:4317
# 4. Thiết lập xác thực (nếu cần)
export OTEL_EXPORTER_OTLP_HEADERS="Authorization=Bearer your-token"
# 5. Để debug: giảm export interval
export OTEL_METRIC_EXPORT_INTERVAL=10000 # 10 giây (mặc định: 60000ms)
export OTEL_LOGS_EXPORT_INTERVAL=5000 # 5 giây (mặc định: 5000ms)
# 6. Chạy Claude Code
claude

Để xác minh setup export metrics, kiểm tra backend của bạn xem có metric claude_code.session.count không - metric này được Claude Code emit khi một session bắt đầu. Để xác minh setup chỉ có logs, gửi một prompt rồi kiểm tra event claude_code.user_prompt. Nếu không thấy gì, chạy claude --debug và xem debug log để tìm lỗi export OTel.

Admin có thể cấu hình OpenTelemetry cho toàn bộ user qua managed settings file, giúp kiểm soát tập trung cấu hình telemetry trên toàn tổ chức.

Ví dụ managed settings:

{
"env": {
"CLAUDE_CODE_ENABLE_TELEMETRY": "1",
"OTEL_METRICS_EXPORTER": "otlp",
"OTEL_LOGS_EXPORTER": "otlp",
"OTEL_EXPORTER_OTLP_PROTOCOL": "grpc",
"OTEL_EXPORTER_OTLP_ENDPOINT": "http://collector.example.com:4317",
"OTEL_EXPORTER_OTLP_HEADERS": "Authorization=Bearer example-token"
}
}

Claude Code không truyền biến OTEL_* xuống các subprocess mà nó spawn ra - bao gồm Bash tool, hooks, MCP server, và language server. Một ứng dụng được instrument OpenTelemetry mà bạn chạy qua Bash tool sẽ không tự kế thừa exporter endpoint hay headers của Claude Code; nếu ứng dụng đó cần export telemetry riêng, hãy set các biến đó trực tiếp trong command.

Managed settings khóa đích OTLP như thế nào

Phần tiêu đề “Managed settings khóa đích OTLP như thế nào”

Khi bạn set một biến OTEL_EXPORTER_OTLP_* trong managed settings, Claude Code sẽ xóa các biến do developer tự set bị xung đột lúc khởi động, và log cảnh báo (xem được bằng claude --debug). Cụ thể:

  • Endpoint: set OTEL_EXPORTER_OTLP_ENDPOINT sẽ xóa mọi endpoint theo từng signal (per-signal) mà developer đã set - developer không thể trỏ một signal sang collector khác.
  • Protocol: set OTEL_EXPORTER_OTLP_PROTOCOL sẽ xóa mọi protocol per-signal do developer set.
  • Credentials: set OTEL_EXPORTER_OTLP_HEADERS, OTEL_EXPORTER_OTLP_CLIENT_KEY, hoặc OTEL_EXPORTER_OTLP_CLIENT_CERTIFICATE sẽ xóa các biến credential per-signal tương ứng, cộng với mọi endpoint developer đã set (generic lẫn per-signal) - vì credentials đó có thể lọt tới một collector mà managed settings không hề chọn.
  • Exporter selector: OTEL_METRICS_EXPORTER, OTEL_LOGS_EXPORTER, và OTEL_TRACES_EXPORTER (beta) vẫn theo thứ tự ưu tiên bình thường theo key - developer vẫn có thể tắt một signal hoặc chuyển sang console exporter, nên nếu muốn khóa hẳn, hãy set các selector này trong managed settings luôn.

Claude Code không xóa các biến per-signal mà chính managed settings đặt ra, nên bạn có thể route một signal riêng tới collector khác (xem ví dụ SIEM bên dưới).

Biến môi trườngMô tảVí dụ
CLAUDE_CODE_ENABLE_TELEMETRYBật thu thập telemetry (bắt buộc)1
OTEL_METRICS_EXPORTERLoại exporter cho metrics, phân cách bằng dấu phẩy. Dùng none để tắtconsole, otlp, prometheus, none
OTEL_LOGS_EXPORTERLoại exporter cho logs/events. Dùng none để tắtconsole, otlp, none
OTEL_EXPORTER_OTLP_PROTOCOLProtocol cho OTLP exporter, áp dụng cho mọi signalgrpc, http/json, http/protobuf
OTEL_EXPORTER_OTLP_ENDPOINTEndpoint OTLP collector cho mọi signalhttp://localhost:4317
OTEL_EXPORTER_OTLP_METRICS_ENDPOINTEndpoint metrics riêng, ghi đè setting chunghttp://localhost:4318/v1/metrics
OTEL_EXPORTER_OTLP_LOGS_ENDPOINTEndpoint logs riêng, ghi đè setting chunghttp://localhost:4318/v1/logs
OTEL_EXPORTER_OTLP_HEADERSHeader xác thực cho OTLPAuthorization=Bearer token
OTEL_METRIC_EXPORT_INTERVALInterval export (ms, mặc định 60000)5000, 60000
OTEL_LOGS_EXPORT_INTERVALInterval export logs (ms, mặc định 5000)1000, 10000
OTEL_LOG_USER_PROMPTSBật log nội dung prompt của user (mặc định tắt)1
OTEL_LOG_ASSISTANT_RESPONSESBật log nội dung phản hồi assistant (mặc định theo OTEL_LOG_USER_PROMPTS)1 bật, 0 giữ redacted
OTEL_LOG_TOOL_DETAILSBật log tham số tool (Bash command, tên MCP server/tool, skill, v.v.)1
OTEL_LOG_TOOL_CONTENTBật log nội dung input/output của tool trong span events (cần bật tracing)1
OTEL_LOG_RAW_API_BODIESEmit toàn bộ request/response JSON của Messages API1 (inline, cắt ở 60 KB) hoặc file:<dir> (không cắt, ghi file)
CLAUDE_CODE_OTEL_CONTENT_MAX_LENGTHGiới hạn độ dài nội dung các attribute (mặc định 61440, ~60 KB)262144
OTEL_EXPORTER_OTLP_METRICS_TEMPORALITY_PREFERENCETemporality cho metrics (mặc định delta)delta, cumulative

Với protocol http/protobufhttp/json, Claude Code gửi mỗi request kèm header Content-Length.

Cách cấu hình client certificate cho OTLP exporter phụ thuộc vào protocol đang dùng:

ProtocolBiến client certificateTrust CA của collector qua
http/protobuf, http/jsonCLAUDE_CODE_CLIENT_CERT, CLAUDE_CODE_CLIENT_KEY, tùy chọn CLAUDE_CODE_CLIENT_KEY_PASSPHRASENODE_EXTRA_CA_CERTS
grpcOTEL_EXPORTER_OTLP_CLIENT_KEYOTEL_EXPORTER_OTLP_CLIENT_CERTIFICATE, hoặc biến per-signal tương ứngOTEL_EXPORTER_OTLP_CERTIFICATE
Biến môi trườngMô tảMặc định
OTEL_METRICS_INCLUDE_SESSION_IDĐưa session.id vào metricstrue
OTEL_METRICS_INCLUDE_VERSIONĐưa app.version vào metricsfalse
OTEL_METRICS_INCLUDE_ACCOUNT_UUIDĐưa user.account_uuid/user.account_id vào metricstrue
OTEL_METRICS_INCLUDE_ENTRYPOINTĐưa app.entrypoint vào metricsfalse
OTEL_METRICS_INCLUDE_RESOURCE_ATTRIBUTESĐưa key từ OTEL_RESOURCE_ATTRIBUTES vào datapoint metricstrue

Các biến này giúp kiểm soát cardinality của metrics - ảnh hưởng đến chi phí lưu trữ và tốc độ truy vấn ở backend metrics của bạn. Cardinality thấp thường đồng nghĩa hiệu năng tốt hơn, chi phí thấp hơn, nhưng dữ liệu ít chi tiết hơn.

Distributed tracing export các span liên kết mỗi user prompt với các API request và tool execution mà nó kích hoạt, giúp bạn xem một request đầy đủ dưới dạng một trace duy nhất trong backend tracing.

Tracing mặc định tắt. Để bật, set cả CLAUDE_CODE_ENABLE_TELEMETRY=1CLAUDE_CODE_ENHANCED_TELEMETRY_BETA=1, rồi chọn OTEL_TRACES_EXPORTER. Traces dùng chung cấu hình OTLP (endpoint, protocol, headers, mTLS) với metrics/logs.

Cấu trúc span:

claude_code.interaction
├── claude_code.llm_request
├── claude_code.hook (cần detailed beta tracing)
└── claude_code.tool
├── claude_code.tool.blocked_on_user
├── claude_code.tool.execution
└── (Agent tool) span llm_request/tool của subagent

Mặc định, span redact nội dung user prompt, tool input, và tool content - bật OTEL_LOG_USER_PROMPTS=1, OTEL_LOG_TOOL_DETAILS=1, OTEL_LOG_TOOL_CONTENT=1 để đưa chúng vào.

Với môi trường enterprise cần xác thực động, bạn có thể cấu hình một script để sinh header theo thời gian thực. Thêm vào .claude/settings.json:

{
"otelHeadersHelper": "/path/to/generate-otel-headers.sh"
}

Script phải output JSON hợp lệ dạng key-value string:

#!/bin/bash
echo "{\"Authorization\": \"Bearer $(get-token.sh)\", \"X-API-Key\": \"$(get-api-key.sh)\"}"

Script chạy lúc khởi động và định kỳ sau đó (mặc định mỗi 29 phút) để hỗ trợ refresh token - tùy chỉnh bằng CLAUDE_CODE_OTEL_HEADERS_HELPER_DEBOUNCE_MS.

Tổ chức có nhiều team/phòng ban có thể thêm attribute tùy chỉnh để phân biệt các nhóm bằng OTEL_RESOURCE_ATTRIBUTES:

Terminal window
export OTEL_RESOURCE_ATTRIBUTES="department=engineering,team.id=platform,cost_center=eng-123"

Các attribute này được gắn vào mọi metric datapoint và event record, cho phép bạn filter theo team, tính cost theo cost center, hoặc dựng dashboard/alert riêng cho từng team.

Mọi metric và event đều có các attribute chuẩn sau: session.id, app.version, app.entrypoint, organization.id, user.account_uuid/user.account_id, user.id (định danh ẩn danh ngẫu nhiên, không liên quan tài khoản Claude), user.email, terminal.type, và các key tùy chỉnh từ OTEL_RESOURCE_ATTRIBUTES.

Events có thêm prompt.id (UUID liên kết mọi event sinh ra từ một user prompt) - dùng để trace toàn bộ hoạt động từ một prompt cụ thể.

Tên metricMô tảĐơn vị
claude_code.session.countSố session CLI đã bắt đầukhông
claude_code.lines_of_code.countSố dòng code đã sửakhông
claude_code.pull_request.countSố pull request đã tạokhông
claude_code.commit.countSố git commit đã tạokhông
claude_code.cost.usageChi phí sessionUSD
claude_code.token.usageSố token đã dùngtokens
claude_code.code_edit_tool.decisionSố quyết định permission cho tool sửa codekhông
claude_code.active_time.totalTổng thời gian hoạt động thực tếgiây

Mỗi metric có thêm attribute ngữ cảnh riêng - ví dụ cost.usagemodel, query_source, agent.name, skill.name, plugin.name, mcp_server.name… Xem tài liệu gốc để có bảng chi tiết từng metric.

Claude Code export nhiều loại event qua logs/events (khi OTEL_LOGS_EXPORTER được cấu hình), gồm: user_prompt, assistant_response, tool_result, api_request, api_error, api_refusal, api_request_body/api_response_body (khi bật raw bodies), tool_decision, permission_mode_changed, auth, mcp_server_connection, internal_error, plugin_installed, plugin_loaded.

Mỗi event mang các attribute chuẩn cộng thêm attribute riêng - ví dụ tool_decisiontool_name, decision (accept/reject), source (config, hook, user_permanent, user_temporary, user_abort, user_reject). Các nội dung nhạy cảm (prompt text, tool input/output, error message chi tiết) đều bị redact mặc định và cần bật cờ tương ứng (OTEL_LOG_USER_PROMPTS, OTEL_LOG_TOOL_DETAILS, OTEL_LOG_TOOL_CONTENT) để hiển thị đầy đủ.