SpyBara
Go Premium

monitoring-usage.md 2026-06-29 23:02 UTC to 2026-06-30 23:02 UTC

39 added, 18 removed.

2026
Tue 30 23:02 Mon 29 23:02 Sat 27 01:01 Fri 26 23:00 Thu 25 23:58 Wed 24 22:02 Tue 23 22:00 Mon 22 23:59 Fri 19 22:58 Thu 18 22:00 Wed 17 17:02 Tue 16 21:57 Mon 15 23:02 Sat 13 21:59 Fri 12 22:00 Thu 11 23:01 Wed 10 23:57 Tue 9 06:34 Mon 8 06:52 Sat 6 06:24 Fri 5 06:45 Thu 4 06:52 Wed 3 06:53 Tue 2 06:51

๋ชจ๋‹ˆํ„ฐ๋ง

Claude Code์— ๋Œ€ํ•œ OpenTelemetry๋ฅผ ํ™œ์„ฑํ™”ํ•˜๊ณ  ๊ตฌ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ์•„๋ด…๋‹ˆ๋‹ค.

OpenTelemetry(OTel)๋ฅผ ํ†ตํ•ด ์›๊ฒฉ ์ธก์ • ๋ฐ์ดํ„ฐ๋ฅผ ๋‚ด๋ณด๋‚ด ์กฐ์ง ์ „์ฒด์—์„œ Claude Code ์‚ฌ์šฉ, ๋น„์šฉ ๋ฐ ๋„๊ตฌ ํ™œ๋™์„ ์ถ”์ ํ•ฉ๋‹ˆ๋‹ค. Claude Code๋Š” ํ‘œ์ค€ ๋ฉ”ํŠธ๋ฆญ ํ”„๋กœํ† ์ฝœ์„ ํ†ตํ•ด ๋ฉ”ํŠธ๋ฆญ์„ ์‹œ๊ณ„์—ด ๋ฐ์ดํ„ฐ๋กœ ๋‚ด๋ณด๋‚ด๊ณ , ๋กœ๊ทธ/์ด๋ฒคํŠธ ํ”„๋กœํ† ์ฝœ์„ ํ†ตํ•ด ์ด๋ฒคํŠธ๋ฅผ ๋‚ด๋ณด๋‚ด๋ฉฐ, ์„ ํƒ์ ์œผ๋กœ ์ถ”์  ํ”„๋กœํ† ์ฝœ์„ ํ†ตํ•ด ๋ถ„์‚ฐ ์ถ”์ ์„ ๋‚ด๋ณด๋ƒ…๋‹ˆ๋‹ค. ๋ฉ”ํŠธ๋ฆญ, ๋กœ๊ทธ ๋ฐ ์ถ”์  ๋ฐฑ์—”๋“œ๋ฅผ ๊ตฌ์„ฑํ•˜์—ฌ ๋ชจ๋‹ˆํ„ฐ๋ง ์š”๊ตฌ ์‚ฌํ•ญ๊ณผ ์ผ์น˜ํ•˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

๋น ๋ฅธ ์‹œ์ž‘

ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ OpenTelemetry๋ฅผ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค:

# 1. ์›๊ฒฉ ์ธก์ • ํ™œ์„ฑํ™”
export CLAUDE_CODE_ENABLE_TELEMETRY=1

# 2. ๋‚ด๋ณด๋‚ด๊ธฐ ์„ ํƒ (๋‘˜ ๋‹ค ์„ ํƒ ์‚ฌํ•ญ - ํ•„์š”ํ•œ ๊ฒƒ๋งŒ ๊ตฌ์„ฑ)
export OTEL_METRICS_EXPORTER=otlp       # ์˜ต์…˜: otlp, prometheus, console, none
export OTEL_LOGS_EXPORTER=otlp          # ์˜ต์…˜: otlp, console, none

# 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

์ „์ฒด ๊ตฌ์„ฑ ์˜ต์…˜์€ OpenTelemetry ์‚ฌ์–‘์„ ์ฐธ์กฐํ•˜์„ธ์š”.

๊ด€๋ฆฌ์ž ๊ตฌ์„ฑ

๊ด€๋ฆฌ์ž๋Š” ๊ด€๋ฆฌ ์„ค์ • ํŒŒ์ผ์„ ํ†ตํ•ด ๋ชจ๋“  ์‚ฌ์šฉ์ž์— ๋Œ€ํ•œ OpenTelemetry ์„ค์ •์„ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์กฐ์ง ์ „์ฒด์—์„œ ์›๊ฒฉ ์ธก์ • ์„ค์ •์„ ์ค‘์•™์—์„œ ์ œ์–ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์„ค์ •์ด ์ ์šฉ๋˜๋Š” ๋ฐฉ์‹์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์„ค์ • ์šฐ์„ ์ˆœ์œ„๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

๊ด€๋ฆฌ ์„ค์ • ๊ตฌ์„ฑ ์˜ˆ:

