AI 코딩 도구를 팀에 들이면 곧 두 질문이 따라옵니다. "얼마나 쓰고 있나?"와 "그래서 도움이 되나?"입니다.
앞의 4편에서 본 비용 문서는 한 문장으로 방향을 정해 줍니다. OpenTelemetry(OTel) 내보내기는 어떤 설정에서든 동작하고, 사용자별 토큰과 비용 지표를 거의 실시간으로 자체 관측 스택에 흘려보내는 유일한 방법이라는 것입니다.
그래서 이번에는 Claude Code가 무엇을 내보내는지, 무엇은 기본으로 내보내지 않는지를 문서에서 확인했습니다.
켜는 법
필요한 건 환경 변수 몇 개입니다. 텔레메트리를 켜고, 내보내기 방식을 고르고, 수집기 주소를 줍니다.
export CLAUDE_CODE_ENABLE_TELEMETRY=1
export OTEL_METRICS_EXPORTER=otlp # otlp, prometheus, console, none
export OTEL_LOGS_EXPORTER=otlp # otlp, console, none
export OTEL_EXPORTER_OTLP_PROTOCOL=grpc
export OTEL_EXPORTER_OTLP_ENDPOINT=http://localhost:4317
지표 내보내기 주기의 기본값은 60초입니다. 처음 붙일 때는 console 내보내기와 짧은 주기로 터미널에서 먼저 확인하라는 예시가 있습니다. 제대로 붙었다면 세션을 시작한 뒤 claude_code.session.count가 보여야 합니다.
무엇이 나오나
지표는 여덟 가지입니다. 문서의 이름을 그대로 옮기면 이렇습니다.
토큰 지표는 입력·출력·캐시 읽기·캐시 생성으로 나뉘어 나옵니다. 캐시가 잘 맞고 있는지를 이 비율로 볼 수 있습니다. 활동 시간도 user와 cli로 나뉘어, 사람이 대화한 시간과 도구·모델이 일한 시간을 구분합니다.
개인적으로 가장 쓸모 있어 보이는 건 오른쪽 하나, code_edit_tool.decision입니다. 수정·쓰기 도구의 제안을 사람이 받아들였는지 거절했는지를 셉니다. 언어별로도 쪼갤 수 있습니다. "도움이 되나?"라는 질문에 가장 가까운 숫자입니다.
로그로 내보내는 이벤트도 있습니다. 사용자 프롬프트, 모델 응답, 도구 결과, 도구 결정, API 요청·오류 같은 이벤트가 prompt.id로 묶여서 나옵니다. 프롬프트 하나에서 벌어진 일을 한 줄로 이어 볼 수 있다는 뜻입니다.
기본으로 가려지는 것
여기서 대부분의 팀이 멈칫합니다. 프롬프트에는 고객 데이터나 사내 코드가 들어갈 수 있으니까요.
문서의 기본값은 보수적입니다. 내용은 기본으로 가려집니다. 길이, 토큰 수, 도구 이름, 소요 시간 같은 메타데이터만 나갑니다.
내용을 내보내려면 변수를 하나씩 켜야 합니다. OTEL_LOG_USER_PROMPTS를 켜야 프롬프트 본문이 나가고, 꺼져 있으면 prompt_length만 남습니다. 도구 인자와 Bash 명령, 파일 경로는 OTEL_LOG_TOOL_DETAILS, API 요청·응답 원문 전체는 OTEL_LOG_RAW_API_BODIES가 필요합니다. 마지막 것은 대화 기록 전체가 담기니 디버깅에만 쓰라고 적혀 있습니다.
user.id도 계정에서 나온 값이 아니라 ~/.claude.json에 저장된 무작위 식별자라고 합니다.
설정은 관리자가 잡는다
팀 대시보드를 만들려면 모두가 같은 곳으로 보내야 합니다. 문서는 관리형 설정 파일의 env 항목으로 텔레메트리 설정을 전원에게 내려보내는 방법을 안내합니다.
몇 가지 동작이 눈에 띕니다.
- 저장소 파일로는 목적지를 바꿀 수 없습니다. 저장소의
.claude/폴더에 든 프로젝트 설정 파일(함께 쓰는 것과 개인용 모두)에 적힌 OTel 내보내기 변수는 무시됩니다. 저장소가 할 수 있는 건 신호를none으로 끄는 것뿐입니다. - 관리형 설정이 목적지를 잠급니다. 관리형 설정에 엔드포인트를 넣으면 개발자가 따로 잡은 신호별 엔드포인트가 지워집니다. 다만 내보내기 방식 선택은 잠기지 않으니, 강제하려면 그것도 관리형 설정에 넣으라고 합니다.
- 하위 프로세스는 물려받지 않습니다. Bash 도구, 훅, MCP 서버에는
OTEL_*변수가 전달되지 않습니다.
첫 번째가 특히 중요합니다. 남의 저장소를 클론해서 열었는데 그 저장소 설정이 내 텔레메트리를 엉뚱한 곳으로 보내는 일은 막혀 있다는 뜻이니까요.
대시보드는 세 칸이면 된다
문서의 설명을 묶어 보면 팀 대시보드는 세 칸으로 시작할 수 있습니다.
- 비용:
cost.usage를 모델별로 합칩니다.OTEL_RESOURCE_ATTRIBUTES에 부서·팀·비용 센터를 넣으면 그 기준으로 나눌 수 있습니다. - 산출물: 커밋 수, PR 수, 바뀐 줄 수를 시간 축에 둡니다.
- 판단:
code_edit_tool.decision의 수락 비율을 언어별로 봅니다.
한 가지 조심할 점이 있습니다. 바뀐 줄 수는 많을수록 좋은 숫자가 아닙니다. 바이브 코딩은 코드를 많이 만들기 쉬운 방식이라, 줄 수만 보면 쓸모없는 코드도 성과처럼 보입니다. 수락 비율과 리뷰 결과를 옆에 같이 놓아야 숫자가 거짓말을 덜 합니다.