Claude Code는 모니터링 및 관찰성을 위해 OpenTelemetry(OTel) 메트릭 및 이벤트를 지원합니다.
모든 메트릭은 OpenTelemetry의 표준 메트릭 프로토콜을 통해 내보내지는 시계열 데이터이며, 이벤트는 OpenTelemetry의 로그/이벤트 프로토콜을 통해 내보내집니다. 메트릭 및 로그 백엔드가 올바르게 구성되어 있고 집계 세분성이 모니터링 요구사항을 충족하는지 확인하는 것은 사용자의 책임입니다.
OpenTelemetry 지원은 현재 베타 버전이며 세부 사항은 변경될 수 있습니다.
빠른 시작
환경 변수를 사용하여 OpenTelemetry를 구성합니다:
# 1. 텔레메트리 활성화
export CLAUDE_CODE_ENABLE_TELEMETRY=1
# 2. 내보내기 선택 (둘 다 선택 사항 - 필요한 것만 구성)
export OTEL_METRICS_EXPORTER=otlp # 옵션: otlp, prometheus, console
export OTEL_LOGS_EXPORTER=otlp # 옵션: otlp, console
# 3. OTLP 엔드포인트 구성 (OTLP 내보내기용)
export OTEL_EXPORTER_OTLP_PROTOCOL=grpc
export OTEL_EXPORTER_OTLP_ENDPOINT=http://localhost:4317
# 4. 인증 설정 (필요한 경우)
export OTEL_EXPORTER_OTLP_HEADERS="Authorization=Bearer your-token"
# 5. 디버깅용: 내보내기 간격 단축
export OTEL_METRIC_EXPORT_INTERVAL=10000 # 10초 (기본값: 60000ms)
export OTEL_LOGS_EXPORT_INTERVAL=5000 # 5초 (기본값: 5000ms)
# 6. Claude Code 실행
claude
기본 내보내기 간격은 메트릭의 경우 60초, 로그의 경우 5초입니다. 설정 중에는 디버깅 목적으로 더 짧은 간격을 사용할 수 있습니다. 프로덕션 사용을 위해 이를 재설정하는 것을 잊지 마세요.
전체 구성 옵션은 OpenTelemetry 사양을 참조하세요.
관리자 구성
관리자는 관리되는 설정 파일을 통해 모든 사용자에 대한 OpenTelemetry 설정을 구성할 수 있습니다. 이를 통해 조직 전체에서 텔레메트리 설정을 중앙에서 제어할 수 있습니다. 설정이 어떻게 적용되는지에 대한 자세한 내용은 설정 우선순위를 참조하세요.
관리되는 설정 파일은 다음 위치에 있습니다:
- macOS:
/Library/Application Support/ClaudeCode/managed-settings.json
- Linux 및 WSL:
/etc/claude-code/managed-settings.json
- Windows:
C:\ProgramData\ClaudeCode\managed-settings.json
관리되는 설정 구성 예시:
{
"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.company.com:4317",
"OTEL_EXPORTER_OTLP_HEADERS": "Authorization=Bearer company-token"
}
}
관리되는 설정은 MDM(Mobile Device Management) 또는 기타 장치 관리 솔루션을 통해 배포될 수 있습니다. 관리되는 설정 파일에 정의된 환경 변수는 높은 우선순위를 가지며 사용자가 재정의할 수 없습니다.
구성 세부 사항
일반 구성 변수
| 환경 변수 | 설명 | 예시 값 |
CLAUDE_CODE_ENABLE_TELEMETRY | 텔레메트리 수집 활성화 (필수) | 1 |
OTEL_METRICS_EXPORTER | 메트릭 내보내기 유형(쉼표로 구분) | console, otlp, prometheus |
OTEL_LOGS_EXPORTER | 로그/이벤트 내보내기 유형(쉼표로 구분) | console, otlp |
OTEL_EXPORTER_OTLP_PROTOCOL | OTLP 내보내기 프로토콜 (모든 신호) | grpc, http/json, http/protobuf |
OTEL_EXPORTER_OTLP_ENDPOINT | OTLP 수집기 엔드포인트 (모든 신호) | http://localhost:4317 |
OTEL_EXPORTER_OTLP_METRICS_PROTOCOL | 메트릭 프로토콜 (일반 설정 재정의) | grpc, http/json, http/protobuf |
OTEL_EXPORTER_OTLP_METRICS_ENDPOINT | OTLP 메트릭 엔드포인트 (일반 설정 재정의) | http://localhost:4318/v1/metrics |
OTEL_EXPORTER_OTLP_LOGS_PROTOCOL | 로그 프로토콜 (일반 설정 재정의) | grpc, http/json, http/protobuf |
OTEL_EXPORTER_OTLP_LOGS_ENDPOINT | OTLP 로그 엔드포인트 (일반 설정 재정의) | http://localhost:4318/v1/logs |
OTEL_EXPORTER_OTLP_HEADERS | OTLP용 인증 헤더 | Authorization=Bearer token |
OTEL_EXPORTER_OTLP_METRICS_CLIENT_KEY | mTLS 인증용 클라이언트 키 | 클라이언트 키 파일 경로 |
OTEL_EXPORTER_OTLP_METRICS_CLIENT_CERTIFICATE | mTLS 인증용 클라이언트 인증서 | 클라이언트 인증서 파일 경로 |
OTEL_METRIC_EXPORT_INTERVAL | 내보내기 간격(밀리초 단위, 기본값: 60000) | 5000, 60000 |
OTEL_LOGS_EXPORT_INTERVAL | 로그 내보내기 간격(밀리초 단위, 기본값: 5000) | 1000, 10000 |
OTEL_LOG_USER_PROMPTS | 사용자 프롬프트 콘텐츠 로깅 활성화 (기본값: 비활성화) | 1로 활성화 |
메트릭 카디널리티 제어
다음 환경 변수는 카디널리티를 관리하기 위해 메트릭에 포함되는 속성을 제어합니다:
| 환경 변수 | 설명 | 기본값 | 비활성화 예시 |
OTEL_METRICS_INCLUDE_SESSION_ID | 메트릭에 session.id 속성 포함 | true | false |
OTEL_METRICS_INCLUDE_VERSION | 메트릭에 app.version 속성 포함 | false | true |
OTEL_METRICS_INCLUDE_ACCOUNT_UUID | 메트릭에 user.account_uuid 속성 포함 | true | false |
이러한 변수는 메트릭의 카디널리티를 제어하는 데 도움이 되며, 이는 메트릭 백엔드의 저장소 요구사항과 쿼리 성능에 영향을 미칩니다. 낮은 카디널리티는 일반적으로 더 나은 성능과 낮은 저장소 비용을 의미하지만 분석을 위한 더 세분화된 데이터는 적습니다.
동적 헤더
동적 인증이 필요한 엔터프라이즈 환경의 경우 스크립트를 구성하여 헤더를 동적으로 생성할 수 있습니다:
설정 구성
.claude/settings.json에 추가:
{
"otelHeadersHelper": "/bin/generate_opentelemetry_headers.sh"
}
스크립트 요구사항
스크립트는 HTTP 헤더를 나타내는 문자열 키-값 쌍이 있는 유효한 JSON을 출력해야 합니다:
#!/bin/bash
# 예시: 여러 헤더
echo "{\"Authorization\": \"Bearer $(get-token.sh)\", \"X-API-Key\": \"$(get-api-key.sh)\"}"
중요한 제한사항
헤더는 시작 시에만 가져오며, 런타임 중에는 가져오지 않습니다. 이는 OpenTelemetry 내보내기 아키텍처 제한 때문입니다.
빈번한 토큰 새로고침이 필요한 시나리오의 경우 자체 헤더를 새로고칠 수 있는 프록시로 OpenTelemetry Collector를 사용하세요.
다중 팀 조직 지원
여러 팀 또는 부서가 있는 조직은 OTEL_RESOURCE_ATTRIBUTES 환경 변수를 사용하여 다양한 그룹을 구분하기 위한 사용자 정의 속성을 추가할 수 있습니다:
# 팀 식별을 위한 사용자 정의 속성 추가
export OTEL_RESOURCE_ATTRIBUTES="department=engineering,team.id=platform,cost_center=eng-123"
이러한 사용자 정의 속성은 모든 메트릭 및 이벤트에 포함되어 다음을 수행할 수 있습니다:
- 팀 또는 부서별로 메트릭 필터링
- 비용 센터별 비용 추적
- 팀별 대시보드 생성
- 특정 팀에 대한 경고 설정
OTEL_RESOURCE_ATTRIBUTES의 중요한 형식 요구사항:OTEL_RESOURCE_ATTRIBUTES 환경 변수는 W3C Baggage 사양을 따르며, 엄격한 형식 요구사항이 있습니다:
- 공백 허용 안 함: 값에 공백이 포함될 수 없습니다. 예를 들어
user.organizationName=My Company는 유효하지 않습니다
- 형식: 쉼표로 구분된 키=값 쌍이어야 합니다:
key1=value1,key2=value2
- 허용된 문자: 제어 문자, 공백, 큰따옴표, 쉼표, 세미콜론 및 백슬래시를 제외한 US-ASCII 문자만 허용됩니다
- 특수 문자: 허용된 범위 외의 문자는 퍼센트 인코딩되어야 합니다
예시:# ❌ 유효하지 않음 - 공백 포함
export OTEL_RESOURCE_ATTRIBUTES="org.name=John's Organization"
# ✅ 유효함 - 대신 밑줄 또는 camelCase 사용
export OTEL_RESOURCE_ATTRIBUTES="org.name=Johns_Organization"
export OTEL_RESOURCE_ATTRIBUTES="org.name=JohnsOrganization"
# ✅ 유효함 - 필요한 경우 특수 문자를 퍼센트 인코딩
export OTEL_RESOURCE_ATTRIBUTES="org.name=John%27s%20Organization"
참고: 전체 키=값 쌍을 인용하는 것(예: "key=value with spaces")은 OpenTelemetry 사양에서 지원하지 않으며 속성이 따옴표로 접두사가 붙는 결과가 됩니다.
구성 예시
# 콘솔 디버깅 (1초 간격)
export CLAUDE_CODE_ENABLE_TELEMETRY=1
export OTEL_METRICS_EXPORTER=console
export OTEL_METRIC_EXPORT_INTERVAL=1000
# OTLP/gRPC
export CLAUDE_CODE_ENABLE_TELEMETRY=1
export OTEL_METRICS_EXPORTER=otlp
export OTEL_EXPORTER_OTLP_PROTOCOL=grpc
export OTEL_EXPORTER_OTLP_ENDPOINT=http://localhost:4317
# Prometheus
export CLAUDE_CODE_ENABLE_TELEMETRY=1
export OTEL_METRICS_EXPORTER=prometheus
# 여러 내보내기
export CLAUDE_CODE_ENABLE_TELEMETRY=1
export OTEL_METRICS_EXPORTER=console,otlp
export OTEL_EXPORTER_OTLP_PROTOCOL=http/json
# 메트릭 및 로그에 대한 다양한 엔드포인트/백엔드
export CLAUDE_CODE_ENABLE_TELEMETRY=1
export OTEL_METRICS_EXPORTER=otlp
export OTEL_LOGS_EXPORTER=otlp
export OTEL_EXPORTER_OTLP_METRICS_PROTOCOL=http/protobuf
export OTEL_EXPORTER_OTLP_METRICS_ENDPOINT=http://metrics.company.com:4318
export OTEL_EXPORTER_OTLP_LOGS_PROTOCOL=grpc
export OTEL_EXPORTER_OTLP_LOGS_ENDPOINT=http://logs.company.com:4317
# 메트릭만 (이벤트/로그 없음)
export CLAUDE_CODE_ENABLE_TELEMETRY=1
export OTEL_METRICS_EXPORTER=otlp
export OTEL_EXPORTER_OTLP_PROTOCOL=grpc
export OTEL_EXPORTER_OTLP_ENDPOINT=http://localhost:4317
# 이벤트/로그만 (메트릭 없음)
export CLAUDE_CODE_ENABLE_TELEMETRY=1
export OTEL_LOGS_EXPORTER=otlp
export OTEL_EXPORTER_OTLP_PROTOCOL=grpc
export OTEL_EXPORTER_OTLP_ENDPOINT=http://localhost:4317
사용 가능한 메트릭 및 이벤트
표준 속성
모든 메트릭 및 이벤트는 다음 표준 속성을 공유합니다:
| 속성 | 설명 | 제어 대상 |
session.id | 고유 세션 식별자 | OTEL_METRICS_INCLUDE_SESSION_ID (기본값: true) |
app.version | 현재 Claude Code 버전 | OTEL_METRICS_INCLUDE_VERSION (기본값: false) |
organization.id | 조직 UUID (인증 시) | 사용 가능할 때 항상 포함 |
user.account_uuid | 계정 UUID (인증 시) | OTEL_METRICS_INCLUDE_ACCOUNT_UUID (기본값: true) |
terminal.type | 터미널 유형 (예: iTerm.app, vscode, cursor, tmux) | 감지 시 항상 포함 |
메트릭
Claude Code는 다음 메트릭을 내보냅니다:
| 메트릭 이름 | 설명 | 단위 |
claude_code.session.count | 시작된 CLI 세션 수 | count |
claude_code.lines_of_code.count | 수정된 코드 라인 수 | count |
claude_code.pull_request.count | 생성된 풀 요청 수 | count |
claude_code.commit.count | 생성된 git 커밋 수 | count |
claude_code.cost.usage | Claude Code 세션의 비용 | USD |
claude_code.token.usage | 사용된 토큰 수 | tokens |
claude_code.code_edit_tool.decision | 코드 편집 도구 권한 결정 수 | count |
claude_code.active_time.total | 총 활성 시간(초) | s |
메트릭 세부 사항
세션 카운터
각 세션 시작 시 증가합니다.
속성:
코드 라인 카운터
코드가 추가되거나 제거될 때 증가합니다.
속성:
- 모든 표준 속성
type: ("added", "removed")
풀 요청 카운터
Claude Code를 통해 풀 요청을 생성할 때 증가합니다.
속성:
커밋 카운터
Claude Code를 통해 git 커밋을 생성할 때 증가합니다.
속성:
비용 카운터
각 API 요청 후 증가합니다.
속성:
- 모든 표준 속성
model: 모델 식별자 (예: “claude-sonnet-4-5-20250929”)
토큰 카운터
각 API 요청 후 증가합니다.
속성:
- 모든 표준 속성
type: ("input", "output", "cacheRead", "cacheCreation")
model: 모델 식별자 (예: “claude-sonnet-4-5-20250929”)
코드 편집 도구 결정 카운터
사용자가 Edit, Write 또는 NotebookEdit 도구 사용을 수락하거나 거부할 때 증가합니다.
속성:
- 모든 표준 속성
tool: 도구 이름 ("Edit", "Write", "NotebookEdit")
decision: 사용자 결정 ("accept", "reject")
language: 편집된 파일의 프로그래밍 언어 (예: "TypeScript", "Python", "JavaScript", "Markdown"). 인식되지 않는 파일 확장자의 경우 "unknown"을 반환합니다.
활성 시간 카운터
Claude Code를 적극적으로 사용하는 실제 시간을 추적합니다 (유휴 시간 제외). 이 메트릭은 프롬프트 입력 또는 응답 수신과 같은 사용자 상호작용 중에 증가합니다.
속성:
이벤트
Claude Code는 OpenTelemetry 로그/이벤트를 통해 다음 이벤트를 내보냅니다 (OTEL_LOGS_EXPORTER가 구성된 경우):
사용자 프롬프트 이벤트
사용자가 프롬프트를 제출할 때 로깅됩니다.
이벤트 이름: claude_code.user_prompt
속성:
- 모든 표준 속성
event.name: "user_prompt"
event.timestamp: ISO 8601 타임스탬프
prompt_length: 프롬프트의 길이
prompt: 프롬프트 콘텐츠 (기본적으로 수정됨, OTEL_LOG_USER_PROMPTS=1로 활성화)
도구 결과 이벤트
도구가 실행을 완료할 때 로깅됩니다.
이벤트 이름: claude_code.tool_result
속성:
- 모든 표준 속성
event.name: "tool_result"
event.timestamp: ISO 8601 타임스탬프
tool_name: 도구의 이름
success: "true" 또는 "false"
duration_ms: 실행 시간(밀리초)
error: 오류 메시지 (실패한 경우)
decision: "accept" 또는 "reject"
source: 결정 소스 - "config", "user_permanent", "user_temporary", "user_abort" 또는 "user_reject"
tool_parameters: 도구별 매개변수를 포함하는 JSON 문자열 (사용 가능한 경우)
- Bash 도구의 경우:
bash_command, full_command, timeout, description, sandbox 포함
API 요청 이벤트
Claude에 대한 각 API 요청에 대해 로깅됩니다.
이벤트 이름: claude_code.api_request
속성:
- 모든 표준 속성
event.name: "api_request"
event.timestamp: ISO 8601 타임스탬프
model: 사용된 모델 (예: “claude-sonnet-4-5-20250929”)
cost_usd: USD 단위의 예상 비용
duration_ms: 요청 지속 시간(밀리초)
input_tokens: 입력 토큰 수
output_tokens: 출력 토큰 수
cache_read_tokens: 캐시에서 읽은 토큰 수
cache_creation_tokens: 캐시 생성에 사용된 토큰 수
API 오류 이벤트
Claude에 대한 API 요청이 실패할 때 로깅됩니다.
이벤트 이름: claude_code.api_error
속성:
- 모든 표준 속성
event.name: "api_error"
event.timestamp: ISO 8601 타임스탬프
model: 사용된 모델 (예: “claude-sonnet-4-5-20250929”)
error: 오류 메시지
status_code: HTTP 상태 코드 (해당하는 경우)
duration_ms: 요청 지속 시간(밀리초)
attempt: 시도 번호 (재시도된 요청의 경우)
도구 결정 이벤트
도구 권한 결정이 내려질 때 로깅됩니다 (수락/거부).
이벤트 이름: claude_code.tool_decision
속성:
- 모든 표준 속성
event.name: "tool_decision"
event.timestamp: ISO 8601 타임스탬프
tool_name: 도구의 이름 (예: “Read”, “Edit”, “Write”, “NotebookEdit” 등)
decision: "accept" 또는 "reject"
source: 결정 소스 - "config", "user_permanent", "user_temporary", "user_abort" 또는 "user_reject"
메트릭 및 이벤트 데이터 해석
Claude Code에서 내보낸 메트릭은 사용 패턴 및 생산성에 대한 귀중한 통찰력을 제공합니다. 다음은 만들 수 있는 일반적인 시각화 및 분석입니다:
사용 모니터링
| 메트릭 | 분석 기회 |
claude_code.token.usage | type (입력/출력), 사용자, 팀 또는 모델별로 분류 |
claude_code.session.count | 시간 경과에 따른 채택 및 참여 추적 |
claude_code.lines_of_code.count | 코드 추가/제거를 추적하여 생산성 측정 |
claude_code.commit.count & claude_code.pull_request.count | 개발 워크플로우에 미치는 영향 이해 |
비용 모니터링
claude_code.cost.usage 메트릭은 다음에 도움이 됩니다:
- 팀 또는 개인 간 사용 추세 추적
- 최적화를 위한 높은 사용 세션 식별
비용 메트릭은 근사치입니다. 공식 청구 데이터는 API 제공자 (Claude Console, AWS Bedrock 또는 Google Cloud Vertex)를 참조하세요.
경고 및 세분화
고려할 일반적인 경고:
- 비용 급증
- 비정상적인 토큰 소비
- 특정 사용자의 높은 세션 볼륨
모든 메트릭은 user.account_uuid, organization.id, session.id, model 및 app.version으로 세분화할 수 있습니다.
이벤트 분석
이벤트 데이터는 Claude Code 상호작용에 대한 자세한 통찰력을 제공합니다:
도구 사용 패턴: 도구 결과 이벤트를 분석하여 다음을 식별합니다:
- 가장 자주 사용되는 도구
- 도구 성공률
- 평균 도구 실행 시간
- 도구 유형별 오류 패턴
성능 모니터링: API 요청 지속 시간 및 도구 실행 시간을 추적하여 성능 병목 현상을 식별합니다.
백엔드 고려사항
메트릭 및 로그 백엔드 선택은 수행할 수 있는 분석 유형을 결정합니다:
메트릭의 경우:
- 시계열 데이터베이스 (예: Prometheus): 비율 계산, 집계된 메트릭
- 컬럼형 저장소 (예: ClickHouse): 복잡한 쿼리, 고유 사용자 분석
- 완전한 기능의 관찰성 플랫폼 (예: Honeycomb, Datadog): 고급 쿼리, 시각화, 경고
이벤트/로그의 경우:
- 로그 집계 시스템 (예: Elasticsearch, Loki): 전체 텍스트 검색, 로그 분석
- 컬럼형 저장소 (예: ClickHouse): 구조화된 이벤트 분석
- 완전한 기능의 관찰성 플랫폼 (예: Honeycomb, Datadog): 메트릭과 이벤트 간의 상관관계
일일/주간/월간 활성 사용자 (DAU/WAU/MAU) 메트릭이 필요한 조직의 경우 효율적인 고유 값 쿼리를 지원하는 백엔드를 고려하세요.
서비스 정보
모든 메트릭 및 이벤트는 다음 리소스 속성과 함께 내보내집니다:
service.name: claude-code
service.version: 현재 Claude Code 버전
os.type: 운영 체제 유형 (예: linux, darwin, windows)
os.version: 운영 체제 버전 문자열
host.arch: 호스트 아키텍처 (예: amd64, arm64)
wsl.version: WSL 버전 번호 (Windows Subsystem for Linux에서 실행할 때만 표시)
- 미터 이름:
com.anthropic.claude_code
ROI 측정 리소스
텔레메트리 설정, 비용 분석, 생산성 메트릭 및 자동화된 보고를 포함한 Claude Code의 투자 수익률 측정에 대한 포괄적인 가이드는 Claude Code ROI 측정 가이드를 참조하세요. 이 저장소는 즉시 사용 가능한 Docker Compose 구성, Prometheus 및 OpenTelemetry 설정, Linear와 같은 도구와 통합된 생산성 보고서 생성 템플릿을 제공합니다.
보안/개인정보 보호 고려사항
- 텔레메트리는 옵트인이며 명시적 구성이 필요합니다
- API 키 또는 파일 콘텐츠와 같은 민감한 정보는 메트릭 또는 이벤트에 포함되지 않습니다
- 사용자 프롬프트 콘텐츠는 기본적으로 수정됩니다 - 프롬프트 길이만 기록됩니다. 사용자 프롬프트 로깅을 활성화하려면
OTEL_LOG_USER_PROMPTS=1을 설정하세요
Amazon Bedrock에서 Claude Code 모니터링
Amazon Bedrock의 Claude Code 사용 모니터링에 대한 자세한 지침은 Claude Code 모니터링 구현 (Bedrock)을 참조하세요.