<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
	<id>https://doc.ruscomtech.ru/index.php?action=history&amp;feed=atom&amp;title=Go_OpenTelemetry</id>
	<title>Go OpenTelemetry - История изменений</title>
	<link rel="self" type="application/atom+xml" href="https://doc.ruscomtech.ru/index.php?action=history&amp;feed=atom&amp;title=Go_OpenTelemetry"/>
	<link rel="alternate" type="text/html" href="https://doc.ruscomtech.ru/index.php?title=Go_OpenTelemetry&amp;action=history"/>
	<updated>2026-05-02T12:06:00Z</updated>
	<subtitle>История изменений этой страницы в вики</subtitle>
	<generator>MediaWiki 1.36.1</generator>
	<entry>
		<id>https://doc.ruscomtech.ru/index.php?title=Go_OpenTelemetry&amp;diff=5864&amp;oldid=prev</id>
		<title>IKuznetsov: Новая страница: «В этом пошаговом руководстве показано, как добавить возможность наблюдения в ваше прило...»</title>
		<link rel="alternate" type="text/html" href="https://doc.ruscomtech.ru/index.php?title=Go_OpenTelemetry&amp;diff=5864&amp;oldid=prev"/>
		<updated>2025-10-15T16:20:57Z</updated>

		<summary type="html">&lt;p&gt;Новая страница: «В этом пошаговом руководстве показано, как добавить возможность наблюдения в ваше прило...»&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Новая страница&lt;/b&gt;&lt;/p&gt;&lt;div&gt;В этом пошаговом руководстве показано, как добавить возможность наблюдения в ваше приложение '''Go''' с помощью библиотек и инструментов '''OpenTelemetry''' '''Go'''.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Особенность&lt;br /&gt;