{
  "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๋Š” OTEL_* ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ Bash ๋„๊ตฌ, ํ›…, MCP ์„œ๋ฒ„ ๋ฐ ์–ธ์–ด ์„œ๋ฒ„๋ฅผ ํฌํ•จํ•˜์—ฌ ์ƒ์„ฑํ•˜๋Š” ํ•˜์œ„ ํ”„๋กœ์„ธ์Šค์— ์ „๋‹ฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. Bash ๋„๊ตฌ๋ฅผ ํ†ตํ•ด ์‹คํ–‰ํ•˜๋Š” OpenTelemetry ๊ณ„์ธก ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ Claude Code์˜ ๋‚ด๋ณด๋‚ด๊ธฐ ์—”๋“œํฌ์ธํŠธ ๋˜๋Š” ํ—ค๋”๋ฅผ ์ƒ์†ํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ํ•ด๋‹น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์ž์‹ ์˜ ์›๊ฒฉ ์ธก์ •์„ ๋‚ด๋ณด๋‚ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ ๋ช…๋ น์—์„œ ์ง์ ‘ ์ด๋Ÿฌํ•œ ๋ณ€์ˆ˜๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

๊ตฌ์„ฑ ์„ธ๋ถ€ ์ •๋ณด

์ผ๋ฐ˜์ ์ธ ๊ตฌ์„ฑ ๋ณ€์ˆ˜

ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ์„ค๋ช… ์˜ˆ์ œ ๊ฐ’
CLAUDE_CODE_ENABLE_TELEMETRY ์›๊ฒฉ ์ธก์ • ์ˆ˜์ง‘ ํ™œ์„ฑํ™” (ํ•„์ˆ˜) 1
OTEL_METRICS_EXPORTER ๋ฉ”ํŠธ๋ฆญ ๋‚ด๋ณด๋‚ด๊ธฐ ์œ ํ˜• (์‰ผํ‘œ๋กœ ๊ตฌ๋ถ„). none์„ ์‚ฌ์šฉํ•˜์—ฌ ๋น„ํ™œ์„ฑํ™” console, otlp, prometheus, none
OTEL_LOGS_EXPORTER ๋กœ๊ทธ/์ด๋ฒคํŠธ ๋‚ด๋ณด๋‚ด๊ธฐ ์œ ํ˜• (์‰ผํ‘œ๋กœ ๊ตฌ๋ถ„). none์„ ์‚ฌ์šฉํ•˜์—ฌ ๋น„ํ™œ์„ฑํ™” console, otlp, none
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_METRIC_EXPORT_INTERVAL ๋‚ด๋ณด๋‚ด๊ธฐ ๊ฐ„๊ฒฉ (๋ฐ€๋ฆฌ์ดˆ ๋‹จ์œ„, ๊ธฐ๋ณธ๊ฐ’: 60000) 5000, 60000
OTEL_LOGS_EXPORT_INTERVAL ๋กœ๊ทธ ๋‚ด๋ณด๋‚ด๊ธฐ ๊ฐ„๊ฒฉ (๋ฐ€๋ฆฌ์ดˆ ๋‹จ์œ„, ๊ธฐ๋ณธ๊ฐ’: 5000) 1000, 10000
OTEL_LOG_USER_PROMPTS ์‚ฌ์šฉ์ž ํ”„๋กฌํ”„ํŠธ ์ฝ˜ํ…์ธ  ๋กœ๊น… ํ™œ์„ฑํ™” (๊ธฐ๋ณธ๊ฐ’: ๋น„ํ™œ์„ฑํ™”) 1๋กœ ํ™œ์„ฑํ™”
OTEL_LOG_ASSISTANT_RESPONSES assistant_response ์ด๋ฒคํŠธ์—์„œ ์–ด์‹œ์Šคํ„ดํŠธ ์‘๋‹ต ํ…์ŠคํŠธ ๋กœ๊น… ํ™œ์„ฑํ™” (๊ธฐ๋ณธ๊ฐ’: ๋น„ํ™œ์„ฑํ™”). ์„ค์ •๋˜์ง€ ์•Š์œผ๋ฉด OTEL_LOG_USER_PROMPTS์˜ ๊ฐ’์œผ๋กœ ํด๋ฐฑ๋ฉ๋‹ˆ๋‹ค. {/* min-version: 2.1.193 */}Claude Code v2.1.193 ์ด์ƒ ํ•„์š” 1๋กœ ํ™œ์„ฑํ™”, 0์œผ๋กœ ์ˆ˜์ •๋œ ์ƒํƒœ ์œ ์ง€
OTEL_LOG_TOOL_DETAILS ๋„๊ตฌ ์ด๋ฒคํŠธ ๋ฐ ์ถ”์  ์ŠคํŒฌ ์†์„ฑ์—์„œ ๋„๊ตฌ ๋งค๊ฐœ๋ณ€์ˆ˜ ๋ฐ ์ž…๋ ฅ ์ธ์ˆ˜ ๋กœ๊น… ํ™œ์„ฑํ™”: Bash ๋ช…๋ น, MCP ์„œ๋ฒ„ ๋ฐ ๋„๊ตฌ ์ด๋ฆ„, ์Šคํ‚ฌ ์ด๋ฆ„ ๋ฐ ๋„๊ตฌ ์ž…๋ ฅ. ๋˜ํ•œ user_prompt ์ด๋ฒคํŠธ์—์„œ ์‚ฌ์šฉ์ž ์ •์˜, ํ”Œ๋Ÿฌ๊ทธ์ธ ๋ฐ MCP ๋ช…๋ น ์ด๋ฆ„์„ ํ™œ์„ฑํ™”ํ•ฉ๋‹ˆ๋‹ค (๊ธฐ๋ณธ๊ฐ’: ๋น„ํ™œ์„ฑํ™”) 1๋กœ ํ™œ์„ฑํ™”
OTEL_LOG_TOOL_CONTENT ์ŠคํŒฌ ์ด๋ฒคํŠธ์—์„œ ๋„๊ตฌ ์ž…๋ ฅ ๋ฐ ์ถœ๋ ฅ ์ฝ˜ํ…์ธ  ๋กœ๊น… ํ™œ์„ฑํ™” (๊ธฐ๋ณธ๊ฐ’: ๋น„ํ™œ์„ฑํ™”). ์ถ”์ ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์ฝ˜ํ…์ธ ๋Š” 60KB์—์„œ ์ž˜๋ฆฝ๋‹ˆ๋‹ค 1๋กœ ํ™œ์„ฑํ™”
OTEL_LOG_RAW_API_BODIES ์ „์ฒด Anthropic Messages API ์š”์ฒญ ๋ฐ ์‘๋‹ต JSON์„ api_request_body / api_response_body ๋กœ๊ทธ ์ด๋ฒคํŠธ๋กœ ๋‚ด๋ณด๋ƒ…๋‹ˆ๋‹ค (๊ธฐ๋ณธ๊ฐ’: ๋น„ํ™œ์„ฑํ™”). ๋ณธ๋ฌธ์—๋Š” ์ „์ฒด ๋Œ€ํ™” ๊ธฐ๋ก์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ™œ์„ฑํ™”ํ•˜๋ฉด OTEL_LOG_USER_PROMPTS, OTEL_LOG_TOOL_DETAILS ๋ฐ OTEL_LOG_TOOL_CONTENT๊ฐ€ ๊ณต๊ฐœํ•  ๋ชจ๋“  ๊ฒƒ์— ๋™์˜ํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค 1๋กœ 60KB์—์„œ ์ž˜๋ฆฐ ์ธ๋ผ์ธ ๋ณธ๋ฌธ, ๋˜๋Š” file:<dir>๋กœ ๋””์Šคํฌ์˜ ์ž˜๋ฆฌ์ง€ ์•Š์€ ๋ณธ๋ฌธ๊ณผ ์ด๋ฒคํŠธ์˜ body_ref ํฌ์ธํ„ฐ
OTEL_EXPORTER_OTLP_METRICS_TEMPORALITY_PREFERENCE ๋ฉ”ํŠธ๋ฆญ ์‹œ๊ฐ„์„ฑ ์„ ํ˜ธ๋„ (๊ธฐ๋ณธ๊ฐ’: delta). ๋ฐฑ์—”๋“œ๊ฐ€ ๋ˆ„์  ์‹œ๊ฐ„์„ฑ์„ ์˜ˆ์ƒํ•˜๋Š” ๊ฒฝ์šฐ cumulative๋กœ ์„ค์ • delta, cumulative
CLAUDE_CODE_OTEL_HEADERS_HELPER_DEBOUNCE_MS ๋™์  ํ—ค๋” ์ƒˆ๋กœ ๊ณ ์นจ ๊ฐ„๊ฒฉ (๊ธฐ๋ณธ๊ฐ’: 1740000ms / 29๋ถ„) 900000

mTLS ์ธ์ฆ

OTLP ๋‚ด๋ณด๋‚ด๊ธฐ๋ฅผ ์œ„ํ•œ ํด๋ผ์ด์–ธํŠธ ์ธ์ฆ์„œ๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ํ•ด๋‹น ์‹ ํ˜ธ์— ์‚ฌ์šฉ๋˜๋Š” OTLP ํ”„๋กœํ† ์ฝœ์— ๋”ฐ๋ผ ๋‹ค๋ฅด๋ฉฐ, OTEL_EXPORTER_OTLP_PROTOCOL ๋˜๋Š” ์‹ ํ˜ธ๋ณ„ ์žฌ์ •์˜๋ฅผ ํ†ตํ•ด ์„ค์ •๋ฉ๋‹ˆ๋‹ค. ๋™์ผํ•œ ๊ตฌ์„ฑ์ด ๋ฉ”ํŠธ๋ฆญ, ๋กœ๊ทธ ๋ฐ ์ถ”์ ์— ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.

ํ”„๋กœํ† ์ฝœ ํด๋ผ์ด์–ธํŠธ ์ธ์ฆ์„œ ๋ณ€์ˆ˜ ์ˆ˜์ง‘๊ธฐ์˜ CA ์‹ ๋ขฐ
http/protobuf, http/json CLAUDE_CODE_CLIENT_CERT, CLAUDE_CODE_CLIENT_KEY ๋ฐ ์„ ํƒ์ ์œผ๋กœ CLAUDE_CODE_CLIENT_KEY_PASSPHRASE. ๋„คํŠธ์›Œํฌ ๊ตฌ์„ฑ ์ฐธ์กฐ NODE_EXTRA_CA_CERTS
grpc OTEL_EXPORTER_OTLP_CLIENT_KEY ๋ฐ OTEL_EXPORTER_OTLP_CLIENT_CERTIFICATE, ๋˜๋Š” ์‹ ํ˜ธ๋ณ„ ์ธ์ฆ์„œ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•œ OTEL_EXPORTER_OTLP_METRICS_CLIENT_KEY์™€ ๊ฐ™์€ ์‹ ํ˜ธ๋ณ„ ๋ณ€ํ˜• OTEL_EXPORTER_OTLP_CERTIFICATE

grpc์˜ ๊ฒฝ์šฐ OpenTelemetry SDK๋Š” ํ‘œ์ค€ OTLP ๋ณ€์ˆ˜๋ฅผ ์ง์ ‘ ์ฝ์œผ๋ฏ€๋กœ ์‹ ํ˜ธ๋ณ„ ๋ฉ”ํŠธ๋ฆญ ๋ณ€์ˆ˜๋ฅผ ์„ค์ •ํ•˜๋Š” ๊ธฐ์กด ๊ตฌ์„ฑ์€ ๊ณ„์† ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

๋ฉ”ํŠธ๋ฆญ ์นด๋””๋„๋ฆฌํ‹ฐ ์ œ์–ด

๋‹ค์Œ ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋Š” ์นด๋””๋„๋ฆฌํ‹ฐ๋ฅผ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ๋ฉ”ํŠธ๋ฆญ์— ํฌํ•จ๋˜๋Š” ์†์„ฑ์„ ์ œ์–ดํ•ฉ๋‹ˆ๋‹ค:

ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ์„ค๋ช… ๊ธฐ๋ณธ๊ฐ’ ๋น„ํ™œ์„ฑํ™” ์˜ˆ
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 ๋ฐ user.account_id ์†์„ฑ ํฌํ•จ true false
OTEL_METRICS_INCLUDE_ENTRYPOINT ๋ฉ”ํŠธ๋ฆญ์— app.entrypoint ์†์„ฑ ํฌํ•จ false true
OTEL_METRICS_INCLUDE_RESOURCE_ATTRIBUTES OTEL_RESOURCE_ATTRIBUTES์˜ ํ‚ค๋ฅผ ๋ฉ”ํŠธ๋ฆญ ๋ฐ์ดํ„ฐํฌ์ธํŠธ์˜ ์†์„ฑ์œผ๋กœ ํฌํ•จ true false

์ด๋Ÿฌํ•œ ๋ณ€์ˆ˜๋Š” ๋ฉ”ํŠธ๋ฆญ์˜ ์นด๋””๋„๋ฆฌํ‹ฐ๋ฅผ ์ œ์–ดํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋˜๋ฉฐ, ์ด๋Š” ๋ฉ”ํŠธ๋ฆญ ๋ฐฑ์—”๋“œ์˜ ์ €์žฅ์†Œ ์š”๊ตฌ ์‚ฌํ•ญ ๋ฐ ์ฟผ๋ฆฌ ์„ฑ๋Šฅ์— ์˜ํ–ฅ์„ ๋ฏธ์นฉ๋‹ˆ๋‹ค. ๋‚ฎ์€ ์นด๋””๋„๋ฆฌํ‹ฐ๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ๋” ๋‚˜์€ ์„ฑ๋Šฅ๊ณผ ๋‚ฎ์€ ์ €์žฅ์†Œ ๋น„์šฉ์„ ์˜๋ฏธํ•˜์ง€๋งŒ ๋ถ„์„์„ ์œ„ํ•œ ์„ธ๋ถ„ํ™”๋œ ๋ฐ์ดํ„ฐ๋Š” ์ ์Šต๋‹ˆ๋‹ค.

์ถ”์  (๋ฒ ํƒ€)

๋ถ„์‚ฐ ์ถ”์ ์€ ๊ฐ ์‚ฌ์šฉ์ž ํ”„๋กฌํ”„ํŠธ๋ฅผ ํ•ด๋‹น ํ”„๋กฌํ”„ํŠธ๊ฐ€ ํŠธ๋ฆฌ๊ฑฐํ•˜๋Š” API ์š”์ฒญ ๋ฐ ๋„๊ตฌ ์‹คํ–‰์— ์—ฐ๊ฒฐํ•˜๋Š” ์ŠคํŒฌ์„ ๋‚ด๋ณด๋‚ด๋ฏ€๋กœ ์ถ”์  ๋ฐฑ์—”๋“œ์—์„œ ์ „์ฒด ์š”์ฒญ์„ ๋‹จ์ผ ์ถ”์ ์œผ๋กœ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ถ”์ ์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ๊บผ์ ธ ์žˆ์Šต๋‹ˆ๋‹ค. ํ™œ์„ฑํ™”ํ•˜๋ ค๋ฉด CLAUDE_CODE_ENABLE_TELEMETRY=1 ๋ฐ CLAUDE_CODE_ENHANCED_TELEMETRY_BETA=1์„ ๋ชจ๋‘ ์„ค์ •ํ•œ ๋‹ค์Œ OTEL_TRACES_EXPORTER๋ฅผ ์„ค์ •ํ•˜์—ฌ ์ŠคํŒฌ์„ ๋ณด๋‚ผ ์œ„์น˜๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. ์ถ”์ ์€ ์—”๋“œํฌ์ธํŠธ, ํ”„๋กœํ† ์ฝœ, ํ—ค๋” ๋ฐ mTLS์— ๋Œ€ํ•ด ์ผ๋ฐ˜์ ์ธ OTLP ๊ตฌ์„ฑ์„ ์žฌ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ์„ค๋ช… ์˜ˆ์ œ ๊ฐ’
CLAUDE_CODE_ENHANCED_TELEMETRY_BETA ์ŠคํŒฌ ์ถ”์  ํ™œ์„ฑํ™” (ํ•„์ˆ˜). ENABLE_ENHANCED_TELEMETRY_BETA๋„ ํ—ˆ์šฉ๋จ 1
OTEL_TRACES_EXPORTER ์ถ”์  ๋‚ด๋ณด๋‚ด๊ธฐ ์œ ํ˜• (์‰ผํ‘œ๋กœ ๊ตฌ๋ถ„). none์„ ์‚ฌ์šฉํ•˜์—ฌ ๋น„ํ™œ์„ฑํ™” console, otlp, none
OTEL_EXPORTER_OTLP_TRACES_PROTOCOL ์ถ”์  ํ”„๋กœํ† ์ฝœ (OTEL_EXPORTER_OTLP_PROTOCOL ์žฌ์ •์˜) grpc, http/json, http/protobuf
OTEL_EXPORTER_OTLP_TRACES_ENDPOINT OTLP ์ถ”์  ์—”๋“œํฌ์ธํŠธ (OTEL_EXPORTER_OTLP_ENDPOINT ์žฌ์ •์˜) http://localhost:4318/v1/traces
OTEL_TRACES_EXPORT_INTERVAL ์ŠคํŒฌ ๋ฐฐ์น˜ ๋‚ด๋ณด๋‚ด๊ธฐ ๊ฐ„๊ฒฉ (๋ฐ€๋ฆฌ์ดˆ ๋‹จ์œ„, ๊ธฐ๋ณธ๊ฐ’: 5000) 1000, 10000

์ŠคํŒฌ์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ์‚ฌ์šฉ์ž ํ”„๋กฌํ”„ํŠธ ํ…์ŠคํŠธ, ๋„๊ตฌ ์ž…๋ ฅ ์„ธ๋ถ€ ์ •๋ณด ๋ฐ ๋„๊ตฌ ์ฝ˜ํ…์ธ ๋ฅผ ์ˆ˜์ •ํ•ฉ๋‹ˆ๋‹ค. OTEL_LOG_USER_PROMPTS=1, OTEL_LOG_TOOL_DETAILS=1 ๋ฐ OTEL_LOG_TOOL_CONTENT=1์„ ์„ค์ •ํ•˜์—ฌ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค.

์ถ”์ ์ด ํ™œ์„ฑํ™”๋˜๋ฉด Bash ๋ฐ PowerShell ํ•˜์œ„ ํ”„๋กœ์„ธ์Šค๋Š” ํ™œ์„ฑ ๋„๊ตฌ ์‹คํ–‰ ์ŠคํŒฌ์˜ W3C ์ถ”์  ์ปจํ…์ŠคํŠธ๋ฅผ ํฌํ•จํ•˜๋Š” TRACEPARENT ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ์ž๋™์œผ๋กœ ์ƒ์†ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด TRACEPARENT๋ฅผ ์ฝ๋Š” ๋ชจ๋“  ํ•˜์œ„ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ž์‹ ์˜ ์ŠคํŒฌ์„ ๋™์ผํ•œ ์ถ”์  ์•„๋ž˜์— ๋ถ€๋ชจ๋กœ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ Claude๊ฐ€ ์‹คํ–‰ํ•˜๋Š” ์Šคํฌ๋ฆฝํŠธ ๋ฐ ๋ช…๋ น์„ ํ†ตํ•œ ์—”๋“œํˆฌ์—”๋“œ ๋ถ„์‚ฐ ์ถ”์ ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

์ถ”์ ์ด ํ™œ์„ฑํ™”๋˜๊ณ  Claude Code๊ฐ€ Anthropic API์— ์ง์ ‘ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ์œผ๋ฉด ๊ฐ ๋ชจ๋ธ ์š”์ฒญ์€ claude_code.llm_request ์ŠคํŒฌ์˜ ์ปจํ…์ŠคํŠธ๋กœ ์„ค์ •๋œ W3C traceparent ํ—ค๋”๋ฅผ ์ „๋‹ฌํ•˜๊ณ , API์˜ traceresponse ํ—ค๋”๋Š” ์ŠคํŒฌ ๋งํฌ๋กœ ๊ธฐ๋ก๋ฉ๋‹ˆ๋‹ค. ์ด๋“ค์€ ํ•จ๊ป˜ Claude Code์˜ ํด๋ผ์ด์–ธํŠธ ์ธก ์ŠคํŒฌ์„ ๋ชจ๋“  ํ˜ธํ™˜ ์ค‘๊ฐ„ ๊ณ„์ธต์„ ํ†ตํ•ด ์„œ๋ฒ„ ์ธก ์ถ”์ ์— ์—ฐ๊ฒฐํ•ฉ๋‹ˆ๋‹ค. ์•„์›ƒ๋ฐ”์šด๋“œ HTTP MCP ์š”์ฒญ์€ ๋™์ผํ•œ ๋ฐฉ์‹์œผ๋กœ traceparent๋ฅผ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค. ํ—ค๋”๋Š” ํƒ€์‚ฌ ์ œ๊ณต์ž์—๊ฒŒ ์ „์†ก๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๊ธฐ๋ณธ์ ์œผ๋กœ ๋ชจ๋ธ ๋ฐ HTTP MCP ์š”์ฒญ์˜ traceparent ํ—ค๋”๋Š” ANTHROPIC_BASE_URL์ด ์„ค์ •๋˜์ง€ ์•Š์•˜๊ฑฐ๋‚˜ Anthropic API๋ฅผ ๊ฐ€๋ฆฌํ‚ฌ ๋•Œ๋งŒ ์ „์†ก๋ฉ๋‹ˆ๋‹ค. ์ผ๋ถ€ ํ”„๋ก์‹œ๋Š” ์ธ์‹๋˜์ง€ ์•Š๋Š” ํ—ค๋”๋ฅผ ๊ฑฐ๋ถ€ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ํ•˜์œ„ ํ”„๋กœ์„ธ์Šค TRACEPARENT ๋ณ€์ˆ˜๋Š” ์ผ๊ด€์„ฑ์„ ์œ„ํ•ด ๋™์ผํ•œ ์Šค์œ„์น˜๋กœ ์ œ์–ด๋ฉ๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž ์ •์˜ ANTHROPIC_BASE_URL ํ”„๋ก์‹œ๋ฅผ ํ†ตํ•ด Claude Code๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ์ถ”์  ์ปจํ…์ŠคํŠธ๋ฅผ ์ „ํŒŒํ•˜๋ ค๋ฉด CLAUDE_CODE_PROPAGATE_TRACEPARENT=1์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

Agent SDK ๋ฐ -p๋กœ ์‹œ์ž‘๋œ ๋น„๋Œ€ํ™”ํ˜• ์„ธ์…˜์—์„œ Claude Code๋Š” ๊ฐ ์ƒํ˜ธ ์ž‘์šฉ ์ŠคํŒฌ์„ ์‹œ์ž‘ํ•  ๋•Œ ์ž์‹ ์˜ ํ™˜๊ฒฝ์—์„œ TRACEPARENT ๋ฐ TRACESTATE๋ฅผ ์ฝ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์ž„๋ฒ ๋”ฉ ํ”„๋กœ์„ธ์Šค๊ฐ€ ํ™œ์„ฑ W3C ์ถ”์  ์ปจํ…์ŠคํŠธ๋ฅผ ํ•˜์œ„ ํ”„๋กœ์„ธ์Šค์— ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ Claude Code์˜ ์ŠคํŒฌ์ด ํ˜ธ์ถœ์ž์˜ ๋ถ„์‚ฐ ์ถ”์ ์˜ ์ž์‹์œผ๋กœ ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค. ๋Œ€ํ™”ํ˜• ์„ธ์…˜์€ CI ๋˜๋Š” ์ปจํ…Œ์ด๋„ˆ ํ™˜๊ฒฝ์˜ ์ฃผ๋ณ€ ๊ฐ’์„ ์‹ค์ˆ˜๋กœ ์ƒ์†ํ•˜๋Š” ๊ฒƒ์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด ์ธ๋ฐ”์šด๋“œ TRACEPARENT๋ฅผ ๋ฌด์‹œํ•ฉ๋‹ˆ๋‹ค.

์ŠคํŒฌ ๊ณ„์ธต ๊ตฌ์กฐ

๊ฐ ์‚ฌ์šฉ์ž ํ”„๋กฌํ”„ํŠธ๋Š” claude_code.interaction ๋ฃจํŠธ ์ŠคํŒฌ์„ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค. API ํ˜ธ์ถœ, ๋„๊ตฌ ํ˜ธ์ถœ ๋ฐ ํ›… ์‹คํ–‰์€ ์ž์‹์œผ๋กœ ๊ธฐ๋ก๋ฉ๋‹ˆ๋‹ค. ๋„๊ตฌ ์ŠคํŒฌ์—๋Š” ๊ถŒํ•œ ๊ฒฐ์ • ๋Œ€๊ธฐ ์‹œ๊ฐ„๊ณผ ์‹คํ–‰ ์ž์ฒด์— ๋Œ€ํ•œ ๋‘ ๊ฐœ์˜ ์ž์‹ ์ŠคํŒฌ์ด ์žˆ์Šต๋‹ˆ๋‹ค. Agent ๋„๊ตฌ ๋˜๋Š” ๋ ˆ๊ฑฐ์‹œ Task ๋„๊ตฌ๊ฐ€ ํ•˜์œ„ ์—์ด์ „ํŠธ๋ฅผ ์ƒ์„ฑํ•˜๋ฉด ํ•˜์œ„ ์—์ด์ „ํŠธ์˜ API ๋ฐ ๋„๊ตฌ ์ŠคํŒฌ์€ ๋ถ€๋ชจ์˜ claude_code.tool ์ŠคํŒฌ ์•„๋ž˜์— ์ค‘์ฒฉ๋ฉ๋‹ˆ๋‹ค.

claude_code.interaction
โ”œโ”€โ”€ claude_code.llm_request
โ”œโ”€โ”€ claude_code.hook                    (์ƒ์„ธ ๋ฒ ํƒ€ ์ถ”์  ํ•„์š”)
โ””โ”€โ”€ claude_code.tool
    โ”œโ”€โ”€ claude_code.tool.blocked_on_user
    โ”œโ”€โ”€ claude_code.tool.execution
    โ””โ”€โ”€ (Agent ๋„๊ตฌ) ํ•˜์œ„ ์—์ด์ „ํŠธ claude_code.llm_request / claude_code.tool ์ŠคํŒฌ

Agent SDK ๋ฐ claude -p ์„ธ์…˜์—์„œ TRACEPARENT๊ฐ€ ํ™˜๊ฒฝ์— ์„ค์ •๋˜๋ฉด claude_code.interaction ์ž์ฒด๊ฐ€ ํ˜ธ์ถœ์ž์˜ ์ŠคํŒฌ์˜ ์ž์‹์ด ๋ฉ๋‹ˆ๋‹ค.

์ŠคํŒฌ ์†์„ฑ

๋ชจ๋“  ์ŠคํŒฌ์€ ํ‘œ์ค€ ์†์„ฑ๊ณผ ์ด๋ฆ„๊ณผ ์ผ์น˜ํ•˜๋Š” span.type ์†์„ฑ์„ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค. ์•„๋ž˜ ํ‘œ๋Š” ๊ฐ ์ŠคํŒฌ์— ์„ค์ •๋œ ์ถ”๊ฐ€ ์†์„ฑ์„ ๋‚˜์—ดํ•ฉ๋‹ˆ๋‹ค. llm_request, tool.execution ๋ฐ hook ์ŠคํŒฌ์€ ์‹คํŒจ๋ฅผ ๊ธฐ๋กํ•  ๋•Œ OpenTelemetry ์ƒํƒœ ERROR๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์ŠคํŒฌ์€ ํ•ญ์ƒ ์ƒํƒœ UNSET์œผ๋กœ ๋๋‚ฉ๋‹ˆ๋‹ค.

claude_code.interaction

์†์„ฑ ์„ค๋ช… ๊ฒŒ์ดํŠธ ๋Œ€์ƒ
user_prompt ํ”„๋กฌํ”„ํŠธ ํ…์ŠคํŠธ. ๊ฒŒ์ดํŠธ๊ฐ€ ์„ค์ •๋˜์ง€ ์•Š์œผ๋ฉด ๊ฐ’์€ <REDACTED>์ž…๋‹ˆ๋‹ค OTEL_LOG_USER_PROMPTS
user_prompt_length ํ”„๋กฌํ”„ํŠธ ๊ธธ์ด (๋ฌธ์ž ๋‹จ์œ„)
interaction.sequence ์ด ์„ธ์…˜์˜ ์ƒํ˜ธ ์ž‘์šฉ 1 ๊ธฐ๋ฐ˜ ์นด์šดํ„ฐ
interaction.duration_ms ํ„ด์˜ ๋ฒฝ์‹œ๊ณ„ ์ง€์† ์‹œ๊ฐ„

claude_code.llm_request

์†์„ฑ ์„ค๋ช… ๊ฒŒ์ดํŠธ ๋Œ€์ƒ
model ๋ชจ๋ธ ์‹๋ณ„์ž
gen_ai.system ํ•ญ์ƒ anthropic. OpenTelemetry GenAI ์˜๋ฏธ๋ก ์  ๊ทœ์น™
gen_ai.request.model model๊ณผ ๋™์ผํ•œ ๊ฐ’. OpenTelemetry GenAI ์˜๋ฏธ๋ก ์  ๊ทœ์น™
query_source ์š”์ฒญ์„ ๋ฐœ๊ธ‰ํ•œ ํ•˜์œ„ ์‹œ์Šคํ…œ (์˜ˆ: repl_main_thread ๋˜๋Š” ํ•˜์œ„ ์—์ด์ „ํŠธ ์ด๋ฆ„)
agent_id ์š”์ฒญ์„ ๋ฐœ๊ธ‰ํ•œ ํ•˜์œ„ ์—์ด์ „ํŠธ ๋˜๋Š” ํŒ€์›์˜ ์‹๋ณ„์ž. ์ฃผ ์„ธ์…˜์—๋Š” ์—†์Œ
parent_agent_id ์ด ์—์ด์ „ํŠธ๋ฅผ ์ƒ์„ฑํ•œ ์—์ด์ „ํŠธ์˜ ์‹๋ณ„์ž. ์ฃผ ์„ธ์…˜ ๋ฐ ์ง์ ‘ ์ƒ์„ฑ๋œ ์—์ด์ „ํŠธ์—๋Š” ์—†์Œ
speed fast ๋˜๋Š” normal
llm_request.context ๋ถ€๋ชจ ์ŠคํŒฌ์— ๋”ฐ๋ผ interaction, tool ๋˜๋Š” standalone
duration_ms ์žฌ์‹œ๋„๋ฅผ ํฌํ•จํ•œ ๋ฒฝ์‹œ๊ณ„ ์ง€์† ์‹œ๊ฐ„
ttft_ms ์ฒซ ๋ฒˆ์งธ ํ† ํฐ๊นŒ์ง€์˜ ์‹œ๊ฐ„ (๋ฐ€๋ฆฌ์ดˆ)
input_tokens API ์‚ฌ์šฉ ๋ธ”๋ก์˜ ์ž…๋ ฅ ํ† ํฐ ์ˆ˜
output_tokens ์ถœ๋ ฅ ํ† ํฐ ์ˆ˜
cache_read_tokens ํ”„๋กฌํ”„ํŠธ ์บ์‹œ์—์„œ ์ฝ์€ ํ† ํฐ
cache_creation_tokens ํ”„๋กฌํ”„ํŠธ ์บ์‹œ์— ๊ธฐ๋ก๋œ ํ† ํฐ
request_id request-id ์‘๋‹ต ํ—ค๋”์˜ Anthropic API ์š”์ฒญ ID
gen_ai.response.id request_id์™€ ๋™์ผํ•œ ๊ฐ’. OpenTelemetry GenAI ์˜๋ฏธ๋ก ์  ๊ทœ์น™
client_request_id ์ตœ์ข… ์‹œ๋„์˜ ํด๋ผ์ด์–ธํŠธ ์ƒ์„ฑ x-client-request-id
attempt ์ด ์š”์ฒญ์— ๋Œ€ํ•ด ์ˆ˜ํ–‰๋œ ์ด ์‹œ๋„
success true ๋˜๋Š” false
status_code ์š”์ฒญ์ด ์‹คํŒจํ–ˆ์„ ๋•Œ HTTP ์ƒํƒœ ์ฝ”๋“œ
error ์š”์ฒญ์ด ์‹คํŒจํ–ˆ์„ ๋•Œ ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€
response.has_tool_call ์‘๋‹ต์— ๋„๊ตฌ ์‚ฌ์šฉ ๋ธ”๋ก์ด ํฌํ•จ๋˜์—ˆ์„ ๋•Œ true
stop_reason API ์‘๋‹ต stop_reason (์˜ˆ: end_turn, tool_use, max_tokens, stop_sequence, pause_turn ๋˜๋Š” refusal)
gen_ai.response.finish_reasons stop_reason๊ณผ ๋™์ผํ•œ ๊ฐ’ (๋ฌธ์ž์—ด ๋ฐฐ์—ด๋กœ ๋ž˜ํ•‘๋จ). OpenTelemetry GenAI ์˜๋ฏธ๋ก ์  ๊ทœ์น™

๊ฐ ์žฌ์‹œ๋„ ์‹œ๋„๋Š” attempt ๋ฐ client_request_id ์†์„ฑ์ด ์žˆ๋Š” gen_ai.request.attempt ์ŠคํŒฌ ์ด๋ฒคํŠธ๋กœ๋„ ๊ธฐ๋ก๋ฉ๋‹ˆ๋‹ค.

claude_code.tool

์†์„ฑ ์„ค๋ช… ๊ฒŒ์ดํŠธ ๋Œ€์ƒ
tool_name ๋„๊ตฌ ์ด๋ฆ„
duration_ms ๊ถŒํ•œ ๋Œ€๊ธฐ ๋ฐ ์‹คํ–‰์„ ํฌํ•จํ•œ ๋ฒฝ์‹œ๊ณ„ ์ง€์† ์‹œ๊ฐ„
result_tokens ๋„๊ตฌ ๊ฒฐ๊ณผ์˜ ๋Œ€๋žต์ ์ธ ํ† ํฐ ํฌ๊ธฐ
agent_id ๋„๊ตฌ๋ฅผ ์‹คํ–‰ํ•œ ํ•˜์œ„ ์—์ด์ „ํŠธ ๋˜๋Š” ํŒ€์›์˜ ์‹๋ณ„์ž. ์ฃผ ์„ธ์…˜์—๋Š” ์—†์Œ
parent_agent_id ์ด ์—์ด์ „ํŠธ๋ฅผ ์ƒ์„ฑํ•œ ์—์ด์ „ํŠธ์˜ ์‹๋ณ„์ž. ์ฃผ ์„ธ์…˜ ๋ฐ ์ง์ ‘ ์ƒ์„ฑ๋œ ์—์ด์ „ํŠธ์—๋Š” ์—†์Œ
tool_use_id ์ด ํ˜ธ์ถœ์— ๋Œ€ํ•œ ๋ชจ๋ธ์˜ tool_use ๋ธ”๋ก ID. tool_result ๋ฐ tool_decision ์ด๋ฒคํŠธ์˜ tool_use_id์™€ ํ›… ํŽ˜์ด๋กœ๋“œ์˜ tool_use_id์™€ ์ผ์น˜ํ•˜๋ฏ€๋กœ ์ŠคํŒฌ์„ ํ•ด๋‹น ๋ ˆ์ฝ”๋“œ์— ์กฐ์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค
gen_ai.tool.call.id tool_use_id์™€ ๋™์ผํ•œ ๊ฐ’. OpenTelemetry GenAI ์˜๋ฏธ๋ก ์  ๊ทœ์น™
file_path Read, Edit ๋ฐ Write ๋„๊ตฌ์˜ ๋Œ€์ƒ ํŒŒ์ผ ๊ฒฝ๋กœ OTEL_LOG_TOOL_DETAILS
full_command Bash ๋„๊ตฌ์˜ ๋ช…๋ น ๋ฌธ์ž์—ด OTEL_LOG_TOOL_DETAILS
skill_name Skill ๋„๊ตฌ์˜ ์Šคํ‚ฌ ์ด๋ฆ„ OTEL_LOG_TOOL_DETAILS
subagent_type Agent ๋„๊ตฌ ๋˜๋Š” ๋ ˆ๊ฑฐ์‹œ Task ๋„๊ตฌ์˜ ํ•˜์œ„ ์—์ด์ „ํŠธ ์œ ํ˜• OTEL_LOG_TOOL_DETAILS

OTEL_LOG_TOOL_CONTENT=1์ผ ๋•Œ ์ด ์ŠคํŒฌ์€ ์†์„ฑ์— ๋„๊ตฌ์˜ ์ž…๋ ฅ ๋ฐ ์ถœ๋ ฅ ๋ณธ๋ฌธ์„ ํฌํ•จํ•˜๋Š” tool.output ์ŠคํŒฌ ์ด๋ฒคํŠธ๋„ ๊ธฐ๋กํ•ฉ๋‹ˆ๋‹ค (์†์„ฑ๋‹น 60KB์—์„œ ์ž˜๋ฆผ).

claude_code.tool.blocked_on_user

์†์„ฑ ์„ค๋ช… ๊ฒŒ์ดํŠธ ๋Œ€์ƒ
duration_ms ๊ถŒํ•œ ๊ฒฐ์ • ๋Œ€๊ธฐ ์‹œ๊ฐ„
decision accept ๋˜๋Š” reject
source ๊ฒฐ์ • ์ถœ์ฒ˜ (Tool decision event์™€ ์ผ์น˜)

claude_code.tool.execution

์†์„ฑ ์„ค๋ช… ๊ฒŒ์ดํŠธ ๋Œ€์ƒ
duration_ms ๋„๊ตฌ ๋ณธ๋ฌธ ์‹คํ–‰ ์‹œ๊ฐ„
tool_use_id ๋ถ€๋ชจ claude_code.tool ์ŠคํŒฌ๊ณผ ๋™์ผํ•œ ๊ฐ’
gen_ai.tool.call.id tool_use_id์™€ ๋™์ผํ•œ ๊ฐ’. OpenTelemetry GenAI ์˜๋ฏธ๋ก ์  ๊ทœ์น™
success true ๋˜๋Š” false
error ์‹คํ–‰์ด ์‹คํŒจํ–ˆ์„ ๋•Œ ์˜ค๋ฅ˜ ๋ฒ”์ฃผ ๋ฌธ์ž์—ด (์˜ˆ: Error:ENOENT ๋˜๋Š” ShellError). ๊ฒŒ์ดํŠธ๊ฐ€ ์„ค์ •๋˜๋ฉด ์ „์ฒด ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๋ฅผ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค OTEL_LOG_TOOL_DETAILS

claude_code.hook

์ด ์ŠคํŒฌ์€ ์ƒ์„ธ ๋ฒ ํƒ€ ์ถ”์ ์ด ํ™œ์„ฑํ™”๋˜์–ด ์žˆ์„ ๋•Œ๋งŒ ๋‚ด๋ณด๋‚ด์ง€๋ฉฐ, ์ด๋Š” ์œ„์˜ ์ถ”์  ๋‚ด๋ณด๋‚ด๊ธฐ ๊ตฌ์„ฑ ์™ธ์— ENABLE_BETA_TRACING_DETAILED=1 ๋ฐ BETA_TRACING_ENDPOINT๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๋Œ€ํ™”ํ˜• CLI ์„ธ์…˜์—์„œ๋Š” ์กฐ์ง์ด ์ด ๊ธฐ๋Šฅ์— ๋Œ€ํ•ด ํ—ˆ์šฉ ๋ชฉ๋ก์— ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. Agent SDK ๋ฐ ๋น„๋Œ€ํ™”ํ˜• -p ์„ธ์…˜์€ ๊ฒŒ์ดํŠธ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. CLAUDE_CODE_ENHANCED_TELEMETRY_BETA๋งŒ ์„ค์ •๋˜์–ด ์žˆ์„ ๋•Œ๋Š” ๋‚ด๋ณด๋‚ด์ง€์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์†์„ฑ ์„ค๋ช… ๊ฒŒ์ดํŠธ ๋Œ€์ƒ
hook_event ํ›… ์ด๋ฒคํŠธ ์œ ํ˜• (์˜ˆ: PreToolUse)
hook_name ์ „์ฒด ํ›… ์ด๋ฆ„ (์˜ˆ: PreToolUse:Write)
num_hooks ์‹คํ–‰๋œ ์ผ์น˜ํ•˜๋Š” ํ›… ๋ช…๋ น ์ˆ˜
hook_definitions JSON ์ง๋ ฌํ™”๋œ ํ›… ๊ตฌ์„ฑ OTEL_LOG_TOOL_DETAILS
duration_ms ๋ชจ๋“  ์ผ์น˜ํ•˜๋Š” ํ›…์˜ ๋ฒฝ์‹œ๊ณ„ ์ง€์† ์‹œ๊ฐ„
num_success ์„ฑ๊ณต์ ์œผ๋กœ ์™„๋ฃŒ๋œ ํ›… ์ˆ˜
num_blocking ์ฐจ๋‹จ ๊ฒฐ์ •์„ ๋ฐ˜ํ™˜ํ•œ ํ›… ์ˆ˜
num_non_blocking_error ์ฐจ๋‹จ ์—†์ด ์‹คํŒจํ•œ ํ›… ์ˆ˜
num_cancelled ์™„๋ฃŒ ์ „์— ์ทจ์†Œ๋œ ํ›… ์ˆ˜

๋™์  ํ—ค๋”

๋™์  ์ธ์ฆ์ด ํ•„์š”ํ•œ ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ ํ™˜๊ฒฝ์˜ ๊ฒฝ์šฐ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ๊ตฌ์„ฑํ•˜์—ฌ ํ—ค๋”๋ฅผ ๋™์ ์œผ๋กœ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋™์  ํ—ค๋”๋Š” http/protobuf ๋ฐ http/json ํ”„๋กœํ† ์ฝœ์—๋งŒ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค. grpc ๋‚ด๋ณด๋‚ด๊ธฐ๋Š” ์ •์  OTEL_EXPORTER_OTLP_HEADERS ๊ฐ’๋งŒ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

์„ค์ • ๊ตฌ์„ฑ

.claude/settings.json์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค:

{
  "otelHeadersHelper": "/bin/generate_opentelemetry_headers.sh"
}

๊ฐ’์€ ๊ณต๋ฐฑ์„ ํฌํ•จํ•œ ๊ฒฝ๋กœ๋ฅผ ํฌํ•จํ•˜๋Š” ์‹คํ–‰ ํŒŒ์ผ์˜ ๊ฒฝ๋กœ์ด๊ฑฐ๋‚˜ ์ธ์ˆ˜๊ฐ€ ์žˆ๋Š” ์…ธ ๋ช…๋ น์ค„์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Windows์—์„œ ๊ฐ’์€ ํ•ญ์ƒ ์…ธ์„ ํ†ตํ•ด ์‹คํ–‰๋˜๋ฏ€๋กœ ๊ณต๋ฐฑ์„ ํฌํ•จํ•˜๋Š” ๊ฒฝ๋กœ๋ฅผ JSON ๊ฐ’ ๋‚ด์— ๋”ฐ์˜ดํ‘œ๋กœ ๋ฌถ์Šต๋‹ˆ๋‹ค.

์Šคํฌ๋ฆฝํŠธ ์š”๊ตฌ ์‚ฌํ•ญ

์Šคํฌ๋ฆฝํŠธ๋Š” HTTP ํ—ค๋”๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๋ฌธ์ž์—ด ํ‚ค-๊ฐ’ ์Œ์ด ์žˆ๋Š” ์œ ํšจํ•œ JSON์„ ์ถœ๋ ฅํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค:

#!/bin/bash
# ์˜ˆ: ์—ฌ๋Ÿฌ ํ—ค๋”
echo "{\"Authorization\": \"Bearer $(get-token.sh)\", \"X-API-Key\": \"$(get-api-key.sh)\"}"

๋„์šฐ๋ฏธ๊ฐ€ ์‹คํŒจํ•˜๊ฑฐ๋‚˜ ์ด๋Ÿฌํ•œ ์š”๊ตฌ ์‚ฌํ•ญ์„ ์ถฉ์กฑํ•˜์ง€ ์•Š๋Š” ์ถœ๋ ฅ์„ ์ธ์‡„ํ•˜๋ฉด Claude Code๋Š” ๋‹ค์Œ์—์„œ ์˜ค๋ฅ˜๋ฅผ ๋ณด๊ณ ํ•ฉ๋‹ˆ๋‹ค:

  • /doctor ์ถœ๋ ฅ
  • --debug๋กœ ์‹คํ–‰ํ•˜๊ฑฐ๋‚˜ ์„ธ์…˜์—์„œ /debug๋ฅผ ์‹คํ–‰ํ•œ ํ›„์˜ ๋””๋ฒ„๊ทธ ๋กœ๊ทธ
  • -p๋กœ ์‹œ์ž‘๋œ ๋น„๋Œ€ํ™”ํ˜• ์„ธ์…˜์˜ stderr

์ƒˆ๋กœ ๊ณ ์นจ ๋™์ž‘

ํ—ค๋” ๋„์šฐ๋ฏธ ์Šคํฌ๋ฆฝํŠธ๋Š” ์‹œ์ž‘ ์‹œ ๊ทธ๋ฆฌ๊ณ  ๊ทธ ์ดํ›„ ์ฃผ๊ธฐ์ ์œผ๋กœ ์‹คํ–‰๋˜์–ด ํ† ํฐ ์ƒˆ๋กœ ๊ณ ์นจ์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ ์Šคํฌ๋ฆฝํŠธ๋Š” 29๋ถ„๋งˆ๋‹ค ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. CLAUDE_CODE_OTEL_HEADERS_HELPER_DEBOUNCE_MS ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋กœ ๊ฐ„๊ฒฉ์„ ์‚ฌ์šฉ์ž ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์ค‘ ํŒ€ ์กฐ์ง ์ง€์›

์—ฌ๋Ÿฌ ํŒ€ ๋˜๋Š” ๋ถ€์„œ๊ฐ€ ์žˆ๋Š” ์กฐ์ง์€ OTEL_RESOURCE_ATTRIBUTES ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋‹ค์–‘ํ•œ ๊ทธ๋ฃน์„ ๊ตฌ๋ถ„ํ•˜๊ธฐ ์œ„ํ•œ ์‚ฌ์šฉ์ž ์ •์˜ ์†์„ฑ์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

# ํŒ€ ์‹๋ณ„์„ ์œ„ํ•œ ์‚ฌ์šฉ์ž ์ •์˜ ์†์„ฑ ์ถ”๊ฐ€
export OTEL_RESOURCE_ATTRIBUTES="department=engineering,team.id=platform,cost_center=eng-123"

์ด๋Ÿฌํ•œ ์‚ฌ์šฉ์ž ์ •์˜ ์†์„ฑ์€ ๋ชจ๋“  ๋ฉ”ํŠธ๋ฆญ ๋ฐ ์ด๋ฒคํŠธ์— ํฌํ•จ๋˜์–ด ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

  • ํŒ€ ๋˜๋Š” ๋ถ€์„œ๋ณ„๋กœ ๋ฉ”ํŠธ๋ฆญ ํ•„ํ„ฐ๋ง
  • ๋น„์šฉ ์„ผํ„ฐ๋ณ„ ๋น„์šฉ ์ถ”์ 
  • ํŒ€๋ณ„ ๋Œ€์‹œ๋ณด๋“œ ์ƒ์„ฑ
  • ํŠน์ • ํŒ€์— ๋Œ€ํ•œ ๊ฒฝ๊ณ  ์„ค์ •

Claude Code๋Š” ์ด๋Ÿฌํ•œ ๊ฐ’์„ ๋ชจ๋“  ๋ฉ”ํŠธ๋ฆญ ๋ฐ์ดํ„ฐํฌ์ธํŠธ ๋ฐ ์ด๋ฒคํŠธ ๋ ˆ์ฝ”๋“œ์˜ ์†์„ฑ์œผ๋กœ ์ฒจ๋ถ€ํ•˜๊ณ , OTLP ๋ฆฌ์†Œ์Šค ๋ธ”๋ก์—์„œ๋„ ์ „์†กํ•ฉ๋‹ˆ๋‹ค. ๋Œ€๋ถ€๋ถ„์˜ ๋ฉ”ํŠธ๋ฆญ ๋ฐฑ์—”๋“œ๋Š” ๋ฐ์ดํ„ฐํฌ์ธํŠธ ์†์„ฑ์„ ์ฟผ๋ฆฌ ๊ฐ€๋Šฅํ•œ ๋ ˆ์ด๋ธ”๋กœ ๋…ธ์ถœํ•˜๋ฏ€๋กœ ์‚ฌ์šฉ์ž ์ •์˜ ํ‚ค๋กœ ์ง์ ‘ ๋ฉ”ํŠธ๋ฆญ์„ ๊ทธ๋ฃนํ™”ํ•˜๊ณ  ํ•„ํ„ฐ๋งํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž ์ •์˜ ํ‚ค๋Š” user.id ๋˜๋Š” session.id์™€ ๊ฐ™์€ ํ‘œ์ค€ ์†์„ฑ์„ ์žฌ์ •์˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ‚ค๊ฐ€ ์ถฉ๋Œํ•˜๋ฉด Claude Code๋Š” ๊ธฐ๋ณธ ์ œ๊ณต ๊ฐ’์„ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค.

๊ฐ ์‚ฌ์šฉ์ž ์ •์˜ ํ‚ค๋Š” ๋ชจ๋“  ๋ฉ”ํŠธ๋ฆญ ์‹œ๋ฆฌ์ฆˆ์˜ ๋ ˆ์ด๋ธ”์ด ๋˜๋ฏ€๋กœ ๋†’์€ ์นด๋””๋„๋ฆฌํ‹ฐ ๊ฐ’์€ ๋ฉ”ํŠธ๋ฆญ ๋ฐฑ์—”๋“œ์˜ ์ €์žฅ์†Œ ๋น„์šฉ์„ ์ฆ๊ฐ€์‹œํ‚ต๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž ์ •์˜ ์†์„ฑ์„ ๋ฆฌ์†Œ์Šค ๋ธ”๋ก์—๋งŒ ๋ณด๋‚ด๊ณ  ๋ฐ์ดํ„ฐํฌ์ธํŠธ ๋ ˆ์ด๋ธ”์—์„œ ์ƒ๋žตํ•˜๋ ค๋ฉด OTEL_METRICS_INCLUDE_RESOURCE_ATTRIBUTES=false๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ๋ฉ”ํŠธ๋ฆญ ์นด๋””๋„๋ฆฌํ‹ฐ ์ œ์–ด๋ฅผ ์ฐธ์กฐํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ์ œ ๊ตฌ์„ฑ

claude๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ ์ „์— ์ด๋Ÿฌํ•œ ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ ๋ธ”๋ก์€ ๋‹ค์–‘ํ•œ ๋‚ด๋ณด๋‚ด๊ธฐ ๋˜๋Š” ๋ฐฐํฌ ์‹œ๋‚˜๋ฆฌ์˜ค์— ๋Œ€ํ•œ ์™„์ „ํ•œ ๊ตฌ์„ฑ์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค:

# ์ฝ˜์†” ๋””๋ฒ„๊น… (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.example.com:4318
export OTEL_EXPORTER_OTLP_LOGS_PROTOCOL=grpc
export OTEL_EXPORTER_OTLP_LOGS_ENDPOINT=http://logs.example.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)
app.entrypoint ์„ธ์…˜์ด ์‹œ์ž‘๋œ ๋ฐฉ์‹, ์˜ˆ: cli, sdk-cli, sdk-ts, sdk-py ๋˜๋Š” claude-vscode OTEL_METRICS_INCLUDE_ENTRYPOINT (๊ธฐ๋ณธ๊ฐ’: false)
organization.id ์กฐ์ง UUID (์ธ์ฆ๋œ ๊ฒฝ์šฐ) ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•  ๋•Œ ํ•ญ์ƒ ํฌํ•จ๋จ
user.account_uuid ๊ณ„์ • UUID (์ธ์ฆ๋œ ๊ฒฝ์šฐ) OTEL_METRICS_INCLUDE_ACCOUNT_UUID (๊ธฐ๋ณธ๊ฐ’: true)
user.account_id Anthropic ๊ด€๋ฆฌ API์™€ ์ผ์น˜ํ•˜๋Š” ํƒœ๊ทธ ํ˜•์‹์˜ ๊ณ„์ • ID (์ธ์ฆ๋œ ๊ฒฝ์šฐ), ์˜ˆ: user_01BWBeN28... OTEL_METRICS_INCLUDE_ACCOUNT_UUID (๊ธฐ๋ณธ๊ฐ’: true)
user.id ์ฒซ ์‹คํ–‰ ์‹œ ์ƒ์„ฑ๋˜๊ณ  ~/.claude.json์— ์œ ์ง€๋˜๋Š” ๋ฌด์ž‘์œ„ ์ต๋ช… ์‹๋ณ„์ž์ž…๋‹ˆ๋‹ค. ๊ฐœ์ธ ์ •๋ณด๋ฅผ ํฌํ•จํ•˜์ง€ ์•Š์œผ๋ฉฐ Claude ๊ณ„์ •์—์„œ ํŒŒ์ƒ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํŒŒ์ผ์„ ์‚ญ์ œํ•˜๋ฉด ๋‹ค์Œ ์‹คํ–‰ ์‹œ ์ƒˆ๋กœ์šด ๊ด€๋ จ ์—†๋Š” ๊ฐ’์ด ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค. ํ•ญ์ƒ ํฌํ•จ๋จ
user.email ์‚ฌ์šฉ์ž ์ด๋ฉ”์ผ ์ฃผ์†Œ (OAuth๋ฅผ ํ†ตํ•ด ์ธ์ฆ๋œ ๊ฒฝ์šฐ) ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•  ๋•Œ ํ•ญ์ƒ ํฌํ•จ๋จ
terminal.type ํ„ฐ๋ฏธ๋„ ์œ ํ˜•, ์˜ˆ: iTerm.app, vscode, cursor ๋˜๋Š” tmux ๊ฐ์ง€๋  ๋•Œ ํ•ญ์ƒ ํฌํ•จ๋จ
OTEL_RESOURCE_ATTRIBUTES์˜ ํ‚ค ์„ค์ •ํ•œ ์‚ฌ์šฉ์ž ์ •์˜ ์†์„ฑ, ์˜ˆ: department ๋˜๋Š” team.id. ๋‹ค์ค‘ ํŒ€ ์กฐ์ง ์ง€์›์„ ์ฐธ์กฐํ•˜์„ธ์š” OTEL_METRICS_INCLUDE_RESOURCE_ATTRIBUTES (๊ธฐ๋ณธ๊ฐ’: true)

Claude Code๊ฐ€ Claude ์•ฑ ๊ฒŒ์ดํŠธ์›จ์ด์— ๋กœ๊ทธ์ธ๋˜์–ด ์žˆ์œผ๋ฉด CLI๋Š” ๊ฒŒ์ดํŠธ์›จ์ด ์„ธ์…˜์˜ ์ธ์ฆ๋œ ID๋กœ ๋‚ด๋ณด๋‚ด๊ธฐ๋ฅผ ์Šคํƒฌํ”„ํ•ฉ๋‹ˆ๋‹ค: user.id๋Š” ์ต๋ช… ์„ค์น˜ ์‹๋ณ„์ž๊ฐ€ ์•„๋‹Œ IdP ์ฃผ์ฒด์ด๊ณ , user.email์€ ๋กœ๊ทธ์ธํ•œ ์ด๋ฉ”์ผ์ด๋ฉฐ, user.groups๋Š” ์‰ผํ‘œ๋กœ ๊ตฌ๋ถ„๋œ ๋ฌธ์ž์—ด๋กœ IdP ๊ทธ๋ฃน ๋ฉค๋ฒ„์‹ญ์„ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค. ๊ฐ ๋‚ด๋ณด๋‚ด๊ธฐ๋Š” ๋˜ํ•œ identity.source: gateway-oidc๋ฅผ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค. ๊ฒŒ์ดํŠธ์›จ์ด ID๋Š” ๋งˆ์ง€๋ง‰์— ์ ์šฉ๋˜๋ฏ€๋กœ OTEL_RESOURCE_ATTRIBUTES๋ฅผ ํ†ตํ•ด ์„ค์ •๋œ user.* ๋ฐ identity.* ํ‚ค๋Š” ๊ฒŒ์ดํŠธ์›จ์ด ์„ธ์…˜์—์„œ ๋ฌด์‹œ๋ฉ๋‹ˆ๋‹ค.

์ด๋ฒคํŠธ๋Š” ์ถ”๊ฐ€๋กœ ๋‹ค์Œ ์†์„ฑ์„ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค. ์ด๋“ค์€ ๋ฌดํ•œ ์นด๋””๋„๋ฆฌํ‹ฐ๋ฅผ ์•ผ๊ธฐํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ๋ฉ”ํŠธ๋ฆญ์— ์ ˆ๋Œ€ ์ฒจ๋ถ€๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค:

  • prompt.id: ์‚ฌ์šฉ์ž ํ”„๋กฌํ”„ํŠธ๋ฅผ ๋‹ค์Œ ํ”„๋กฌํ”„ํŠธ๊นŒ์ง€์˜ ๋ชจ๋“  ํ›„์† ์ด๋ฒคํŠธ์™€ ์ƒ๊ด€์‹œํ‚ค๋Š” UUID์ž…๋‹ˆ๋‹ค. ์ด๋ฒคํŠธ ์ƒ๊ด€ ์†์„ฑ์„ ์ฐธ์กฐํ•˜์„ธ์š”.
  • workspace.host_paths: ๋ฐ์Šคํฌํ†ฑ ์•ฑ์—์„œ ์„ ํƒํ•œ ํ˜ธ์ŠคํŠธ ์ž‘์—… ๊ณต๊ฐ„ ๋””๋ ‰ํ† ๋ฆฌ (๋ฌธ์ž์—ด ๋ฐฐ์—ด)

๋ฉ”ํŠธ๋ฆญ

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

๋ฉ”ํŠธ๋ฆญ ์„ธ๋ถ€ ์ •๋ณด

๊ฐ ๋ฉ”ํŠธ๋ฆญ์€ ์œ„์— ๋‚˜์—ด๋œ ํ‘œ์ค€ ์†์„ฑ์„ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค. ์ถ”๊ฐ€ ์ปจํ…์ŠคํŠธ๋ณ„ ์†์„ฑ์ด ์žˆ๋Š” ๋ฉ”ํŠธ๋ฆญ์€ ์•„๋ž˜์— ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

์„ธ์…˜ ์นด์šดํ„ฐ

๊ฐ ์„ธ์…˜ ์‹œ์ž‘ ์‹œ ์ฆ๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

์†์„ฑ:

  • ๋ชจ๋“  ํ‘œ์ค€ ์†์„ฑ
  • start_type: ์„ธ์…˜์ด ์‹œ์ž‘๋œ ๋ฐฉ์‹. "fresh", "resume", "continue" ๋˜๋Š” "agents_view" ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค. "agents_view" ๊ฐ’์€ claude agents ๋Œ€์‹œ๋ณด๋“œ ํ”„๋กœ์„ธ์Šค (๋Œ€ํ™”ํ˜• ์„ธ์…˜์ด ์•„๋‹Œ ์‚ฌ์šฉ์ž๊ฐ€ ์‹œ์ž‘ํ•œ ๋กœ์ปฌ UI)๋ฅผ ์‹๋ณ„ํ•ฉ๋‹ˆ๋‹ค. ๋Œ€์‹œ๋ณด๋“œ์—์„œ UI ํ”„๋กœ์„ธ์Šค ์‹œ์ž‘์„ ๋Œ€ํ™”ํ˜• ์„ธ์…˜๊ณผ ๋ถ„๋ฆฌํ•˜๋ ค๋ฉด ์ด ๊ฐ’์œผ๋กœ ํ•„ํ„ฐ๋งํ•ฉ๋‹ˆ๋‹ค.

์ฝ”๋“œ ๋ผ์ธ ์นด์šดํ„ฐ

์ฝ”๋“œ๊ฐ€ ์ถ”๊ฐ€๋˜๊ฑฐ๋‚˜ ์ œ๊ฑฐ๋  ๋•Œ ์ฆ๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

์†์„ฑ:

  • ๋ชจ๋“  ํ‘œ์ค€ ์†์„ฑ
  • type: ("added", "removed")
  • model: ๋ณ€๊ฒฝ์„ ์ˆ˜ํ–‰ํ•œ ๋ชจ๋ธ์˜ ๋ชจ๋ธ ์‹๋ณ„์ž (์˜ˆ: "claude-sonnet-5")

ํ’€ ์š”์ฒญ ์นด์šดํ„ฐ

Claude Code๋ฅผ ํ†ตํ•ด ์…ธ ๋ช…๋ น ๋˜๋Š” MCP ๋„๊ตฌ๋ฅผ ํ†ตํ•ด ํ’€ ์š”์ฒญ ๋˜๋Š” ๋ณ‘ํ•ฉ ์š”์ฒญ์„ ์ƒ์„ฑํ•  ๋•Œ ์ฆ๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

์†์„ฑ:

์ปค๋ฐ‹ ์นด์šดํ„ฐ

Claude Code๋ฅผ ํ†ตํ•ด git ์ปค๋ฐ‹์„ ์ƒ์„ฑํ•  ๋•Œ ์ฆ๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

์†์„ฑ:

๋น„์šฉ ์นด์šดํ„ฐ

๊ฐ API ์š”์ฒญ ํ›„ ์ฆ๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

์†์„ฑ:

  • ๋ชจ๋“  ํ‘œ์ค€ ์†์„ฑ
  • model: ๋ชจ๋ธ ์‹๋ณ„์ž (์˜ˆ: "claude-sonnet-5")
  • query_source: ์š”์ฒญ์„ ๋ฐœ๊ธ‰ํ•œ ํ•˜์œ„ ์‹œ์Šคํ…œ์˜ ๋ฒ”์ฃผ. "main", "subagent" ๋˜๋Š” "auxiliary" ์ค‘ ํ•˜๋‚˜
  • speed: ์š”์ฒญ์ด ๋น ๋ฅธ ๋ชจ๋“œ๋ฅผ ์‚ฌ์šฉํ–ˆ์„ ๋•Œ "fast". ๊ทธ ์™ธ์—๋Š” ์—†์Œ
  • effort: ์š”์ฒญ์— ์ ์šฉ๋œ ๋…ธ๋ ฅ ์ˆ˜์ค€: "low", "medium", "high", "xhigh" ๋˜๋Š” "max". ๋ชจ๋ธ์ด ๋…ธ๋ ฅ์„ ์ง€์›ํ•˜์ง€ ์•Š์„ ๋•Œ๋Š” ์—†์Œ
  • agent.name: ์š”์ฒญ์„ ๋ฐœ๊ธ‰ํ•œ ํ•˜์œ„ ์—์ด์ „ํŠธ ์œ ํ˜•. ๊ธฐ๋ณธ ์ œ๊ณต ์—์ด์ „ํŠธ ์ด๋ฆ„ ๋ฐ ๊ณต์‹ ๋งˆ์ผ“ํ”Œ๋ ˆ์ด์Šค ํ”Œ๋Ÿฌ๊ทธ์ธ์˜ ์—์ด์ „ํŠธ๋Š” ๊ทธ๋Œ€๋กœ ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์‚ฌ์šฉ์ž ์ •์˜ ์—์ด์ „ํŠธ ์ด๋ฆ„์€ "custom"์œผ๋กœ ๋Œ€์ฒด๋ฉ๋‹ˆ๋‹ค. ์š”์ฒญ์ด ๋ช…๋ช…๋œ ํ•˜์œ„ ์—์ด์ „ํŠธ ์œ ํ˜•์—์„œ ๋ฐœ๊ธ‰๋˜์ง€ ์•Š์•˜์„ ๋•Œ๋Š” ์—†์Œ
  • skill.name: ์š”์ฒญ์— ๋Œ€ํ•ด ํ™œ์„ฑํ™”๋œ ์Šคํ‚ฌ (Skill ๋„๊ตฌ, / ๋ช…๋ น์œผ๋กœ ์„ค์ •๋˜๊ฑฐ๋‚˜ ์ƒ์„ฑ๋œ ํ•˜์œ„ ์—์ด์ „ํŠธ์— ์˜ํ•ด ์ƒ์†๋จ). ๊ธฐ๋ณธ ์ œ๊ณต, ๋ฒˆ๋“ค, ์‚ฌ์šฉ์ž ์ •์˜ ๋ฐ ๊ณต์‹ ๋งˆ์ผ“ํ”Œ๋ ˆ์ด์Šค ํ”Œ๋Ÿฌ๊ทธ์ธ ์Šคํ‚ฌ ์ด๋ฆ„์€ ๊ทธ๋Œ€๋กœ ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค. ํƒ€์‚ฌ ํ”Œ๋Ÿฌ๊ทธ์ธ ์Šคํ‚ฌ ์ด๋ฆ„์€ "third-party"๋กœ ๋Œ€์ฒด๋ฉ๋‹ˆ๋‹ค. ํ™œ์„ฑ ์Šคํ‚ฌ์ด ์—†์„ ๋•Œ๋Š” ์—†์Œ
  • plugin.name: ํ™œ์„ฑ ์Šคํ‚ฌ ๋˜๋Š” ํ•˜์œ„ ์—์ด์ „ํŠธ๊ฐ€ ํ”Œ๋Ÿฌ๊ทธ์ธ์—์„œ ์ œ๊ณต๋  ๋•Œ ์†Œ์œ  ํ”Œ๋Ÿฌ๊ทธ์ธ. ๊ณต์‹ ๋งˆ์ผ“ํ”Œ๋ ˆ์ด์Šค ํ”Œ๋Ÿฌ๊ทธ์ธ ์ด๋ฆ„์€ ๊ทธ๋Œ€๋กœ ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค. ํƒ€์‚ฌ ํ”Œ๋Ÿฌ๊ทธ์ธ ์ด๋ฆ„์€ "third-party"๋กœ ๋Œ€์ฒด๋ฉ๋‹ˆ๋‹ค. ์Šคํ‚ฌ ๋ฐ ํ•˜์œ„ ์—์ด์ „ํŠธ ๋ชจ๋‘ ์†Œ์œ  ํ”Œ๋Ÿฌ๊ทธ์ธ์ด ์—†์„ ๋•Œ๋Š” ์—†์Œ
  • marketplace.name: ์†Œ์œ  ํ”Œ๋Ÿฌ๊ทธ์ธ์ด ์„ค์น˜๋œ ๋งˆ์ผ“ํ”Œ๋ ˆ์ด์Šค. ๊ณต์‹ ๋งˆ์ผ“ํ”Œ๋ ˆ์ด์Šค ํ”Œ๋Ÿฌ๊ทธ์ธ์—๋งŒ ๋‚ด๋ณด๋‚ด์ง‘๋‹ˆ๋‹ค. ๊ทธ ์™ธ์—๋Š” ์—†์Œ
  • mcp_server.name: ์ด ์š”์ฒญ์„ ์ƒ์„ฑํ•œ ํ„ด์—์„œ ๋„๊ตฌ๊ฐ€ ์‹คํ–‰๋œ MCP ์„œ๋ฒ„. ๊ธฐ๋ณธ ์ œ๊ณต, claude.ai ํ”„๋ก์‹œ ๋ฐ ๊ณต์‹ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ ์„œ๋ฒ„ ์ด๋ฆ„์€ ๊ทธ๋Œ€๋กœ ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž ๊ตฌ์„ฑ ์„œ๋ฒ„ ์ด๋ฆ„์€ "custom"์œผ๋กœ ๋Œ€์ฒด๋ฉ๋‹ˆ๋‹ค. MCP ๋„๊ตฌ๊ฐ€ ์‹คํ–‰๋˜์ง€ ์•Š์•˜์„ ๋•Œ๋Š” ์—†์Œ
  • mcp_tool.name: ์ด ์š”์ฒญ์„ ์ƒ์„ฑํ•œ ํ„ด์—์„œ ์‹คํ–‰๋œ MCP ๋„๊ตฌ (mcp_server.name๊ณผ ๋™์ผํ•œ ์ˆ˜์ • ์ฒ˜๋ฆฌ). MCP ๋„๊ตฌ๊ฐ€ ์‹คํ–‰๋˜์ง€ ์•Š์•˜์„ ๋•Œ๋Š” ์—†์Œ

ํ† ํฐ ์นด์šดํ„ฐ

๊ฐ API ์š”์ฒญ ํ›„ ์ฆ๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

์†์„ฑ:

  • ๋ชจ๋“  ํ‘œ์ค€ ์†์„ฑ
  • type: ("input", "output", "cacheRead", "cacheCreation")
  • model: ๋ชจ๋ธ ์‹๋ณ„์ž (์˜ˆ: "claude-sonnet-5")
  • query_source: ์š”์ฒญ์„ ๋ฐœ๊ธ‰ํ•œ ํ•˜์œ„ ์‹œ์Šคํ…œ์˜ ๋ฒ”์ฃผ. "main", "subagent" ๋˜๋Š” "auxiliary" ์ค‘ ํ•˜๋‚˜
  • speed: ์š”์ฒญ์ด ๋น ๋ฅธ ๋ชจ๋“œ๋ฅผ ์‚ฌ์šฉํ–ˆ์„ ๋•Œ "fast". ๊ทธ ์™ธ์—๋Š” ์—†์Œ
  • effort: ์š”์ฒญ์— ์ ์šฉ๋œ ๋…ธ๋ ฅ ์ˆ˜์ค€. ๋น„์šฉ ์นด์šดํ„ฐ์˜ ์„ธ๋ถ€ ์ •๋ณด๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.
  • agent.name, skill.name, plugin.name, marketplace.name, mcp_server.name, mcp_tool.name: ์š”์ฒญ์— ๋Œ€ํ•œ ์Šคํ‚ฌ, ํ”Œ๋Ÿฌ๊ทธ์ธ, ์—์ด์ „ํŠธ ๋ฐ MCP ์†์„ฑ. ๋น„์šฉ ์นด์šดํ„ฐ์˜ ์ •์˜ ๋ฐ ์ˆ˜์ • ๋™์ž‘์„ ์ฐธ์กฐํ•˜์„ธ์š”.

์ฝ”๋“œ ํŽธ์ง‘ ๋„๊ตฌ ๊ฒฐ์ • ์นด์šดํ„ฐ

์‚ฌ์šฉ์ž๊ฐ€ Edit, Write ๋˜๋Š” NotebookEdit ๋„๊ตฌ ์‚ฌ์šฉ์„ ์ˆ˜๋ฝํ•˜๊ฑฐ๋‚˜ ๊ฑฐ๋ถ€ํ•  ๋•Œ ์ฆ๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

์†์„ฑ:

  • ๋ชจ๋“  ํ‘œ์ค€ ์†์„ฑ
  • tool_name: ๋„๊ตฌ ์ด๋ฆ„ ("Edit", "Write", "NotebookEdit")
  • decision: ์‚ฌ์šฉ์ž ๊ฒฐ์ • ("accept", "reject")
  • source: ๊ฒฐ์ • ์ถœ์ฒ˜. "config", "hook", "user_permanent", "user_temporary", "user_abort" ๋˜๋Š” "user_reject" ์ค‘ ํ•˜๋‚˜. ๋„๊ตฌ ๊ฒฐ์ • ์ด๋ฒคํŠธ๋ฅผ ์ฐธ์กฐํ•˜์—ฌ ๊ฐ ๊ฐ’์˜ ์˜๋ฏธ๋ฅผ ํ™•์ธํ•˜์„ธ์š”.
  • language: ํŽธ์ง‘๋œ ํŒŒ์ผ์˜ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด, ์˜ˆ: "TypeScript", "Python", "JavaScript" ๋˜๋Š” "Markdown". ์ธ์‹๋˜์ง€ ์•Š๋Š” ํŒŒ์ผ ํ™•์žฅ์ž์˜ ๊ฒฝ์šฐ "unknown"์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

ํ™œ์„ฑ ์‹œ๊ฐ„ ์นด์šดํ„ฐ

Claude Code๋ฅผ ์ ๊ทน์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ์‹ค์ œ ์‹œ๊ฐ„์„ ์ถ”์ ํ•ฉ๋‹ˆ๋‹ค (์œ ํœด ์‹œ๊ฐ„ ์ œ์™ธ). ์ด ๋ฉ”ํŠธ๋ฆญ์€ ์‚ฌ์šฉ์ž ์ƒํ˜ธ ์ž‘์šฉ (์ž…๋ ฅ, ์‘๋‹ต ์ฝ๊ธฐ) ์ค‘ ๋ฐ CLI ์ฒ˜๋ฆฌ (๋„๊ตฌ ์‹คํ–‰, AI ์‘๋‹ต ์ƒ์„ฑ) ์ค‘์— ์ฆ๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

์†์„ฑ:

  • ๋ชจ๋“  ํ‘œ์ค€ ์†์„ฑ
  • type: ํ‚ค๋ณด๋“œ ์ƒํ˜ธ ์ž‘์šฉ์˜ ๊ฒฝ์šฐ "user", ๋„๊ตฌ ์‹คํ–‰ ๋ฐ AI ์‘๋‹ต์˜ ๊ฒฝ์šฐ "cli"

์ด๋ฒคํŠธ

Claude Code๋Š” OpenTelemetry ๋กœ๊ทธ/์ด๋ฒคํŠธ๋ฅผ ํ†ตํ•ด ๋‹ค์Œ ์ด๋ฒคํŠธ๋ฅผ ๋‚ด๋ณด๋ƒ…๋‹ˆ๋‹ค (OTEL_LOGS_EXPORTER๊ฐ€ ๊ตฌ์„ฑ๋œ ๊ฒฝ์šฐ):

์ด๋ฒคํŠธ ์ƒ๊ด€ ์†์„ฑ

์‚ฌ์šฉ์ž๊ฐ€ ํ”„๋กฌํ”„ํŠธ๋ฅผ ์ œ์ถœํ•˜๋ฉด Claude Code๋Š” ์—ฌ๋Ÿฌ API ํ˜ธ์ถœ์„ ์ˆ˜ํ–‰ํ•˜๊ณ  ์—ฌ๋Ÿฌ ๋„๊ตฌ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. prompt.id ์†์„ฑ์„ ์‚ฌ์šฉํ•˜๋ฉด ์ด๋Ÿฌํ•œ ๋ชจ๋“  ์ด๋ฒคํŠธ๋ฅผ ํ•ด๋‹น ์ด๋ฒคํŠธ๋ฅผ ํŠธ๋ฆฌ๊ฑฐํ•œ ๋‹จ์ผ ํ”„๋กฌํ”„ํŠธ์— ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์†์„ฑ ์„ค๋ช…
prompt.id ๋‹จ์ผ ์‚ฌ์šฉ์ž ํ”„๋กฌํ”„ํŠธ ์ฒ˜๋ฆฌ ์ค‘์— ์ƒ์„ฑ๋œ ๋ชจ๋“  ์ด๋ฒคํŠธ๋ฅผ ์—ฐ๊ฒฐํ•˜๋Š” UUID v4 ์‹๋ณ„์ž

๋‹จ์ผ ํ”„๋กฌํ”„ํŠธ๋กœ ํŠธ๋ฆฌ๊ฑฐ๋œ ๋ชจ๋“  ํ™œ๋™์„ ์ถ”์ ํ•˜๋ ค๋ฉด ํŠน์ • prompt.id ๊ฐ’์œผ๋กœ ์ด๋ฒคํŠธ๋ฅผ ํ•„ํ„ฐ๋งํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” user_prompt ์ด๋ฒคํŠธ, ๋ชจ๋“  api_request ์ด๋ฒคํŠธ ๋ฐ ํ•ด๋‹น ํ”„๋กฌํ”„ํŠธ ์ฒ˜๋ฆฌ ์ค‘์— ๋ฐœ์ƒํ•œ ๋ชจ๋“  tool_result ์ด๋ฒคํŠธ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

์‚ฌ์šฉ์ž ํ”„๋กฌํ”„ํŠธ ์ด๋ฒคํŠธ

์‚ฌ์šฉ์ž๊ฐ€ ํ”„๋กฌํ”„ํŠธ๋ฅผ ์ œ์ถœํ•  ๋•Œ ๊ธฐ๋ก๋ฉ๋‹ˆ๋‹ค.

์ด๋ฒคํŠธ ์ด๋ฆ„: claude_code.user_prompt

์†์„ฑ:

  • ๋ชจ๋“  ํ‘œ์ค€ ์†์„ฑ
  • event.name: "user_prompt"
  • event.timestamp: ISO 8601 ํƒ€์ž„์Šคํƒฌํ”„
  • event.sequence: ์„ธ์…˜ ๋‚ด ์ด๋ฒคํŠธ ์ˆœ์„œ ์ง€์ •์„ ์œ„ํ•œ ๋‹จ์กฐ ์ฆ๊ฐ€ ์นด์šดํ„ฐ
  • prompt_length: ํ”„๋กฌํ”„ํŠธ์˜ ๊ธธ์ด
  • prompt: ํ”„๋กฌํ”„ํŠธ ์ฝ˜ํ…์ธ . ๊ธฐ๋ณธ์ ์œผ๋กœ ์ˆ˜์ •๋จ. OTEL_LOG_USER_PROMPTS=1๋กœ ์„ค์ •ํ•˜์—ฌ ํฌํ•จ
  • command_name: ํ”„๋กฌํ”„ํŠธ๊ฐ€ ๋ช…๋ น์„ ํ˜ธ์ถœํ•  ๋•Œ ๋ช…๋ น ์ด๋ฆ„. compact ๋˜๋Š” debug์™€ ๊ฐ™์€ ๊ธฐ๋ณธ ์ œ๊ณต ๋ฐ ๋ฒˆ๋“ค ๋ช…๋ น ์ด๋ฆ„์€ ๊ทธ๋Œ€๋กœ ๋‚ด๋ณด๋‚ด์ง‘๋‹ˆ๋‹ค. reset๊ณผ ๊ฐ™์€ ๋ณ„์นญ์€ ์ •๊ทœ ์ด๋ฆ„์ด ์•„๋‹Œ ์ž…๋ ฅํ•œ ๋Œ€๋กœ ๋‚ด๋ณด๋ƒ…๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž ์ •์˜, ํ”Œ๋Ÿฌ๊ทธ์ธ ๋ฐ MCP ๋ช…๋ น ์ด๋ฆ„์€ OTEL_LOG_TOOL_DETAILS=1์ด ์„ค์ •๋˜์ง€ ์•Š์œผ๋ฉด custom ๋˜๋Š” mcp๋กœ ์ถ•์†Œ๋ฉ๋‹ˆ๋‹ค
  • command_source: ๋ช…๋ น์ด ์žˆ์„ ๋•Œ ๋ช…๋ น์˜ ์ถœ์ฒ˜: builtin, custom ๋˜๋Š” mcp. ํ”Œ๋Ÿฌ๊ทธ์ธ ์ œ๊ณต ๋ช…๋ น์€ custom์œผ๋กœ ๋ณด๊ณ ํ•ฉ๋‹ˆ๋‹ค

์–ด์‹œ์Šคํ„ดํŠธ ์‘๋‹ต ์ด๋ฒคํŠธ

๊ฐ API ์š”์ฒญ์ด ๋ชจ๋ธ์˜ ํ…์ŠคํŠธ ์ฝ˜ํ…์ธ ๋ฅผ ๋ฐ˜ํ™˜ํ•œ ํ›„ ๊ธฐ๋ก๋ฉ๋‹ˆ๋‹ค. ์‘๋‹ต์˜ ํ…์ŠคํŠธ ๋ธ”๋ก๋งŒ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. ์‚ฌ๊ณ  ๋ธ”๋ก ๋ฐ ๋„๊ตฌ ์‚ฌ์šฉ ๋ธ”๋ก์€ ์ œ์™ธ๋ฉ๋‹ˆ๋‹ค. {/* min-version: 2.1.193 */}Claude Code v2.1.193 ์ด์ƒ ํ•„์š”.

์ด๋ฒคํŠธ ์ด๋ฆ„: claude_code.assistant_response

์†์„ฑ:

  • ๋ชจ๋“  ํ‘œ์ค€ ์†์„ฑ
  • event.name: "assistant_response"
  • event.timestamp: ISO 8601 ํƒ€์ž„์Šคํƒฌํ”„
  • event.sequence: ์„ธ์…˜ ๋‚ด ์ด๋ฒคํŠธ ์ˆœ์„œ ์ง€์ •์„ ์œ„ํ•œ ๋‹จ์กฐ ์ฆ๊ฐ€ ์นด์šดํ„ฐ
  • response_length: ์‘๋‹ต ํ…์ŠคํŠธ์˜ ๊ธธ์ด (๋ฌธ์ž)
  • response: ์‘๋‹ต ํ…์ŠคํŠธ (60KB์—์„œ ์ž˜๋ฆผ). ๊ธฐ๋ณธ์ ์œผ๋กœ <REDACTED>๋กœ ์ˆ˜์ •๋จ. OTEL_LOG_ASSISTANT_RESPONSES=1๋กœ ์„ค์ •ํ•˜์—ฌ ํฌํ•จ. OTEL_LOG_ASSISTANT_RESPONSES๊ฐ€ ์„ค์ •๋˜์ง€ ์•Š์œผ๋ฉด OTEL_LOG_USER_PROMPTS๊ฐ€ ๋Œ€์‹  ์ œ์–ดํ•˜๋ฏ€๋กœ ํ”„๋กฌํ”„ํŠธ ๋กœ๊น…์ด ์ผœ์ ธ ์žˆ๋Š” ๋™์•ˆ ์‘๋‹ต์„ ์ˆ˜์ •๋œ ์ƒํƒœ๋กœ ์œ ์ง€ํ•˜๋ ค๋ฉด OTEL_LOG_ASSISTANT_RESPONSES=0์œผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค
  • model: ๋ชจ๋ธ ์‹๋ณ„์ž (์˜ˆ: "claude-sonnet-4-6")
  • request_id: ์‘๋‹ต์˜ request-id ํ—ค๋”์˜ Anthropic API ์š”์ฒญ ID. API๊ฐ€ ๋ฐ˜ํ™˜ํ•  ๋•Œ๋งŒ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค
  • query_source: ์š”์ฒญ์„ ๋ฐœ๊ธ‰ํ•œ ํ•˜์œ„ ์‹œ์Šคํ…œ, ์˜ˆ: "repl_main_thread", "compact" ๋˜๋Š” ํ•˜์œ„ ์—์ด์ „ํŠธ ์ด๋ฆ„

๋„๊ตฌ ๊ฒฐ๊ณผ ์ด๋ฒคํŠธ

๋„๊ตฌ๊ฐ€ ์‹คํ–‰์„ ์™„๋ฃŒํ•  ๋•Œ ๊ธฐ๋ก๋ฉ๋‹ˆ๋‹ค. ๋„๊ตฌ ํ˜ธ์ถœ์ด ๊ฑฐ๋ถ€๋œ ๊ฒฝ์šฐ ๋‚ด๋ณด๋‚ด์ง€์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋„๊ตฌ ๊ฒฐ์ • ์ด๋ฒคํŠธ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

์ด๋ฒคํŠธ ์ด๋ฆ„: claude_code.tool_result

์†์„ฑ:

  • ๋ชจ๋“  ํ‘œ์ค€ ์†์„ฑ
  • event.name: "tool_result"
  • event.timestamp: ISO 8601 ํƒ€์ž„์Šคํƒฌํ”„
  • event.sequence: ์„ธ์…˜ ๋‚ด ์ด๋ฒคํŠธ ์ˆœ์„œ ์ง€์ •์„ ์œ„ํ•œ ๋‹จ์กฐ ์ฆ๊ฐ€ ์นด์šดํ„ฐ
  • tool_name: ๋„๊ตฌ์˜ ์ด๋ฆ„
  • tool_use_id: ์ด ๋„๊ตฌ ํ˜ธ์ถœ์˜ ๊ณ ์œ  ์‹๋ณ„์ž. ํ›…์— ์ „๋‹ฌ๋œ tool_use_id์™€ ์ผ์น˜ํ•˜์—ฌ OTel ์ด๋ฒคํŠธ์™€ ํ›… ์บก์ฒ˜ ๋ฐ์ดํ„ฐ ๊ฐ„์˜ ์ƒ๊ด€๊ด€๊ณ„๋ฅผ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • success: "true" ๋˜๋Š” "false"
  • duration_ms: ์‹คํ–‰ ์‹œ๊ฐ„ (๋ฐ€๋ฆฌ์ดˆ)
  • error_type: ๋„๊ตฌ๊ฐ€ ์‹คํŒจํ–ˆ์„ ๋•Œ ์˜ค๋ฅ˜ ๋ฒ”์ฃผ ๋ฌธ์ž์—ด, ์˜ˆ: "Error:ENOENT" ๋˜๋Š” "ShellError"
  • error (OTEL_LOG_TOOL_DETAILS=1์ผ ๋•Œ): ๋„๊ตฌ๊ฐ€ ์‹คํŒจํ–ˆ์„ ๋•Œ ์ „์ฒด ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€
  • decision_type: ํ•ญ์ƒ "accept"์ž…๋‹ˆ๋‹ค. ์ด ์ด๋ฒคํŠธ๋Š” ๋„๊ตฌ๊ฐ€ ์‹คํ–‰๋œ ํ›„์—๋งŒ ๋‚ด๋ณด๋‚ด์ง‘๋‹ˆ๋‹ค (๊ฑฐ๋ถ€๋œ ํ˜ธ์ถœ์€ ๋„๊ตฌ ๊ฒฐ๊ณผ๋ฅผ ์ƒ์„ฑํ•˜์ง€ ์•Š์Œ)
  • decision_source: ๊ถŒํ•œ ๊ฒฐ์ •์ด ๋‚˜์˜จ ์œ„์น˜. "config", "hook", "user_permanent" ๋˜๋Š” "user_temporary" ์ค‘ ํ•˜๋‚˜. ๋„๊ตฌ ๊ฒฐ์ • ์ด๋ฒคํŠธ๋ฅผ ์ฐธ์กฐํ•˜์—ฌ ๊ฐ ๊ฐ’์˜ ์˜๋ฏธ๋ฅผ ํ™•์ธํ•˜์„ธ์š”. ๊ฑฐ๋ถ€ ์ „์šฉ ์ถœ์ฒ˜์ธ "user_abort" ๋ฐ "user_reject"๋Š” ์ด ์ด๋ฒคํŠธ์— ๋‚˜ํƒ€๋‚˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • tool_input_size_bytes: JSON ์ง๋ ฌํ™”๋œ ๋„๊ตฌ ์ž…๋ ฅ์˜ ํฌ๊ธฐ (๋ฐ”์ดํŠธ)
  • tool_result_size_bytes: ๋„๊ตฌ ๊ฒฐ๊ณผ์˜ ํฌ๊ธฐ (๋ฐ”์ดํŠธ)
  • mcp_server_scope: MCP ์„œ๋ฒ„ ๋ฒ”์œ„ ์‹๋ณ„์ž (MCP ๋„๊ตฌ์˜ ๊ฒฝ์šฐ)
  • tool_parameters (OTEL_LOG_TOOL_DETAILS=1์ผ ๋•Œ): ๋„๊ตฌ๋ณ„ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ํฌํ•จํ•˜๋Š” JSON ๋ฌธ์ž์—ด:
    • Bash ๋„๊ตฌ์˜ ๊ฒฝ์šฐ: bash_command, full_command, timeout, description, dangerouslyDisableSandbox ๋ฐ git_commit_id (git commit ๋ช…๋ น์ด ์„ฑ๊ณตํ•  ๋•Œ ์ปค๋ฐ‹ SHA) ํฌํ•จ
    • WorkspaceBash ๋„๊ตฌ์˜ ๊ฒฝ์šฐ: bash_command, full_command, timeout ํฌํ•จ
    • MCP ๋„๊ตฌ์˜ ๊ฒฝ์šฐ: mcp_server_name, mcp_tool_name ํฌํ•จ
    • Skill ๋„๊ตฌ์˜ ๊ฒฝ์šฐ: skill_name ํฌํ•จ
    • Agent ๋„๊ตฌ ๋˜๋Š” ๋ ˆ๊ฑฐ์‹œ Task ๋„๊ตฌ์˜ ๊ฒฝ์šฐ: subagent_type ํฌํ•จ
  • tool_input (OTEL_LOG_TOOL_DETAILS=1์ผ ๋•Œ): JSON ์ง๋ ฌํ™”๋œ ๋„๊ตฌ ์ธ์ˆ˜์ž…๋‹ˆ๋‹ค. 512์ž๋ฅผ ์ดˆ๊ณผํ•˜๋Š” ๊ฐœ๋ณ„ ๊ฐ’์€ ์ž˜๋ฆฌ๊ณ , ์ „์ฒด ํŽ˜์ด๋กœ๋“œ๋Š” ์•ฝ 4K ๋ฌธ์ž๋กœ ์ œํ•œ๋ฉ๋‹ˆ๋‹ค. MCP ๋„๊ตฌ๋ฅผ ํฌํ•จํ•œ ๋ชจ๋“  ๋„๊ตฌ์— ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.

API ์š”์ฒญ ์ด๋ฒคํŠธ

Claude์— ๋Œ€ํ•œ ๊ฐ API ์š”์ฒญ์— ๋Œ€ํ•ด ๊ธฐ๋ก๋ฉ๋‹ˆ๋‹ค.

์ด๋ฒคํŠธ ์ด๋ฆ„: claude_code.api_request

์†์„ฑ:

  • ๋ชจ๋“  ํ‘œ์ค€ ์†์„ฑ
  • event.name: "api_request"
  • event.timestamp: ISO 8601 ํƒ€์ž„์Šคํƒฌํ”„
  • event.sequence: ์„ธ์…˜ ๋‚ด ์ด๋ฒคํŠธ ์ˆœ์„œ ์ง€์ •์„ ์œ„ํ•œ ๋‹จ์กฐ ์ฆ๊ฐ€ ์นด์šดํ„ฐ
  • model: ์‚ฌ์šฉ๋œ ๋ชจ๋ธ (์˜ˆ: "claude-sonnet-5")
  • cost_usd: USD ๋‹จ์œ„์˜ ์˜ˆ์ƒ ๋น„์šฉ
  • duration_ms: ์š”์ฒญ ์ง€์† ์‹œ๊ฐ„ (๋ฐ€๋ฆฌ์ดˆ)
  • input_tokens: ์ž…๋ ฅ ํ† ํฐ ์ˆ˜
  • output_tokens: ์ถœ๋ ฅ ํ† ํฐ ์ˆ˜
  • cache_read_tokens: ์บ์‹œ์—์„œ ์ฝ์€ ํ† ํฐ ์ˆ˜
  • cache_creation_tokens: ์บ์‹œ ์ƒ์„ฑ์— ์‚ฌ์šฉ๋œ ํ† ํฐ ์ˆ˜
  • request_id: ์‘๋‹ต์˜ request-id ํ—ค๋”์˜ Anthropic API ์š”์ฒญ ID, ์˜ˆ: "req_011...". API๊ฐ€ ๋ฐ˜ํ™˜ํ•  ๋•Œ๋งŒ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.
  • speed: ๋น ๋ฅธ ๋ชจ๋“œ๊ฐ€ ํ™œ์„ฑํ™”๋˜์—ˆ๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” "fast" ๋˜๋Š” "normal"
  • query_source: ์š”์ฒญ์„ ๋ฐœ๊ธ‰ํ•œ ํ•˜์œ„ ์‹œ์Šคํ…œ, ์˜ˆ: "repl_main_thread", "compact" ๋˜๋Š” ํ•˜์œ„ ์—์ด์ „ํŠธ ์ด๋ฆ„
  • effort: ์š”์ฒญ์— ์ ์šฉ๋œ ๋…ธ๋ ฅ ์ˆ˜์ค€: "low", "medium", "high", "xhigh" ๋˜๋Š” "max". ๋ชจ๋ธ์ด ๋…ธ๋ ฅ์„ ์ง€์›ํ•˜์ง€ ์•Š์„ ๋•Œ๋Š” ์—†์Œ
  • agent.name, skill.name, plugin.name, marketplace.name, mcp_server.name, mcp_tool.name: ์š”์ฒญ์— ๋Œ€ํ•œ ์Šคํ‚ฌ, ํ”Œ๋Ÿฌ๊ทธ์ธ, ์—์ด์ „ํŠธ ๋ฐ MCP ์†์„ฑ. ๋น„์šฉ ์นด์šดํ„ฐ์˜ ์ •์˜ ๋ฐ ์ˆ˜์ • ๋™์ž‘์„ ์ฐธ์กฐํ•˜์„ธ์š”.

API ์˜ค๋ฅ˜ ์ด๋ฒคํŠธ

Claude์— ๋Œ€ํ•œ API ์š”์ฒญ์ด ์‹คํŒจํ•  ๋•Œ ๊ธฐ๋ก๋ฉ๋‹ˆ๋‹ค.

์ด๋ฒคํŠธ ์ด๋ฆ„: claude_code.api_error

์†์„ฑ:

  • ๋ชจ๋“  ํ‘œ์ค€ ์†์„ฑ
  • event.name: "api_error"
  • event.timestamp: ISO 8601 ํƒ€์ž„์Šคํƒฌํ”„
  • event.sequence: ์„ธ์…˜ ๋‚ด ์ด๋ฒคํŠธ ์ˆœ์„œ ์ง€์ •์„ ์œ„ํ•œ ๋‹จ์กฐ ์ฆ๊ฐ€ ์นด์šดํ„ฐ
  • model: ์‚ฌ์šฉ๋œ ๋ชจ๋ธ (์˜ˆ: "claude-sonnet-5")
  • error: ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€
  • status_code: HTTP ์ƒํƒœ ์ฝ”๋“œ (์ˆซ์ž). HTTP๊ฐ€ ์•„๋‹Œ ์˜ค๋ฅ˜ (์˜ˆ: ์—ฐ๊ฒฐ ์‹คํŒจ)์˜ ๊ฒฝ์šฐ ์—†์Œ
  • duration_ms: ์š”์ฒญ ์ง€์† ์‹œ๊ฐ„ (๋ฐ€๋ฆฌ์ดˆ)
  • attempt: ์ดˆ๊ธฐ ์š”์ฒญ์„ ํฌํ•จํ•œ ์ด ์‹œ๋„ ํšŸ์ˆ˜ (1์€ ์žฌ์‹œ๋„๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์•˜์Œ์„ ์˜๋ฏธ)
  • request_id: ์‘๋‹ต์˜ request-id ํ—ค๋”์˜ Anthropic API ์š”์ฒญ ID, ์˜ˆ: "req_011...". API๊ฐ€ ๋ฐ˜ํ™˜ํ•  ๋•Œ๋งŒ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.
  • speed: ๋น ๋ฅธ ๋ชจ๋“œ๊ฐ€ ํ™œ์„ฑํ™”๋˜์—ˆ๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” "fast" ๋˜๋Š” "normal"
  • query_source: ์š”์ฒญ์„ ๋ฐœ๊ธ‰ํ•œ ํ•˜์œ„ ์‹œ์Šคํ…œ, ์˜ˆ: "repl_main_thread", "compact" ๋˜๋Š” ํ•˜์œ„ ์—์ด์ „ํŠธ ์ด๋ฆ„
  • effort: ์š”์ฒญ์— ์ ์šฉ๋œ ๋…ธ๋ ฅ ์ˆ˜์ค€. ๋ชจ๋ธ์ด ๋…ธ๋ ฅ์„ ์ง€์›ํ•˜์ง€ ์•Š์„ ๋•Œ๋Š” ์—†์Œ
  • agent.name, skill.name, plugin.name, marketplace.name, mcp_server.name, mcp_tool.name: ์š”์ฒญ์— ๋Œ€ํ•œ ์Šคํ‚ฌ, ํ”Œ๋Ÿฌ๊ทธ์ธ, ์—์ด์ „ํŠธ ๋ฐ MCP ์†์„ฑ. ๋น„์šฉ ์นด์šดํ„ฐ์˜ ์ •์˜ ๋ฐ ์ˆ˜์ • ๋™์ž‘์„ ์ฐธ์กฐํ•˜์„ธ์š”.

API ๊ฑฐ๋ถ€ ์ด๋ฒคํŠธ

API ์š”์ฒญ์ด stop_reason: "refusal"์„ ๋ฐ˜ํ™˜ํ•  ๋•Œ ๊ธฐ๋ก๋ฉ๋‹ˆ๋‹ค. ๊ฑฐ๋ถ€๋Š” HTTP ์˜ค๋ฅ˜๊ฐ€ ์•„๋‹Œ ์„ฑ๊ณต์ ์ธ ์‘๋‹ต ์ŠคํŠธ๋ฆผ์— ๋„์ฐฉํ•˜๋ฏ€๋กœ api_error ์ด๋ฒคํŠธ๋Š” ์ด์— ๋Œ€ํ•ด ๋ฐœ์ƒํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด ์ด๋ฒคํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๊ฑฐ๋ถ€ ๋นˆ๋„๋ฅผ ์ถ”์ ํ•˜๊ณ  ๊ฑฐ๋ถ€๋ฅผ api_request ๋ฐ api_error์™€ ๋™์ผํ•œ ์†์„ฑ์œผ๋กœ ๊ทธ๋ฃนํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๋ฒคํŠธ ์ด๋ฆ„: claude_code.api_refusal

์†์„ฑ:

  • ๋ชจ๋“  ํ‘œ์ค€ ์†์„ฑ
  • event.name: "api_refusal"
  • event.timestamp: ISO 8601 ํƒ€์ž„์Šคํƒฌํ”„
  • event.sequence: ์„ธ์…˜ ๋‚ด ์ด๋ฒคํŠธ ์ˆœ์„œ ์ง€์ •์„ ์œ„ํ•œ ๋‹จ์กฐ ์ฆ๊ฐ€ ์นด์šดํ„ฐ
  • model: ์š”์ฒญ์˜ ๋ชจ๋ธ ์‹๋ณ„์ž
  • request_id: ์‘๋‹ต์˜ request-id ํ—ค๋”์˜ Anthropic API ์š”์ฒญ ID, ์˜ˆ: "req_011...". API๊ฐ€ ๋ฐ˜ํ™˜ํ•  ๋•Œ๋งŒ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.
  • query_source: ์š”์ฒญ์„ ๋ฐœ๊ธ‰ํ•œ ํ•˜์œ„ ์‹œ์Šคํ…œ, ์˜ˆ: "repl_main_thread", "compact" ๋˜๋Š” ํ•˜์œ„ ์—์ด์ „ํŠธ ์ด๋ฆ„. api_request์˜ ์ •์˜๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.
  • speed: ๋น ๋ฅธ ๋ชจ๋“œ๊ฐ€ ํ™œ์„ฑํ™”๋˜์—ˆ์„ ๋•Œ "fast", ๋˜๋Š” "normal"
  • attempt: ์žฌ์‹œ๋„ ์‹œ๋„ ๋ฒˆํ˜ธ. ์ฒซ ๋ฒˆ์งธ ์‹œ๋„๋Š” 1์ž…๋‹ˆ๋‹ค.
  • effort: ์š”์ฒญ์— ์ ์šฉ๋œ ๋…ธ๋ ฅ ์ˆ˜์ค€. ๋ชจ๋ธ์ด ๋…ธ๋ ฅ์„ ์ง€์›ํ•˜์ง€ ์•Š์„ ๋•Œ๋Š” ์—†์Œ
  • server_fallback_hop: API์˜ ์„œ๋ฒ„ ์ธก ๋ชจ๋ธ ํด๋ฐฑ์ด ์ด๋ฏธ ์ด ๊ฑฐ๋ถ€๋ฅผ ๋‹ค๋ฅธ ๋ชจ๋ธ์—์„œ ์žฌ์‹œ๋„ํ–ˆ์œผ๋ฏ€๋กœ ์‚ฌ์šฉ์ž๊ฐ€ ์ด ํŠน์ • ๊ฑฐ๋ถ€๋ฅผ ๋ณด์ง€ ๋ชปํ–ˆ์„ ๋•Œ true. ์š”์ฒญ์ด ๊ฑฐ๋ถ€๋กœ ๋๋‚ฌ์„ ๋•Œ false. ๋‹จ์ผ ํ„ด์€ ๋‚˜์ค‘์— false ์ตœ์ข… ์ด๋ฒคํŠธ๊ฐ€ ์žˆ๋Š” true ํ™‰ ์ด๋ฒคํŠธ๋ฅผ ๋ชจ๋‘ ๋‚ด๋ณด๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • has_category: API ์‘๋‹ต์ด "cyber", "bio", "frontier_llm" ๋˜๋Š” "reasoning_extraction"์˜ stop_details.category๋ฅผ ์ „๋‹ฌํ–ˆ์„ ๋•Œ true. ์‘๋‹ต์ด ์นดํ…Œ๊ณ ๋ฆฌ๋ฅผ ์ „๋‹ฌํ•˜์ง€ ์•Š์•˜๊ฑฐ๋‚˜ ํ•ด๋‹น ์ง‘ํ•ฉ ์™ธ๋ถ€์˜ ๊ฐ’์„ ์ „๋‹ฌํ–ˆ์„ ๋•Œ false. server_fallback_hop์ด true์ผ ๋•Œ๋Š” ์—†์Œ (ํ™‰ ๋ธ”๋ก์€ stop_details๋ฅผ ์ „๋‹ฌํ•˜์ง€ ์•Š์Œ).
  • has_explanation: API ์‘๋‹ต์ด stop_details.explanation์„ ์ „๋‹ฌํ–ˆ์„ ๋•Œ true, ๊ทธ ์™ธ์—๋Š” false. server_fallback_hop์ด true์ผ ๋•Œ๋Š” ์—†์Œ.
  • category: API ์‘๋‹ต์˜ stop_details.category ๊ฐ’. "cyber", "bio", "frontier_llm" ๋˜๋Š” "reasoning_extraction" ์ค‘ ํ•˜๋‚˜. OTEL_LOG_TOOL_DETAILS=1์ด ์„ค์ •๋˜์–ด ์žˆ๊ณ  has_category๊ฐ€ true์ผ ๋•Œ๋งŒ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.
  • agent.name, skill.name, plugin.name, marketplace.name, mcp_server.name, mcp_tool.name: ์š”์ฒญ์— ๋Œ€ํ•œ ์Šคํ‚ฌ, ํ”Œ๋Ÿฌ๊ทธ์ธ, ์—์ด์ „ํŠธ ๋ฐ MCP ์†์„ฑ. ๋น„์šฉ ์นด์šดํ„ฐ์˜ ์ •์˜ ๋ฐ ์ˆ˜์ • ๋™์ž‘์„ ์ฐธ์กฐํ•˜์„ธ์š”.

API ์š”์ฒญ ๋ณธ๋ฌธ ์ด๋ฒคํŠธ

OTEL_LOG_RAW_API_BODIES๊ฐ€ ์„ค์ •๋˜์–ด ์žˆ์„ ๋•Œ ๊ฐ API ์š”์ฒญ ์‹œ๋„์— ๋Œ€ํ•ด ๊ธฐ๋ก๋ฉ๋‹ˆ๋‹ค. ์กฐ์ •๋œ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•œ ์žฌ์‹œ๋„๋Š” ๊ฐ๊ฐ ์ž์‹ ์˜ ์ด๋ฒคํŠธ๋ฅผ ์ƒ์„ฑํ•˜๋ฏ€๋กœ ์‹œ๋„๋‹น ํ•˜๋‚˜์˜ ์ด๋ฒคํŠธ๊ฐ€ ๋‚ด๋ณด๋‚ด์ง‘๋‹ˆ๋‹ค.

์ด๋ฒคํŠธ ์ด๋ฆ„: claude_code.api_request_body

์†์„ฑ:

  • ๋ชจ๋“  ํ‘œ์ค€ ์†์„ฑ
  • event.name: "api_request_body"
  • event.timestamp: ISO 8601 ํƒ€์ž„์Šคํƒฌํ”„
  • event.sequence: ์„ธ์…˜ ๋‚ด ์ด๋ฒคํŠธ ์ˆœ์„œ ์ง€์ •์„ ์œ„ํ•œ ๋‹จ์กฐ ์ฆ๊ฐ€ ์นด์šดํ„ฐ
  • body: JSON ์ง๋ ฌํ™”๋œ Messages API ์š”์ฒญ ๋งค๊ฐœ๋ณ€์ˆ˜ (์‹œ์Šคํ…œ ํ”„๋กฌํ”„ํŠธ, ๋ฉ”์‹œ์ง€, ๋„๊ตฌ ๋“ฑ) (60KB์—์„œ ์ž˜๋ฆผ). ์ด์ „ ์–ด์‹œ์Šคํ„ดํŠธ ํ„ด์˜ ํ™•์žฅ ์‚ฌ๊ณ  ์ฝ˜ํ…์ธ ๋Š” ์ˆ˜์ •๋ฉ๋‹ˆ๋‹ค. ์ธ๋ผ์ธ ๋ชจ๋“œ (OTEL_LOG_RAW_API_BODIES=1)์—์„œ๋งŒ ๋‚ด๋ณด๋‚ด์ง‘๋‹ˆ๋‹ค.
  • body_ref: ์ž˜๋ฆฌ์ง€ ์•Š์€ ๋ณธ๋ฌธ์„ ํฌํ•จํ•˜๋Š” <dir>/<uuid>.request.json ํŒŒ์ผ์˜ ์ ˆ๋Œ€ ๊ฒฝ๋กœ. ํŒŒ์ผ ๋ชจ๋“œ (OTEL_LOG_RAW_API_BODIES=file:<dir>)์—์„œ๋งŒ ๋‚ด๋ณด๋‚ด์ง‘๋‹ˆ๋‹ค.
  • body_length: ์ž˜๋ฆฌ์ง€ ์•Š์€ ๋ณธ๋ฌธ ๊ธธ์ด. OTEL_LOG_RAW_API_BODIES=file:<dir>์ผ ๋•Œ UTF-8 ๋ฐ”์ดํŠธ, =1์ผ ๋•Œ UTF-16 ์ฝ”๋“œ ๋‹จ์œ„
  • body_truncated: ์ธ๋ผ์ธ ์ž˜๋ฆผ์ด ๋ฐœ์ƒํ–ˆ์„ ๋•Œ "true". ํŒŒ์ผ ๋ชจ๋“œ ๋ฐ ์ž˜๋ฆผ์ด ๋ฐœ์ƒํ•˜์ง€ ์•Š์•˜์„ ๋•Œ๋Š” ์—†์Œ
  • model: ์š”์ฒญ ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ๋ชจ๋ธ ์‹๋ณ„์ž
  • query_source: ์š”์ฒญ์„ ๋ฐœ๊ธ‰ํ•œ ํ•˜์œ„ ์‹œ์Šคํ…œ (์˜ˆ: "compact")

API ์‘๋‹ต ๋ณธ๋ฌธ ์ด๋ฒคํŠธ

OTEL_LOG_RAW_API_BODIES๊ฐ€ ์„ค์ •๋˜์–ด ์žˆ์„ ๋•Œ ๊ฐ ์„ฑ๊ณต์ ์ธ API ์‘๋‹ต์— ๋Œ€ํ•ด ๊ธฐ๋ก๋ฉ๋‹ˆ๋‹ค.

์ด๋ฒคํŠธ ์ด๋ฆ„: claude_code.api_response_body

์†์„ฑ:

  • ๋ชจ๋“  ํ‘œ์ค€ ์†์„ฑ
  • event.name: "api_response_body"
  • event.timestamp: ISO 8601 ํƒ€์ž„์Šคํƒฌํ”„
  • event.sequence: ์„ธ์…˜ ๋‚ด ์ด๋ฒคํŠธ ์ˆœ์„œ ์ง€์ •์„ ์œ„ํ•œ ๋‹จ์กฐ ์ฆ๊ฐ€ ์นด์šดํ„ฐ
  • body: JSON ์ง๋ ฌํ™”๋œ Messages API ์‘๋‹ต (id, ์ฝ˜ํ…์ธ  ๋ธ”๋ก, ์‚ฌ์šฉ, ์ค‘์ง€ ์ด์œ ) (60KB์—์„œ ์ž˜๋ฆผ). ํ™•์žฅ ์‚ฌ๊ณ  ์ฝ˜ํ…์ธ ๋Š” ์ˆ˜์ •๋ฉ๋‹ˆ๋‹ค. ์ธ๋ผ์ธ ๋ชจ๋“œ (OTEL_LOG_RAW_API_BODIES=1)์—์„œ๋งŒ ๋‚ด๋ณด๋‚ด์ง‘๋‹ˆ๋‹ค.
  • body_ref: ์ž˜๋ฆฌ์ง€ ์•Š์€ ๋ณธ๋ฌธ์„ ํฌํ•จํ•˜๋Š” <dir>/<request_id>.response.json ํŒŒ์ผ์˜ ์ ˆ๋Œ€ ๊ฒฝ๋กœ. ํŒŒ์ผ ๋ชจ๋“œ (OTEL_LOG_RAW_API_BODIES=file:<dir>)์—์„œ๋งŒ ๋‚ด๋ณด๋‚ด์ง‘๋‹ˆ๋‹ค.
  • body_length: ์ž˜๋ฆฌ์ง€ ์•Š์€ ๋ณธ๋ฌธ ๊ธธ์ด. OTEL_LOG_RAW_API_BODIES=file:<dir>์ผ ๋•Œ UTF-8 ๋ฐ”์ดํŠธ, =1์ผ ๋•Œ UTF-16 ์ฝ”๋“œ ๋‹จ์œ„
  • body_truncated: ์ธ๋ผ์ธ ์ž˜๋ฆผ์ด ๋ฐœ์ƒํ–ˆ์„ ๋•Œ "true". ํŒŒ์ผ ๋ชจ๋“œ ๋ฐ ์ž˜๋ฆผ์ด ๋ฐœ์ƒํ•˜์ง€ ์•Š์•˜์„ ๋•Œ๋Š” ์—†์Œ
  • model: ๋ชจ๋ธ ์‹๋ณ„์ž
  • query_source: ์š”์ฒญ์„ ๋ฐœ๊ธ‰ํ•œ ํ•˜์œ„ ์‹œ์Šคํ…œ
  • request_id: ์‘๋‹ต์˜ request-id ํ—ค๋”์˜ Anthropic API ์š”์ฒญ ID, ์˜ˆ: "req_011...". API๊ฐ€ ๋ฐ˜ํ™˜ํ•  ๋•Œ๋งŒ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

๋„๊ตฌ ๊ฒฐ์ • ์ด๋ฒคํŠธ

๋„๊ตฌ ๊ถŒํ•œ ๊ฒฐ์ •์ด ๋‚ด๋ ค์งˆ ๋•Œ ๊ธฐ๋ก๋ฉ๋‹ˆ๋‹ค (์ˆ˜๋ฝ/๊ฑฐ๋ถ€).

์ด๋ฒคํŠธ ์ด๋ฆ„: claude_code.tool_decision

์†์„ฑ:

  • ๋ชจ๋“  ํ‘œ์ค€ ์†์„ฑ
  • event.name: "tool_decision"
  • event.timestamp: ISO 8601 ํƒ€์ž„์Šคํƒฌํ”„
  • event.sequence: ์„ธ์…˜ ๋‚ด ์ด๋ฒคํŠธ ์ˆœ์„œ ์ง€์ •์„ ์œ„ํ•œ ๋‹จ์กฐ ์ฆ๊ฐ€ ์นด์šดํ„ฐ
  • tool_name: ๋„๊ตฌ์˜ ์ด๋ฆ„ (์˜ˆ: "Read", "Edit", "Write", "NotebookEdit")
  • tool_use_id: ์ด ๋„๊ตฌ ํ˜ธ์ถœ์˜ ๊ณ ์œ  ์‹๋ณ„์ž. ํ›…์— ์ „๋‹ฌ๋œ tool_use_id์™€ ์ผ์น˜ํ•˜์—ฌ OTel ์ด๋ฒคํŠธ์™€ ํ›… ์บก์ฒ˜ ๋ฐ์ดํ„ฐ ๊ฐ„์˜ ์ƒ๊ด€๊ด€๊ณ„๋ฅผ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • decision: "accept" ๋˜๋Š” "reject"
  • source: ๊ฒฐ์ • ์ถœ์ฒ˜:
    • "config": ํ”„๋กœ์ ํŠธ ์„ค์ •, ์‚ฌ์šฉ์ž์˜ ๊ฐœ์ธ ์„ค์ •์˜ ํ—ˆ์šฉ ๊ทœ์น™, ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ ๊ด€๋ฆฌ ์ •์ฑ…, --allowedTools ๋˜๋Š” --disallowedTools ํ”Œ๋ž˜๊ทธ, ํ™œ์„ฑ ๊ถŒํ•œ ๋ชจ๋“œ, ๊ฐ™์€ ๋Œ€ํ™”ํ˜• CLI ์„ธ์…˜์˜ ์ด์ „ ํ”„๋กฌํ”„ํŠธ์—์„œ์˜ ์„ธ์…˜ ๋ฒ”์œ„ ๋ถ€์—ฌ ๋˜๋Š” ๋„๊ตฌ๊ฐ€ ๋ณธ์งˆ์ ์œผ๋กœ ์•ˆ์ „ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํ”„๋กฌํ”„ํŠธ ์—†์ด ์ž๋™์œผ๋กœ ๊ฒฐ์ •๋จ. ์ด๋ฒคํŠธ๋Š” ์ด๋Ÿฌํ•œ ์ถœ์ฒ˜ ์ค‘ ์–ด๋А ๊ฒƒ์ด ์ผ์น˜ํ–ˆ๋Š”์ง€ ๋‚˜ํƒ€๋‚ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
    • "hook": PreToolUse ๋˜๋Š” PermissionRequest ํ›…์ด ๊ฒฐ์ •์„ ๋ฐ˜ํ™˜ํ•จ.
    • "user_permanent": ์‚ฌ์šฉ์ž๊ฐ€ ๊ถŒํ•œ ํ”„๋กฌํ”„ํŠธ์—์„œ "์˜ˆ, ๊ทธ๋ฆฌ๊ณ  ... ๋‹ค์‹œ ๋ฌป์ง€ ๋งˆ์„ธ์š”"๋ฅผ ์„ ํƒํ•˜์—ฌ ๊ฐœ์ธ ์„ค์ •์— ํ—ˆ์šฉ ๊ทœ์น™์„ ์ €์žฅํ–ˆ์„ ๋•Œ ๋‚ด๋ณด๋‚ด์ง‘๋‹ˆ๋‹ค. ๋Œ€ํ™”ํ˜• CLI์—์„œ๋Š” ํ•ด๋‹น ์„ ํƒ ์ž์ฒด์— ๋Œ€ํ•ด์„œ๋งŒ ๋‚ด๋ณด๋‚ด์ง‘๋‹ˆ๋‹ค. ๋‚˜์ค‘์— ์ €์žฅ๋œ ๊ทœ์น™๊ณผ ์ผ์น˜ํ•˜๋Š” ํ˜ธ์ถœ์€ ๋Œ€์‹  "config"์„ ๋‚ด๋ณด๋ƒ…๋‹ˆ๋‹ค. Agent SDK ๋˜๋Š” ๋น„๋Œ€ํ™”ํ˜• -p ์„ธ์…˜์—์„œ๋Š” ์ดˆ๊ธฐ ์„ ํƒ๊ณผ ๋‚˜์ค‘์˜ ๊ทœ์น™ ์ผ์น˜ ๋ชจ๋‘ "user_permanent"๋ฅผ ๋‚ด๋ณด๋ƒ…๋‹ˆ๋‹ค. ์ˆ˜๋ฝ์œผ๋กœ ์ฒ˜๋ฆฌ๋จ.
    • "user_temporary": ์‚ฌ์šฉ์ž๊ฐ€ ๊ถŒํ•œ ํ”„๋กฌํ”„ํŠธ์—์„œ "์˜ˆ"๋ฅผ ์„ ํƒํ–ˆ๊ฑฐ๋‚˜ ํŒŒ์ผ ํŽธ์ง‘ ๋˜๋Š” ์ฝ๊ธฐ ํ”„๋กฌํ”„ํŠธ์—์„œ "์ด ์„ธ์…˜ ์ค‘" ์˜ต์…˜ ์ค‘ ํ•˜๋‚˜๋ฅผ ์„ ํƒํ–ˆ์„ ๋•Œ ๋‚ด๋ณด๋‚ด์ง‘๋‹ˆ๋‹ค. ๋Œ€ํ™”ํ˜• CLI์—์„œ๋Š” ์„ ํƒ ์ž์ฒด์— ๋Œ€ํ•ด์„œ๋งŒ ๋‚ด๋ณด๋‚ด์ง‘๋‹ˆ๋‹ค. ๋‚˜์ค‘์— ํ•ด๋‹น ์„ธ์…˜ ๋ฒ”์œ„ ๋ถ€์—ฌ์™€ ์ผ์น˜ํ•˜๋Š” ํ˜ธ์ถœ์€ ๋Œ€์‹  "config"์„ ๋‚ด๋ณด๋ƒ…๋‹ˆ๋‹ค. Agent SDK ๋˜๋Š” ๋น„๋Œ€ํ™”ํ˜• -p ์„ธ์…˜์—์„œ๋Š” ์„ ํƒ๊ณผ ๋‚˜์ค‘์˜ ์ผ์น˜ ๋ชจ๋‘ "user_temporary"๋ฅผ ๋‚ด๋ณด๋ƒ…๋‹ˆ๋‹ค. ์ˆ˜๋ฝ์œผ๋กœ ์ฒ˜๋ฆฌ๋จ.
    • "user_abort": ์‚ฌ์šฉ์ž๊ฐ€ ๋‹ต๋ณ€ ์—†์ด ๊ถŒํ•œ ํ”„๋กฌํ”„ํŠธ๋ฅผ ๋‹ซ์•˜์„ ๋•Œ ๋‚ด๋ณด๋‚ด์ง‘๋‹ˆ๋‹ค. ๊ฑฐ๋ถ€๋กœ ์ฒ˜๋ฆฌ๋จ.
    • "user_reject": ์‚ฌ์šฉ์ž๊ฐ€ ํ”„๋กฌํ”„ํŠธ๋  ๋•Œ "์•„๋‹ˆ์˜ค"๋ฅผ ์„ ํƒํ–ˆ์„ ๋•Œ ๋‚ด๋ณด๋‚ด์ง‘๋‹ˆ๋‹ค. ๋Œ€ํ™”ํ˜• CLI์—์„œ๋Š” ํ•ด๋‹น ์„ ํƒ ์ž์ฒด์— ๋Œ€ํ•ด์„œ๋งŒ ๋‚ด๋ณด๋‚ด์ง‘๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž์˜ ๊ฐœ์ธ ์„ค์ •์˜ ๊ฑฐ๋ถ€ ๊ทœ์น™๊ณผ ์ผ์น˜ํ•˜๋Š” ํ˜ธ์ถœ์€ ๋Œ€์‹  "config"์„ ๋‚ด๋ณด๋ƒ…๋‹ˆ๋‹ค. Agent SDK ๋˜๋Š” ๋น„๋Œ€ํ™”ํ˜• -p ์„ธ์…˜์—์„œ๋Š” ๊ฐœ์ธ ์„ค์ •์˜ ๊ฑฐ๋ถ€ ๊ทœ์น™๊ณผ ์ผ์น˜ํ•˜๋Š” ํ˜ธ์ถœ์ด "user_reject"๋ฅผ ๋‚ด๋ณด๋ƒ…๋‹ˆ๋‹ค. ๊ฑฐ๋ถ€๋กœ ์ฒ˜๋ฆฌ๋จ.
  • tool_parameters (OTEL_LOG_TOOL_DETAILS=1์ผ ๋•Œ): ๋„๊ตฌ๋ณ„ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ํฌํ•จํ•˜๋Š” JSON ๋ฌธ์ž์—ด. ๋„๊ตฌ ๊ฒฐ๊ณผ ์ด๋ฒคํŠธ์™€ ๋™์ผํ•œ ํ˜•ํƒœ์ด์ง€๋งŒ git_commit_id์™€ ๊ฐ™์€ ์‹คํ–‰ ํ›„ ํ•„๋“œ๋Š” ์ œ์™ธ๋ฉ๋‹ˆ๋‹ค. ๊ถŒํ•œ ๊ฒฐ์ •์ด updatedInput์„ ํ†ตํ•ด ๋„๊ตฌ ์ž…๋ ฅ์„ ๋‹ค์‹œ ์“ธ ๊ฒฝ์šฐ ์ˆ˜๋ฝ๋œ ํ˜ธ์ถœ์˜ tool_result์™€ ๊ฐ’์ด ๋‹ค๋ฅผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ์†์„ฑ์„ ์‚ฌ์šฉํ•˜์—ฌ decision์ด "reject"์ผ ๋•Œ ์–ด๋–ค ๋ช…๋ น์ด ๊ฑฐ๋ถ€๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
    • Bash ๋„๊ตฌ์˜ ๊ฒฝ์šฐ: bash_command, full_command, timeout, description, dangerouslyDisableSandbox ํฌํ•จ
    • WorkspaceBash ๋„๊ตฌ์˜ ๊ฒฝ์šฐ: bash_command, full_command, timeout ํฌํ•จ
    • MCP ๋„๊ตฌ์˜ ๊ฒฝ์šฐ: mcp_server_name, mcp_tool_name ํฌํ•จ
    • Skill ๋„๊ตฌ์˜ ๊ฒฝ์šฐ: skill_name ํฌํ•จ
    • Agent ๋„๊ตฌ ๋˜๋Š” ๋ ˆ๊ฑฐ์‹œ Task ๋„๊ตฌ์˜ ๊ฒฝ์šฐ: subagent_type ํฌํ•จ

๊ถŒํ•œ ๋ชจ๋“œ ๋ณ€๊ฒฝ ์ด๋ฒคํŠธ

๊ถŒํ•œ ๋ชจ๋“œ๊ฐ€ ๋ณ€๊ฒฝ๋  ๋•Œ ๊ธฐ๋ก๋ฉ๋‹ˆ๋‹ค (์˜ˆ: Shift+Tab ์ˆœํ™˜, ๊ณ„ํš ๋ชจ๋“œ ์ข…๋ฃŒ ๋˜๋Š” ์ž๋™ ๋ชจ๋“œ ๊ฒŒ์ดํŠธ ํ™•์ธ).

์ด๋ฒคํŠธ ์ด๋ฆ„: claude_code.permission_mode_changed

์†์„ฑ:

  • ๋ชจ๋“  ํ‘œ์ค€ ์†์„ฑ
  • event.name: "permission_mode_changed"
  • event.timestamp: ISO 8601 ํƒ€์ž„์Šคํƒฌํ”„
  • event.sequence: ์„ธ์…˜ ๋‚ด ์ด๋ฒคํŠธ ์ˆœ์„œ ์ง€์ •์„ ์œ„ํ•œ ๋‹จ์กฐ ์ฆ๊ฐ€ ์นด์šดํ„ฐ
  • from_mode: ์ด์ „ ๊ถŒํ•œ ๋ชจ๋“œ, ์˜ˆ: "default", "plan", "acceptEdits", "auto" ๋˜๋Š” "bypassPermissions"
  • to_mode: ์ƒˆ ๊ถŒํ•œ ๋ชจ๋“œ
  • trigger: ๋ณ€๊ฒฝ์„ ์•ผ๊ธฐํ•œ ๊ฒƒ. "shift_tab", "exit_plan_mode", "auto_gate_denied" ๋˜๋Š” "auto_opt_in" ์ค‘ ํ•˜๋‚˜. SDK ๋˜๋Š” ๋ธŒ๋ฆฌ์ง€์—์„œ ์ „ํ™˜์ด ์‹œ์ž‘๋  ๋•Œ๋Š” ์—†์Œ

์ธ์ฆ ์ด๋ฒคํŠธ

/login ๋˜๋Š” /logout์ด ์™„๋ฃŒ๋  ๋•Œ ๊ธฐ๋ก๋ฉ๋‹ˆ๋‹ค.

์ด๋ฒคํŠธ ์ด๋ฆ„: claude_code.auth

์†์„ฑ:

  • ๋ชจ๋“  ํ‘œ์ค€ ์†์„ฑ
  • event.name: "auth"
  • event.timestamp: ISO 8601 ํƒ€์ž„์Šคํƒฌํ”„
  • event.sequence: ์„ธ์…˜ ๋‚ด ์ด๋ฒคํŠธ ์ˆœ์„œ ์ง€์ •์„ ์œ„ํ•œ ๋‹จ์กฐ ์ฆ๊ฐ€ ์นด์šดํ„ฐ
  • action: "login" ๋˜๋Š” "logout"
  • success: "true" ๋˜๋Š” "false"
  • auth_method: ์ธ์ฆ ๋ฐฉ๋ฒ•, ์˜ˆ: "oauth"
  • error_category: ์ž‘์—…์ด ์‹คํŒจํ–ˆ์„ ๋•Œ ๋ฒ”์ฃผ๋ณ„ ์˜ค๋ฅ˜ ์ข…๋ฅ˜. ์›๋ณธ ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๋Š” ํฌํ•จ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค
  • status_code: ์ž‘์—…์ด HTTP ์˜ค๋ฅ˜๋กœ ์‹คํŒจํ–ˆ์„ ๋•Œ HTTP ์ƒํƒœ ์ฝ”๋“œ (๋ฌธ์ž์—ด)

MCP ์„œ๋ฒ„ ์—ฐ๊ฒฐ ์ด๋ฒคํŠธ

MCP ์„œ๋ฒ„๊ฐ€ ์—ฐ๊ฒฐ, ์—ฐ๊ฒฐ ํ•ด์ œ ๋˜๋Š” ์—ฐ๊ฒฐ ์‹คํŒจํ•  ๋•Œ ๊ธฐ๋ก๋ฉ๋‹ˆ๋‹ค.

์ด๋ฒคํŠธ ์ด๋ฆ„: claude_code.mcp_server_connection

์†์„ฑ:

  • ๋ชจ๋“  ํ‘œ์ค€ ์†์„ฑ
  • event.name: "mcp_server_connection"
  • event.timestamp: ISO 8601 ํƒ€์ž„์Šคํƒฌํ”„
  • event.sequence: ์„ธ์…˜ ๋‚ด ์ด๋ฒคํŠธ ์ˆœ์„œ ์ง€์ •์„ ์œ„ํ•œ ๋‹จ์กฐ ์ฆ๊ฐ€ ์นด์šดํ„ฐ
  • status: "connected", "failed" ๋˜๋Š” "disconnected"
  • transport_type: ์„œ๋ฒ„ ์ „์†ก, ์˜ˆ: "stdio", "sse" ๋˜๋Š” "http"
  • server_scope: ์„œ๋ฒ„๊ฐ€ ๊ตฌ์„ฑ๋œ ๋ฒ”์œ„, ์˜ˆ: "user", "project" ๋˜๋Š” "local"
  • duration_ms: ์—ฐ๊ฒฐ ์‹œ๋„ ์ง€์† ์‹œ๊ฐ„ (๋ฐ€๋ฆฌ์ดˆ)
  • error_code: ์—ฐ๊ฒฐ์ด ์‹คํŒจํ–ˆ์„ ๋•Œ ์˜ค๋ฅ˜ ์ฝ”๋“œ
  • is_plugin: ์„œ๋ฒ„๊ฐ€ ํ”Œ๋Ÿฌ๊ทธ์ธ์—์„œ ์ œ๊ณต๋  ๋•Œ true, ๊ทธ ์™ธ์—๋Š” false
  • plugin_id_hash (is_plugin์ด true์ผ ๋•Œ): ํ”Œ๋Ÿฌ๊ทธ์ธ ์ด๋ฆ„ ๋ฐ ๋งˆ์ผ“ํ”Œ๋ ˆ์ด์Šค์˜ ์•ˆ์ •์ ์ธ ํ•ด์‹œ (์ด๋ฆ„์„ ๋…ธ์ถœํ•˜์ง€ ์•Š๊ณ  ํ”Œ๋Ÿฌ๊ทธ์ธ๋ณ„๋กœ ์ด๋ฒคํŠธ๋ฅผ ๊ทธ๋ฃนํ™”ํ•˜๊ธฐ ์œ„ํ•จ)
  • plugin.name (is_plugin์ด true์ผ ๋•Œ): ์„œ๋ฒ„๋ฅผ ์ œ๊ณตํ•˜๋Š” ํ”Œ๋Ÿฌ๊ทธ์ธ์˜ ์ด๋ฆ„. ํƒ€์‚ฌ ํ”Œ๋Ÿฌ๊ทธ์ธ์˜ ๊ฒฝ์šฐ OTEL_LOG_TOOL_DETAILS=1์ด ์•„๋‹ˆ๋ฉด ๋ฆฌํ„ฐ๋Ÿด ๋ฌธ์ž์—ด "third-party"์ž…๋‹ˆ๋‹ค. ๊ณต์‹ Anthropic ์†Œ์Šค์˜ ํ”Œ๋Ÿฌ๊ทธ์ธ์€ ํ•ญ์ƒ ์ด๋ฆ„์œผ๋กœ ์‹๋ณ„๋ฉ๋‹ˆ๋‹ค. plugin_id_hash ๋ฐ plugin.name ์†์„ฑ์€ ์ž์‹ ์˜ ๋ชจ๋‹ˆํ„ฐ๋ง ๋ฐฑ์—”๋“œ๋กœ ํ๋ฅด๋ฉฐ Anthropic์œผ๋กœ ์ „์†ก๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค
  • server_name (OTEL_LOG_TOOL_DETAILS=1์ผ ๋•Œ): ๊ตฌ์„ฑ๋œ ์„œ๋ฒ„ ์ด๋ฆ„
  • error (OTEL_LOG_TOOL_DETAILS=1์ผ ๋•Œ): ์—ฐ๊ฒฐ์ด ์‹คํŒจํ–ˆ์„ ๋•Œ ์ „์ฒด ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€

๋‚ด๋ถ€ ์˜ค๋ฅ˜ ์ด๋ฒคํŠธ

Claude Code๊ฐ€ ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ๋‚ด๋ถ€ ์˜ค๋ฅ˜๋ฅผ ํฌ์ฐฉํ•  ๋•Œ ๊ธฐ๋ก๋ฉ๋‹ˆ๋‹ค. ์˜ค๋ฅ˜ ํด๋ž˜์Šค ์ด๋ฆ„๊ณผ errno ์Šคํƒ€์ผ ์ฝ”๋“œ๋งŒ ๊ธฐ๋ก๋ฉ๋‹ˆ๋‹ค. ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€ ๋ฐ ์Šคํƒ ์ถ”์ ์€ ํฌํ•จ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด ์ด๋ฒคํŠธ๋Š” Bedrock, Vertex ๋˜๋Š” Foundry์— ๋Œ€ํ•ด ์‹คํ–‰ํ•˜๊ฑฐ๋‚˜ DISABLE_ERROR_REPORTING์ด ์„ค์ •๋˜์–ด ์žˆ์„ ๋•Œ๋Š” ๋‚ด๋ณด๋‚ด์ง€์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ด๋ฒคํŠธ ์ด๋ฆ„: claude_code.internal_error

์†์„ฑ:

  • ๋ชจ๋“  ํ‘œ์ค€ ์†์„ฑ
  • event.name: "internal_error"
  • event.timestamp: ISO 8601 ํƒ€์ž„์Šคํƒฌํ”„
  • event.sequence: ์„ธ์…˜ ๋‚ด ์ด๋ฒคํŠธ ์ˆœ์„œ ์ง€์ •์„ ์œ„ํ•œ ๋‹จ์กฐ ์ฆ๊ฐ€ ์นด์šดํ„ฐ
  • error_name: ์˜ค๋ฅ˜ ํด๋ž˜์Šค ์ด๋ฆ„, ์˜ˆ: "TypeError" ๋˜๋Š” "SyntaxError"
  • error_code: ์˜ค๋ฅ˜์— ์žˆ์„ ๋•Œ Node.js errno ์ฝ”๋“œ, ์˜ˆ: "ENOENT"

ํ”Œ๋Ÿฌ๊ทธ์ธ ์„ค์น˜๋จ ์ด๋ฒคํŠธ

ํ”Œ๋Ÿฌ๊ทธ์ธ์ด ์„ค์น˜๋ฅผ ์™„๋ฃŒํ•  ๋•Œ ๊ธฐ๋ก๋ฉ๋‹ˆ๋‹ค (claude plugin install CLI ๋ช…๋ น ๋ฐ ๋Œ€ํ™”ํ˜• /plugin UI ๋ชจ๋‘).

์ด๋ฒคํŠธ ์ด๋ฆ„: claude_code.plugin_installed

์†์„ฑ:

  • ๋ชจ๋“  ํ‘œ์ค€ ์†์„ฑ
  • event.name: "plugin_installed"
  • event.timestamp: ISO 8601 ํƒ€์ž„์Šคํƒฌํ”„
  • event.sequence: ์„ธ์…˜ ๋‚ด ์ด๋ฒคํŠธ ์ˆœ์„œ ์ง€์ •์„ ์œ„ํ•œ ๋‹จ์กฐ ์ฆ๊ฐ€ ์นด์šดํ„ฐ
  • marketplace.is_official: ๋งˆ์ผ“ํ”Œ๋ ˆ์ด์Šค๊ฐ€ ๊ณต์‹ Anthropic ๋งˆ์ผ“ํ”Œ๋ ˆ์ด์Šค์ธ ๊ฒฝ์šฐ "true", ๊ทธ ์™ธ์—๋Š” "false"
  • install.trigger: "cli" ๋˜๋Š” "ui"
  • plugin.name: ์„ค์น˜๋œ ํ”Œ๋Ÿฌ๊ทธ์ธ์˜ ์ด๋ฆ„. ํƒ€์‚ฌ ๋งˆ์ผ“ํ”Œ๋ ˆ์ด์Šค์˜ ๊ฒฝ์šฐ OTEL_LOG_TOOL_DETAILS=1์ผ ๋•Œ๋งŒ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค
  • plugin.version: ๋งˆ์ผ“ํ”Œ๋ ˆ์ด์Šค ํ•ญ๋ชฉ์— ์„ ์–ธ๋œ ๊ฒฝ์šฐ ํ”Œ๋Ÿฌ๊ทธ์ธ ๋ฒ„์ „. ํƒ€์‚ฌ ๋งˆ์ผ“ํ”Œ๋ ˆ์ด์Šค์˜ ๊ฒฝ์šฐ OTEL_LOG_TOOL_DETAILS=1์ผ ๋•Œ๋งŒ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค
  • marketplace.name: ํ”Œ๋Ÿฌ๊ทธ์ธ์ด ์„ค์น˜๋œ ๋งˆ์ผ“ํ”Œ๋ ˆ์ด์Šค. ํƒ€์‚ฌ ๋งˆ์ผ“ํ”Œ๋ ˆ์ด์Šค์˜ ๊ฒฝ์šฐ OTEL_LOG_TOOL_DETAILS=1์ผ ๋•Œ๋งŒ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค

ํ”Œ๋Ÿฌ๊ทธ์ธ ๋กœ๋“œ๋จ ์ด๋ฒคํŠธ

์„ธ์…˜ ์‹œ์ž‘ ์‹œ ํ™œ์„ฑํ™”๋œ ํ”Œ๋Ÿฌ๊ทธ์ธ๋‹น ํ•œ ๋ฒˆ ๊ธฐ๋ก๋ฉ๋‹ˆ๋‹ค. ์ด ์ด๋ฒคํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ”Œ๋ฆฟ ์ „์ฒด์—์„œ ํ™œ์„ฑํ™”๋œ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์ธ๋ฒคํ† ๋ฆฌํ™”ํ•ฉ๋‹ˆ๋‹ค. ์„ค์น˜ ์ž‘์—… ์ž์ฒด๋ฅผ ๊ธฐ๋กํ•˜๋Š” plugin_installed๋ฅผ ๋ณด์™„ํ•ฉ๋‹ˆ๋‹ค.

์ด๋ฒคํŠธ ์ด๋ฆ„: claude_code.plugin_loaded

์†์„ฑ:

  • ๋ชจ๋“  ํ‘œ์ค€ ์†์„ฑ
  • event.name: "plugin_loaded"
  • event.timestamp: ISO 8601 ํƒ€์ž„์Šคํƒฌํ”„
  • event.sequence: ์„ธ์…˜ ๋‚ด ์ด๋ฒคํŠธ ์ˆœ์„œ ์ง€์ •์„ ์œ„ํ•œ ๋‹จ์กฐ ์ฆ๊ฐ€ ์นด์šดํ„ฐ
  • plugin.name: ํ”Œ๋Ÿฌ๊ทธ์ธ์˜ ์ด๋ฆ„. ๊ณต์‹ ๋งˆ์ผ“ํ”Œ๋ ˆ์ด์Šค ๋ฐ ๊ธฐ๋ณธ ์ œ๊ณต ๋ฒˆ๋“ค ์™ธ๋ถ€์˜ ํ”Œ๋Ÿฌ๊ทธ์ธ์˜ ๊ฒฝ์šฐ OTEL_LOG_TOOL_DETAILS=1์ด ์•„๋‹ˆ๋ฉด ๊ฐ’์€ "third-party"์ž…๋‹ˆ๋‹ค
  • marketplace.name: ํ”Œ๋Ÿฌ๊ทธ์ธ์ด ์„ค์น˜๋œ ๋งˆ์ผ“ํ”Œ๋ ˆ์ด์Šค (์•Œ๋ ค์ง„ ๊ฒฝ์šฐ). plugin.name๊ณผ ๋™์ผํ•œ ์กฐ๊ฑด์—์„œ "third-party"๋กœ ์ˆ˜์ •๋ฉ๋‹ˆ๋‹ค
  • plugin.version: ํ”Œ๋Ÿฌ๊ทธ์ธ ๋งค๋‹ˆํŽ˜์ŠคํŠธ์˜ ๋ฒ„์ „. ์ด๋ฆ„์ด ์ˆ˜์ •๋˜์ง€ ์•Š๊ณ  ๋งค๋‹ˆํŽ˜์ŠคํŠธ๊ฐ€ ๋ฒ„์ „์„ ์„ ์–ธํ•  ๋•Œ๋งŒ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค
  • plugin.scope: ํ”Œ๋Ÿฌ๊ทธ์ธ์˜ ์ถœ์ฒ˜ ๋ฒ”์ฃผ: "official", "org", "user-local" ๋˜๋Š” "default-bundle"
  • enabled_via: ํ”Œ๋Ÿฌ๊ทธ์ธ์ด ํ™œ์„ฑํ™”๋œ ๋ฐฉ์‹: "default-enable", "org-policy", "seed-mount" ๋˜๋Š” "user-install"
  • plugin_id_hash: ํ”Œ๋Ÿฌ๊ทธ์ธ ์ด๋ฆ„ ๋ฐ ๋งˆ์ผ“ํ”Œ๋ ˆ์ด์Šค์˜ ๊ฒฐ์ •๋ก ์  ํ•ด์‹œ (๊ตฌ์„ฑ๋œ ๋‚ด๋ณด๋‚ด๊ธฐ๋กœ๋งŒ ์ „์†ก๋จ). ํ”Œ๋ฆฟ ์ „์ฒด์—์„œ ๋กœ๋“œ๋œ ์„œ๋กœ ๋‹ค๋ฅธ ํƒ€์‚ฌ ํ”Œ๋Ÿฌ๊ทธ์ธ ์ˆ˜๋ฅผ ์„ธ๋Š” ๊ฒƒ์„ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค (์ด๋ฆ„ ๊ธฐ๋ก ์—†์ด)
  • has_hooks: ํ”Œ๋Ÿฌ๊ทธ์ธ์ด ํ›…์„ ์ œ๊ณตํ•˜๋Š”์ง€ ์—ฌ๋ถ€
  • has_mcp: ํ”Œ๋Ÿฌ๊ทธ์ธ์ด MCP ์„œ๋ฒ„๋ฅผ ์ œ๊ณตํ•˜๋Š”์ง€ ์—ฌ๋ถ€
  • host_owned_mcp: SDK ํ˜ธ์ŠคํŠธ๊ฐ€ ์ด ํ”Œ๋Ÿฌ๊ทธ์ธ์˜ MCP ์—ฐ๊ฒฐ์„ ๊ด€๋ฆฌํ•˜๊ณ  Claude Code๊ฐ€ ํ”Œ๋Ÿฌ๊ทธ์ธ์˜ MCP ์„œ๋ฒ„ ๊ตฌ์„ฑ ์ฝ๊ธฐ๋ฅผ ๊ฑด๋„ˆ๋›ธ ๋•Œ true, ๊ทธ ์™ธ์—๋Š” false. {/* min-version: 2.1.172 */}Claude Code v2.1.172 ์ด์ƒ ํ•„์š”
  • skill_path_count: ํ”Œ๋Ÿฌ๊ทธ์ธ์ด ์„ ์–ธํ•˜๋Š” ์Šคํ‚ฌ ๋””๋ ‰ํ† ๋ฆฌ ์ˆ˜
  • command_path_count: ํ”Œ๋Ÿฌ๊ทธ์ธ์ด ์„ ์–ธํ•˜๋Š” ๋ช…๋ น ๋””๋ ‰ํ† ๋ฆฌ ์ˆ˜
  • agent_path_count: ํ”Œ๋Ÿฌ๊ทธ์ธ์ด ์„ ์–ธํ•˜๋Š” ์—์ด์ „ํŠธ ๋””๋ ‰ํ† ๋ฆฌ ์ˆ˜
  • safe_mode: ์„ธ์…˜์ด --safe-mode๋กœ ์‹œ์ž‘๋˜์—ˆ์„ ๋•Œ "true", ๊ทธ ์™ธ์—๋Š” "false". ์•ˆ์ „ ๋ชจ๋“œ์—์„œ ์ด ์ด๋ฒคํŠธ๋Š” ๊ตฌ์„ฑ๋œ ์ธ๋ฒคํ† ๋ฆฌ๋งŒ ๋ณด๊ณ ํ•ฉ๋‹ˆ๋‹ค. ํ”Œ๋Ÿฌ๊ทธ์ธ์˜ ๋ช…๋ น, ์Šคํ‚ฌ, ํ›… ๋ฐ MCP ์„œ๋ฒ„๋Š” ๋กœ๋“œ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. {/* min-version: 2.1.169 */}Claude Code v2.1.169 ์ด์ƒ ํ•„์š”

์Šคํ‚ฌ ํ™œ์„ฑํ™”๋จ ์ด๋ฒคํŠธ

์Šคํ‚ฌ์ด ํ˜ธ์ถœ๋  ๋•Œ ๊ธฐ๋ก๋ฉ๋‹ˆ๋‹ค. Claude๊ฐ€ Skill ๋„๊ตฌ๋ฅผ ํ†ตํ•ด ํ˜ธ์ถœํ•˜๋“  / ๋ช…๋ น์œผ๋กœ ์‹คํ–‰ํ•˜๋“  ์ƒ๊ด€์—†์Šต๋‹ˆ๋‹ค.

์ด๋ฒคํŠธ ์ด๋ฆ„: claude_code.skill_activated

์†์„ฑ:

  • ๋ชจ๋“  ํ‘œ์ค€ ์†์„ฑ
  • event.name: "skill_activated"
  • event.timestamp: ISO 8601 ํƒ€์ž„์Šคํƒฌํ”„
  • event.sequence: ์„ธ์…˜ ๋‚ด ์ด๋ฒคํŠธ ์ˆœ์„œ ์ง€์ •์„ ์œ„ํ•œ ๋‹จ์กฐ ์ฆ๊ฐ€ ์นด์šดํ„ฐ
  • skill.name: ์Šคํ‚ฌ์˜ ์ด๋ฆ„. ์‚ฌ์šฉ์ž ์ •์˜ ๋ฐ ํƒ€์‚ฌ ํ”Œ๋Ÿฌ๊ทธ์ธ ์Šคํ‚ฌ์˜ ๊ฒฝ์šฐ OTEL_LOG_TOOL_DETAILS=1์ด ์•„๋‹ˆ๋ฉด ๊ฐ’์€ ์ž๋ฆฌ ํ‘œ์‹œ์ž "custom_skill"์ž…๋‹ˆ๋‹ค
  • invocation_trigger: ์Šคํ‚ฌ์ด ํŠธ๋ฆฌ๊ฑฐ๋œ ๋ฐฉ์‹ ("user-slash", "claude-proactive" ๋˜๋Š” "nested-skill")
  • skill.source: ์Šคํ‚ฌ์ด ๋กœ๋“œ๋œ ์œ„์น˜ (์˜ˆ: "bundled", "userSettings", "projectSettings", "plugin")
  • skill.kind: ์Šคํ‚ฌ์ด ์›Œํฌํ”Œ๋กœ์šฐ ์Šคํ‚ฌ์ผ ๋•Œ "workflow". ๊ทธ ์™ธ์—๋Š” ์—†์Œ
  • plugin.name (OTEL_LOG_TOOL_DETAILS=1์ด๊ฑฐ๋‚˜ ํ”Œ๋Ÿฌ๊ทธ์ธ์ด ๊ณต์‹ ๋งˆ์ผ“ํ”Œ๋ ˆ์ด์Šค์—์„œ ์˜จ ๊ฒฝ์šฐ): ์Šคํ‚ฌ์ด ํ”Œ๋Ÿฌ๊ทธ์ธ์—์„œ ์ œ๊ณต๋  ๋•Œ ์†Œ์œ  ํ”Œ๋Ÿฌ๊ทธ์ธ์˜ ์ด๋ฆ„
  • marketplace.name (OTEL_LOG_TOOL_DETAILS=1์ด๊ฑฐ๋‚˜ ํ”Œ๋Ÿฌ๊ทธ์ธ์ด ๊ณต์‹ ๋งˆ์ผ“ํ”Œ๋ ˆ์ด์Šค์—์„œ ์˜จ ๊ฒฝ์šฐ): ์Šคํ‚ฌ์ด ํ”Œ๋Ÿฌ๊ทธ์ธ์—์„œ ์ œ๊ณต๋  ๋•Œ ์†Œ์œ  ํ”Œ๋Ÿฌ๊ทธ์ธ์ด ์„ค์น˜๋œ ๋งˆ์ผ“ํ”Œ๋ ˆ์ด์Šค

@ ๋ฉ˜์…˜ ์ด๋ฒคํŠธ

Claude Code๊ฐ€ ํ”„๋กฌํ”„ํŠธ์—์„œ @-๋ฉ˜์…˜์„ ํ•ด์„ํ•  ๋•Œ ๊ธฐ๋ก๋ฉ๋‹ˆ๋‹ค. ๋ชจ๋“  ๋ฉ˜์…˜์ด ์ด๋ฒคํŠธ๋ฅผ ๋‚ด๋ณด๋‚ด๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค: ๊ถŒํ•œ ๊ฑฐ๋ถ€, ํŒŒ์ผ ํฌ๊ธฐ ์ดˆ๊ณผ, PDF ์ฐธ์กฐ ์ฒจ๋ถ€, ๋””๋ ‰ํ† ๋ฆฌ ๋ชฉ๋ก ์‹คํŒจ์™€ ๊ฐ™์€ ์กฐ๊ธฐ ์ข…๋ฃŒ ๊ฒฝ๋กœ๋Š” ๋กœ๊น… ์—†์ด ๋ฐ˜ํ™˜๋ฉ๋‹ˆ๋‹ค.

์ด๋ฒคํŠธ ์ด๋ฆ„: claude_code.at_mention

์†์„ฑ:

  • ๋ชจ๋“  ํ‘œ์ค€ ์†์„ฑ
  • event.name: "at_mention"
  • event.timestamp: ISO 8601 ํƒ€์ž„์Šคํƒฌํ”„
  • event.sequence: ์„ธ์…˜ ๋‚ด ์ด๋ฒคํŠธ ์ˆœ์„œ ์ง€์ •์„ ์œ„ํ•œ ๋‹จ์กฐ ์ฆ๊ฐ€ ์นด์šดํ„ฐ
  • mention_type: ๋ฉ˜์…˜์˜ ์œ ํ˜• ("file", "directory", "agent", "mcp_resource")
  • success: ๋ฉ˜์…˜์ด ์„ฑ๊ณต์ ์œผ๋กœ ํ•ด์„๋˜์—ˆ๋Š”์ง€ ์—ฌ๋ถ€ ("true" ๋˜๋Š” "false")

API ์žฌ์‹œ๋„ ์†Œ์ง„๋จ ์ด๋ฒคํŠธ

API ์š”์ฒญ์ด ๋‘ ๋ฒˆ ์ด์ƒ ์‹œ๋„ ํ›„ ์‹คํŒจํ•  ๋•Œ ํ•œ ๋ฒˆ ๊ธฐ๋ก๋ฉ๋‹ˆ๋‹ค. ์ตœ์ข… api_error ์ด๋ฒคํŠธ์™€ ํ•จ๊ป˜ ๋‚ด๋ณด๋‚ด์ง‘๋‹ˆ๋‹ค.

์ด๋ฒคํŠธ ์ด๋ฆ„: claude_code.api_retries_exhausted

์†์„ฑ:

  • ๋ชจ๋“  ํ‘œ์ค€ ์†์„ฑ
  • event.name: "api_retries_exhausted"
  • event.timestamp: ISO 8601 ํƒ€์ž„์Šคํƒฌํ”„
  • event.sequence: ์„ธ์…˜ ๋‚ด ์ด๋ฒคํŠธ ์ˆœ์„œ ์ง€์ •์„ ์œ„ํ•œ ๋‹จ์กฐ ์ฆ๊ฐ€ ์นด์šดํ„ฐ
  • model: ์‚ฌ์šฉ๋œ ๋ชจ๋ธ
  • error: ์ตœ์ข… ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€
  • status_code: HTTP ์ƒํƒœ ์ฝ”๋“œ (์ˆซ์ž). HTTP๊ฐ€ ์•„๋‹Œ ์˜ค๋ฅ˜์˜ ๊ฒฝ์šฐ ์—†์Œ
  • total_attempts: ์ˆ˜ํ–‰๋œ ์ด ์‹œ๋„ ํšŸ์ˆ˜
  • total_retry_duration_ms: ๋ชจ๋“  ์‹œ๋„์— ๊ฑธ์นœ ์ด ๋ฒฝ์‹œ๊ณ„ ์‹œ๊ฐ„
  • speed: "fast" ๋˜๋Š” "normal"

ํ›… ๋“ฑ๋ก๋จ ์ด๋ฒคํŠธ

์„ธ์…˜ ์‹œ์ž‘ ์‹œ ๊ตฌ์„ฑ๋œ ํ›…๋‹น ํ•œ ๋ฒˆ ๊ธฐ๋ก๋ฉ๋‹ˆ๋‹ค. ์ด ์ด๋ฒคํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ”Œ๋ฆฟ ์ „์ฒด์—์„œ ํ™œ์„ฑํ™”๋œ ํ›…์„ ์ธ๋ฒคํ† ๋ฆฌํ™”ํ•ฉ๋‹ˆ๋‹ค. ์‹คํ–‰๋ณ„ hook_execution_start ๋ฐ hook_execution_complete ์ด๋ฒคํŠธ๋ฅผ ๋ณด์™„ํ•ฉ๋‹ˆ๋‹ค.

์ด๋ฒคํŠธ ์ด๋ฆ„: claude_code.hook_registered

์†์„ฑ:

  • ๋ชจ๋“  ํ‘œ์ค€ ์†์„ฑ
  • event.name: "hook_registered"
  • event.timestamp: ISO 8601 ํƒ€์ž„์Šคํƒฌํ”„
  • event.sequence: ์„ธ์…˜ ๋‚ด ์ด๋ฒคํŠธ ์ˆœ์„œ ์ง€์ •์„ ์œ„ํ•œ ๋‹จ์กฐ ์ฆ๊ฐ€ ์นด์šดํ„ฐ
  • hook_event: ํ›… ์ด๋ฒคํŠธ ์œ ํ˜•, ์˜ˆ: "PreToolUse" ๋˜๋Š” "PostToolUse"
  • hook_type: ํ›… ๊ตฌํ˜„ ์œ ํ˜•: "command", "prompt", "mcp_tool", "http" ๋˜๋Š” "agent"
  • hook_source: ํ›…์ด ์ •์˜๋œ ์œ„์น˜: "userSettings", "projectSettings", "localSettings", "flagSettings", "policySettings" ๋˜๋Š” "pluginHook"
  • safe_mode: ์„ธ์…˜์ด --safe-mode๋กœ ์‹œ์ž‘๋˜์—ˆ์„ ๋•Œ "true", ๊ทธ ์™ธ์—๋Š” "false". {/* min-version: 2.1.169 */}Claude Code v2.1.169 ์ด์ƒ ํ•„์š”
  • hook_matcher (OTEL_LOG_TOOL_DETAILS=1์ผ ๋•Œ): ์„ค์ •๋œ ๊ฒฝ์šฐ ํ›… ๊ตฌ์„ฑ์˜ ๋งค์ฒ˜ ๋ฌธ์ž์—ด
  • plugin.name (hook_source๊ฐ€ "pluginHook"์ผ ๋•Œ): ๊ธฐ์—ฌํ•˜๋Š” ํ”Œ๋Ÿฌ๊ทธ์ธ์˜ ์ด๋ฆ„. ๊ณต์‹ ๋งˆ์ผ“ํ”Œ๋ ˆ์ด์Šค ๋ฐ ๊ธฐ๋ณธ ์ œ๊ณต ๋ฒˆ๋“ค ์™ธ๋ถ€์˜ ํ”Œ๋Ÿฌ๊ทธ์ธ์˜ ๊ฒฝ์šฐ OTEL_LOG_TOOL_DETAILS=1์ด ์•„๋‹ˆ๋ฉด ๊ฐ’์€ "third-party"์ž…๋‹ˆ๋‹ค
  • plugin_id_hash (hook_source๊ฐ€ "pluginHook"์ผ ๋•Œ): ํ”Œ๋Ÿฌ๊ทธ์ธ ์ด๋ฆ„ ๋ฐ ๋งˆ์ผ“ํ”Œ๋ ˆ์ด์Šค์˜ ๊ฒฐ์ •๋ก ์  ํ•ด์‹œ (๊ตฌ์„ฑ๋œ ๋‚ด๋ณด๋‚ด๊ธฐ๋กœ๋งŒ ์ „์†ก๋จ). ์ด๋ฆ„์„ ๊ธฐ๋กํ•˜์ง€ ์•Š๊ณ  ๊ธฐ์—ฌํ•˜๋Š” ์„œ๋กœ ๋‹ค๋ฅธ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์„ธ๋Š” ๊ฒƒ์„ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค

ํ›… ์‹คํ–‰ ์‹œ์ž‘ ์ด๋ฒคํŠธ

ํ•˜๋‚˜ ์ด์ƒ์˜ ํ›…์ด ํ›… ์ด๋ฒคํŠธ์— ๋Œ€ํ•ด ์‹คํ–‰์„ ์‹œ์ž‘ํ•  ๋•Œ ๊ธฐ๋ก๋ฉ๋‹ˆ๋‹ค.

์ด๋ฒคํŠธ ์ด๋ฆ„: claude_code.hook_execution_start

์†์„ฑ:

  • ๋ชจ๋“  ํ‘œ์ค€ ์†์„ฑ
  • event.name: "hook_execution_start"
  • event.timestamp: ISO 8601 ํƒ€์ž„์Šคํƒฌํ”„
  • event.sequence: ์„ธ์…˜ ๋‚ด ์ด๋ฒคํŠธ ์ˆœ์„œ ์ง€์ •์„ ์œ„ํ•œ ๋‹จ์กฐ ์ฆ๊ฐ€ ์นด์šดํ„ฐ
  • hook_event: ํ›… ์ด๋ฒคํŠธ ์œ ํ˜•, ์˜ˆ: "PreToolUse" ๋˜๋Š” "PostToolUse"
  • hook_name: ๋งค์ฒ˜๋ฅผ ํฌํ•จํ•œ ์ „์ฒด ํ›… ์ด๋ฆ„, ์˜ˆ: "PreToolUse:Write"
  • num_hooks: ์ผ์น˜ํ•˜๋Š” ํ›… ๋ช…๋ น ์ˆ˜
  • managed_only: ๊ด€๋ฆฌ ์ •์ฑ… ํ›…๋งŒ ํ—ˆ์šฉ๋  ๋•Œ "true"
  • hook_source: "policySettings" ๋˜๋Š” "merged"
  • safe_mode: ์„ธ์…˜์ด --safe-mode๋กœ ์‹œ์ž‘๋˜์—ˆ์„ ๋•Œ "true", ๊ทธ ์™ธ์—๋Š” "false". {/* min-version: 2.1.169 */}Claude Code v2.1.169 ์ด์ƒ ํ•„์š”
  • hook_definitions: JSON ์ง๋ ฌํ™”๋œ ํ›… ๊ตฌ์„ฑ. ์ƒ์„ธ ๋ฒ ํƒ€ ์ถ”์ ๊ณผ OTEL_LOG_TOOL_DETAILS=1์ด ๋ชจ๋‘ ํ™œ์„ฑํ™”๋˜์–ด ์žˆ์„ ๋•Œ๋งŒ ํฌํ•จ๋จ

ํ›… ์‹คํ–‰ ์™„๋ฃŒ ์ด๋ฒคํŠธ

ํ›… ์ด๋ฒคํŠธ์˜ ๋ชจ๋“  ํ›…์ด ์™„๋ฃŒ๋˜์—ˆ์„ ๋•Œ ๊ธฐ๋ก๋ฉ๋‹ˆ๋‹ค.

์ด๋ฒคํŠธ ์ด๋ฆ„: claude_code.hook_execution_complete

์†์„ฑ:

  • ๋ชจ๋“  ํ‘œ์ค€ ์†์„ฑ
  • event.name: "hook_execution_complete"
  • event.timestamp: ISO 8601 ํƒ€์ž„์Šคํƒฌํ”„
  • event.sequence: ์„ธ์…˜ ๋‚ด ์ด๋ฒคํŠธ ์ˆœ์„œ ์ง€์ •์„ ์œ„ํ•œ ๋‹จ์กฐ ์ฆ๊ฐ€ ์นด์šดํ„ฐ
  • hook_event: ํ›… ์ด๋ฒคํŠธ ์œ ํ˜•
  • hook_name: ๋งค์ฒ˜๋ฅผ ํฌํ•จํ•œ ์ „์ฒด ํ›… ์ด๋ฆ„
  • num_hooks: ์ผ์น˜ํ•˜๋Š” ํ›… ๋ช…๋ น ์ˆ˜
  • num_success: ์„ฑ๊ณต์ ์œผ๋กœ ์™„๋ฃŒ๋œ ์ˆ˜
  • num_blocking: ์ฐจ๋‹จ ๊ฒฐ์ •์„ ๋ฐ˜ํ™˜ํ•œ ์ˆ˜
  • num_non_blocking_error: ์ฐจ๋‹จ ์—†์ด ์‹คํŒจํ•œ ์ˆ˜
  • num_cancelled: ์™„๋ฃŒ ์ „์— ์ทจ์†Œ๋œ ์ˆ˜
  • total_duration_ms: ๋ชจ๋“  ์ผ์น˜ํ•˜๋Š” ํ›…์˜ ๋ฒฝ์‹œ๊ณ„ ์ง€์† ์‹œ๊ฐ„
  • managed_only: ๊ด€๋ฆฌ ์ •์ฑ… ํ›…๋งŒ ํ—ˆ์šฉ๋  ๋•Œ "true"
  • hook_source: "policySettings" ๋˜๋Š” "merged"
  • safe_mode: ์„ธ์…˜์ด --safe-mode๋กœ ์‹œ์ž‘๋˜์—ˆ์„ ๋•Œ "true", ๊ทธ ์™ธ์—๋Š” "false". {/* min-version: 2.1.169 */}Claude Code v2.1.169 ์ด์ƒ ํ•„์š”
  • hook_definitions: JSON ์ง๋ ฌํ™”๋œ ํ›… ๊ตฌ์„ฑ. ์ƒ์„ธ ๋ฒ ํƒ€ ์ถ”์ ๊ณผ OTEL_LOG_TOOL_DETAILS=1์ด ๋ชจ๋‘ ํ™œ์„ฑํ™”๋˜์–ด ์žˆ์„ ๋•Œ๋งŒ ํฌํ•จ๋จ

ํ›… ํ”Œ๋Ÿฌ๊ทธ์ธ ๋ฉ”ํŠธ๋ฆญ ์ด๋ฒคํŠธ

๊ณต์‹ ๋งˆ์ผ“ํ”Œ๋ ˆ์ด์Šค ํ”Œ๋Ÿฌ๊ทธ์ธ ํ›…์ด ํ˜ธ์ถœ๋ณ„ ๋ฉ”ํŠธ๋ฆญ์„ ๋‚ด๋ณด๋‚ผ ๋•Œ ๊ธฐ๋ก๋ฉ๋‹ˆ๋‹ค. ๊ณต์‹ Anthropic ๋งˆ์ผ“ํ”Œ๋ ˆ์ด์Šค์—์„œ ์„ค์น˜๋œ ํ”Œ๋Ÿฌ๊ทธ์ธ๋งŒ ์ด๋ฅผ ๋‚ด๋ณด๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํƒ€์‚ฌ ๋งˆ์ผ“ํ”Œ๋ ˆ์ด์Šค ํ”Œ๋Ÿฌ๊ทธ์ธ ๋ฐ ์‚ฌ์šฉ์ž ๊ตฌ์„ฑ ํ›…์€ ์ด ์ด๋ฒคํŠธ๋กœ ๋‚ด๋ณด๋‚ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด ์ด๋ฒคํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ”Œ๋Ÿฌ๊ทธ์ธ ๋™์ž‘ (์˜ˆ: ์ฐพ๊ธฐ ๋น„์œจ, ๋น„์šฉ, ์ง€์† ์‹œ๊ฐ„)์„ ์ž์‹ ์˜ ๊ด€์ฐฐ์„ฑ ์Šคํƒ์—์„œ ๋ชจ๋‹ˆํ„ฐ๋งํ•ฉ๋‹ˆ๋‹ค.

์ด๋ฒคํŠธ ์ด๋ฆ„: claude_code.hook_plugin_metrics

์†์„ฑ:

  • ๋ชจ๋“  ํ‘œ์ค€ ์†์„ฑ
  • event.name: "hook_plugin_metrics"
  • event.timestamp: ISO 8601 ํƒ€์ž„์Šคํƒฌํ”„
  • event.sequence: ์„ธ์…˜ ๋‚ด ์ด๋ฒคํŠธ ์ˆœ์„œ ์ง€์ •์„ ์œ„ํ•œ ๋‹จ์กฐ ์ฆ๊ฐ€ ์นด์šดํ„ฐ
  • plugin_id: <name>@<marketplace> ํ˜•์‹์˜ ํ”Œ๋Ÿฌ๊ทธ์ธ ์‹๋ณ„์ž
  • hook_event: ๋ฉ”ํŠธ๋ฆญ์„ ๋‚ด๋ณด๋‚ธ ํ›… ์ด๋ฒคํŠธ ์œ ํ˜•
  • ์ตœ๋Œ€ 20๊ฐœ์˜ ํ”Œ๋Ÿฌ๊ทธ์ธ ๋‚ด๋ณด๋‚ธ ๋ฉ”ํŠธ๋ฆญ ํ‚ค. ์ด๋ฆ„์€ ^[a-z][a-z0-9_]{0,39}$์™€ ์ผ์น˜ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ’์€ ๋ถ€์šธ ๋˜๋Š” ์ˆซ์ž์ž…๋‹ˆ๋‹ค.

์••์ถ• ์ด๋ฒคํŠธ

๋Œ€ํ™” ์••์ถ•์ด ์™„๋ฃŒ๋  ๋•Œ ๊ธฐ๋ก๋ฉ๋‹ˆ๋‹ค.

์ด๋ฒคํŠธ ์ด๋ฆ„: claude_code.compaction

์†์„ฑ:

  • ๋ชจ๋“  ํ‘œ์ค€ ์†์„ฑ
  • event.name: "compaction"
  • event.timestamp: ISO 8601 ํƒ€์ž„์Šคํƒฌํ”„
  • event.sequence: ์„ธ์…˜ ๋‚ด ์ด๋ฒคํŠธ ์ˆœ์„œ ์ง€์ •์„ ์œ„ํ•œ ๋‹จ์กฐ ์ฆ๊ฐ€ ์นด์šดํ„ฐ
  • trigger: "auto" ๋˜๋Š” "manual"
  • success: "true" ๋˜๋Š” "false"
  • duration_ms: ์••์ถ• ์ง€์† ์‹œ๊ฐ„
  • pre_tokens: ์••์ถ• ์ „ ๋Œ€๋žต์ ์ธ ํ† ํฐ ์ˆ˜
  • post_tokens: ์••์ถ• ํ›„ ๋Œ€๋žต์ ์ธ ํ† ํฐ ์ˆ˜
  • error: ์••์ถ•์ด ์‹คํŒจํ–ˆ์„ ๋•Œ ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€
  • precompute_reuse: trigger๊ฐ€ "manual"์ผ ๋•Œ๋งŒ ์„ค์ •๋ฉ๋‹ˆ๋‹ค. ์ž๋™ ์••์ถ•์€ ์ปจํ…์ŠคํŠธ ์œˆ๋„์šฐ๊ฐ€ ๊ฐ€๋“ ์ฐจ๊ธฐ ์ „์— ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ์š”์•ฝ์„ ์ค€๋น„ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ด ์†์„ฑ์€ /compact๊ฐ€ ํ•ด๋‹น ์ค€๋น„๋œ ์š”์•ฝ์„ ์žฌ์‚ฌ์šฉํ–ˆ๋Š”์ง€ ๊ธฐ๋กํ•ฉ๋‹ˆ๋‹ค. "hit"์€ ์žฌ์‚ฌ์šฉ๋˜์—ˆ์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. "miss_custom_instructions", "miss_hook" ๋ฐ "miss_not_ready"๋Š” ๋Œ€์‹  ์ƒˆ๋กœ์šด ์š”์•ฝ์ด ๊ณ„์‚ฐ๋œ ์ด์œ ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. {/* min-version: 2.1.153 */}Claude Code v2.1.153 ์ด์ƒ ํ•„์š”

ํ”ผ๋“œ๋ฐฑ ์„ค๋ฌธ ์ด๋ฒคํŠธ

์„ธ์…˜ ํ’ˆ์งˆ ์„ค๋ฌธ์ด ํ‘œ์‹œ๋˜๊ฑฐ๋‚˜ ๋‹ต๋ณ€๋  ๋•Œ ๊ธฐ๋ก๋ฉ๋‹ˆ๋‹ค. ์„ธ์…˜ ํ’ˆ์งˆ ์„ค๋ฌธ์„ ์ฐธ์กฐํ•˜์—ฌ ์„ค๋ฌธ์ด ์ˆ˜์ง‘ํ•˜๋Š” ๋‚ด์šฉ๊ณผ ์ œ์–ด ๋ฐฉ๋ฒ•์„ ํ™•์ธํ•˜์„ธ์š”.

์ด๋ฒคํŠธ ์ด๋ฆ„: claude_code.feedback_survey

์†์„ฑ:

  • ๋ชจ๋“  ํ‘œ์ค€ ์†์„ฑ
  • event.name: "feedback_survey"
  • event.timestamp: ISO 8601 ํƒ€์ž„์Šคํƒฌํ”„
  • event.sequence: ์„ธ์…˜ ๋‚ด ์ด๋ฒคํŠธ ์ˆœ์„œ ์ง€์ •์„ ์œ„ํ•œ ๋‹จ์กฐ ์ฆ๊ฐ€ ์นด์šดํ„ฐ
  • event_type: ์„ค๋ฌธ ์ˆ˜๋ช… ์ฃผ๊ธฐ ์ด๋ฒคํŠธ, ์˜ˆ: "appeared", "responded" ๋˜๋Š” "transcript_prompt_appeared"
  • appearance_id: ํ•˜๋‚˜์˜ ์„ค๋ฌธ ์ธ์Šคํ„ด์Šค์— ๋Œ€ํ•ด ๋‚ด๋ณด๋‚ด์ง„ ์ด๋ฒคํŠธ๋ฅผ ์—ฐ๊ฒฐํ•˜๋Š” ๊ณ ์œ  ID
  • survey_type: ์ด๋ฒคํŠธ๋ฅผ ์ƒ์„ฑํ•œ ์„ค๋ฌธ. "session"์€ "Claude๊ฐ€ ์–ด๋–ป๊ฒŒ ํ•˜๊ณ  ์žˆ๋‚˜์š”?" ํ‰๊ฐ€ ํ”„๋กฌํ”„ํŠธ์ž…๋‹ˆ๋‹ค
  • response: responded ์ด๋ฒคํŠธ์—์„œ ์‚ฌ์šฉ์ž์˜ ์„ ํƒ
  • enabled_via_override: CLAUDE_CODE_ENABLE_FEEDBACK_SURVEY_FOR_OTEL์ด ์„ค์ •๋˜์–ด ์žˆ์„ ๋•Œ true. ๋ฌธ์ž์—ด์ด ์•„๋‹Œ ๋ถ€์šธ๋กœ ๋‚ด๋ณด๋‚ด์ง‘๋‹ˆ๋‹ค. session ์„ค๋ฌธ ์ด๋ฒคํŠธ์— ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ์ด ์†์„ฑ์„ ํ•„ํ„ฐ๋งํ•˜์—ฌ ํ”Œ๋ฆฟ ์ „์ฒด์—์„œ ์žฌ์ •์˜๊ฐ€ ์ ์šฉ๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค

๋ฉ”ํŠธ๋ฆญ ๋ฐ ์ด๋ฒคํŠธ ๋ฐ์ดํ„ฐ ํ•ด์„

๋‚ด๋ณด๋‚ธ ๋ฉ”ํŠธ๋ฆญ ๋ฐ ์ด๋ฒคํŠธ๋Š” ๋‹ค์–‘ํ•œ ๋ถ„์„์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค:

์‚ฌ์šฉ ๋ชจ๋‹ˆํ„ฐ๋ง

๋ฉ”ํŠธ๋ฆญ ๋ถ„์„ ๊ธฐํšŒ
claude_code.token.usage type (์ž…๋ ฅ/์ถœ๋ ฅ), ์‚ฌ์šฉ์ž, ํŒ€, ๋ชจ๋ธ, skill.name, plugin.name ๋˜๋Š” agent.name๋ณ„๋กœ ๋ถ„๋ฅ˜
claude_code.session.count ์‹œ๊ฐ„ ๊ฒฝ๊ณผ์— ๋”ฐ๋ฅธ ์ฑ„ํƒ ๋ฐ ์ฐธ์—ฌ ์ถ”์ 
claude_code.lines_of_code.count ์ฝ”๋“œ ์ถ”๊ฐ€ ๋ฐ ์ œ๊ฑฐ๋ฅผ ์ถ”์ ํ•˜์—ฌ ์ƒ์‚ฐ์„ฑ ์ธก์ •, ๋ชจ๋ธ๋ณ„๋กœ ๋ถ„๋ฅ˜
claude_code.commit.count & claude_code.pull_request.count ๊ฐœ๋ฐœ ์›Œํฌํ”Œ๋กœ์šฐ์— ๋ฏธ์น˜๋Š” ์˜ํ–ฅ ์ดํ•ด

๋น„์šฉ ๋ชจ๋‹ˆํ„ฐ๋ง

claude_code.cost.usage ๋ฉ”ํŠธ๋ฆญ์€ ๋‹ค์Œ์— ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค:

  • ํŒ€ ๋˜๋Š” ๊ฐœ์ธ ์ „์ฒด์˜ ์‚ฌ์šฉ ์ถ”์„ธ ์ถ”์ 
  • ์ตœ์ ํ™”๋ฅผ ์œ„ํ•œ ๋†’์€ ์‚ฌ์šฉ ์„ธ์…˜ ์‹๋ณ„
  • skill.name, plugin.name ๋ฐ agent.name ์†์„ฑ์„ ํ†ตํ•ด ํŠน์ • ์Šคํ‚ฌ, ํ”Œ๋Ÿฌ๊ทธ์ธ ๋˜๋Š” ์„œ๋ธŒ์—์ด์ „ํŠธ ์œ ํ˜•์— ์ง€์ถœ ๊ท€์†

๊ฒฝ๊ณ  ๋ฐ ์„ธ๋ถ„ํ™”

์ผ๋ฐ˜์ ์ธ ๊ฒฝ๊ณ  ๊ณ ๋ ค ์‚ฌํ•ญ:

  • ๋น„์šฉ ๊ธ‰์ฆ
  • ๋น„์ •์ƒ์ ์ธ ํ† ํฐ ์†Œ๋น„
  • ํŠน์ • ์‚ฌ์šฉ์ž์˜ ๋†’์€ ์„ธ์…˜ ๋ณผ๋ฅจ

๋ชจ๋“  ๋ฉ”ํŠธ๋ฆญ์€ ํ‘œ์ค€ ์†์„ฑ์œผ๋กœ ์„ธ๋ถ„ํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. model ์†์„ฑ์€ claude_code.token.usage, claude_code.cost.usage์—์„œ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋ฉฐ, v2.1.172๋ถ€ํ„ฐ claude_code.lines_of_code.count์—์„œ๋„ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ์ปค๋ฐ‹์˜ ๋ชจ๋ธ๋ณ„ ๋ถ„๋ฅ˜๋Š” ํ•œ ์„ธ์…˜์ด ์—ฌ๋Ÿฌ ๋ชจ๋ธ์— ๊ฑธ์ณ ์žˆ์„ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ session.id์—์„œ ํ† ํฐ ๋˜๋Š” ๋น„์šฉ ๋ฉ”ํŠธ๋ฆญ์— ๋Œ€ํ•ด ์กฐ์ธํ•˜์—ฌ๋งŒ ๊ทผ์‚ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ† ํฐ ๋˜๋Š” ๋น„์šฉ ์ธก๋ฉด์„ query_source๊ฐ€ "main"์ธ ํ–‰์œผ๋กœ ํ•„ํ„ฐ๋งํ•˜์—ฌ ๋ณด์กฐ ๋ฐ ์„œ๋ธŒ์—์ด์ „ํŠธ ์š”์ฒญ์ด ์„ธ์…˜์˜ ์ปค๋ฐ‹์„ ํ•ด๋‹น ์š”์ฒญ์„ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š์€ ๋ชจ๋ธ์— ๊ท€์†์‹œํ‚ค์ง€ ์•Š๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

์žฌ์‹œ๋„ ์†Œ์ง„ ๊ฐ์ง€

Claude Code๋Š” ์‹คํŒจํ•œ API ์š”์ฒญ์„ ๋‚ด๋ถ€์ ์œผ๋กœ ์žฌ์‹œ๋„ํ•˜๊ณ  ํฌ๊ธฐํ•œ ํ›„์—๋งŒ ๋‹จ์ผ claude_code.api_error ์ด๋ฒคํŠธ๋ฅผ ๋‚ด๋ณด๋‚ด๋ฏ€๋กœ ์ด๋ฒคํŠธ ์ž์ฒด๊ฐ€ ํ•ด๋‹น ์š”์ฒญ์˜ ์ตœ์ข… ์‹ ํ˜ธ์ž…๋‹ˆ๋‹ค. ์ค‘๊ฐ„ ์žฌ์‹œ๋„ ์‹œ๋„๋Š” ๋ณ„๋„์˜ ์ด๋ฒคํŠธ๋กœ ๊ธฐ๋ก๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ด๋ฒคํŠธ์˜ attempt ์†์„ฑ์€ ์ด ์‹œ๋„ ํšŸ์ˆ˜๋ฅผ ๊ธฐ๋กํ•ฉ๋‹ˆ๋‹ค. CLAUDE_CODE_MAX_RETRIES๋Š” ๊ธฐ๋ณธ๊ฐ’์ด 10์ด๊ณ  ์ตœ๋Œ€ 15์ž…๋‹ˆ๋‹ค. ์š”์ฒญ์ด ์ผ์‹œ์  ์˜ค๋ฅ˜์— ๋Œ€ํ•œ ๋ชจ๋“  ์žฌ์‹œ๋„๋ฅผ ์†Œ์ง„ํ•˜๋ฉด attempt๋Š” ํ•ด๋‹น ์œ ํšจ ์ œํ•œ๋ณด๋‹ค ํ•˜๋‚˜ ๋งŽ์Šต๋‹ˆ๋‹ค: ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ๋Š” 11์ด๊ณ  16์„ ์ดˆ๊ณผํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋” ๋‚ฎ์€ ๊ฐ’์€ 400 ์‘๋‹ต๊ณผ ๊ฐ™์€ ์žฌ์‹œ๋„ ๋ถˆ๊ฐ€๋Šฅํ•œ ์˜ค๋ฅ˜๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.

๋ณต๊ตฌ๋œ ์„ธ์…˜๊ณผ ์ •์ฒด๋œ ์„ธ์…˜์„ ๊ตฌ๋ถ„ํ•˜๋ ค๋ฉด session.id๋กœ ์ด๋ฒคํŠธ๋ฅผ ๊ทธ๋ฃนํ™”ํ•˜๊ณ  ์˜ค๋ฅ˜ ํ›„ ๋‚˜์ค‘์— api_request ์ด๋ฒคํŠธ๊ฐ€ ์กด์žฌํ•˜๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

์ด๋ฒคํŠธ ๋ถ„์„

์ด๋ฒคํŠธ ๋ฐ์ดํ„ฐ๋Š” Claude Code ์ƒํ˜ธ ์ž‘์šฉ์— ๋Œ€ํ•œ ์ž์„ธํ•œ ํ†ต์ฐฐ๋ ฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค:

๋„๊ตฌ ์‚ฌ์šฉ ํŒจํ„ด: ๋„๊ตฌ ๊ฒฐ๊ณผ ์ด๋ฒคํŠธ๋ฅผ ๋ถ„์„ํ•˜์—ฌ ๋‹ค์Œ์„ ์‹๋ณ„ํ•ฉ๋‹ˆ๋‹ค:

  • ๊ฐ€์žฅ ์ž์ฃผ ์‚ฌ์šฉ๋˜๋Š” ๋„๊ตฌ
  • ๋„๊ตฌ ์„ฑ๊ณต๋ฅ 
  • ํ‰๊ท  ๋„๊ตฌ ์‹คํ–‰ ์‹œ๊ฐ„
  • ๋„๊ตฌ ์œ ํ˜•๋ณ„ ์˜ค๋ฅ˜ ํŒจํ„ด

์„ฑ๋Šฅ ๋ชจ๋‹ˆํ„ฐ๋ง: API ์š”์ฒญ ์ง€์† ์‹œ๊ฐ„ ๋ฐ ๋„๊ตฌ ์‹คํ–‰ ์‹œ๊ฐ„์„ ์ถ”์ ํ•˜์—ฌ ์„ฑ๋Šฅ ๋ณ‘๋ชฉ ํ˜„์ƒ์„ ์‹๋ณ„ํ•ฉ๋‹ˆ๋‹ค.

๊ฐ์‚ฌ ๋ณด์•ˆ ์ด๋ฒคํŠธ

OpenTelemetry ์ด๋ฒคํŠธ๋Š” Claude Code ํ™œ๋™์˜ ๊ฐ์‚ฌ ๋ฐ์ดํ„ฐ ์†Œ์Šค์ž…๋‹ˆ๋‹ค. ๋ชจ๋“  ์ด๋ฒคํŠธ๋Š” ๋„๊ตฌ ํ˜ธ์ถœ, MCP ํ™œ๋™ ๋ฐ ๊ถŒํ•œ ๊ฒฐ์ •์„ ํ•ด๋‹น ์ด๋ฒคํŠธ๋ฅผ ํŠธ๋ฆฌ๊ฑฐํ•œ ์‚ฌ์šฉ์ž์—๊ฒŒ ์—ฐ๊ฒฐํ•˜๋Š” ID ์†์„ฑ์„ ์ „๋‹ฌํ•˜๋ฉฐ, OTLP ๋กœ๊ทธ ๋‚ด๋ณด๋‚ด๊ธฐ๋Š” ์ด๋Ÿฌํ•œ ์ด๋ฒคํŠธ๋ฅผ OTLP ์ˆ˜์‹ ๊ธฐ๊ฐ€ ์žˆ๋Š” ๋ชจ๋“  SIEM(Security Information and Event Management) ํ”Œ๋žซํผ ๋˜๋Š” SIEM์œผ๋กœ ์ „๋‹ฌํ•˜๋Š” OpenTelemetry Collector์— ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์†์„ฑ ์ž‘์—…์„ ์‚ฌ์šฉ์ž์—๊ฒŒ ์—ฐ๊ฒฐ

๊ฐ ์ด๋ฒคํŠธ์˜ ํ‘œ์ค€ ์†์„ฑ์—๋Š” ์ธ์ฆ๋œ ์‚ฌ์šฉ์ž์˜ ID๊ฐ€ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค: Claude ๊ณ„์ •์œผ๋กœ ๋กœ๊ทธ์ธํ•  ๋•Œ user.email, user.account_uuid, user.account_id ๋ฐ organization.id, ๊ทธ๋ฆฌ๊ณ  ์„ค์น˜ ๋ฒ”์œ„ user.id ๋ฐ ์„ธ์…˜๋ณ„ session.id. user.id๋Š” ์„ค์น˜ ๋ฒ”์œ„ ์‹๋ณ„์ž์ด๋ฉฐ, Claude ์•ฑ ๊ฒŒ์ดํŠธ์›จ์ด ์„ธ์…˜์—์„œ๋Š” ๊ฒŒ์ดํŠธ์›จ์ด ๋ฐœ๊ธ‰ ํ† ํฐ์˜ IdP ์ฃผ์ฒด์ž…๋‹ˆ๋‹ค.

MCP ๋„๊ตฌ ํ˜ธ์ถœ, Bash ๋ช…๋ น ๋ฐ ํŒŒ์ผ ํŽธ์ง‘์€ ๋”ฐ๋ผ์„œ ์„ธ์…˜์„ ์‹œ์ž‘ํ•œ ๊ฐœ๋ฐœ์ž์—๊ฒŒ ๊ท€์†๋ฉ๋‹ˆ๋‹ค. Claude Code๋Š” ๋ณ„๋„์˜ ์„œ๋น„์Šค ๊ณ„์ •์œผ๋กœ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ฐ ์ด๋ฒคํŠธ์— ๊ธฐ๋ก๋œ ID๋Š” ๊ฐœ๋ฐœ์ž ์ž์‹ ์˜ Claude ๊ณ„์ •์ด๊ฑฐ๋‚˜ Claude ์•ฑ ๊ฒŒ์ดํŠธ์›จ์ด ์„ธ์…˜์˜ ๊ฐœ๋ฐœ์ž IdP ์‹ ์›์ž…๋‹ˆ๋‹ค.

Claude Code๊ฐ€ ์ง์ ‘ API ํ‚ค๋กœ ์ธ์ฆํ•˜๊ฑฐ๋‚˜ Bedrock, Vertex AI ๋˜๋Š” Microsoft Foundry์— ๋Œ€ํ•ด ์ธ์ฆํ•  ๋•Œ ์„ธ์…˜์— Claude ๊ณ„์ •์ด ์—†์œผ๋ฉฐ user.id ๋ฐ session.id๋งŒ ์ฑ„์›Œ์ง‘๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋ฐฐํฌ์—์„œ๋Š” OTEL_RESOURCE_ATTRIBUTES๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์‚ฌ์šฉ์ž ID๋ฅผ ์ง์ ‘ ์ฒจ๋ถ€ํ•˜๊ณ , ๊ด€๋ฆฌ ์„ค์ • ํŒŒ์ผ ๋˜๋Š” ์‹œ์ž‘ ๋ž˜ํผ๋ฅผ ํ†ตํ•ด ์‚ฌ์šฉ์ž๋ณ„๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. Claude ์•ฑ ๊ฒŒ์ดํŠธ์›จ์ด ์„ธ์…˜์€ ์ด ์ค‘ ์–ด๋А ๊ฒƒ๋„ ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค: CLI๋Š” ํ‘œ์ค€ ์†์„ฑ์— ์„ค๋ช…๋œ ๋Œ€๋กœ IdP ์‹ ์›์„ ์ž๋™์œผ๋กœ ์Šคํƒฌํ”„ํ•ฉ๋‹ˆ๋‹ค.

export OTEL_RESOURCE_ATTRIBUTES="enduser.id=jdoe@example.com,enduser.directory_id=S-1-5-21-..."

MCP ํ™œ๋™ ๊ฐ์‚ฌ

์ „์ฒด ํ˜ธ์ถœ ์„ธ๋ถ€ ์ •๋ณด๋กœ MCP ์„œ๋ฒ„ ํ™œ๋™์„ ์บก์ฒ˜ํ•˜๋ ค๋ฉด ๋กœ๊ทธ ๋‚ด๋ณด๋‚ด๊ธฐ๋ฅผ ํ™œ์„ฑํ™”ํ•˜๊ณ  OTEL_LOG_TOOL_DETAILS=1์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ MCP ์ž‘์—…์€ ํ‘œ์ค€ ID ์†์„ฑ๊ณผ ํ•จ๊ป˜ ์„œ๋ฒ„ ์ด๋ฆ„, ๋„๊ตฌ ์ด๋ฆ„ ๋ฐ ํ˜ธ์ถœ ์ธ์ˆ˜๋ฅผ ์ „๋‹ฌํ•˜๋Š” ๊ตฌ์กฐํ™”๋œ ์ด๋ฒคํŠธ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค:

์ด๋ฒคํŠธ MCP์— ๋Œ€ํ•ด ๊ธฐ๋กํ•˜๋Š” ๊ฒƒ
mcp_server_connection ์„œ๋ฒ„ ์—ฐ๊ฒฐ, ์—ฐ๊ฒฐ ํ•ด์ œ ๋ฐ ์—ฐ๊ฒฐ ์‹คํŒจ (server_name, transport_type, server_scope ๋ฐ ์˜ค๋ฅ˜ ์„ธ๋ถ€ ์ •๋ณด ํฌํ•จ)
tool_result ๊ฐ MCP ๋„๊ตฌ ํ˜ธ์ถœ (tool_name ๋ฐ mcp_server_scope ํฌํ•จ, mcp_server_name ๋ฐ mcp_tool_name์„ ํฌํ•จํ•˜๋Š” tool_parameters ํŽ˜์ด๋กœ๋“œ, ํ˜ธ์ถœ ์ธ์ˆ˜๋ฅผ ํฌํ•จํ•˜๋Š” tool_input ํŽ˜์ด๋กœ๋“œ)
tool_decision ํ˜ธ์ถœ์ด ํ—ˆ์šฉ๋˜์—ˆ๋Š”์ง€ ๊ฑฐ๋ถ€๋˜์—ˆ๋Š”์ง€, ๊ทธ๋ฆฌ๊ณ  ๊ฒฐ์ •์ด ๊ตฌ์„ฑ, ํ›… ๋˜๋Š” ์‚ฌ์šฉ์ž์—์„œ ๋‚˜์™”๋Š”์ง€ ์—ฌ๋ถ€, ๊ทธ๋ฆฌ๊ณ  mcp_server_name ๋ฐ mcp_tool_name์„ ํฌํ•จํ•˜๋Š” tool_parameters ํŽ˜์ด๋กœ๋“œ

OTEL_LOG_TOOL_DETAILS ์—†์ด ์ด๋Ÿฌํ•œ ์ด๋ฒคํŠธ๋Š” ์‹๋ณ„ ์„ธ๋ถ€ ์ •๋ณด๋ฅผ ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค:

  • tool_result: tool_name ๋ฐ mcp_server_scope๋ฅผ ์œ ์ง€ํ•˜๊ณ , mcp_server_name, mcp_tool_name ๋ฐ ์ธ์ˆ˜๋ฅผ ์ƒ๋žตํ•ฉ๋‹ˆ๋‹ค
  • tool_decision: tool_name์„ ์œ ์ง€ํ•˜๊ณ , tool_parameters๋ฅผ ์ƒ๋žตํ•ฉ๋‹ˆ๋‹ค
  • mcp_server_connection: server_name ๋ฐ ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๋ฅผ ์ƒ๋žตํ•˜์ง€๋งŒ, is_plugin, plugin_id_hash ๋ฐ plugin.name์„ ์œ ์ง€ํ•˜๋ฉฐ, Anthropic์ด ์•„๋‹Œ ํ”Œ๋Ÿฌ๊ทธ์ธ ์ด๋ฆ„์€ ๋ฆฌํ„ฐ๋Ÿด "third-party"๋กœ ์ˆ˜์ •๋˜๋ฏ€๋กœ ํ”Œ๋Ÿฌ๊ทธ์ธ ์ œ๊ณต ์„œ๋ฒ„๋Š” ์ƒ์„ธ ๋กœ๊น… ์—†์ด๋„ ๊ตฌ๋ณ„ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค

๋ณด์•ˆ ์งˆ๋ฌธ์„ ์ด๋ฒคํŠธ์— ๋งคํ•‘

๊ฐ์ง€ ๊ทœ์น™์„ ๊ตฌ์ถ•ํ•  ๋•Œ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜๋ ค๋Š” ์‹ ํ˜ธ๋ฅผ ์ฐพ๊ณ  ํ•ด๋‹น ์ด๋ฒคํŠธ ๋ฐ ์†์„ฑ์— ๋Œ€ํ•ด ๋ฐฑ์—”๋“œ๋ฅผ ์ฟผ๋ฆฌํ•ฉ๋‹ˆ๋‹ค:

์‹ ํ˜ธ ์ด๋ฒคํŠธ ์ฃผ์š” ์†์„ฑ
๋„๊ตฌ ํ˜ธ์ถœ ํ—ˆ์šฉ ๋˜๋Š” ๊ฑฐ๋ถ€, ๊ทธ๋ฆฌ๊ณ  ์–ด๋–ป๊ฒŒ tool_decision decision, source, tool_name, tool_parameters
๊ถŒํ•œ ๋ชจ๋“œ ์—์Šค์ปฌ๋ ˆ์ด์…˜ permission_mode_changed from_mode, to_mode, trigger
์ •์ฑ… ํ›…์ด ์ž‘์—…์„ ์ฐจ๋‹จํ•จ hook_execution_complete hook_event, num_blocking
๋กœ๊ทธ์ธ, ๋กœ๊ทธ์•„์›ƒ ๋ฐ ์ธ์ฆ ์‹คํŒจ auth action, success, error_category
MCP ์„œ๋ฒ„ ์—ฐ๊ฒฐ ๋˜๋Š” ์‹คํŒจ mcp_server_connection status, server_name, is_plugin, error_code
ํ”Œ๋Ÿฌ๊ทธ์ธ ์„ค์น˜ ๋ฐ ์ถœ์ฒ˜ plugin_installed plugin.name, marketplace.name, marketplace.is_official
์‹คํ–‰๋œ ๋ช…๋ น ๋ฐ ํ„ฐ์น˜๋œ ํŒŒ์ผ tool_result (์‹คํ–‰๋จ) ๋˜๋Š” tool_decision (๊ฑฐ๋ถ€๋จ) (OTEL_LOG_TOOL_DETAILS=1 ํฌํ•จ) tool_parameters; tool_input (tool_result๋งŒ ํ•ด๋‹น)

Claude Code๋Š” ์›๋ณธ ์ด๋ฒคํŠธ ์ŠคํŠธ๋ฆผ๋งŒ ๋‚ด๋ณด๋ƒ…๋‹ˆ๋‹ค. ์ด์ƒ ๊ฐ์ง€, ๊ธฐ์ค€์„  ์„ค์ •, ์„ธ์…˜ ๊ฐ„ ์ƒ๊ด€ ๊ด€๊ณ„ ๋ฐ ๊ฒฝ๊ณ ๋Š” SIEM ๋˜๋Š” ๊ด€์ฐฐ์„ฑ ๋ฐฑ์—”๋“œ์˜ ์ฑ…์ž„์ž…๋‹ˆ๋‹ค.

SIEM์— ์ด๋ฒคํŠธ ์ „์†ก

OTEL_EXPORTER_OTLP_LOGS_ENDPOINT๋ฅผ SIEM์˜ OTLP ์ˆ˜์‹ ๊ธฐ ๋˜๋Š” SIEM์˜ ๊ธฐ๋ณธ ์ˆ˜์ง‘ API๋กœ ์ „๋‹ฌํ•˜๋Š” OpenTelemetry Collector๋กœ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ ๊ด€๋ฆฌ ์„ค์ • ์˜ˆ๋Š” ์ด๋ฒคํŠธ๋งŒ ๋‚ด๋ณด๋‚ด๊ณ  MCP ๋ฐ Bash ๊ฐ์‚ฌ๋ฅผ ์œ„ํ•ด ์ „์ฒด ๋„๊ตฌ ์„ธ๋ถ€ ์ •๋ณด๋ฅผ ํ™œ์„ฑํ™”ํ•ฉ๋‹ˆ๋‹ค:

{
  "env": {
    "CLAUDE_CODE_ENABLE_TELEMETRY": "1",
    "OTEL_LOGS_EXPORTER": "otlp",
    "OTEL_LOG_TOOL_DETAILS": "1",
    "OTEL_EXPORTER_OTLP_LOGS_PROTOCOL": "http/protobuf",
    "OTEL_EXPORTER_OTLP_LOGS_ENDPOINT": "https://siem.example.com:4318/v1/logs",
    "OTEL_EXPORTER_OTLP_HEADERS": "Authorization=Bearer your-siem-token"
  }
}

๋ฐฑ์—”๋“œ ๊ณ ๋ ค ์‚ฌํ•ญ

๋ฉ”ํŠธ๋ฆญ, ๋กœ๊ทธ ๋ฐ ์ถ”์  ๋ฐฑ์—”๋“œ ์„ ํƒ์€ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ„์„ ์œ ํ˜•์„ ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค:

๋ฉ”ํŠธ๋ฆญ์˜ ๊ฒฝ์šฐ

  • ์‹œ๊ณ„์—ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค (์˜ˆ: Prometheus): ๋น„์œจ ๊ณ„์‚ฐ, ์ง‘๊ณ„๋œ ๋ฉ”ํŠธ๋ฆญ
  • ์ปฌ๋Ÿผํ˜• ์ €์žฅ์†Œ (์˜ˆ: ClickHouse): ๋ณต์žกํ•œ ์ฟผ๋ฆฌ, ๊ณ ์œ  ์‚ฌ์šฉ์ž ๋ถ„์„
  • ์™„์ „ํ•œ ๊ธฐ๋Šฅ์˜ ๊ด€์ฐฐ์„ฑ ํ”Œ๋žซํผ (์˜ˆ: Honeycomb, Datadog, Grafana Cloud): ๊ณ ๊ธ‰ ์ฟผ๋ฆฌ, ์‹œ๊ฐํ™”, ๊ฒฝ๊ณ 

์ด๋ฒคํŠธ/๋กœ๊ทธ์˜ ๊ฒฝ์šฐ

  • ๋กœ๊ทธ ์ง‘๊ณ„ ์‹œ์Šคํ…œ (์˜ˆ: Elasticsearch, Loki): ์ „์ฒด ํ…์ŠคํŠธ ๊ฒ€์ƒ‰, ๋กœ๊ทธ ๋ถ„์„
  • ์ปฌ๋Ÿผํ˜• ์ €์žฅ์†Œ (์˜ˆ: ClickHouse): ๊ตฌ์กฐํ™”๋œ ์ด๋ฒคํŠธ ๋ถ„์„
  • ์™„์ „ํ•œ ๊ธฐ๋Šฅ์˜ ๊ด€์ฐฐ์„ฑ ํ”Œ๋žซํผ (์˜ˆ: Honeycomb, Datadog, Grafana Cloud): ๋ฉ”ํŠธ๋ฆญ๊ณผ ์ด๋ฒคํŠธ ๊ฐ„์˜ ์ƒ๊ด€ ๊ด€๊ณ„

์ถ”์ ์˜ ๊ฒฝ์šฐ

๋ถ„์‚ฐ ์ถ”์  ์ €์žฅ์†Œ ๋ฐ ์ŠคํŒฌ ์ƒ๊ด€ ๊ด€๊ณ„๋ฅผ ์ง€์›ํ•˜๋Š” ๋ฐฑ์—”๋“œ๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค:

  • ๋ถ„์‚ฐ ์ถ”์  ์‹œ์Šคํ…œ (์˜ˆ: Jaeger, Zipkin, Grafana Tempo): ์ŠคํŒฌ ์‹œ๊ฐํ™”, ์š”์ฒญ ์›Œํ„ฐํด, ์ง€์—ฐ ์‹œ๊ฐ„ ๋ถ„์„
  • ์™„์ „ํ•œ ๊ธฐ๋Šฅ์˜ ๊ด€์ฐฐ์„ฑ ํ”Œ๋žซํผ (์˜ˆ: Honeycomb, Datadog, Grafana Cloud): ์ถ”์  ๊ฒ€์ƒ‰ ๋ฐ ๋ฉ”ํŠธ๋ฆญ๊ณผ ๋กœ๊ทธ์™€์˜ ์ƒ๊ด€ ๊ด€๊ณ„

์ผ์ผ/์ฃผ๊ฐ„/์›”๊ฐ„ ํ™œ์„ฑ ์‚ฌ์šฉ์ž (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์™€ ๊ฐ™์€ ๋„๊ตฌ์™€ ํ†ตํ•ฉ๋œ ์ƒ์‚ฐ์„ฑ ๋ณด๊ณ ์„œ ์ƒ์„ฑ ํ…œํ”Œ๋ฆฟ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

๋ณด์•ˆ ๋ฐ ๊ฐœ์ธ ์ •๋ณด ๋ณดํ˜ธ

  • OpenTelemetry ๋‚ด๋ณด๋‚ด๊ธฐ๋Š” ์„ ํƒ ์‚ฌํ•ญ์ด๋ฉฐ ๋ช…์‹œ์  ๊ตฌ์„ฑ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. Anthropic์˜ ๋ณ„๋„ ์šด์˜ ์›๊ฒฉ ์ธก์ • ๋ฐ ์ด๋ฅผ ๋น„ํ™œ์„ฑํ™”ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด์„œ๋Š” ๋ฐ์ดํ„ฐ ์‚ฌ์šฉ์„ ์ฐธ์กฐํ•˜์„ธ์š”
  • ์›๋ณธ ํŒŒ์ผ ์ฝ˜ํ…์ธ  ๋ฐ ์ฝ”๋“œ ์Šค๋‹ˆํŽซ์€ ๋ฉ”ํŠธ๋ฆญ ๋˜๋Š” ์ด๋ฒคํŠธ์— ํฌํ•จ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ถ”์  ์ŠคํŒฌ์€ ๋ณ„๋„์˜ ๋ฐ์ดํ„ฐ ๊ฒฝ๋กœ์ž…๋‹ˆ๋‹ค: ์•„๋ž˜์˜ OTEL_LOG_TOOL_CONTENT ํ•ญ๋ชฉ์„ ์ฐธ์กฐํ•˜์„ธ์š”
  • OAuth๋ฅผ ํ†ตํ•ด ์ธ์ฆ๋œ ๊ฒฝ์šฐ user.email์ด ์›๊ฒฉ ์ธก์ • ์†์„ฑ์— ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. ์กฐ์ง์—์„œ ์ด๊ฒƒ์ด ์šฐ๋ ค ์‚ฌํ•ญ์ธ ๊ฒฝ์šฐ ์›๊ฒฉ ์ธก์ • ๋ฐฑ์—”๋“œ์™€ ํ•จ๊ป˜ ์ž‘์—…ํ•˜์—ฌ ์ด ํ•„๋“œ๋ฅผ ํ•„ํ„ฐ๋งํ•˜๊ฑฐ๋‚˜ ์ˆ˜์ •ํ•˜์„ธ์š”
  • ์‚ฌ์šฉ์ž ํ”„๋กฌํ”„ํŠธ ์ฝ˜ํ…์ธ ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์ˆ˜์ง‘๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ”„๋กฌํ”„ํŠธ ๊ธธ์ด๋งŒ ๊ธฐ๋ก๋ฉ๋‹ˆ๋‹ค. ํ”„๋กฌํ”„ํŠธ ์ฝ˜ํ…์ธ ๋ฅผ ํฌํ•จํ•˜๋ ค๋ฉด OTEL_LOG_USER_PROMPTS=1์„ ์„ค์ •ํ•˜์„ธ์š”
  • ์–ด์‹œ์Šคํ„ดํŠธ ์‘๋‹ต ํ…์ŠคํŠธ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์ˆ˜์ง‘๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์‘๋‹ต ๊ธธ์ด๋งŒ ๊ธฐ๋ก๋ฉ๋‹ˆ๋‹ค. ์‘๋‹ต ํ…์ŠคํŠธ๋ฅผ ํฌํ•จํ•˜๋ ค๋ฉด OTEL_LOG_ASSISTANT_RESPONSES=1์„ ์„ค์ •ํ•˜์„ธ์š”. Claude Code์˜ ๋ชจ๋“  OpenTelemetry ๋ฐ์ดํ„ฐ์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์‘๋‹ต ํ…์ŠคํŠธ๋Š” ๊ตฌ์„ฑํ•œ OTel ์—”๋“œํฌ์ธํŠธ๋กœ๋งŒ ์ „์†ก๋˜๋ฉฐ Anthropic์œผ๋กœ๋Š” ์ „์†ก๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด ๋ณ€์ˆ˜๊ฐ€ ์„ค์ •๋˜์ง€ ์•Š์œผ๋ฉด OTEL_LOG_USER_PROMPTS๊ฐ€ ํด๋ฐฑ์œผ๋กœ ์‚ฌ์šฉ๋˜๋ฏ€๋กœ ํ”„๋กฌํ”„ํŠธ ์ฝ˜ํ…์ธ ๋Š” ์›ํ•˜์ง€๋งŒ ์‘๋‹ต ์ฝ˜ํ…์ธ ๋Š” ์›ํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ OTEL_LOG_ASSISTANT_RESPONSES=0์„ ์„ค์ •ํ•˜์„ธ์š”
  • ๋„๊ตฌ ์ž…๋ ฅ ์ธ์ˆ˜ ๋ฐ ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ๊ธฐ๋ก๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ํฌํ•จํ•˜๋ ค๋ฉด OTEL_LOG_TOOL_DETAILS=1์„ ์„ค์ •ํ•˜์„ธ์š”. ์ด ๋ฐ์ดํ„ฐ๋Š” ๊ตฌ์„ฑํ•œ OTEL ์—”๋“œํฌ์ธํŠธ๋กœ๋งŒ ์ „์†ก๋˜๋ฉฐ Anthropic์œผ๋กœ๋Š” ์ „์†ก๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ธ์ˆ˜์—๋Š” ์—ฌ์ „ํžˆ ๋ฏผ๊ฐํ•œ ๊ฐ’์ด ํฌํ•จ๋  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ํ•„์š”์— ๋”ฐ๋ผ ์ด๋Ÿฌํ•œ ์†์„ฑ์„ ํ•„ํ„ฐ๋งํ•˜๊ฑฐ๋‚˜ ์ˆ˜์ •ํ•˜๋„๋ก ์›๊ฒฉ ์ธก์ • ๋ฐฑ์—”๋“œ๋ฅผ ๊ตฌ์„ฑํ•˜์„ธ์š”. ํ™œ์„ฑํ™”๋˜๋ฉด:
    • tool_result ๋ฐ tool_decision ์ด๋ฒคํŠธ๋Š” Bash ๋ช…๋ น, MCP ์„œ๋ฒ„ ๋ฐ ๋„๊ตฌ ์ด๋ฆ„, ์Šคํ‚ฌ ์ด๋ฆ„์ด ํฌํ•จ๋œ tool_parameters ์†์„ฑ์„ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค. full_command์™€ ๊ฐ™์€ ํ•„๋“œ๋Š” ์ž˜๋ฆฌ์ง€ ์•Š์€ ์ƒํƒœ๋กœ ๋‚ด๋ณด๋‚ด์ง‘๋‹ˆ๋‹ค
    • tool_result ์ด๋ฒคํŠธ๋Š” ์ถ”๊ฐ€๋กœ ํŒŒ์ผ ๊ฒฝ๋กœ, URL, ๊ฒ€์ƒ‰ ํŒจํ„ด ๋ฐ ๊ธฐํƒ€ ์ธ์ˆ˜๊ฐ€ ํฌํ•จ๋œ tool_input ์†์„ฑ์„ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค. 512์ž๋ฅผ ์ดˆ๊ณผํ•˜๋Š” ๊ฐœ๋ณ„ ๊ฐ’์€ ์ž˜๋ฆฌ๊ณ  ์ „์ฒด๋Š” ์•ฝ 4K ๋ฌธ์ž๋กœ ์ œํ•œ๋ฉ๋‹ˆ๋‹ค
    • user_prompt ์ด๋ฒคํŠธ๋Š” ์‚ฌ์šฉ์ž ์ •์˜, ํ”Œ๋Ÿฌ๊ทธ์ธ ๋ฐ MCP ๋ช…๋ น์˜ ์ถ•์ž command_name์„ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค
    • ์ถ”์  ์ŠคํŒฌ์€ ๋™์ผํ•œ tool_input ์†์„ฑ ๋ฐ file_path์™€ ๊ฐ™์€ ์ž…๋ ฅ ํŒŒ์ƒ ์†์„ฑ์„ ํฌํ•จํ•˜๋ฉฐ, tool_input๊ณผ ๋™์ผํ•œ ์ž˜๋ฆผ์ด ์ ์šฉ๋ฉ๋‹ˆ๋‹ค
  • ๋„๊ตฌ ์ž…๋ ฅ ๋ฐ ์ถœ๋ ฅ ์ฝ˜ํ…์ธ ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์ถ”์  ์ŠคํŒฌ์— ๊ธฐ๋ก๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ํฌํ•จํ•˜๋ ค๋ฉด OTEL_LOG_TOOL_CONTENT=1์„ ์„ค์ •ํ•˜์„ธ์š”. ํ™œ์„ฑํ™”๋˜๋ฉด ์ŠคํŒฌ ์ด๋ฒคํŠธ๋Š” ์ŠคํŒฌ๋‹น 60KB์—์„œ ์ž˜๋ฆฐ ์ „์ฒด ๋„๊ตฌ ์ž…๋ ฅ ๋ฐ ์ถœ๋ ฅ ์ฝ˜ํ…์ธ ๋ฅผ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—๋Š” Read ๋„๊ตฌ ๊ฒฐ๊ณผ์˜ ์›๋ณธ ํŒŒ์ผ ์ฝ˜ํ…์ธ  ๋ฐ Bash ๋ช…๋ น ์ถœ๋ ฅ์ด ํฌํ•จ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•„์š”์— ๋”ฐ๋ผ ์ด๋Ÿฌํ•œ ์†์„ฑ์„ ํ•„ํ„ฐ๋งํ•˜๊ฑฐ๋‚˜ ์ˆ˜์ •ํ•˜๋„๋ก ์›๊ฒฉ ์ธก์ • ๋ฐฑ์—”๋“œ๋ฅผ ๊ตฌ์„ฑํ•˜์„ธ์š”
  • ์›๋ณธ Anthropic Messages API ์š”์ฒญ ๋ฐ ์‘๋‹ต ๋ณธ๋ฌธ์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ๊ธฐ๋ก๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ํฌํ•จํ•˜๋ ค๋ฉด OTEL_LOG_RAW_API_BODIES๋ฅผ ์„ค์ •ํ•˜์„ธ์š”. =1์ผ ๋•Œ ๊ฐ API ํ˜ธ์ถœ์€ body ์†์„ฑ์ด JSON ์ง๋ ฌํ™”๋œ ํŽ˜์ด๋กœ๋“œ(60KB์—์„œ ์ž˜๋ฆผ)์ธ api_request_body ๋ฐ api_response_body ๋กœ๊ทธ ์ด๋ฒคํŠธ๋ฅผ ๋‚ด๋ณด๋ƒ…๋‹ˆ๋‹ค. =file:<dir>์ผ ๋•Œ ์ž˜๋ฆฌ์ง€ ์•Š์€ ๋ณธ๋ฌธ์€ ํ•ด๋‹น ๋””๋ ‰ํ† ๋ฆฌ ์•„๋ž˜์˜ .request.json ๋ฐ .response.json ํŒŒ์ผ์— ๊ธฐ๋ก๋˜๊ณ  ์ด๋ฒคํŠธ๋Š” ์ธ๋ผ์ธ ๋ณธ๋ฌธ ๋Œ€์‹  body_ref ๊ฒฝ๋กœ๋ฅผ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค. ๋กœ๊ทธ ์ˆ˜์ง‘๊ธฐ ๋˜๋Š” ์‚ฌ์ด๋“œ์นด์™€ ํ•จ๊ป˜ ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ๋ฐฐํฌํ•˜๋˜ ์›๊ฒฉ ์ธก์ • ์ŠคํŠธ๋ฆผ์„ ํ†ตํ•ด์„œ๋Š” ๋ฐฐํฌํ•˜์ง€ ๋งˆ์„ธ์š”. ๋‘ ๋ชจ๋“œ ๋ชจ๋‘์—์„œ ๋ณธ๋ฌธ์—๋Š” ์ „์ฒด ๋Œ€ํ™” ๊ธฐ๋ก(์‹œ์Šคํ…œ ํ”„๋กฌํ”„ํŠธ, ๋ชจ๋“  ์ด์ „ ์‚ฌ์šฉ์ž ๋ฐ ์–ด์‹œ์Šคํ„ดํŠธ ํ„ด, ๋„๊ตฌ ๊ฒฐ๊ณผ)์ด ํฌํ•จ๋˜๋ฏ€๋กœ ์ด๋ฅผ ํ™œ์„ฑํ™”ํ•˜๋ฉด ๋‹ค๋ฅธ OTEL_LOG_* ์ฝ˜ํ…์ธ  ํ”Œ๋ž˜๊ทธ๊ฐ€ ๊ณต๊ฐœํ•  ๋ชจ๋“  ๊ฒƒ์— ๋™์˜ํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. Claude์˜ ํ™•์žฅ ์‚ฌ๊ณ  ์ฝ˜ํ…์ธ ๋Š” ๋‹ค๋ฅธ ์„ค์ •์— ๊ด€๊ณ„์—†์ด ํ•ญ์ƒ ์ด๋Ÿฌํ•œ ๋ณธ๋ฌธ์—์„œ ์ˆ˜์ •๋ฉ๋‹ˆ๋‹ค

Amazon Bedrock์—์„œ Claude Code ๋ชจ๋‹ˆํ„ฐ๋ง

Amazon Bedrock์˜ Claude Code ์‚ฌ์šฉ ๋ชจ๋‹ˆํ„ฐ๋ง์— ๋Œ€ํ•œ ์ž์„ธํ•œ ์ง€์นจ์€ Claude Code ๋ชจ๋‹ˆํ„ฐ๋ง ๊ตฌํ˜„ (Bedrock)์„ ์ฐธ์กฐํ•˜์„ธ์š”.