---
title: Использование OpenTelemetry с Claude API
url: https://platform.claude.com/docs/ru/manage-claude/opentelemetry/api
description: Добавьте назначение в Claude Console, чтобы отправлять трассировки OpenTelemetry ваших запросов к Messages API и сеансов Managed Agents в вашу платформу наблюдаемости.
featureMetadata:
  topic:
    title: OpenTelemetry
    url: https://platform.claude.com/docs/en/manage-claude/opentelemetry
  status: beta
  zdr:
    eligibility: eligible
    note: Excludes [Covered Models](https://platform.claude.com/docs/en/manage-claude/api-and-data-retention#model-specific-data-retention-requirements). Только для функций, которые сами по себе соответствуют требованиям ZDR, например Messages API. Claude Managed Agents не соответствует требованиям ZDR.
  supportedPlatforms:
    Claude API: beta
    Claude Platform on AWS: beta
  rows:
    - label: Работает с
      value: Messages API, Claude Managed Agents
  details:
    - После доставки данные хранятся в выбранном вами сервисе за пределами Anthropic в соответствии с правилами хранения и контроля доступа этого сервиса.
---

С помощью OpenTelemetry Claude API может создавать *Span* (спан) для каждого запроса к модели и каждого использования инструментов, которое он выполняет. Вы можете просматривать эти спаны в своей платформе наблюдаемости без изменения кода.

API создаёт спаны для ваших запросов к Messages API и сеансов Managed Agents. Чтобы получать их, добавьте *destination* (назначение) в Claude Console. Назначение сообщает API конечную точку OTLP вашей платформы наблюдаемости и способ аутентификации в ней.

## Что вам понадобится

* **Роль администратора** в организации Claude Console, чтобы добавлять и изменять назначения. С ролью разработчика вы можете их просматривать. Если ваша организация использует Claude Platform on AWS, войдите в Console через AWS Console, как описано в разделе [Вход в систему](https://platform.claude.com/docs/ru/build-with-claude/claude-platform-on-aws#signing-in).
* **Конечная точка OTLP/HTTP**, принимающая кодировку protobuf по URL-адресу HTTPS на порту 443. Если вы запускаете собственный [OpenTelemetry Collector](https://opentelemetry.io/docs/collector/), его приёмник OTLP/HTTP по умолчанию прослушивает порт 4318. Настройте приёмник на приём HTTPS на порту 443 или разместите перед Collector балансировщик нагрузки или обратный прокси.
* **Учетные данные для конечной точки**, например ключ API.

## 1. Добавьте назначение

<Info>
  Когда вы добавляете назначение телеметрии, Anthropic будет отправлять трассировки активности Claude Platform в вашей организации на указанную вами конечную точку OTLP/HTTP стороннего поставщика в соответствии с условиями вашего поставщика и средствами контроля доступа. После доставки данные хранятся в выбранном вами сервисе за пределами Anthropic в соответствии с правилами хранения и контроля доступа этого сервиса.
</Info>

1. В Console откройте [страницу настроек OpenTelemetry](https://platform.claude.com/settings/telemetry-destinations) вашей организации и нажмите **Add destination**.

2. Настройте назначение:

   | Поле                           | Что ввести                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       |
   | ------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
   | **Provider**                   | Ваша платформа наблюдаемости или **Custom**, если её нет в списке. Если вы выберете платформу из списка, Console запросит её данные, например ключ API, вместо **OTLP endpoint URL**, **Request headers** и **OTLP traces endpoint URL**.                                                                                                                                                                                                                                                                                        |
   | **Name**                       | Необязательно. Например, «Платформа наблюдаемости компании Acme».                                                                                                                                                                                                                                                                                                                                                                                                                                                                |
   | **OTLP endpoint URL**          | Базовый URL-адрес HTTPS конечной точки OTLP/HTTP вашей платформы наблюдаемости с именем хоста, а не IP-адресом. Он может содержать префикс пути, например `https://gateway.example.com/otlp`. Не добавляйте `/v1/traces`, так как API добавляет его сам. Если вы задали **OTLP traces endpoint URL**, API использует вместо этого указанный URL-адрес.                                                                                                                                                                           |
   | **Request headers**            | Заголовки, которые API отправляет с каждым запросом, например заголовок ключа API вашей платформы наблюдаемости. Размещайте учётные данные только в значениях заголовков. После сохранения Console больше не показывает эти значения.                                                                                                                                                                                                                                                                                            |
   | **Content mode**               | **Metadata only** или **Full content**. См. [чем различаются режимы содержимого](https://platform.claude.com/docs/ru/manage-claude/opentelemetry#choose-a-content-mode).                                                                                                                                                                                                                                                                                                                                                         |
   | **Workspaces**                 | Рабочие пространства, спаны которых получает назначение: **All**, **Selected** или **All except**. См. [Выберите рабочие пространства для назначения](https://platform.claude.com/docs/ru/manage-claude/opentelemetry/api#choose-workspaces-for-a-destination).                                                                                                                                                                                                                                                                  |
   | **OTLP traces endpoint URL**   | Необязательно, в разделе **Advanced settings**. Полный URL-адрес конечной точки трассировок вашей платформы наблюдаемости, например `https://gateway.example.com/custom/traces`. Задайте его, если платформа принимает трассировки по URL-адресу, отличному от OTLP endpoint URL с добавлением `/v1/traces`. Он должен иметь тот же хост, что и OTLP endpoint URL.                                                                                                                                                               |
   | **Maximum content size in MB** | Необязательно, в разделе **Advanced settings**, если выбран режим содержимого **Full content**. Максимальный объем содержимого, который API отправляет в каждом спане. Console заполняет его в зависимости от значения, выбранного в поле **Provider**. Измените его в соответствии с тем, что принимает ваша платформа наблюдаемости. Оставьте поле пустым, чтобы отправлять максимальный объем, допустимый API. См. [Ограничения содержимого](https://platform.claude.com/docs/ru/manage-claude/opentelemetry#content-limits). |

3. Нажмите **Add destination**, чтобы сохранить.

4. Нажмите **Test** в меню **More actions** назначения. Появится сообщение о том, что тестовый спан доставлен в ваш коллектор, или о причине сбоя доставки (см. [Ошибки доставки](https://platform.claude.com/docs/ru/manage-claude/opentelemetry/api#delivery-errors)).

5. Убедитесь, что спан `anthropic.test` поступил в вашу платформу наблюдаемости.

### Admin API и CLI

Вы также можете добавлять назначение через [Admin API](https://platform.claude.com/docs/ru/manage-claude/admin-api), а не через Console. Выполните вход в CLI от имени администратора или укажите [ключ Admin API](https://platform.claude.com/docs/ru/manage-claude/admin-api-keys) в `ANTHROPIC_API_KEY`. В Claude Platform on AWS вместо этого отправляйте запросы на `https://aws-external-anthropic.{region}.api.aws`, подписывая их своими учётными данными AWS, как описано в разделе [Выполнение запросов](https://platform.claude.com/docs/ru/build-with-claude/claude-platform-on-aws#making-requests). В этом случае ваша [политика IAM](https://platform.claude.com/docs/ru/api/claude-platform-on-aws-iam-actions) определяет, кто может управлять назначениями. Запрос может включать только рабочие пространства вашего аккаунта AWS в этом регионе.

<CodeGroup>
  ```bash CLI
  # Sign in once as an admin, which opens a browser. Leave ANTHROPIC_API_KEY unset, because it overrides the profile.
  ant auth login --profile admin --scope "org:admin"
  ant --profile admin beta:organization:telemetry-destinations create \
    --endpoint-url https://gateway.example.com/otlp \
    --headers '{authorization: "Bearer YOUR_OBSERVABILITY_API_KEY"}' \
    --traces.content-mode metadata_only \
    --workspaces.type all
  ```

  ```bash cURL
  curl --fail-with-body -sS "https://api.anthropic.com/v1/organizations/telemetry_destinations" \
    -H "x-api-key: $ANTHROPIC_API_KEY" \
    -H "anthropic-version: 2023-06-01" \
    -H "anthropic-beta: telemetry-destinations-2026-08-11" \
    -H "content-type: application/json" \
    -d '{
      "endpoint_url": "https://gateway.example.com/otlp",
      "headers": {"authorization": "Bearer YOUR_OBSERVABILITY_API_KEY"},
      "traces": {"content_mode": "metadata_only"},
      "workspaces": {"type": "all"}
    }'
  ```

  ```python Python
  client = anthropic.Anthropic()

  destination = client.beta.organization.telemetry_destinations.create(
      endpoint_url="https://gateway.example.com/otlp",
      headers={"authorization": "Bearer YOUR_OBSERVABILITY_API_KEY"},
      traces={"content_mode": "metadata_only"},
      workspaces={"type": "all"},
  )

  print(destination.id)
  ```

  ```typescript TypeScript
  const client = new Anthropic();

  const destination = await client.beta.organization.telemetryDestinations.create({
    endpoint_url: "https://gateway.example.com/otlp",
    headers: { authorization: "Bearer YOUR_OBSERVABILITY_API_KEY" },
    traces: { content_mode: "metadata_only" },
    workspaces: { type: "all" }
  });

  console.log(destination.id);
  ```

  ```csharp C#
  using Anthropic.Models.Beta.Organization.TelemetryDestinations;

  AnthropicClient client = new();

  var destination = await client.Beta.Organization.TelemetryDestinations.Create(
      new()
      {
          EndpointUrl = "https://gateway.example.com/otlp",
          Headers = new Dictionary<string, string>
          {
              ["authorization"] = "Bearer YOUR_OBSERVABILITY_API_KEY",
          },
          Traces = new() { ContentMode = BetaTelemetryDestinationContentMode.MetadataOnly },
          Workspaces = new BetaTelemetryDestinationWorkspacesAllParams(),
      }
  );

  Console.WriteLine(destination.ID);
  ```

  ```go Go
  client := anthropic.NewClient()

  destination, err := client.Beta.Organization.TelemetryDestinations.New(
  	context.Background(),
  	anthropic.BetaOrganizationTelemetryDestinationNewParams{
  		EndpointURL: "https://gateway.example.com/otlp",
  		Headers: map[string]string{
  			"authorization": "Bearer YOUR_OBSERVABILITY_API_KEY",
  		},
  		Traces: anthropic.BetaTelemetryDestinationTracesParams{
  			ContentMode: anthropic.BetaTelemetryDestinationContentModeMetadataOnly,
  		},
  		Workspaces: anthropic.BetaTelemetryDestinationWorkspacesParamsUnion{
  			OfAll: &anthropic.BetaTelemetryDestinationWorkspacesAllParams{},
  		},
  	},
  )
  if err != nil {
  	log.Fatal(err)
  }

  fmt.Println(destination.ID)
  ```

  ```java Java
  import com.anthropic.core.JsonValue;
  import com.anthropic.models.beta.organization.telemetrydestinations.BetaTelemetryDestinationContentMode;
  import com.anthropic.models.beta.organization.telemetrydestinations.BetaTelemetryDestinationTracesParams;
  import com.anthropic.models.beta.organization.telemetrydestinations.BetaTelemetryDestinationWorkspacesAllParams;
  import com.anthropic.models.beta.organization.telemetrydestinations.TelemetryDestinationCreateParams;

  void main() {
      AnthropicClient client = AnthropicOkHttpClient.fromEnv();

      var params = TelemetryDestinationCreateParams.builder()
          .endpointUrl("https://gateway.example.com/otlp")
          .headers(TelemetryDestinationCreateParams.Headers.builder()
              .putAdditionalProperty("authorization", JsonValue.from("Bearer YOUR_OBSERVABILITY_API_KEY"))
              .build())
          .traces(BetaTelemetryDestinationTracesParams.builder()
              .contentMode(BetaTelemetryDestinationContentMode.METADATA_ONLY)
              .build())
          .workspaces(BetaTelemetryDestinationWorkspacesAllParams.builder().build())
          .build();
      var destination = client.beta().organization().telemetryDestinations().create(params);

      IO.println(destination.id());
  }
  ```

  ```php PHP
  $client = new Client();

  $destination = $client->beta->organization->telemetryDestinations->create(
      endpointURL: 'https://gateway.example.com/otlp',
      headers: ['authorization' => 'Bearer YOUR_OBSERVABILITY_API_KEY'],
      traces: ['contentMode' => 'metadata_only'],
      workspaces: ['type' => 'all'],
  );

  echo "{$destination->id}\n";
  ```

  ```ruby Ruby
  client = Anthropic::Client.new

  destination = client.beta.organization.telemetry_destinations.create(
    endpoint_url: "https://gateway.example.com/otlp",
    headers: {authorization: "Bearer YOUR_OBSERVABILITY_API_KEY"},
    traces: {content_mode: :metadata_only},
    workspaces: {type: :all}
  )

  puts destination.id
  ```
</CodeGroup>

Запрос на создание принимает те же настройки, что и Console, за исключением **Provider**, поэтому введите URL-адрес конечной точки и заголовки вашей платформы наблюдаемости самостоятельно. Задайте `traces.max_content_bytes` (csharp, go: `Traces.MaxContentBytes`; java, php: `traces.maxContentBytes`) в байтах в соответствии с тем, что принимает ваша платформа наблюдаемости (см. [Ограничения содержимого](https://platform.claude.com/docs/ru/manage-claude/opentelemetry#content-limits)). Чтобы просмотреть список, изменить или удалить назначения, а также чтобы добавить или удалить одно рабочее пространство, используйте другие методы API назначений телеметрии.

## 2. Выберите рабочие пространства для назначения

Назначение получает спаны рабочих пространств, которые оно охватывает. Выберите их при добавлении назначения. Для **Workspaces** выберите один из следующих вариантов:

* **All:** все рабочие пространства в организации, включая [Default Workspace](https://platform.claude.com/docs/ru/manage-claude/workspaces#how-workspaces-work) и рабочие пространства, созданные позже.
* **Selected:** только выбранные вами рабочие пространства.
* **All except:** как **All**, но без выбранных вами рабочих пространств.

Для **Selected** или **All except** выберите рабочие пространства в поле поиска, которое появляется под вариантами. Чтобы позже изменить рабочие пространства назначения, откройте его меню **More actions** на [странице настроек OpenTelemetry](https://platform.claude.com/settings/telemetry-destinations), когда фильтр **Workspace** показывает **All**. Нажмите **Edit**, затем выберите другой вариант **Workspaces** или измените рабочие пространства в поле поиска.

Если у вас есть роль разработчика в организации и роль Workspace Admin в рабочем пространстве, вы можете добавить это рабочее пространство в назначение **Selected** или удалить его оттуда. Выберите это рабочее пространство в фильтре **Workspace**, затем откройте меню **More actions** назначения. В Claude Platform on AWS в Console нет роли Workspace Admin. Там то, кто может добавить рабочее пространство в назначение или удалить его оттуда, определяет ваша [политика IAM](https://platform.claude.com/docs/ru/api/claude-platform-on-aws-iam-actions).

API отправляет спаны в каждое включённое назначение, которое охватывает [рабочее пространство, в котором выполняется запрос или сеанс](https://platform.claude.com/docs/ru/manage-claude/workspaces#api-keys-and-resource-scoping).

## 3. Убедитесь, что спаны поступают

1. В Console выберите рабочее пространство, на которое распространяется назначение, и отправьте запрос к Messages API в [playground](https://platform.claude.com/playground). Вы также можете отправить запрос к Messages API из вашего приложения или запустить сеанс Managed Agents в этом рабочем пространстве. Чтобы запустить сеанс, вы можете выполнить шаги из руководства [Начало работы с Claude Managed Agents](https://platform.claude.com/docs/ru/managed-agents/quickstart).
2. В Console на [странице настроек OpenTelemetry](https://platform.claude.com/settings/telemetry-destinations) убедитесь, что в столбце **Delivery** для назначения отображается **Healthy**. Это может занять около минуты.
3. В вашей платформе наблюдаемости отфильтруйте по `service.name` = `claude-platform`, чтобы найти спаны запроса.

Если в столбце отображается **Failing**, наведите на него указатель, чтобы увидеть последнюю ошибку. Чтобы найти вероятную причину, см. [Ошибки доставки](https://platform.claude.com/docs/ru/manage-claude/opentelemetry/api#delivery-errors).

## 4. Свяжите спаны API с вашими собственными трассировками

По умолчанию спаны API для запроса к Messages API или сеанса Managed Agents находятся в собственных трассировках. Свяжите их с трассировками вашего приложения, чтобы они вкладывались в ваши собственные спаны.

API считывает контекст трассировки каждого запроса из [заголовка `traceparent`](https://www.w3.org/TR/trace-context/) W3C. Если флаг выборки в заголовке выключен, API не создаёт спан запроса и спаны под ним. Claude Platform on AWS пока не поддерживает этот заголовок. Спаны для запросов, которые вы туда отправляете, всегда начинают собственные трассировки, даже если флаг выборки выключен.

<Tabs>
  <Tab title="С Claude SDK">
    Чтобы связать спаны API, [настройте трассировку SDK](https://platform.claude.com/docs/ru/manage-claude/opentelemetry/sdk) в вашем приложении и вызывайте SDK изнутри одного из ваших собственных спанов. Тогда ваш спан будет содержать спан SDK, который содержит спан API. Отправляйте все эти спаны на одну и ту же платформу наблюдаемости, чтобы она могла показать их как одну трассировку. См. примеры трассировок [запроса к Messages API](https://platform.claude.com/docs/ru/manage-claude/opentelemetry#a-messages-api-request) и [сеанса Managed Agents](https://platform.claude.com/docs/ru/manage-claude/opentelemetry#a-managed-agents-session).

    Следующий пример отправляет сообщение пользователя в сеанс внутри вашего собственного спана:

    <CodeGroup exclude="shell">
      ```python Python
      from opentelemetry import trace

      tracer = trace.get_tracer("my-service")

      with tracer.start_as_current_span("summarize_issues"):
          client.beta.sessions.events.send(
              session.id,
              events=[
                  {
                      "type": "user.message",
                      "content": [{"type": "text", "text": "Summarize the open issues"}],
                  },
              ],
          )
      ```

      ```typescript TypeScript
      import { trace } from "@opentelemetry/api";

      const tracer = trace.getTracer("my-service");

      await tracer.startActiveSpan("summarize_issues", async (span) => {
        try {
          await client.beta.sessions.events.send(session.id, {
            events: [
              {
                type: "user.message",
                content: [{ type: "text", text: "Summarize the open issues" }]
              }
            ]
          });
        } finally {
          span.end();
        }
      });
      ```

      ```csharp C#
      using System.Diagnostics;

      // Добавьте этот источник в ваш tracer provider рядом с com.anthropic.sdk.csharp.
      var source = new ActivitySource("MyService");

      using (source.StartActivity("summarize_issues"))
      {
          // parameters содержит событие user.message.
          await client.Beta.Sessions.Events.Send(session.ID, parameters);
      }
      ```

      ```go Go
      // Передайте контекст, содержащий ваш span.
      ctx, span := otel.Tracer("my-service").Start(ctx, "summarize_issues")
      defer span.End()

      // params содержит событие user.message.
      _, err := client.Beta.Sessions.Events.Send(ctx, session.ID, params)
      ```

      ```java Java
      Tracer tracer = GlobalOpenTelemetry.getTracer("my-service");
      Span span = tracer.spanBuilder("summarize_issues").startSpan();

      try (Scope scope = span.makeCurrent()) {
          // params содержит событие user.message.
          client.beta().sessions().events().send(session.id(), params);
      } finally {
          span.end();
      }
      ```

      ```php PHP
      use OpenTelemetry\API\Globals;

      $tracer = Globals::tracerProvider()->getTracer('my-service');
      $span = $tracer->spanBuilder('summarize_issues')->startSpan();
      $scope = $span->activate();

      try {
          $client->beta->sessions->events->send(
              $session->id,
              events: [
                  [
                      'type' => 'user.message',
                      'content' => [
                          ['type' => 'text', 'text' => 'Summarize the open issues'],
                      ],
                  ],
              ],
          );
      } finally {
          $scope->detach();
          $span->end();
      }
      ```

      ```ruby Ruby
      tracer = OpenTelemetry.tracer_provider.tracer("my-service")

      tracer.in_span("summarize_issues") do
        client.beta.sessions.events.send_(
          session.id,
          events: [
            {
              type: "user.message",
              content: [{type: "text", text: "Summarize the open issues"}]
            }
          ]
        )
      end
      ```
    </CodeGroup>

    SDK записывает заголовок `traceparent` с помощью пропагатора вашего приложения, а флаг выборки в нём соответствует вашему сэмплеру. Если ваше приложение использует пропагатор, отличный от W3C trace context, например B3, также добавьте пропагатор W3C trace context.
  </Tab>

  <Tab title="С другими клиентами">
    Скопируйте контекст трассировки текущего спана в заголовки запроса, например когда вы создаёте сеанс Managed Agents или отправляете сообщение пользователя:

    <CodeGroup exclude="shell:CLI">
      ```bash cURL
      # TRACEPARENT — это traceparent активного span в вашем собственном сервисе,
      # например 00-<trace-id>-<span-id>-01.
      curl -fsSL "https://api.anthropic.com/v1/sessions/$SESSION_ID/events" \
        -H "x-api-key: $ANTHROPIC_API_KEY" \
        -H "anthropic-version: 2023-06-01" \
        -H "anthropic-beta: managed-agents-2026-04-01" \
        -H "content-type: application/json" \
        -H "traceparent: $TRACEPARENT" \
        -d '{
          "events": [
            {
              "type": "user.message",
              "content": [{"type": "text", "text": "Summarize the open issues"}]
            }
          ]
        }'
      ```

      ```python Python
      import os
      import httpx2
      from opentelemetry.trace.propagation.tracecontext import TraceContextTextMapPropagator

      headers = {
          "x-api-key": os.environ["ANTHROPIC_API_KEY"],
          "anthropic-version": "2023-06-01",
          "anthropic-beta": "managed-agents-2026-04-01",
          "content-type": "application/json",
      }
      # Копируем контекст трассировки активного span в заголовки запроса.
      TraceContextTextMapPropagator().inject(headers)

      httpx2.post(
          f"https://api.anthropic.com/v1/sessions/{os.environ['SESSION_ID']}/events",
          headers=headers,
          json={
              "events": [
                  {
                      "type": "user.message",
                      "content": [{"type": "text", "text": "Summarize the open issues"}],
                  },
              ],
          },
      )
      ```

      ```typescript TypeScript
      import { context, defaultTextMapSetter } from "@opentelemetry/api";
      import { W3CTraceContextPropagator } from "@opentelemetry/core";

      const headers: Record<string, string> = {
        "x-api-key": process.env.ANTHROPIC_API_KEY!,
        "anthropic-version": "2023-06-01",
        "anthropic-beta": "managed-agents-2026-04-01",
        "content-type": "application/json"
      };
      // Скопировать контекст трассировки активного span в заголовки запроса.
      new W3CTraceContextPropagator().inject(context.active(), headers, defaultTextMapSetter);

      await fetch(`https://api.anthropic.com/v1/sessions/${process.env.SESSION_ID}/events`, {
        method: "POST",
        headers,
        body: JSON.stringify({
          events: [
            {
              type: "user.message",
              content: [{ type: "text", text: "Summarize the open issues" }]
            }
          ]
        })
      });
      ```

      ```csharp C#
      using System.Diagnostics;
      using System.Net.Http.Json;
      using OpenTelemetry;
      using OpenTelemetry.Context.Propagation;

      using var httpClient = new HttpClient();
      using var request = new HttpRequestMessage(
          HttpMethod.Post,
          $"https://api.anthropic.com/v1/sessions/{Environment.GetEnvironmentVariable("SESSION_ID")}/events")
      {
          // JsonContent устанавливает заголовок content-type.
          Content = JsonContent.Create(new
          {
              events = new[]
              {
                  new
                  {
                      type = "user.message",
                      content = new[] { new { type = "text", text = "Summarize the open issues" } },
                  },
              },
          }),
      };
      request.Headers.Add("x-api-key", Environment.GetEnvironmentVariable("ANTHROPIC_API_KEY"));
      request.Headers.Add("anthropic-version", "2023-06-01");
      request.Headers.Add("anthropic-beta", "managed-agents-2026-04-01");

      // Копирует контекст трассировки активного span в заголовки запроса.
      new TraceContextPropagator().Inject(
          new PropagationContext(Activity.Current?.Context ?? default, Baggage.Current),
          request,
          (carrier, key, value) => carrier.Headers.Add(key, value));

      await httpClient.SendAsync(request);
      ```

      ```go Go
      import (
      	"context"
      	"net/http"
      	"os"
      	"strings"

      	"go.opentelemetry.io/otel/propagation"
      )

      func sendMessage(ctx context.Context) error {
      	body := strings.NewReader(`{
      		"events": [
      			{
      				"type": "user.message",
      				"content": [{"type": "text", "text": "Summarize the open issues"}]
      			}
      		]
      	}`)
      	req, err := http.NewRequestWithContext(ctx, http.MethodPost,
      		"https://api.anthropic.com/v1/sessions/"+os.Getenv("SESSION_ID")+"/events", body)
      	if err != nil {
      		return err
      	}
      	req.Header.Set("x-api-key", os.Getenv("ANTHROPIC_API_KEY"))
      	req.Header.Set("anthropic-version", "2023-06-01")
      	req.Header.Set("anthropic-beta", "managed-agents-2026-04-01")
      	req.Header.Set("content-type", "application/json")

      	// Скопировать контекст трассировки активного span в заголовки запроса.
      	propagation.TraceContext{}.Inject(ctx, propagation.HeaderCarrier(req.Header))

      	resp, err := http.DefaultClient.Do(req)
      	if err != nil {
      		return err
      	}
      	return resp.Body.Close()
      }
      ```

      ```java Java
      import io.opentelemetry.api.trace.propagation.W3CTraceContextPropagator;
      import io.opentelemetry.context.Context;
      import java.net.URI;
      import java.net.http.HttpClient;
      import java.net.http.HttpRequest;
      import java.net.http.HttpResponse;

      void main() throws Exception {
          var request = HttpRequest.newBuilder(URI.create(
                  "https://api.anthropic.com/v1/sessions/" + System.getenv("SESSION_ID") + "/events"))
              .header("x-api-key", System.getenv("ANTHROPIC_API_KEY"))
              .header("anthropic-version", "2023-06-01")
              .header("anthropic-beta", "managed-agents-2026-04-01")
              .header("content-type", "application/json")
              .POST(HttpRequest.BodyPublishers.ofString("""
                  {
                    "events": [
                      {
                        "type": "user.message",
                        "content": [{"type": "text", "text": "Summarize the open issues"}]
                      }
                    ]
                  }
                  """));

          // Скопировать контекст трассировки активного span в заголовки запроса.
          W3CTraceContextPropagator.getInstance()
              .inject(Context.current(), request, HttpRequest.Builder::header);

          HttpClient.newHttpClient().send(request.build(), HttpResponse.BodyHandlers.ofString());
      }
      ```

      ```php PHP
      use OpenTelemetry\API\Trace\Propagation\TraceContextPropagator;

      $headers = [
          'x-api-key' => getenv('ANTHROPIC_API_KEY'),
          'anthropic-version' => '2023-06-01',
          'anthropic-beta' => 'managed-agents-2026-04-01',
          'content-type' => 'application/json',
      ];
      // Скопировать контекст трассировки активного span в заголовки запроса.
      TraceContextPropagator::getInstance()->inject($headers);

      $ch = curl_init('https://api.anthropic.com/v1/sessions/' . getenv('SESSION_ID') . '/events');
      curl_setopt_array($ch, [
          CURLOPT_RETURNTRANSFER => true,
          CURLOPT_HTTPHEADER => array_map(
              static fn ($name, $value) => "$name: $value",
              array_keys($headers),
              $headers,
          ),
          CURLOPT_POSTFIELDS => json_encode([
              'events' => [
                  [
                      'type' => 'user.message',
                      'content' => [
                          ['type' => 'text', 'text' => 'Summarize the open issues'],
                      ],
                  ],
              ],
          ]),
      ]);
      curl_exec($ch);
      ```

      ```ruby Ruby
      require "json"
      require "net/http"
      require "opentelemetry"

      headers = {
        "x-api-key" => ENV.fetch("ANTHROPIC_API_KEY"),
        "anthropic-version" => "2023-06-01",
        "anthropic-beta" => "managed-agents-2026-04-01",
        "content-type" => "application/json"
      }
      # Копируем контекст трассировки активного span в заголовки запроса.
      OpenTelemetry::Trace::Propagation::TraceContext.text_map_propagator.inject(headers)

      Net::HTTP.post(
        URI("https://api.anthropic.com/v1/sessions/#{ENV.fetch("SESSION_ID")}/events"),
        {
          events: [
            {
              type: "user.message",
              content: [{type: "text", text: "Summarize the open issues"}]
            }
          ]
        }.to_json,
        headers
      )
      ```
    </CodeGroup>
  </Tab>
</Tabs>

Messages API также передаёт трассировку вашему серверу MCP, когда вы подключаете его с помощью [коннектора MCP](https://platform.claude.com/docs/ru/agents-and-tools/mcp-connector), чтобы он мог размещать собственные спаны под спанами API. Каждый запрос и уведомление, которые API отправляет вашему серверу MCP, содержат W3C `traceparent` в `params._meta`. В запросе `tools/call` он указывает на спан [`anthropic.mcp_tool_use`](https://platform.claude.com/docs/ru/api/opentelemetry/spans#anthropic-tool-use-anthropic-mcp-tool-use-and-anthropic-custom-tool-use) этого использования инструмента. В остальных сообщениях он указывает на спан [`anthropic.messages.create`](https://platform.claude.com/docs/ru/api/opentelemetry/spans#anthropic-messages-create). Для запроса, который API не трассирует, например запроса, у которого в заголовке `traceparent` выключен флаг выборки, API не отправляет `traceparent`.

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

<CardGroup cols={2}>
  <Card title="Настройка трассировки SDK" icon="code-brackets" href="https://platform.claude.com/docs/ru/manage-claude/opentelemetry/sdk">
    Получите наблюдаемость вашего клиента.
  </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>

## Доставка и состояние

Следующие правила применяются к спанам, которые API отправляет в ваши назначения.

* **Как минимум один раз:** назначение может получить один и тот же спан более одного раза. Чтобы удалить дубликаты, используйте идентификатор трассировки и идентификатор спана.
* **Без гарантий:** спан может быть потерян до доставки. API не может повторно отправить потерянный спан.
* **Сжатие:** API сжимает первый запрос каждой доставки с помощью gzip и устанавливает заголовок `Content-Encoding: gzip`. Если ваша конечная точка отвечает на этот запрос ответом `400` или `415`, API сразу же повторно отправляет те же спаны без сжатия.
* **Повторные попытки:** API повторяет доставку позже ограниченное число раз после тайм-аута, сбоя соединения, TLS или DNS либо ответа `408`, `429` или `5xx`. При других сбоях повторные попытки не выполняются.
* **Тайм-ауты:** для каждого запроса ваша конечная точка должна завершить TLS-рукопожатие в течение 5 секунд и отправить заголовки ответа в течение 5 секунд. Каждая доставка завершается по тайм-ауту через 10 секунд в общей сложности, включая повторную отправку без сжатия.
* **User agent:** каждый запрос содержит заголовок `User-Agent: Claude-Platform`.

Столбец **Delivery** показывает состояние каждого назначения. Состояние может отставать до одной минуты.

| Состояние доставки | Значение                                                                                       |
| ------------------ | ---------------------------------------------------------------------------------------------- |
| **Healthy**        | Последняя доставка прошла успешно.                                                             |
| **Failing**        | Последняя доставка завершилась сбоем. Чтобы увидеть ошибку, наведите указатель на **Failing**. |
| **No data**        | API ещё не пытался выполнить доставку.                                                         |
| **Disabled**       | Назначение не получает спаны. Чтобы узнать причину, наведите указатель на **Disabled**.        |

API отключает назначение, когда:

* Конечная точка отправляет перенаправление `3xx`.
* Имя хоста конечной точки разрешается в IP-адрес, который не является публичным.
* Все доставки завершаются сбоем в течение 24 часов.

API не отправляет спаны в отключённое назначение. Чтобы возобновить экспорт, устраните причину. Затем, когда фильтр **Workspace** на [странице настроек OpenTelemetry](https://platform.claude.com/settings/telemetry-destinations) показывает **All**, нажмите **Enable** в меню **More actions** назначения. Экспорт возобновится примерно в течение минуты.

Чтобы изменить назначение, откройте его меню **More actions**, когда фильтр **Workspace** показывает **All**. Затем нажмите **Edit**, **Disable**, **Enable** или **Delete**. Если вы меняете хост в **OTLP endpoint URL**, введите значения заголовков заново. Если у назначения есть **OTLP traces endpoint URL**, укажите для него тот же новый хост или очистите его.

## Ограничения

| Ограничение                                    | Значение       |
| ---------------------------------------------- | -------------- |
| Назначений на организацию, включая отключённые | 10             |
| Выбранных рабочих пространств на назначение    | 1 000          |
| Заголовков запроса на назначение               | 20             |
| Длина имени заголовка                          | 128 байт       |
| Длина значения заголовка                       | 4 096 байт     |
| Общая длина всех имён и значений заголовков    | 16 384 байта   |
| Длина URL конечной точки                       | 2 048 символов |

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

| Проблема                                                                                  | Что проверить                                                                                                                                                                                                                                                                                                                                                                            |
| ----------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Нет спанов API                                                                            | Рабочему пространству нужно включённое назначение, которое его охватывает. См. [Выберите рабочие пространства для назначения](https://platform.claude.com/docs/ru/manage-claude/opentelemetry/api#choose-workspaces-for-a-destination). После того как назначение начинает охватывать рабочее пространство, до поступления спанов из этого рабочего пространства может пройти до минуты. |
| В столбце **Delivery** отображается **Failing**                                           | Наведите на него указатель, чтобы увидеть последнюю ошибку. Чтобы найти вероятную причину, см. [Ошибки доставки](https://platform.claude.com/docs/ru/manage-claude/opentelemetry/api#delivery-errors).                                                                                                                                                                                   |
| В столбце **Delivery** отображается **Disabled**                                          | Наведите на него указатель, чтобы узнать причину. Список причин см. в разделе [когда API отключает назначение](https://platform.claude.com/docs/ru/manage-claude/opentelemetry/api#delivery-and-health).                                                                                                                                                                                 |
| Спаны не содержат подсказок или ответов, хотя для назначения задан режим **Full content** | У вашей организации может действовать ограничение на обработку данных HIPAA, FERPA или K-12, согласованное с Anthropic. См. [Режимы содержимого](https://platform.claude.com/docs/ru/manage-claude/opentelemetry#choose-a-content-mode).                                                                                                                                                 |

### Ошибки доставки

Когда доставка завершается неудачей, в столбце **Delivery** отображается **Failing**. Наведите на него указатель, чтобы увидеть ошибку, а затем определите вероятную причину:

| Ошибка                                              | Вероятная причина                                                                                                                                     |
| --------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------- |
| HTTP error (status 401) или HTTP error (status 403) | Неверный заголовок аутентификации                                                                                                                     |
| HTTP error (status 404)                             | Неверный путь в **OTLP endpoint URL** или **OTLP traces endpoint URL**                                                                                |
| DNS resolution failure                              | Имя хоста конечной точки не разрешается                                                                                                               |
| TLS failure                                         | Проблема с TLS, например с сертификатом конечной точки                                                                                                |
| Timeout                                             | Конечная точка не ответила вовремя. См. [тайм-ауты доставки](https://platform.claude.com/docs/ru/manage-claude/opentelemetry/api#delivery-and-health) |
| Connection failure                                  | API не удалось подключиться к конечной точке                                                                                                          |