!Поддержка&lt;br /&gt;
|-&lt;br /&gt;
|Автоматические инструменты&lt;br /&gt;
|Да&lt;br /&gt;
|-&lt;br /&gt;
|Трассировки&lt;br /&gt;
|Да&lt;br /&gt;
|-&lt;br /&gt;
|Метрики&lt;br /&gt;
|Да&lt;br /&gt;
|-&lt;br /&gt;
|Логи&lt;br /&gt;
|Нет&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Предустановка ==&lt;br /&gt;
&lt;br /&gt;
* Ключ-АСТРОМ версии '''1.222+'''&lt;br /&gt;
* Для трассировки включен контекст трассировки '''W3C'''.&lt;br /&gt;
*# Перейдите в '''Настройки &amp;gt; Предустановка &amp;gt; Функции ЕдиногоАгента'''.&lt;br /&gt;
*# Включите опцию '''Отправлять HTTP-заголовки контекста трассировки W3C'''.&lt;br /&gt;
&lt;br /&gt;
== Получение данных для доступа к Ключ-АСТРОМ ==&lt;br /&gt;
&lt;br /&gt;
=== Определение базового URL API ===&lt;br /&gt;
Подробную информацию о сборке базового '''URL-адреса''' конечной точки '''OTLP''' см. в разделе [[Экспорт с помощью OTLP]]. URL-адрес должен заканчиваться на &amp;lt;code&amp;gt;/api/v2/otlp&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Получение токена доступа API ===&lt;br /&gt;
Токен доступа для сбора трассировок, логов и метрик можно создать в разделе [[Токен доступа|Токены доступа]].&lt;br /&gt;
&lt;br /&gt;
Экспорт с помощью '''OTLP''' содержит более подробную информацию о формате и необходимых областях доступа.&lt;br /&gt;
&lt;br /&gt;
== Выберите, как вы хотите инструментировать свое приложение ==&lt;br /&gt;
'''OpenTelemetry''' поддерживает автоматическое и ручное инструментирование на '''Go''', а также их комбинацию.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|&amp;lt;u&amp;gt;Какой инструментарий выбрать?&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Рекомендуется начать с автоматического измерения и добавить ручное измерение, если автоматический подход не работает или не дает достаточно информации.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Инициализирование OpenTelemetry ==&lt;br /&gt;
1. Добавьте следующие операторы импорта.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|import (&lt;br /&gt;
&lt;br /&gt;
  &amp;quot;context&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  &amp;quot;github.com/astromkey/OneAgent-SDK-for-Go/sdk&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  &amp;quot;go.opentelemetry.io/otel&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  &amp;quot;go.opentelemetry.io/otel/attribute&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  &amp;quot;go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  &amp;quot;go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  &amp;quot;go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  &amp;quot;go.opentelemetry.io/otel/propagation&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  &amp;quot;go.opentelemetry.io/otel/trace&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  sdkmetric &amp;quot;go.opentelemetry.io/otel/sdk/metric&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  &amp;quot;go.opentelemetry.io/otel/sdk/metric/metricdata&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  &amp;quot;go.opentelemetry.io/otel/sdk/resource&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  sdktrace &amp;quot;go.opentelemetry.io/otel/sdk/trace&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  semconv &amp;quot;go.opentelemetry.io/otel/semconv/v1.20.0&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  &amp;quot;log&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  &amp;quot;time&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  &amp;quot;log/slog&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  &amp;quot;go.opentelemetry.io/contrib/bridges/otelslog&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  &amp;quot;go.opentelemetry.io/otel/log/global&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  sdklog &amp;quot;go.opentelemetry.io/otel/sdk/log&amp;quot;&lt;br /&gt;
&lt;br /&gt;
)&lt;br /&gt;
|}&lt;br /&gt;
2. [https://go.dev/ref/mod#go-mod-tidy Запустите команду﻿ '''Go''' &amp;lt;code&amp;gt;mod tidy&amp;lt;/code&amp;gt;] для установки зависимостей.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|go mod tidy&lt;br /&gt;
|}&lt;br /&gt;
3. Добавьте следующий код в стартовый файл и укажите соответствующие значения для &amp;lt;code&amp;gt;DT_API_HOST&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;DT_API_TOKEN&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;DT_API_HOST&amp;lt;/code&amp;gt; должен содержать только имя хоста вашего '''URL-адреса''' Ключ-АСТРОМ (например, &amp;lt;code&amp;gt;XXXXX.live.astromkey.com&amp;lt;/code&amp;gt;); он не является URL-адресом и не должен содержать никаких схем или путей&lt;br /&gt;
* &amp;lt;code&amp;gt;DT_API_TOKEN&amp;lt;/code&amp;gt; должен содержать токен доступа&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|func InitOpenTelemetry() {&lt;br /&gt;
&lt;br /&gt;
  // ===== GENERAL SETUP =====&lt;br /&gt;
&lt;br /&gt;
  DT_API_HOST := &amp;quot;&amp;quot; // Only the host part of your astromkey URL&lt;br /&gt;
&lt;br /&gt;
  DT_API_BASE_PATH := &amp;quot;/api/v2/otlp&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  DT_API_TOKEN := &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  authHeader := map[string]string{&amp;quot;Authorization&amp;quot;: &amp;quot;Api-Token &amp;quot; + DT_API_TOKEN}&lt;br /&gt;
&lt;br /&gt;
  ctx := context.Background()&lt;br /&gt;
&lt;br /&gt;
  oneagentsdk := sdk.CreateInstance()&lt;br /&gt;
&lt;br /&gt;
  dtMetadata := oneagentsdk.GetEnrichmentMetadata()&lt;br /&gt;
&lt;br /&gt;
  var attributes []attribute.KeyValue&lt;br /&gt;
&lt;br /&gt;
  for k, v := range dtMetadata {&lt;br /&gt;
&lt;br /&gt;
    attributes = append(attributes, attribute.KeyValue{Key: attribute.Key(k), Value: attribute.StringValue(v)})&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  attributes = append(attributes,&lt;br /&gt;
&lt;br /&gt;
    semconv.ServiceNameKey.String(&amp;quot;go-quickstart&amp;quot;), //TODO Replace with the name of your application&lt;br /&gt;
&lt;br /&gt;
    semconv.ServiceVersionKey.String(&amp;quot;1.0.1&amp;quot;),      //TODO Replace with the version of your application&lt;br /&gt;
&lt;br /&gt;
  )&lt;br /&gt;
&lt;br /&gt;
  res, err := resource.New(ctx, resource.WithAttributes(attributes...))&lt;br /&gt;
&lt;br /&gt;
  if err != nil {&lt;br /&gt;
&lt;br /&gt;
    log.Fatalf(&amp;quot;Failed to create resource: %v&amp;quot;, err)&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
  // ===== TRACING SETUP =====&lt;br /&gt;
&lt;br /&gt;
  exporter, err := otlptracehttp.New(&lt;br /&gt;
&lt;br /&gt;
    ctx,&lt;br /&gt;
&lt;br /&gt;
    otlptracehttp.WithEndpoint(DT_API_HOST),&lt;br /&gt;
&lt;br /&gt;
    otlptracehttp.WithURLPath(DT_API_BASE_PATH+&amp;quot;/v1/traces&amp;quot;),&lt;br /&gt;
&lt;br /&gt;
    otlptracehttp.WithHeaders(authHeader),&lt;br /&gt;
&lt;br /&gt;
  )&lt;br /&gt;
&lt;br /&gt;
  if err != nil {&lt;br /&gt;
&lt;br /&gt;
    log.Fatalf(&amp;quot;Failed to create OTLP exporter: %v&amp;quot;, err)&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  tp := sdktrace.NewTracerProvider(&lt;br /&gt;
&lt;br /&gt;
    sdktrace.WithResource(res),&lt;br /&gt;
&lt;br /&gt;
    sdktrace.WithSampler(sdktrace.AlwaysSample()),&lt;br /&gt;
&lt;br /&gt;
    sdktrace.WithBatcher(exporter),&lt;br /&gt;
&lt;br /&gt;
  )&lt;br /&gt;
&lt;br /&gt;
  otel.SetTracerProvider(tp)&lt;br /&gt;
&lt;br /&gt;
  otel.SetTextMapPropagator(propagation.NewCompositeTextMapPropagator(propagation.TraceContext{}, propagation.Baggage{}))&lt;br /&gt;
&lt;br /&gt;
  // ===== METRIC SETUP =====&lt;br /&gt;
&lt;br /&gt;
  var deltaTemporalitySelector = func(sdkmetric.InstrumentKind) metricdata.Temporality { return metricdata.DeltaTemporality }&lt;br /&gt;
&lt;br /&gt;
  metricsExporter, err := otlpmetrichttp.New(&lt;br /&gt;
&lt;br /&gt;
    ctx,&lt;br /&gt;
&lt;br /&gt;
    otlpmetrichttp.WithEndpoint(DT_API_HOST),&lt;br /&gt;
&lt;br /&gt;
    otlpmetrichttp.WithURLPath(DT_API_BASE_PATH+&amp;quot;/v1/metrics&amp;quot;),&lt;br /&gt;
&lt;br /&gt;
    otlpmetrichttp.WithHeaders(authHeader),&lt;br /&gt;
&lt;br /&gt;
    otlpmetrichttp.WithTemporalitySelector(deltaTemporalitySelector),&lt;br /&gt;
&lt;br /&gt;
  )&lt;br /&gt;
&lt;br /&gt;
  if err != nil {&lt;br /&gt;
&lt;br /&gt;
    log.Fatalf(&amp;quot;Failed to create OTLP exporter: %v&amp;quot;, err)&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  mp := sdkmetric.NewMeterProvider(&lt;br /&gt;
&lt;br /&gt;
    sdkmetric.WithResource(res),&lt;br /&gt;
&lt;br /&gt;
    sdkmetric.WithReader(sdkmetric.NewPeriodicReader(metricsExporter, sdkmetric.WithInterval(2*time.Second))),&lt;br /&gt;
&lt;br /&gt;
  )&lt;br /&gt;
&lt;br /&gt;
  otel.SetMeterProvider(mp)&lt;br /&gt;
&lt;br /&gt;
  // ===== LOG SETUP =====&lt;br /&gt;
&lt;br /&gt;
  logExporter, err := otlploghttp.New(&lt;br /&gt;
&lt;br /&gt;
    ctx,&lt;br /&gt;
&lt;br /&gt;
    otlploghttp.WithEndpoint(DT_API_HOST),&lt;br /&gt;
&lt;br /&gt;
    otlploghttp.WithURLPath(DT_API_BASE_PATH+&amp;quot;/v1/logs&amp;quot;),&lt;br /&gt;
&lt;br /&gt;
    otlploghttp.WithHeaders(authHeader),&lt;br /&gt;
&lt;br /&gt;
  )&lt;br /&gt;
&lt;br /&gt;
  if err != nil {&lt;br /&gt;
&lt;br /&gt;
    log.Fatalf(&amp;quot;Failed to create OTLP exporter: %v&amp;quot;, err)&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  lp := sdklog.NewLoggerProvider(&lt;br /&gt;
&lt;br /&gt;
    sdklog.WithProcessor(sdklog.NewBatchProcessor(logExporter)),&lt;br /&gt;
&lt;br /&gt;
    sdklog.WithResource(res),&lt;br /&gt;
&lt;br /&gt;
  )&lt;br /&gt;
&lt;br /&gt;
  global.SetLoggerProvider(lp)&lt;br /&gt;
&lt;br /&gt;
  logger := otelslog.NewLogger(&amp;quot;my-logger-scope&amp;quot;, otelslog.WithLoggerProvider(lp))&lt;br /&gt;
&lt;br /&gt;
  slog.SetDefault(logger) // here we are overwriting the sdtout to http logger exporter&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
|}&lt;br /&gt;
4. Обязательно вызовите функцию '''OpenTelemetry''' &amp;lt;code&amp;gt;InitOpenTelemetry&amp;lt;/code&amp;gt; как можно раньше в коде запуска, чтобы инициализировать ее.&lt;br /&gt;
&lt;br /&gt;
== Автоматическое инструментирование приложения (необязательно) ==&lt;br /&gt;
1. Просмотрите [https://opentelemetry.io/ecosystem/registry/?language=go&amp;amp;component=instrumentation реестр '''OpenTelemetry''']﻿ и выберите библиотеки инструментария, соответствующие библиотекам вашего приложения.&lt;br /&gt;
&lt;br /&gt;
2. Добавьте соответствующие пакеты в ваши заявления об импорте.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|import (&lt;br /&gt;
&lt;br /&gt;
  &amp;quot;go.opentelemetry.io/[PACKAGE]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
)&lt;br /&gt;
|}&lt;br /&gt;
3. [https://go.dev/ref/mod#go-mod-tidy Запустите команду﻿ Go &amp;lt;code&amp;gt;mod tiny&amp;lt;/code&amp;gt;] для установки зависимостей.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|go mod tidy&lt;br /&gt;
|}&lt;br /&gt;
4. Оберните существующий код вызовами вспомогательных библиотек.&lt;br /&gt;
&lt;br /&gt;
=== Пример для &amp;lt;code&amp;gt;net/http&amp;lt;/code&amp;gt; ===&lt;br /&gt;
1. Установить [https://pkg.go.dev/go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp библиотеку инструментов для &amp;lt;code&amp;gt;net/http&amp;lt;/code&amp;gt;]﻿.&lt;br /&gt;
&lt;br /&gt;
2. Добавьте пакет в ваши импортные заявления.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|import (&lt;br /&gt;
&lt;br /&gt;
  // other packages&lt;br /&gt;
&lt;br /&gt;
  &amp;quot;go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp&amp;quot;&lt;br /&gt;
&lt;br /&gt;
)&lt;br /&gt;
|}&lt;br /&gt;
3. Оберните функцию обработчика HTTP.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|handler := http.HandlerFunc(httpHandler)&lt;br /&gt;
&lt;br /&gt;
wrappedHandler := otelhttp.NewHandler(handler, &amp;quot;my-span&amp;quot;) //TODO Replace with the name of your span&lt;br /&gt;
&lt;br /&gt;
//Use the wrappedHandler with your handle&lt;br /&gt;
&lt;br /&gt;
http.Handle(&amp;quot;/&amp;quot;, wrappedHandler)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Инструментирование приложения вручную ==&lt;br /&gt;
&lt;br /&gt;
=== Добавление трассировки ===&lt;br /&gt;
1. Сначала вам нужно получить объект трассировки.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|tracer := otel.Tracer(&amp;quot;my-tracer&amp;quot;)&lt;br /&gt;
|}&lt;br /&gt;
2. С помощью &amp;lt;code&amp;gt;tracer&amp;lt;/code&amp;gt;, вы теперь можете использовать конструктор интервалов для создания и запуска новых интервалов.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|_, span := tracer.Start(r.Context(), &amp;quot;Call to /myendpoint&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
defer span.End()&lt;br /&gt;
&lt;br /&gt;
span.SetAttributes(attribute.String(&amp;quot;http.method&amp;quot;, &amp;quot;GET&amp;quot;), attribute.String(&amp;quot;net.protocol.version&amp;quot;, &amp;quot;1.1&amp;quot;))&lt;br /&gt;
&lt;br /&gt;
// TODO your code goes here&lt;br /&gt;
|}&lt;br /&gt;
В приведенном выше коде мы:&lt;br /&gt;
&lt;br /&gt;
* Создали новый диапазон и назвали его «Call to /myendpoint».&lt;br /&gt;
* Запланировали отложенный вызов &amp;lt;code&amp;gt;End()&amp;lt;/code&amp;gt;, чтобы гарантировать правильное закрытие диапазона при возврате функции.&lt;br /&gt;
* Добавили два атрибута, следуя [https://opentelemetry.io/docs/specs/semconv/general/trace/ семантическому соглашению об именовании]﻿, специфичные для действия этого диапазона: информацию о методе '''HTTP''' и версии.&lt;br /&gt;
* Добавьте &amp;lt;code&amp;gt;TODO&amp;lt;/code&amp;gt; вместо конечной бизнес-логики.&lt;br /&gt;
&lt;br /&gt;
=== Сбор метрик ===&lt;br /&gt;
1. Получите объект метрик.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|meter := otel.Meter(&amp;quot;my-meter&amp;quot;)&lt;br /&gt;
|}&lt;br /&gt;
2. С помощью &amp;lt;code&amp;gt;meter&amp;lt;/code&amp;gt; мы теперь можем создавать отдельные инструменты, например, метрику.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|requestCounter, _ := meter.Int64Counter(&amp;quot;request_counter&amp;quot;)&lt;br /&gt;
|}&lt;br /&gt;
3. Теперь мы можем вызвать метод &amp;lt;code&amp;gt;Add()&amp;lt;/code&amp;gt; для записи новых значений &amp;lt;code&amp;gt;requestCounter&amp;lt;/code&amp;gt; с помощью счетчика.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|requestCounter.Add(context.Background(), 1)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Подключение логов ===&lt;br /&gt;
После инициализации логов '''OpenTelemetry''' &amp;lt;code&amp;gt;InitOpenTelemetry()&amp;lt;/code&amp;gt; и настройки его в качестве регистратора по умолчанию для '''[https://pkg.go.dev/log/slog slog]'''﻿ мы теперь можем вызывать любую из функций логов '''slog''' (например, &amp;lt;code&amp;gt;[https://pkg.go.dev/log/slog#Info Info()]&amp;lt;/code&amp;gt;) для отправки информации логов в Ключ-АСТРОМ.﻿&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|slog.Info(&amp;quot;an info message&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
slog.Debug(&amp;quot;a debug message&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
slog.Error(&amp;quot;an error&amp;quot;)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Обеспечение распространения контекста (необязательно) ===&lt;br /&gt;
Распространение контекста особенно важно, когда задействованы сетевые вызовы (например, '''REST''').&lt;br /&gt;
&lt;br /&gt;
==== Извлечение контекста при получении запроса ====&lt;br /&gt;
В следующем примере мы предполагаем, что мы получили сетевой вызов через библиотеку &amp;lt;code&amp;gt;[https://pkg.go.dev/net/http net/http]&amp;lt;/code&amp;gt; и его тип &amp;lt;code&amp;gt;[https://pkg.go.dev/net/http#Request Request]&amp;lt;/code&amp;gt;.﻿﻿&lt;br /&gt;
&lt;br /&gt;
Чтобы получить дескриптор исходного контекста (предоставленного вызывающей службой), мы передаём объект HTTP-заголовка ( &amp;lt;code&amp;gt;r.Header&amp;lt;/code&amp;gt;) функции &amp;lt;code&amp;gt;Extract&amp;lt;/code&amp;gt; глобального propagator singleton, которая создаёт экземпляр этого контекста и возвращает результат в &amp;lt;code&amp;gt;parentCtx&amp;lt;/code&amp;gt;. Это позволяет нам продолжить предыдущую трассировку с помощью наших собственных интервалов.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|func httpHandler(w http.ResponseWriter, r *http.Request) {&lt;br /&gt;
&lt;br /&gt;
  parentCtx := otel.GetTextMapPropagator().Extract(r.Context(), propagation.HeaderCarrier(r.Header))&lt;br /&gt;
&lt;br /&gt;
  tracer := otel.Tracer(&amp;quot;my-tracer&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
  ctx, span := tracer.Start(&lt;br /&gt;
&lt;br /&gt;
    parentCtx,&lt;br /&gt;
&lt;br /&gt;
    &amp;quot;manual-server&amp;quot;, //TODO Replace with the name of your span&lt;br /&gt;
&lt;br /&gt;
    trace.WithAttributes(&lt;br /&gt;
&lt;br /&gt;
      attribute.String(&amp;quot;my-key-1&amp;quot;, &amp;quot;my-value-1&amp;quot;), //TODO Add attributes&lt;br /&gt;
&lt;br /&gt;
    ),&lt;br /&gt;
&lt;br /&gt;
  )&lt;br /&gt;
&lt;br /&gt;
  defer span.End()&lt;br /&gt;
&lt;br /&gt;
  //TODO your code goes here&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Внедрение контекста при отправке запросов ====&lt;br /&gt;
В следующем примере мы создаём новый экземпляр &amp;lt;code&amp;gt;[https://pkg.go.dev/net/http#Request Request]&amp;lt;/code&amp;gt; и передаём объект вызову &amp;lt;code&amp;gt;InjectDo&amp;lt;/code&amp;gt; глобального propagator singleton. Это добавляет необходимые '''HTTP-заголовки''' к объекту запроса, который мы в конечном итоге передаём для выполнения сетевого запроса.﻿&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|client := http.Client{}&lt;br /&gt;
&lt;br /&gt;
req, err := http.NewRequest(&amp;quot;&amp;lt;method&amp;gt;&amp;quot;, &amp;quot;&amp;lt;url&amp;gt;&amp;quot;, &amp;lt;body&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
if err != nil {&lt;br /&gt;
&lt;br /&gt;
  // TODO handle error&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Method to inject the current context in the request headers&lt;br /&gt;
&lt;br /&gt;
otel.GetTextMapPropagator().Inject(ctx, propagation.HeaderCarrier(req.Header))&lt;br /&gt;
&lt;br /&gt;
client.Do(req) // Your call goes here&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Настройте сбор данных в соответствии с требованиями конфиденциальности (необязательно) ==&lt;br /&gt;
Хотя Ключ-АСТРОМ автоматически собирает все атрибуты '''OpenTelemetry''', в веб-интерфейсе Ключ-АСТРОМ сохраняются и отображаются только значения атрибутов, указанные в списке разрешенных. Это предотвращает случайное сохранение персональных данных, позволяя вам соблюдать требования к конфиденциальности и контролировать объем хранимых данных мониторинга.&lt;br /&gt;
&lt;br /&gt;
Чтобы просматривать пользовательские атрибуты, необходимо сначала разрешить их использование в веб-интерфейсе Ключ-АСТРОМ.&lt;br /&gt;
&lt;br /&gt;
== Проверка загрузки данных в Ключ-АСТРОМ ==&lt;br /&gt;
После завершения инструментирования вашего приложения выполните несколько тестовых действий для создания и отправки демонстрационных трассировок, метрик и логов, а также проверьте, что они были правильно загружены в Ключ-АСТРОМ.&lt;br /&gt;
&lt;br /&gt;
Чтобы сделать это для трассировок, перейдите в раздел '''Трассировки''' и выберите вкладку '''Распределенные трассировки'''. Если вы используете ЕдиныйАгент, выберите '''PurePaths''' .&lt;br /&gt;
&lt;br /&gt;
Для просмотра метрик и логов перейдите в раздел '''Метрики''' или '''Логов''' или '''Логи и события'''.&lt;/div&gt;</summary>
		<author><name>IKuznetsov</name></author>
	</entry>
</feed>