---
title: Настройка OpenTelemetry с Claude SDK
url: https://platform.claude.com/docs/ru/manage-claude/opentelemetry/sdk
description: Трассируйте каждый запрос, который отправляет Claude SDK, и каждый инструмент, который запускает его tool runner, и отправляйте спаны на вашу платформу наблюдаемости.
featureMetadata:
  topic:
    title: OpenTelemetry
    url: https://platform.claude.com/docs/en/manage-claude/opentelemetry
  status: beta
  supportedPlatforms:
    Claude API: beta
    Claude Platform on AWS: beta
    Amazon Bedrock: beta
    Google Cloud: beta
    Microsoft Foundry: beta
  rows:
    - label: Работает с
      value: Messages API, Claude Managed Agents
---

С помощью OpenTelemetry Claude SDK может создавать «span» (спан) для каждого отправляемого запроса и для каждого использования инструмента, которое запускает [tool runner](https://platform.claude.com/docs/ru/agents-and-tools/tool-use/tool-runner). Вы можете просматривать эти спаны на вашей «observability platform» (платформе наблюдаемости), вложенными в ваши собственные трассировки.

SDK создаёт спаны в вашем приложении. «Exporter» (экспортер) OpenTelemetry вашего приложения отправляет их на вашу платформу наблюдаемости.

<Note>
  В период бета-тестирования параметры SDK и схема спанов могут меняться так, что это нарушит работу вашего кода, ваших запросов или ваших дашбордов. Например, новая версия SDK может переименовать спан, атрибут, параметр или переменную окружения. Закрепите версию SDK в ваших зависимостях, чтобы самостоятельно выбирать, когда принимать изменения.
</Note>

## 1. Установите SDK

Установите последнюю версию Claude SDK или обновитесь до неё:

<Tabs>
  <Tab title="Python">
    ```bash
    pip install --upgrade anthropic
    ```

    Если ваше приложение ещё не использует OpenTelemetry SDK, установите его вместе с консольным экспортером, который вы используете на следующем шаге для вывода спанов:

    ```bash
    pip install opentelemetry-sdk
    ```
  </Tab>

  <Tab title="TypeScript">
    ```bash
    npm install @anthropic-ai/sdk@latest
    ```

    Если ваше приложение ещё не использует OpenTelemetry SDK, установите его вместе с консольным экспортером, который вы используете на следующем шаге для вывода спанов:

    ```bash
    npm install @opentelemetry/sdk-trace-node
    ```
  </Tab>

  <Tab title="C#">
    ```bash
    dotnet add package Anthropic
    ```

    Если ваше приложение ещё не использует OpenTelemetry SDK, установите его вместе с консольным экспортером, который вы используете на следующем шаге для вывода спанов:

    ```bash
    dotnet add package OpenTelemetry.Exporter.Console
    ```
  </Tab>

  <Tab title="Go">
    ```bash
    go get github.com/anthropics/anthropic-sdk-go@latest
    ```

    Если ваше приложение ещё не использует OpenTelemetry SDK, установите его вместе с консольным экспортером, который вы используете на следующем шаге для вывода спанов:

    ```bash
    go get go.opentelemetry.io/otel/sdk go.opentelemetry.io/otel/exporters/stdout/stdouttrace
    ```
  </Tab>

  <Tab title="Java">
    Добавьте Claude SDK в ваши зависимости или обновите его как минимум до следующей версии, если ваш файл сборки уже его объявляет:

    <CodeGroup exclude="shell, python, typescript, csharp, go, php, ruby">
      ```kotlin Gradle
      implementation("com.anthropic:anthropic-java:2.73.0")
      ```

      ```xml Maven
      <dependency>
          <groupId>com.anthropic</groupId>
          <artifactId>anthropic-java</artifactId>
          <version>2.73.0</version>
      </dependency>
      ```
    </CodeGroup>

    Если ваше приложение еще не использует OpenTelemetry SDK, установите его вместе с консольным экспортером, который вы используете на следующем шаге для вывода спанов. Добавьте `io.opentelemetry:opentelemetry-sdk` и `io.opentelemetry:opentelemetry-exporter-logging` в вашу сборку, оба в последней версии из [Maven Central](https://central.sonatype.com/artifact/io.opentelemetry/opentelemetry-sdk).
  </Tab>

  <Tab title="PHP">
    ```bash
    composer require "anthropic-ai/sdk" "guzzlehttp/guzzle:^7"
    ```

    Если ваше приложение ещё не использует OpenTelemetry SDK, установите его вместе с консольным экспортером, который вы используете на следующем шаге для вывода спанов:

    ```bash
    composer require open-telemetry/sdk
    ```
  </Tab>

  <Tab title="Ruby">
    Если ваш `Gemfile` еще не содержит `anthropic`, добавьте gem:

    ```bash
    bundle add anthropic
    ```

    Если ваш `Gemfile` уже содержит `anthropic`, обновите gem:

    ```bash
    bundle update anthropic
    ```

    Если ваше приложение ещё не использует OpenTelemetry SDK, установите его вместе с консольным экспортером, который вы используете на следующем шаге для вывода спанов:

    ```bash
    bundle add opentelemetry-sdk
    ```
  </Tab>
</Tabs>

## 2. Зарегистрируйте провайдер трассировщика

*Tracer provider* (провайдер трассировщика) — это объект OpenTelemetry, который создаёт спаны и передаёт их вашему экспортеру. SDK использует провайдер трассировщика, который регистрирует ваше приложение, поэтому ваши вызовы SDK остаются прежними. Зарегистрируйте его перед первым вызовом, который вы хотите трассировать.

Следующий пример регистрирует провайдер трассировщика, который выводит каждый спан в консоль, а затем выполняет один вызов. Используйте его, чтобы увидеть спаны до подключения платформы наблюдаемости:

<CodeGroup exclude="shell">
  ```python Python
  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)
  ```

  ```typescript TypeScript
  import Anthropic from "@anthropic-ai/sdk";
  import {
    ConsoleSpanExporter,
    NodeTracerProvider,
    SimpleSpanProcessor
  } from "@opentelemetry/sdk-trace-node";

  // Регистрируем провайдер трассировки, который выводит каждый span в консоль.
  const provider = new NodeTracerProvider({
    spanProcessors: [new SimpleSpanProcessor(new ConsoleSpanExporter())]
  });
  // register() также устанавливает менеджер контекста, благодаря чему span'ы SDK вкладываются в ваши span'ы.
  provider.register();

  const client = new Anthropic();

  const message = await client.messages.create({
    model: "claude-opus-5-5",
    max_tokens: 1024,
    messages: [{ role: "user", content: "Hello, Claude" }]
  });
  console.log(message.content);
  ```

  ```csharp C#
  using Anthropic;
  using Anthropic.Models.Messages;
  using OpenTelemetry;
  using OpenTelemetry.Trace;

  // Зарегистрируйте tracer provider (поставщик трассировки), который выводит каждый span в консоль.
  // SDK генерирует свои span из источника com.anthropic.sdk.csharp. Укажите com.anthropic.sdk.csharp*
  // вместо этого, чтобы включить клиенты SDK для облачных платформ.
  using var tracerProvider = Sdk.CreateTracerProviderBuilder()
      .AddSource("com.anthropic.sdk.csharp")
      .AddConsoleExporter()
      .Build();

  AnthropicClient client = new();

  var message = await client.Messages.Create(new MessageCreateParams
  {
      Model = Model.ClaudeOpus5_5,
      MaxTokens = 1024,
      Messages = [new() { Role = Role.User, Content = "Hello, Claude" }],
  });
  Console.WriteLine(message);
  ```

  ```go Go
  package main

  import (
  	"context"
  	"fmt"

  	"github.com/anthropics/anthropic-sdk-go"
  	"go.opentelemetry.io/otel"
  	"go.opentelemetry.io/otel/exporters/stdout/stdouttrace"
  	"go.opentelemetry.io/otel/propagation"
  	sdktrace "go.opentelemetry.io/otel/sdk/trace"
  )

  func main() {
  	ctx := context.Background()

  	// Регистрируем провайдер трассировки, который выводит каждый span в консоль.
  	exporter, err := stdouttrace.New(stdouttrace.WithPrettyPrint())
  	if err != nil {
  		panic(err)
  	}
  	provider := sdktrace.NewTracerProvider(sdktrace.WithSyncer(exporter))
  	defer provider.Shutdown(ctx)
  	otel.SetTracerProvider(provider)
  	// OpenTelemetry для Go по умолчанию не регистрирует propagator, поэтому
  	// регистрируем propagator контекста трассировки W3C.
  	otel.SetTextMapPropagator(propagation.TraceContext{})

  	client := anthropic.NewClient()

  	message, err := client.Messages.New(ctx, anthropic.MessageNewParams{
  		Model:     anthropic.ModelClaudeOpus5_5,
  		MaxTokens: 1024,
  		Messages: []anthropic.MessageParam{
  			anthropic.NewUserMessage(anthropic.NewTextBlock("Hello, Claude")),
  		},
  	})
  	if err != nil {
  		panic(err)
  	}
  	fmt.Println(message.Content)
  }
  ```

  ```java Java
  import com.anthropic.client.okhttp.AnthropicOkHttpClient;
  import com.anthropic.models.messages.MessageCreateParams;
  import com.anthropic.models.messages.Model;
  import io.opentelemetry.api.trace.propagation.W3CTraceContextPropagator;
  import io.opentelemetry.context.propagation.ContextPropagators;
  import io.opentelemetry.exporter.logging.LoggingSpanExporter;
  import io.opentelemetry.sdk.OpenTelemetrySdk;
  import io.opentelemetry.sdk.trace.SdkTracerProvider;
  import io.opentelemetry.sdk.trace.export.SimpleSpanProcessor;

  void main() {
      // Регистрируем tracer provider, который записывает каждый span в журнал.
      var tracerProvider = SdkTracerProvider.builder()
          .addSpanProcessor(SimpleSpanProcessor.create(LoggingSpanExporter.create()))
          .build();
      OpenTelemetrySdk.builder()
          .setTracerProvider(tracerProvider)
          // OpenTelemetry для Java не регистрирует propagator при сборке в коде,
          // поэтому регистрируем propagator контекста трассировки W3C.
          .setPropagators(ContextPropagators.create(W3CTraceContextPropagator.getInstance()))
          .buildAndRegisterGlobal();

      var client = AnthropicOkHttpClient.fromEnv();

      var message = client.messages().create(MessageCreateParams.builder()
          .model(Model.CLAUDE_OPUS_5_5)
          .maxTokens(1024)
          .addUserMessage("Hello, Claude")
          .build());
      IO.println(message.content());

      tracerProvider.close();
  }
  ```

  ```php PHP
  use Anthropic\Client;
  use Anthropic\Messages\Model;
  use OpenTelemetry\API\Trace\Propagation\TraceContextPropagator;
  use OpenTelemetry\SDK\Sdk;
  use OpenTelemetry\SDK\Trace\SpanExporter\ConsoleSpanExporterFactory;
  use OpenTelemetry\SDK\Trace\SpanProcessor\SimpleSpanProcessor;
  use OpenTelemetry\SDK\Trace\TracerProvider;

  // Регистрируем tracer provider, который выводит каждый span в консоль.
  $tracerProvider = new TracerProvider(
      new SimpleSpanProcessor((new ConsoleSpanExporterFactory())->create()),
  );
  Sdk::builder()
      ->setTracerProvider($tracerProvider)
      // OpenTelemetry для PHP не регистрирует propagator при сборке в коде,
      // поэтому регистрируем propagator W3C trace context.
      ->setPropagator(TraceContextPropagator::getInstance())
      ->buildAndRegisterGlobal();

  $client = new Client();

  $message = $client->messages->create(
      maxTokens: 1024,
      messages: [['role' => 'user', 'content' => 'Hello, Claude']],
      model: Model::CLAUDE_OPUS_5_5,
  );
  echo $message;
  ```

  ```ruby Ruby
  require "anthropic"
  require "opentelemetry/sdk"

  # Регистрируем tracer provider, который выводит каждый span в консоль.
  OpenTelemetry::SDK.configure do |config|
    config.add_span_processor(
      OpenTelemetry::SDK::Trace::Export::SimpleSpanProcessor.new(
        OpenTelemetry::SDK::Trace::Export::ConsoleSpanExporter.new
      )
    )
  end

  client = Anthropic::Client.new

  message = client.messages.create(
    model: Anthropic::Model::CLAUDE_OPUS_5_5,
    max_tokens: 1024,
    messages: [{role: "user", content: "Hello, Claude"}]
  )
  puts(message.content)
  ```
</CodeGroup>

В консоли отображается один спан [`anthropic.messages.create`](https://platform.claude.com/docs/ru/api/opentelemetry/spans#anthropic-messages-create).

## 3. Отправьте спаны на вашу платформу наблюдаемости

Замените консольный экспортер на экспортер OTLP, указывающий на вашу платформу наблюдаемости. Настройку для вашего языка см. в документации OpenTelemetry: [экспортеры Python](https://opentelemetry.io/docs/languages/python/exporters/), [экспортеры TypeScript](https://opentelemetry.io/docs/languages/js/exporters/), [экспортеры .NET](https://opentelemetry.io/docs/languages/dotnet/exporters/), [экспортеры Go](https://opentelemetry.io/docs/languages/go/exporters/), [конфигурация Java SDK](https://opentelemetry.io/docs/languages/java/configuration/), [экспортеры PHP](https://opentelemetry.io/docs/languages/php/exporters/) или [экспортеры Ruby](https://opentelemetry.io/docs/languages/ruby/exporters/).

## 4. Настройте SDK

Используйте следующие параметры, чтобы определить, что попадает в ваши спаны и куда они отправляются. Вы можете задать параметр в коде или, если у него есть переменная окружения, с помощью переменной окружения, указанной под его именем.

<Note>
  Если вы передаёте клиенту `open_telemetry` (typescript, java, php: `openTelemetry`; csharp: `OpenTelemetry`; go: `option.With…()`), это целиком переопределяет переменные окружения этого параметра, включая вложенные ключи. Любой вложенный ключ, который вы не указали, использует значение по умолчанию из таблицы, даже если задана его переменная окружения.
</Note>

| Параметр                                                                                                                                                                                                                       | Для чего используется                                                                                                                                                                                                                                    | По умолчанию                                                                                                                                                                                  |
| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `traces.content_mode` (typescript, java, php: `traces.contentMode`; csharp: `Traces.ContentMode`; go: `option.WithOpenTelemetryTracesContentMode()`)<br />`ANTHROPIC_OPEN_TELEMETRY_TRACES_CONTENT_MODE=content`               | Включение подсказок и ответов в спаны. См. [Режимы содержимого](https://platform.claude.com/docs/ru/manage-claude/opentelemetry#choose-a-content-mode).                                                                                                  | `metadata_only`                                                                                                                                                                               |
| `traces.max_content_bytes` (typescript, java, php: `traces.maxContentBytes`; csharp: `Traces.MaxContentBytes`; go: `option.WithOpenTelemetryTracesMaxContentBytes()`)<br />`ANTHROPIC_OPEN_TELEMETRY_TRACES_MAX_CONTENT_BYTES` | Изменение ограничения на объём содержимого каждого спана. См. [Ограничения содержимого](https://platform.claude.com/docs/ru/manage-claude/opentelemetry#content-limits).                                                                                 | 0,75 MB                                                                                                                                                                                       |
| `conversation_id` (typescript, java, php: `conversationId`; csharp: `ConversationId`; go: `option.WithOpenTelemetryConversationID()`)                                                                                          | Объединение нескольких вызовов в один диалог. SDK записывает идентификатор в `gen_ai.conversation.id`. Идентификатор экспортируется в обоих режимах содержимого, поэтому не помещайте в него персональные данные или секреты.                            | Нет                                                                                                                                                                                           |
| `tracer_provider` (typescript, java, php: `tracerProvider`; csharp: `AddSource("com.anthropic.sdk.csharp")`; go: `option.WithTracerProvider()`)                                                                                | Выбор провайдера трассировщика, который получает спаны SDK.                                                                                                                                                                                              | Провайдер трассировщика, настроенный вами в разделе [Зарегистрируйте провайдер трассировщика](https://platform.claude.com/docs/ru/manage-claude/opentelemetry/sdk#register-a-tracer-provider) |
| `propagation` (go: `option.WithOpenTelemetryPropagation()`)<br />`ANTHROPIC_OPEN_TELEMETRY_PROPAGATION=false`                                                                                                                  | Прекращение отправки заголовков контекста трассировки и baggage вместе с запросами, например когда их уже отправляет инструментирование вашего HTTP-клиента. SDK по-прежнему создаёт спаны. Доступно в SDK для Python, TypeScript, Go, Java, Ruby и PHP. | Включено                                                                                                                                                                                      |
| `open_telemetry` (typescript, java, php: `openTelemetry`; csharp: `OpenTelemetry`; go: `option.WithoutOpenTelemetry()`)<br />`ANTHROPIC_OPEN_TELEMETRY=false`                                                                  | Отключение спанов для одного клиента, например когда другая библиотека уже трассирует SDK.                                                                                                                                                               | Включено                                                                                                                                                                                      |

Следующий пример показывает, как использовать каждый параметр:

<CodeGroup exclude="shell">
  ```python Python
  # Использовать конкретный 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"}],
  )
  ```

  ```typescript TypeScript
  // Использовать конкретный tracer provider и записывать содержимое.
  // Параметр openTelemetry переопределяет все переменные окружения ANTHROPIC_OPEN_TELEMETRY*.
  const client = new Anthropic({
    openTelemetry: { tracerProvider: provider, traces: { contentMode: "content" } }
  });

  // Отключить spans для одного клиента.
  const quietClient = new Anthropic({ openTelemetry: false });

  // Задать ID беседы в параметрах запроса одного вызова.
  const message = await client.messages.create(
    {
      model: "claude-opus-5-5",
      max_tokens: 1024,
      messages: [{ role: "user", content: "Hello, Claude" }]
    },
    { openTelemetry: { conversationId: "conv_42" } }
  );
  ```

  ```csharp C#
  // Использовать конкретный tracer provider (поставщик трассировщиков): добавьте в него источник SDK.
  using var tracerProvider = Sdk.CreateTracerProviderBuilder()
      .AddSource("com.anthropic.sdk.csharp")
      .AddConsoleExporter()
      .Build();

  // Записывать содержимое.
  // Установка OpenTelemetry переопределяет все переменные окружения ANTHROPIC_OPEN_TELEMETRY*.
  AnthropicClient client = new()
  {
      OpenTelemetry = new() { Traces = new() { ContentMode = OpenTelemetryContentMode.Content } },
  };

  // Отключить spans (спаны) для одного клиента.
  AnthropicClient quietClient = new() { OpenTelemetry = false };

  // Задать ID беседы для вызовов в рамках одной беседы.
  var conversation = client.WithOptions(options => options with
  {
      OpenTelemetryRequest = new() { ConversationId = "conv_42" },
  });
  var message = await conversation.Messages.Create(new MessageCreateParams
  {
      Model = Model.ClaudeOpus5_5,
      MaxTokens = 1024,
      Messages = [new() { Role = Role.User, Content = "Hello, Claude" }],
  });
  ```

  ```go Go
  // Используйте конкретный tracer provider и записывайте содержимое.
  client := anthropic.NewClient(
  	option.WithTracerProvider(provider),
  	option.WithOpenTelemetryTracesContentMode(option.OpenTelemetryContentModeContent),
  )

  // Отключите spans (спаны) для одного клиента.
  quietClient := anthropic.NewClient(option.WithoutOpenTelemetry())

  // Задайте ID беседы в параметрах запроса одного вызова.
  message, err := client.Messages.New(ctx, anthropic.MessageNewParams{
  	Model:     anthropic.ModelClaudeOpus5_5,
  	MaxTokens: 1024,
  	Messages: []anthropic.MessageParam{
  		anthropic.NewUserMessage(anthropic.NewTextBlock("Hello, Claude")),
  	},
  }, option.WithOpenTelemetryConversationID("conv_42"))
  ```

  ```java Java
  // Клиент считывает переменные окружения, только если вы создаёте его с помощью fromEnv().
  // Системные свойства anthropic.openTelemetry, anthropic.openTelemetryTracesContentMode
  // и anthropic.openTelemetryTracesMaxContentBytes имеют приоритет над переменными
  // окружения.

  // Используйте конкретный tracer provider и записывайте содержимое. Начните с
  // OpenTelemetryOptions.fromEnv(), чтобы сохранить параметры, считанные fromEnv().
  var envOptions = OpenTelemetryOptions.fromEnv();
  var client = AnthropicOkHttpClient.builder()
      .fromEnv()
      .openTelemetry(envOptions.toBuilder()
          .tracerProvider(tracerProvider)
          .traces(envOptions.traces().toBuilder()
              .contentMode(OpenTelemetryContentMode.CONTENT)
              .build())
          .build())
      .build();

  // Отключите spans для одного клиента.
  var quietClient = AnthropicOkHttpClient.builder().fromEnv().openTelemetry(false).build();

  // Задайте ID беседы в параметрах запроса для одного вызова.
  var params = MessageCreateParams.builder()
      .model(Model.CLAUDE_OPUS_5_5)
      .maxTokens(1024)
      .addUserMessage("Hello, Claude")
      .build();
  var message = client.messages().create(params, RequestOptions.builder()
      .openTelemetry(OpenTelemetryRequestOptions.builder().conversationId("conv_42").build())
      .build());
  ```

  ```php PHP
  // Использовать конкретный tracer provider и записывать содержимое.
  // Задание openTelemetry переопределяет все переменные окружения ANTHROPIC_OPEN_TELEMETRY*.
  $client = new Client(
      openTelemetry: ['tracerProvider' => $tracerProvider, 'traces' => ['contentMode' => 'content']],
  );

  // Отключить spans для одного клиента.
  $quietClient = new Client(openTelemetry: false);

  // Задать ID беседы в параметрах запроса одного вызова.
  $message = $client->messages->create(
      maxTokens: 1024,
      messages: [['role' => 'user', 'content' => 'Hello, Claude']],
      model: Model::CLAUDE_OPUS_5_5,
      requestOptions: ['openTelemetry' => ['conversationId' => 'conv_42']],
  );
  ```

  ```ruby Ruby
  # Использовать конкретный tracer provider и записывать содержимое.
  # Параметр open_telemetry переопределяет все переменные окружения ANTHROPIC_OPEN_TELEMETRY*.
  client = Anthropic::Client.new(open_telemetry: {tracer_provider: provider, traces: {content_mode: :content}})

  # Отключить spans для одного клиента.
  quiet_client = Anthropic::Client.new(open_telemetry: false)

  # Задать ID беседы в параметрах запроса одного вызова.
  message = client.messages.create(
    model: Anthropic::Model::CLAUDE_OPUS_5_5,
    max_tokens: 1024,
    messages: [{role: "user", content: "Hello, Claude"}],
    request_options: {open_telemetry: {conversation_id: "conv_42"}}
  )
  ```
</CodeGroup>

## Следующие шаги

<CardGroup cols={2}>
  <Card title="Настройка трассировки API" icon="cloud" href="https://platform.claude.com/docs/ru/manage-claude/opentelemetry/api">
    Получите наблюдаемость Claude API.
  </Card>

  <Card title="Посмотрите примеры трассировок" icon="sitemap" href="https://platform.claude.com/docs/ru/manage-claude/opentelemetry#example-traces-and-how-to-read-them">
    Проследите путь запроса от вашего клиента до Claude API.
  </Card>
</CardGroup>

## Трассировка потока

Спан `anthropic.messages.create` для потока завершается, когда ваш код прочитал весь поток или закрыл его, поэтому закрывайте поток, чтение которого вы прекращаете досрочно. В режиме содержимого спан содержит ответ модели, только если вы читаете поток с помощью `messages.stream()` (go: `Messages.NewStreaming()`; java: `messages().createStreaming()`; csharp: `Messages.CreateStreaming()`; php: `messages->createStream()`).

Спаны, которые вы начинаете во время чтения потока, являются соседними по отношению к спану SDK, а не его дочерними спанами. Чтобы сгруппировать их с запросом, начните собственный спан, охватывающий и вызов, и цикл чтения.

## Трассировка самостоятельно размещённой песочницы Managed Agents

В [самостоятельно размещённой песочнице](https://platform.claude.com/docs/ru/managed-agents/self-hosted-sandboxes) Managed Agents инструменты запускает ваша песочница, поэтому спаны инструментов поступают от SDK, а не от API. «Environment worker» (рабочий процесс среды) в SDK для Python, TypeScript и Go создаёт спан для каждого запускаемого инструмента и каждого отправляемого запроса. Он группирует их под одним спаном [`anthropic.environment.work`](https://platform.claude.com/docs/ru/api/opentelemetry/spans#anthropic-environment-work) для каждого рабочего элемента.

Чтобы получить эти спаны:

1. В процессе, который запускает рабочий процесс, [настройте трассировку SDK](https://platform.claude.com/docs/ru/manage-claude/opentelemetry/sdk#install-the-sdk), как описано в шагах 1–4.
2. Разрешите сетевой трафик из песочницы на вашу платформу наблюдаемости или в OpenTelemetry Collector.

Когда рабочий процесс отправляет результат инструмента, спан API этого запроса вкладывается в его спан SDK.

## Контекст трассировки и baggage

С каждым запросом SDK с помощью распространителя вашего приложения отправляет в API контекст трассировки в таких заголовках, как `traceparent`. Если этот распространитель также записывает baggage, SDK отправляет и ваш baggage. Чтобы отправлять контекст трассировки без baggage, зарегистрируйте только распространитель контекста трассировки W3C.

Чтобы SDK не отправлял эти заголовки, например когда инструментирование вашего HTTP-клиента уже отправляет их, отключите распространение в SDK:

<CodeGroup exclude="shell">
  ```python Python
  client = Anthropic(open_telemetry={"propagation": False})
  ```

  <CodeGroupItem>
    ```typescript TypeScript
    const client = new Anthropic({ openTelemetry: { propagation: false } });
    ```

    <Warning>
      Задайте 

      `propagation: false`

      , если вы используете 

      `@opentelemetry/instrumentation-undici`

      , который входит в 

      `@opentelemetry/auto-instrumentations-node`

      . Иначе из-за 

      [ошибки в этом пакете](https://github.com/open-telemetry/opentelemetry-js-contrib/issues/3711)

       к каждому запросу добавляется второй заголовок 

      `traceparent`

      , из-за чего контекст трассировки становится недействительным.
    </Warning>
  </CodeGroupItem>

  ```csharp C#
  // SDK записывает эти заголовки с помощью DistributedContextPropagator из .NET.
  // Пропагатор без вывода отключает эти заголовки для всех HttpClient в процессе.
  // Задайте его до создания любого клиента.
  DistributedContextPropagator.Current = DistributedContextPropagator.CreateNoOutputPropagator();

  AnthropicClient client = new();
  ```

  ```go Go
  client := anthropic.NewClient(option.WithOpenTelemetryPropagation(false))
  ```

  ```java Java
  var envOptions = OpenTelemetryOptions.fromEnv();
  var client = AnthropicOkHttpClient.builder()
      .fromEnv()
      .openTelemetry(envOptions.toBuilder().propagation(false).build())
      .build();
  ```

  ```php PHP
  $client = new Client(openTelemetry: ['propagation' => false]);
  ```

  ```ruby Ruby
  client = Anthropic::Client.new(open_telemetry: {propagation: false})
  ```
</CodeGroup>

Пока SDK вызывает [инструмент MCP](https://platform.claude.com/docs/ru/agents-and-tools/mcp-connector#client-side-mcp-helpers), текущим спаном является спан инструмента SDK. Некоторые клиентские библиотеки MCP отправляют контекст трассировки на сервер MCP в `_meta`, поэтому сервер, который его читает, может добавить свои спаны в вашу трассировку под этим спаном инструмента. Так делают пакет Python `mcp` начиная с версии 2.0 и пакет C# `ModelContextProtocol`. SDK MCP для TypeScript, Go, Java, Ruby и PHP сами этого не делают.

## Устранение неполадок

| Проблема                                                                                                               | Что проверить                                                                                                                                                                                                                                                                                                                                                         |
| ---------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Нет спанов от SDK                                                                                                      | Зарегистрируйте провайдер трассировщика до первого вызова. Убедитесь, что вы установили SDK, как описано в разделе [Установите SDK](https://platform.claude.com/docs/ru/manage-claude/opentelemetry/sdk#install-the-sdk), и что `ANTHROPIC_OPEN_TELEMETRY` не равно `false`.                                                                                          |
| Java SDK не отправляет спаны зарегистрированному поставщику трассировщика или не отправляет контекст трассировки в API | Другая зависимость задаёт версию `opentelemetry-api` ниже 1.57.0. Обновите `opentelemetry-api` до версии 1.57.0 или более поздней.                                                                                                                                                                                                                                    |
| Спаны SDK не вкладываются в ваши спаны, или спаны, которые создаёт ваш инструмент, не вкладываются в спан инструмента  | Вызывайте SDK изнутри одного из ваших собственных спанов, как это сделано в [примере из раздела «Свяжите спаны API с вашими собственными трассировками»](https://platform.claude.com/docs/ru/manage-claude/opentelemetry/api#connect-api-spans-to-your-own-traces). В Go начинайте спаны, которые создаёт ваш инструмент, из `ctx`, который ему передаёт tool runner. |
| Запросы от SDK не содержат заголовка `traceparent`                                                                     | Зарегистрируйте в OpenTelemetry распространитель контекста трассировки W3C. SDK записывает заголовки с помощью распространителя вашего приложения.                                                                                                                                                                                                                    |
| Спан SDK для потока не завершается или не содержит ответа                                                              | См. [Трассировка потока](https://platform.claude.com/docs/ru/manage-claude/opentelemetry/sdk#trace-a-stream).                                                                                                                                                                                                                                                         |
| Каждый запрос отображается дважды                                                                                      | Спан SDK и спан API одного запроса имеют одинаковое имя. Используйте вид спана или `service.name`, чтобы различать их. Если другая библиотека также трассирует SDK, отключите одну из двух.                                                                                                                                                                           |
