Настройка OpenTelemetry с Claude SDK
Трассируйте каждый запрос, который отправляет Claude SDK, и каждый инструмент, который запускает его tool runner, и отправляйте спаны на вашу платформу наблюдаемости.
С помощью OpenTelemetry Claude SDK может создавать «span» (спан) для каждого отправляемого запроса и для каждого использования инструмента, которое запускает tool runner. Вы можете просматривать эти спаны на вашей «observability platform» (платформе наблюдаемости), вложенными в ваши собственные трассировки.
SDK создаёт спаны в вашем приложении. «Exporter» (экспортер) OpenTelemetry вашего приложения отправляет их на вашу платформу наблюдаемости.
1. Установите SDK
Установите последнюю версию Claude SDK или обновитесь до неё:
pip install --upgrade anthropicЕсли ваше приложение ещё не использует OpenTelemetry SDK, установите его вместе с консольным экспортером, который вы используете на следующем шаге для вывода спанов:
pip install opentelemetry-sdk2. Зарегистрируйте провайдер трассировщика
Tracer provider (провайдер трассировщика) — это объект OpenTelemetry, который создаёт спаны и передаёт их вашему экспортеру. SDK использует провайдер трассировщика, который регистрирует ваше приложение, поэтому ваши вызовы SDK остаются прежними. Зарегистрируйте его перед первым вызовом, который вы хотите трассировать.
Следующий пример регистрирует провайдер трассировщика, который выводит каждый спан в консоль, а затем выполняет один вызов. Используйте его, чтобы увидеть спаны до подключения платформы наблюдаемости:
from anthropic import Anthropic
from opentelemetry import trace
from opentelemetry.sdk.trace import TracerProvider
from opentelemetry.sdk.trace.export import ConsoleSpanExporter, SimpleSpanProcessor
# Регистрируем tracer provider (поставщик трассировщиков), выводящий каждый span в консоль.
provider = TracerProvider()
provider.add_span_processor(SimpleSpanProcessor(ConsoleSpanExporter()))
trace.set_tracer_provider(provider)
client = Anthropic()
message = client.messages.create(
model="claude-opus-5-5",
max_tokens=1024,
messages=[{"role": "user", "content": "Hello, Claude"}],
)
print(message.content)В консоли отображается один спан anthropic.messages.create.
3. Отправьте спаны на вашу платформу наблюдаемости
Замените консольный экспортер на экспортер OTLP, указывающий на вашу платформу наблюдаемости. Настройку для вашего языка см. в документации OpenTelemetry: экспортеры Python, экспортеры TypeScript, экспортеры .NET, экспортеры Go, конфигурация Java SDK, экспортеры PHP или экспортеры Ruby.
4. Настройте SDK
Используйте следующие параметры, чтобы определить, что попадает в ваши спаны и куда они отправляются. Вы можете задать параметр в коде или, если у него есть переменная окружения, с помощью переменной окружения, указанной под его именем.
| Параметр | Для чего используется | По умолчанию |
|---|---|---|
traces.content_modeANTHROPIC_OPEN_TELEMETRY_TRACES_CONTENT_MODE=content | Включение подсказок и ответов в спаны. См. Режимы содержимого. | metadata_only |
traces.max_content_bytesANTHROPIC_OPEN_TELEMETRY_TRACES_MAX_CONTENT_BYTES | Изменение ограничения на объём содержимого каждого спана. См. Ограничения содержимого. | 0,75 MB |
conversation_id | Объединение нескольких вызовов в один диалог. SDK записывает идентификатор в gen_ai.conversation.id. Идентификатор экспортируется в обоих режимах содержимого, поэтому не помещайте в него персональные данные или секреты. | Нет |
tracer_provider | Выбор провайдера трассировщика, который получает спаны SDK. | Провайдер трассировщика, настроенный вами в разделе Зарегистрируйте провайдер трассировщика |
propagationANTHROPIC_OPEN_TELEMETRY_PROPAGATION=false | Прекращение отправки заголовков контекста трассировки и baggage вместе с запросами, например когда их уже отправляет инструментирование вашего HTTP-клиента. SDK по-прежнему создаёт спаны. Доступно в SDK для Python, TypeScript, Go, Java, Ruby и PHP. | Включено |
open_telemetryANTHROPIC_OPEN_TELEMETRY=false | Отключение спанов для одного клиента, например когда другая библиотека уже трассирует SDK. | Включено |
Следующий пример показывает, как использовать каждый параметр:
# Использовать конкретный tracer provider и записывать содержимое.
# Параметр open_telemetry переопределяет все переменные окружения ANTHROPIC_OPEN_TELEMETRY*.
client = Anthropic(
open_telemetry={"tracer_provider": provider, "traces": {"content_mode": "content"}}
)
# Отключить spans для одного клиента.
quiet_client = Anthropic(open_telemetry=False)
# Задать ID беседы через with_options(), который возвращает копию клиента.
# with_options() заменяет параметр целиком, поэтому начинайте с client.open_telemetry.
message = client.with_options(
open_telemetry={**client.open_telemetry, "conversation_id": "conv_42"}
).messages.create(
model="claude-opus-5-5",
max_tokens=1024,
messages=[{"role": "user", "content": "Hello, Claude"}],
)Следующие шаги
Получите наблюдаемость Claude API.
Проследите путь запроса от вашего клиента до Claude API.
Трассировка потока
Спан anthropic.messages.create для потока завершается, когда ваш код прочитал весь поток или закрыл его, поэтому закрывайте поток, чтение которого вы прекращаете досрочно. В режиме содержимого спан содержит ответ модели, только если вы читаете поток с помощью messages.stream().
Спаны, которые вы начинаете во время чтения потока, являются соседними по отношению к спану SDK, а не его дочерними спанами. Чтобы сгруппировать их с запросом, начните собственный спан, охватывающий и вызов, и цикл чтения.
Трассировка самостоятельно размещённой песочницы Managed Agents
В самостоятельно размещённой песочнице Managed Agents инструменты запускает ваша песочница, поэтому спаны инструментов поступают от SDK, а не от API. «Environment worker» (рабочий процесс среды) в SDK для Python, TypeScript и Go создаёт спан для каждого запускаемого инструмента и каждого отправляемого запроса. Он группирует их под одним спаном anthropic.environment.work для каждого рабочего элемента.
Чтобы получить эти спаны:
- В процессе, который запускает рабочий процесс, настройте трассировку SDK, как описано в шагах 1–4.
- Разрешите сетевой трафик из песочницы на вашу платформу наблюдаемости или в OpenTelemetry Collector.
Когда рабочий процесс отправляет результат инструмента, спан API этого запроса вкладывается в его спан SDK.
Контекст трассировки и baggage
С каждым запросом SDK с помощью распространителя вашего приложения отправляет в API контекст трассировки в таких заголовках, как traceparent. Если этот распространитель также записывает baggage, SDK отправляет и ваш baggage. Чтобы отправлять контекст трассировки без baggage, зарегистрируйте только распространитель контекста трассировки W3C.
Чтобы SDK не отправлял эти заголовки, например когда инструментирование вашего HTTP-клиента уже отправляет их, отключите распространение в SDK:
client = Anthropic(open_telemetry={"propagation": False})Пока SDK вызывает инструмент MCP, текущим спаном является спан инструмента SDK. Некоторые клиентские библиотеки MCP отправляют контекст трассировки на сервер MCP в _meta, поэтому сервер, который его читает, может добавить свои спаны в вашу трассировку под этим спаном инструмента. Так делают пакет Python mcp начиная с версии 2.0 и пакет C# ModelContextProtocol. SDK MCP для TypeScript, Go, Java, Ruby и PHP сами этого не делают.
Устранение неполадок
| Проблема | Что проверить |
|---|---|
| Нет спанов от SDK | Зарегистрируйте провайдер трассировщика до первого вызова. Убедитесь, что вы установили SDK, как описано в разделе Установите SDK, и что ANTHROPIC_OPEN_TELEMETRY не равно false. |
| Java SDK не отправляет спаны зарегистрированному поставщику трассировщика или не отправляет контекст трассировки в API | Другая зависимость задаёт версию opentelemetry-api ниже 1.57.0. Обновите opentelemetry-api до версии 1.57.0 или более поздней. |
| Спаны SDK не вкладываются в ваши спаны, или спаны, которые создаёт ваш инструмент, не вкладываются в спан инструмента | Вызывайте SDK изнутри одного из ваших собственных спанов, как это сделано в примере из раздела «Свяжите спаны API с вашими собственными трассировками». В Go начинайте спаны, которые создаёт ваш инструмент, из ctx, который ему передаёт tool runner. |
Запросы от SDK не содержат заголовка traceparent | Зарегистрируйте в OpenTelemetry распространитель контекста трассировки W3C. SDK записывает заголовки с помощью распространителя вашего приложения. |
| Спан SDK для потока не завершается или не содержит ответа | См. Трассировка потока. |
| Каждый запрос отображается дважды | Спан SDK и спан API одного запроса имеют одинаковое имя. Используйте вид спана или service.name, чтобы различать их. Если другая библиотека также трассирует SDK, отключите одну из двух. |
Compatibility
- Supported platforms
- Claude APIBeta
- Claude Platform on AWSBeta
- Amazon BedrockBeta
- Google CloudBeta
- Microsoft FoundryBeta
- Работает с
- Messages API, Claude Managed Agents
Was this page helpful?