- какие инструменты они вызывали
- сколько времени заняла каждый запрос к модели
- сколько токенов было потрачено
- где произошли сбои
Как телеметрия поступает из SDK
Agent SDK запускает Claude Code CLI как дочерний процесс и взаимодействует с ним через локальный канал. CLI имеет встроенную инструментацию OpenTelemetry: он записывает spans вокруг каждого запроса к модели и выполнения инструмента, излучает метрики для счётчиков токенов и стоимости и излучает структурированные события логов для подсказок и результатов инструментов. SDK не производит телеметрию самостоятельно. Вместо этого он передаёт конфигурацию в процесс CLI, и CLI экспортирует непосредственно в ваш сборщик. Конфигурация передаётся как переменные окружения. По умолчанию дочерний процесс наследует окружение вашего приложения, поэтому вы можете настроить телеметрию в одном из двух мест:- Окружение процесса: установите переменные в вашей оболочке, контейнере или оркестраторе перед запуском вашего приложения. Каждый вызов
query()автоматически их подхватывает без изменения кода. Это рекомендуемый подход для production развёртываний. - Параметры для каждого вызова: установите переменные в
ClaudeAgentOptions.env(Python) илиoptions.env(TypeScript). Используйте это, когда разные агенты в одном процессе нуждаются в разных параметрах телеметрии. В Pythonenvобъединяется поверх унаследованного окружения. В TypeScriptenvполностью заменяет унаследованное окружение, поэтому включите...process.envв объект, который вы передаёте.
| Сигнал | Что он содержит | Включить с помощью |
|---|---|---|
| Metrics | Счётчики для токенов, стоимости, сессий, строк кода и решений по инструментам | OTEL_METRICS_EXPORTER |
| Log events | Структурированные записи для каждой подсказки, запроса API, ошибки API и результата инструмента | OTEL_LOGS_EXPORTER |
| Traces | Spans для каждого взаимодействия, запроса к модели, вызова инструмента и hook (бета) | OTEL_TRACES_EXPORTER плюс CLAUDE_CODE_ENHANCED_TELEMETRY_BETA=1 |
Включение экспорта телеметрии
Телеметрия отключена до тех пор, пока вы не установитеCLAUDE_CODE_ENABLE_TELEMETRY=1 и не выберете хотя бы один экспортер. Наиболее распространённая конфигурация отправляет все три сигнала через OTLP HTTP на сборщик.
Следующий пример устанавливает переменные в словарь и передаёт их через options.env. Агент выполняет одну задачу, и CLI экспортирует spans, метрики и события на сборщик по адресу collector.example.com пока цикл потребляет поток ответов:
options.env.
Экспортер
console записывает телеметрию в стандартный вывод, который SDK использует
как свой канал сообщений. Не устанавливайте console как значение экспортера при запуске
через SDK. Чтобы проверить телеметрию локально, направьте
OTEL_EXPORTER_OTLP_ENDPOINT на локальный сборщик или контейнер all-in-one Jaeger
вместо этого.Сброс телеметрии из короткоживущих вызовов
CLI группирует телеметрию и экспортирует по интервалу. При чистом выходе процесса он пытается сбросить ожидающие данные, но сброс ограничен коротким таймаутом, поэтому spans всё ещё могут быть потеряны, если сборщик медленно реагирует. Если ваш процесс убит до того, как CLI завершит работу, всё, что остаётся в буфере пакета, теряется. Снижение интервалов экспорта сокращает оба окна. По умолчанию метрики экспортируются каждые 60 секунд, а traces и logs экспортируются каждые 5 секунд. Следующий пример сокращает все три интервала, чтобы данные достигли сборщика пока короткая задача всё ещё выполняется:Чтение трассировок агента
Traces дают вам наиболее детальный вид запуска агента. С установленнымCLAUDE_CODE_ENHANCED_TELEMETRY_BETA=1, каждый шаг цикла агента становится span, который вы можете проверить в вашем бэкенде трассировки:
claude_code.interaction: оборачивает один оборот цикла агента, от получения подсказки до создания ответа.claude_code.llm_request: оборачивает каждый вызов API Claude с именем модели, задержкой и подсчётом токенов как атрибутами.claude_code.tool: оборачивает каждый вызов инструмента с дочерними spans для ожидания разрешения (claude_code.tool.blocked_on_user) и самого выполнения (claude_code.tool.execution).claude_code.hook: оборачивает каждое выполнение hook. Требует детальную бета-трассировку (ENABLE_BETA_TRACING_DETAILED=1иBETA_TRACING_ENDPOINT) в дополнение к переменным выше.
llm_request, tool и hook являются дочерними элементами охватывающего span claude_code.interaction. Когда агент порождает подагента через инструмент Task, spans llm_request и tool подагента вложены под span claude_code.tool родительского агента, поэтому полная цепочка делегирования появляется как одна трассировка.
Spans по умолчанию несут атрибут session.id. Когда вы делаете несколько вызовов query() для одной и той же сессии, фильтруйте по session.id в вашем бэкенде, чтобы увидеть их как одну временную шкалу. Атрибут опускается, если OTEL_METRICS_INCLUDE_SESSION_ID установлен на ложное значение.
Трассировка находится в бета-версии. Имена spans и атрибуты могут измениться между выпусками. См.
Traces (beta) в справочнике Monitoring
для переменных конфигурации экспортера трассировки.
Связывание трассировок с вашим приложением
SDK автоматически распространяет контекст трассировки W3C в подпроцесс CLI. Когда вы вызываетеquery() пока в вашем приложении активен span OpenTelemetry, SDK внедряет TRACEPARENT и TRACESTATE в окружение дочернего процесса, и CLI читает их, так что его span claude_code.interaction становится дочерним элементом вашего span. Запуск агента затем появляется внутри трассировки вашего приложения вместо отключённого корня.
Когда распространение контекста трассировки включено, CLI также пересылает TRACEPARENT каждой команде Bash и PowerShell, которую он запускает. Если команда, запущенная через инструмент Bash, излучает свои собственные spans OpenTelemetry, эти spans вложены под span claude_code.tool.execution, который оборачивает команду.
Автоматическое внедрение пропускается, когда вы явно устанавливаете TRACEPARENT в options.env, поэтому вы можете закрепить определённый контекст родителя, если необходимо. Интерактивные сессии CLI полностью игнорируют входящий TRACEPARENT; только запуски Agent SDK и claude -p его соблюдают. См. Traces (beta) в справочнике Monitoring для полного справочника span и атрибутов.
Пометка телеметрии от вашего агента
По умолчанию CLI сообщаетservice.name как claude-code. Если вы запускаете несколько агентов или запускаете SDK наряду с другими сервисами, которые экспортируют на один и тот же сборщик, переопределите имя сервиса и добавьте атрибуты ресурсов, чтобы вы могли фильтровать по агенту в вашем бэкенде.
Следующий пример переименовывает сервис и прикрепляет метаданные развёртывания. Эти значения применяются как атрибуты ресурсов OpenTelemetry на каждом span, метрике и событии, которое излучает агент:
Атрибуция действий вашим конечным пользователям
CLI прикрепляет атрибуты идентичности к каждому событию на основе учётных данных, которые он использует для вызова Anthropic. Когда вы создаёте приложение, которое обслуживает многих конечных пользователей из одного развёртывания, эти атрибуты идентифицируют учётные данные вашего сервиса, а не конечного пользователя, от имени которого действовал агент. Чтобы сделать вызовы инструментов и активность MCP атрибутируемыми конечным пользователям вашего приложения, внедрите идентичность конечного пользователя как атрибуты ресурсов при каждом вызовеquery(). Процентно-кодируйте значения перед интерполяцией, так как OTEL_RESOURCE_ATTRIBUTES зарезервирует запятые, пробелы и знаки равенства. Следующий пример прикрепляет запрашивающего пользователя и тенанта к каждому span и событию из одного запроса:
tool_decision, tool_result, mcp_server_connection и permission_mode_changed становятся журналом аудита для каждого пользователя, который вы можете переслать на платформу Security Information and Event Management (SIEM). См. Аудит событий безопасности в справочнике Monitoring для полного списка событий, связанных с безопасностью, и атрибутов, которые несёт каждое из них.
Контроль конфиденциальных данных в экспортах
Телеметрия по умолчанию структурирована. Длительности, имена моделей и имена инструментов записываются на каждом span; подсчёты токенов записываются, когда базовый запрос API возвращает данные об использовании, поэтому spans для неудачных или прерванных запросов могут их опускать. Содержимое, которое читает и записывает ваш агент, по умолчанию не записывается. Эти переменные opt-in добавляют содержимое в экспортируемые данные:| Переменная | Добавляет |
|---|---|
OTEL_LOG_USER_PROMPTS=1 | Текст подсказки на событиях claude_code.user_prompt и на span claude_code.interaction |
OTEL_LOG_TOOL_DETAILS=1 | Аргументы входных данных инструмента (пути файлов, команды оболочки, шаблоны поиска) на событиях claude_code.tool_result |
OTEL_LOG_TOOL_CONTENT=1 | Полные тела входных и выходных данных инструмента как события span на claude_code.tool, усечённые на 60 КБ. Требует, чтобы трассировка была включена |
OTEL_LOG_RAW_API_BODIES | Полный JSON запроса и ответа Anthropic Messages API как события логов claude_code.api_request_body и claude_code.api_response_body. Установите на 1 для встроенных тел, усечённых на 60 КБ, или file:<dir> для неусечённых тел на диске с путём body_ref в событии. Тела включают всю историю разговора и имеют содержимое расширенного мышления отредактировано. Включение этого подразумевает согласие на всё, что раскроют три переменные выше |
Связанная документация
Эти руководства охватывают смежные темы для мониторинга и развёртывания агентов:- Отслеживание стоимости и использования: читайте данные о токенах и стоимости из потока сообщений без внешнего бэкенда.
- Размещение Agent SDK: развёртывайте агентов в контейнерах, где вы можете установить переменные OpenTelemetry на уровне окружения.
- Monitoring: полный справочник для каждой переменной окружения, метрики и события, которые излучает CLI.