<?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=C%2B%2B_OpenTelemetry</id>
	<title>C++ OpenTelemetry - История изменений</title>
	<link rel="self" type="application/atom+xml" href="https://doc.ruscomtech.ru/index.php?action=history&amp;feed=atom&amp;title=C%2B%2B_OpenTelemetry"/>
	<link rel="alternate" type="text/html" href="https://doc.ruscomtech.ru/index.php?title=C%2B%2B_OpenTelemetry&amp;action=history"/>
	<updated>2026-05-02T12:05:57Z</updated>
	<subtitle>История изменений этой страницы в вики</subtitle>
	<generator>MediaWiki 1.36.1</generator>
	<entry>
		<id>https://doc.ruscomtech.ru/index.php?title=C%2B%2B_OpenTelemetry&amp;diff=5858&amp;oldid=prev</id>
		<title>IKuznetsov в 09:06, 15 октября 2025</title>
		<link rel="alternate" type="text/html" href="https://doc.ruscomtech.ru/index.php?title=C%2B%2B_OpenTelemetry&amp;diff=5858&amp;oldid=prev"/>
		<updated>2025-10-15T09:06:00Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;ru&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Предыдущая&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Версия 09:06, 15 октября 2025&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l217&quot;&gt;Строка 217:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 217:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;     resource::ResourceAttributes resource_attributes = &amp;lt;nowiki&amp;gt;{{&amp;quot;service.name&amp;quot;, name},&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;     resource::ResourceAttributes resource_attributes = &amp;lt;nowiki&amp;gt;{{&amp;quot;service.name&amp;quot;, name},&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;                                                        &lt;/del&gt;{&amp;quot;service.version&amp;quot;, version}}&amp;lt;/nowiki&amp;gt;;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;                                                         &lt;/ins&gt;{&amp;quot;service.version&amp;quot;, version}}&amp;lt;/nowiki&amp;gt;;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;  resource::ResourceAttributes dt_resource_attributes;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;  resource::ResourceAttributes dt_resource_attributes;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;  try&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;  try&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;  {&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;  {&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;    for (string name : {&amp;quot;dt_metadata_e617c525669e072eebe3d0f08212e8f2.properties&amp;quot;,&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;    for (string name : {&amp;quot;dt_metadata_e617c525669e072eebe3d0f08212e8f2.properties&amp;quot;,&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;                        &amp;quot;/var/lib/&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;dynatrace&lt;/del&gt;/enrichment/dt_metadata.properties&amp;quot;,&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;                        &amp;quot;/var/lib/&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;astromkey&lt;/ins&gt;/enrichment/dt_metadata.properties&amp;quot;,&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;                        &amp;quot;/var/lib/&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;dynatrace&lt;/del&gt;/enrichment/dt_host_metadata.properties&amp;quot;})&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;                        &amp;quot;/var/lib/&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;astromkey&lt;/ins&gt;/enrichment/dt_host_metadata.properties&amp;quot;})&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;    {&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;    {&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;      string file_path;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;      string file_path;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l271&quot;&gt;Строка 271:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 271:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;void initMeter() {&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;void initMeter() {&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;  resource::ResourceAttributes resource_attributes = &amp;lt;nowiki&amp;gt;{{&amp;quot;service.name&amp;quot;, name},&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;  resource::ResourceAttributes resource_attributes = &amp;lt;nowiki&amp;gt;{{&amp;quot;service.name&amp;quot;, name},&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;                                                        &lt;/del&gt;{&amp;quot;service.version&amp;quot;, version}}&amp;lt;/nowiki&amp;gt;;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;                                                         &lt;/ins&gt;{&amp;quot;service.version&amp;quot;, version}}&amp;lt;/nowiki&amp;gt;;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;  otlp::OtlpHttpMetricExporterOptions otlpOptions;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;  otlp::OtlpHttpMetricExporterOptions otlpOptions;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;  auto resource = resource::Resource::Create(resource_attributes);&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;  auto resource = resource::Resource::Create(resource_attributes);&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>IKuznetsov</name></author>
	</entry>
	<entry>
		<id>https://doc.ruscomtech.ru/index.php?title=C%2B%2B_OpenTelemetry&amp;diff=5857&amp;oldid=prev</id>
		<title>IKuznetsov: Новая страница: «В этом пошаговом руководстве показано, как добавить возможность наблюдения в ваше прило...»</title>
		<link rel="alternate" type="text/html" href="https://doc.ruscomtech.ru/index.php?title=C%2B%2B_OpenTelemetry&amp;diff=5857&amp;oldid=prev"/>
		<updated>2025-10-15T09:05:47Z</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;В этом пошаговом руководстве показано, как добавить возможность наблюдения в ваше приложение '''C++''' с помощью библиотек и инструментов '''OpenTelemetry C++'''.&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;
* [https://github.com/open-telemetry/opentelemetry-cpp/blob/main/README.md#supported-development-platforms Поддерживаемый]﻿ компилятор '''C++''' ('''C++ 11''' и более поздние версии)&lt;br /&gt;
* Библиотека [https://github.com/protocolbuffers/protobuf/blob/main/src/README.md буферов протоколов]﻿&lt;br /&gt;
* Библиотека [https://github.com/open-telemetry/opentelemetry-cpp/blob/main/INSTALL.md OpenTelemetry]﻿&lt;br /&gt;
* Для трассировки включен контекст трассировки '''W3C'''.&lt;br /&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;
== Настройка OpenTelemetry ==&lt;br /&gt;
1. Добавьте следующие директивы в конфигурацию сборки '''CMake''' &amp;lt;code&amp;gt;CMakeLists.txt&amp;lt;/code&amp;gt;:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|find_package(CURL REQUIRED)&lt;br /&gt;
&lt;br /&gt;
find_package(Protobuf REQUIRED)&lt;br /&gt;
&lt;br /&gt;
find_package(opentelemetry-cpp CONFIG REQUIRED)&lt;br /&gt;
&lt;br /&gt;
include_directories(&amp;quot;${OPENTELEMETRY_CPP_INCLUDE_DIRS}&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
target_link_libraries(&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;YOUR_EXE_NAME&amp;gt; ${OPENTELEMETRY_CPP_LIBRARIES}&lt;br /&gt;
&lt;br /&gt;
    opentelemetry_trace&lt;br /&gt;
&lt;br /&gt;
    opentelemetry_common&lt;br /&gt;
&lt;br /&gt;
    opentelemetry_http_client_curl&lt;br /&gt;
&lt;br /&gt;
    opentelemetry_exporter_otlp_http&lt;br /&gt;
&lt;br /&gt;
    opentelemetry_exporter_otlp_http_client&lt;br /&gt;
&lt;br /&gt;
    opentelemetry_otlp_recordable&lt;br /&gt;
&lt;br /&gt;
    opentelemetry_resources&lt;br /&gt;
&lt;br /&gt;
    opentelemetry_metrics&lt;br /&gt;
&lt;br /&gt;
    opentelemetry_exporter_otlp_http_metric&lt;br /&gt;
&lt;br /&gt;
)&lt;br /&gt;
|}&lt;br /&gt;
2. Создайте файл с именем &amp;lt;code&amp;gt;otel.h&amp;lt;/code&amp;gt; в директорииии вашего приложения и сохраните следующее содержимое:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|#include &amp;quot;opentelemetry/trace/provider.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;#&amp;lt;/nowiki&amp;gt;include &amp;quot;opentelemetry/trace/propagation/http_trace_context.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;#&amp;lt;/nowiki&amp;gt;include &amp;quot;opentelemetry/context/propagation/global_propagator.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;#&amp;lt;/nowiki&amp;gt;include &amp;quot;opentelemetry/sdk/trace/simple_processor_factory.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;#&amp;lt;/nowiki&amp;gt;include &amp;quot;opentelemetry/sdk/trace/tracer_context.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;#&amp;lt;/nowiki&amp;gt;include &amp;quot;opentelemetry/sdk/trace/tracer_context_factory.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;#&amp;lt;/nowiki&amp;gt;include &amp;quot;opentelemetry/sdk/trace/tracer_provider_factory.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;#&amp;lt;/nowiki&amp;gt;include &amp;quot;opentelemetry/exporters/ostream/span_exporter_factory.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;#&amp;lt;/nowiki&amp;gt;include &amp;quot;opentelemetry/exporters/otlp/otlp_http_exporter_factory.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;#&amp;lt;/nowiki&amp;gt;include &amp;quot;opentelemetry/metrics/provider.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;#&amp;lt;/nowiki&amp;gt;include &amp;quot;opentelemetry/sdk/metrics/export/periodic_exporting_metric_reader.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;#&amp;lt;/nowiki&amp;gt;include &amp;quot;opentelemetry/sdk/metrics/view/view_registry_factory.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;#&amp;lt;/nowiki&amp;gt;include &amp;quot;opentelemetry/sdk/metrics/meter_context_factory.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;#&amp;lt;/nowiki&amp;gt;include &amp;quot;opentelemetry/sdk/metrics/meter_provider_factory.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;#&amp;lt;/nowiki&amp;gt;include &amp;quot;opentelemetry/exporters/ostream/metric_exporter_factory.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;#&amp;lt;/nowiki&amp;gt;include &amp;quot;opentelemetry/exporters/otlp/otlp_http_metric_exporter_factory.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;#&amp;lt;/nowiki&amp;gt;include &amp;quot;opentelemetry/logs/provider.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;#&amp;lt;/nowiki&amp;gt;include &amp;quot;opentelemetry/sdk/logs/logger.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;#&amp;lt;/nowiki&amp;gt;include &amp;quot;opentelemetry/sdk/logs/logger_provider_factory.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;#&amp;lt;/nowiki&amp;gt;include &amp;quot;opentelemetry/sdk/logs/simple_log_record_processor_factory.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;#&amp;lt;/nowiki&amp;gt;include &amp;quot;opentelemetry/sdk/logs/logger_context_factory.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;#&amp;lt;/nowiki&amp;gt;include &amp;quot;opentelemetry/exporters/ostream/log_record_exporter.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;#&amp;lt;/nowiki&amp;gt;include &amp;quot;opentelemetry/exporters/otlp/otlp_http_log_record_exporter_factory.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;#&amp;lt;/nowiki&amp;gt;include &amp;lt;cstring&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;#&amp;lt;/nowiki&amp;gt;include &amp;lt;iostream&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;#&amp;lt;/nowiki&amp;gt;include &amp;lt;vector&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;#&amp;lt;/nowiki&amp;gt;include &amp;lt;fstream&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;#&amp;lt;/nowiki&amp;gt;include &amp;lt;list&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;#&amp;lt;/nowiki&amp;gt;include &amp;lt;memory&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;#&amp;lt;/nowiki&amp;gt;include &amp;lt;thread&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;#&amp;lt;/nowiki&amp;gt;include &amp;lt;iostream&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;#&amp;lt;/nowiki&amp;gt;include &amp;lt;string&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
using namespace std;&lt;br /&gt;
&lt;br /&gt;
namespace nostd    = opentelemetry::nostd;&lt;br /&gt;
&lt;br /&gt;
namespace otlp     = opentelemetry::exporter::otlp;&lt;br /&gt;
&lt;br /&gt;
namespace resource = opentelemetry::sdk::resource;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
namespace trace_api      = opentelemetry::trace;&lt;br /&gt;
&lt;br /&gt;
namespace trace_sdk      = opentelemetry::sdk::trace;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
namespace metrics_api   = opentelemetry::metrics;&lt;br /&gt;
&lt;br /&gt;
namespace metrics_sdk    = opentelemetry::sdk::metrics;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
namespace logs_api      = opentelemetry::logs;&lt;br /&gt;
&lt;br /&gt;
namespace logs_sdk      = opentelemetry::sdk::logs;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
namespace&lt;br /&gt;
&lt;br /&gt;
{&lt;br /&gt;
  // Class definition for context propagation&lt;br /&gt;
  otlp::OtlpHttpMetricExporterOptions options;&lt;br /&gt;
  std::string version{ &amp;quot;1.0.1&amp;quot; };&lt;br /&gt;
  std::string name{ &amp;quot;app_cpp&amp;quot; };&lt;br /&gt;
  std::string schema{ &amp;quot;https://opentelemetry.io/schemas/1.2.0&amp;quot; };&lt;br /&gt;
&lt;br /&gt;
  template &amp;lt;typename T&amp;gt;&lt;br /&gt;
  class HttpTextMapCarrier : public opentelemetry::context::propagation::TextMapCarrier&lt;br /&gt;
  {&lt;br /&gt;
    public:&lt;br /&gt;
      HttpTextMapCarrier&amp;lt;T&amp;gt;(T &amp;amp;headers) : headers_(headers) {}&lt;br /&gt;
      HttpTextMapCarrier() = default;&lt;br /&gt;
      virtual nostd::string_view Get(nostd::string_view key) const noexcept override&lt;br /&gt;
      {&lt;br /&gt;
        std::string key_to_compare = key.data();&lt;br /&gt;
        // Header's first letter seems to be  automatically capitaliazed by our test http-server, so&lt;br /&gt;
        // compare accordingly.&lt;br /&gt;
        if (key == opentelemetry::trace::propagation::kTraceParent)&lt;br /&gt;
        {&lt;br /&gt;
          key_to_compare = &amp;quot;Traceparent&amp;quot;;&lt;br /&gt;
        }&lt;br /&gt;
        else if (key == opentelemetry::trace::propagation::kTraceState)&lt;br /&gt;
        {&lt;br /&gt;
          key_to_compare = &amp;quot;Tracestate&amp;quot;;&lt;br /&gt;
        }&lt;br /&gt;
        auto it = headers_.find(key_to_compare);&lt;br /&gt;
        if (it != headers_.end())&lt;br /&gt;
        {&lt;br /&gt;
          return it-&amp;gt;second;&lt;br /&gt;
        }&lt;br /&gt;
        return &amp;quot;&amp;quot;;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      virtual void Set(nostd::string_view key, nostd::string_view value) noexcept override&lt;br /&gt;
      {&lt;br /&gt;
        headers_.insert(std::pair&amp;lt;std::string, std::string&amp;gt;(std::string(key), std::string(value)));&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      T headers_;&lt;br /&gt;
  };&lt;br /&gt;
  // ===== GENERAL SETUP =====&lt;br /&gt;
  void initTracer()&lt;br /&gt;
  {&lt;br /&gt;
    otlp::OtlpHttpExporterOptions traceOptions;&lt;br /&gt;
    traceOptions.url = std::string(std::getenv(&amp;quot;DT_API_URL&amp;quot;)) + &amp;quot;/v1/traces&amp;quot;;&lt;br /&gt;
    traceOptions.content_type  = otlp::HttpRequestContentType::kBinary;&lt;br /&gt;
    traceOptions.http_headers.insert(&lt;br /&gt;
        std::make_pair&amp;lt;const std::string, std::string&amp;gt;(&amp;quot;Authorization&amp;quot;, std::getenv(&amp;quot;DT_API_TOKEN&amp;quot;)));&lt;br /&gt;
&lt;br /&gt;
    resource::ResourceAttributes resource_attributes = &amp;lt;nowiki&amp;gt;{{&amp;quot;service.name&amp;quot;, name},&lt;br /&gt;
                                                        {&amp;quot;service.version&amp;quot;, version}}&amp;lt;/nowiki&amp;gt;;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;  resource::ResourceAttributes dt_resource_attributes;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;  try&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;  {&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;    for (string name : {&amp;quot;dt_metadata_e617c525669e072eebe3d0f08212e8f2.properties&amp;quot;,&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;                        &amp;quot;/var/lib/dynatrace/enrichment/dt_metadata.properties&amp;quot;,&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;                        &amp;quot;/var/lib/dynatrace/enrichment/dt_host_metadata.properties&amp;quot;})&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;    {&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;      string file_path;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;      ifstream dt_file;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;      dt_file.open(name);&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;      if (dt_file.is_open())&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;      {&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;        string dt_metadata;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;        ifstream dt_properties;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;        while (getline(dt_file, file_path))&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;        {&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;          dt_properties.open(file_path);&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;          if (dt_properties.is_open())&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;          {&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;            while (getline(dt_properties, dt_metadata))&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;            {&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;              dt_resource_attributes.SetAttribute(&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;                dt_metadata.substr(0, dt_metadata.find(&amp;quot;=&amp;quot;)),&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;                dt_metadata.substr(dt_metadata.find(&amp;quot;=&amp;quot;) + 1)&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;              );&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;            }&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;            dt_properties.close();&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;          }&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;        }&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;        dt_file.close();&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;      }&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;    }&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;  }&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;  catch (...) {}&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;  auto dt_resource = resource::Resource::Create(dt_resource_attributes);&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;  auto resource = resource::Resource::Create(resource_attributes);&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;  auto merged_resource = dt_resource.Merge(resource);&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;  auto exporter = otlp::OtlpHttpExporterFactory::Create(traceOptions);&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;  auto processor = trace_sdk::SimpleSpanProcessorFactory::Create(std::move(exporter));&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;  std::vector&amp;lt;std::unique_ptr&amp;lt;trace_sdk::SpanProcessor&amp;gt;&amp;gt; processors;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;  processors.push_back(std::move(processor));&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;  auto context = trace_sdk::TracerContextFactory::Create(std::move(processors), merged_resource);&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;  std::shared_ptr&amp;lt;opentelemetry::trace::TracerProvider&amp;gt; provider = opentelemetry::sdk::trace::TracerProviderFactory::Create(std::move(context));&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;  // Set the global trace provider&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;  opentelemetry::trace::Provider::SetTracerProvider(provider);&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;  // set global propagator&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;  opentelemetry::context::propagation::GlobalTextMapPropagator::SetGlobalPropagator(&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;      opentelemetry::nostd::shared_ptr&amp;lt;opentelemetry::context::propagation::TextMapPropagator&amp;gt;(&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;          new opentelemetry::trace::propagation::HttpTraceContext()));&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;}&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;// ===== METRIC SETUP =====&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;void initMeter() {&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;  resource::ResourceAttributes resource_attributes = &amp;lt;nowiki&amp;gt;{{&amp;quot;service.name&amp;quot;, name},&lt;br /&gt;
                                                        {&amp;quot;service.version&amp;quot;, version}}&amp;lt;/nowiki&amp;gt;;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;  otlp::OtlpHttpMetricExporterOptions otlpOptions;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;  auto resource = resource::Resource::Create(resource_attributes);&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;  otlpOptions.url = std::string(std::getenv(&amp;quot;DT_API_URL&amp;quot;)) + &amp;quot;/v1/metrics&amp;quot;;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;  otlpOptions.aggregation_temporality = otlp::PreferredAggregationTemporality::kDelta;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;  otlpOptions.content_type = otlp::HttpRequestContentType::kBinary;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;  otlpOptions.http_headers.insert(std::make_pair&amp;lt;const std::string, std::string&amp;gt;(&amp;quot;Authorization&amp;quot;, std::getenv(&amp;quot;DT_API_TOKEN&amp;quot;)));&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;  //This creates the exporter with the options we have defined above.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;  auto exporter = otlp::OtlpHttpMetricExporterFactory::Create(otlpOptions);&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;  metrics_sdk::PeriodicExportingMetricReaderOptions options;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;  options.export_interval_millis = std::chrono::milliseconds(1000);&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;  options.export_timeout_millis  = std::chrono::milliseconds(500);&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;  std::unique_ptr&amp;lt;metrics_sdk::MetricReader&amp;gt; reader{new metrics_sdk::PeriodicExportingMetricReader(std::move(exporter), options) };&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;  auto context = metrics_sdk::MeterContextFactory::Create(opentelemetry::sdk::metrics::ViewRegistryFactory::Create(), resource);&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;  context-&amp;gt;AddMetricReader(std::move(reader));&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;  auto u_provider = metrics_sdk::MeterProviderFactory::Create(std::move(context));&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;  std::shared_ptr&amp;lt;opentelemetry::metrics::MeterProvider&amp;gt; provider(std::move(u_provider));&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;  metrics_api::Provider::SetMeterProvider(provider);&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;}&lt;br /&gt;
&lt;br /&gt;
  // ===== LOG SETUP =====&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;void initLogger() {&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;  resource::ResourceAttributes resource_attributes = &amp;lt;nowiki&amp;gt;{{&amp;quot;service.name&amp;quot;, name}, &lt;br /&gt;
                                                        {&amp;quot;service.version&amp;quot;, version}}&amp;lt;/nowiki&amp;gt;;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;  auto resource = resource::Resource::Create(resource_attributes); &lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;  otlp::OtlpHttpLogRecordExporterOptions loggerOptions;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;  loggerOptions.url = std::string(std::getenv(&amp;quot;DT_API_URL&amp;quot;)) + &amp;quot;/v1/logs&amp;quot;;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;  loggerOptions.http_headers.insert(std::make_pair&amp;lt;const std::string, std::string&amp;gt;(&amp;quot;Authorization&amp;quot;, std::getenv(&amp;quot;DT_API_TOKEN&amp;quot;)));&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;  loggerOptions.content_type = opentelemetry::exporter::otlp::HttpRequestContentType::kBinary;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;  auto exporter  = otlp::OtlpHttpLogRecordExporterFactory::Create(loggerOptions);&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;  auto processor = logs_sdk::SimpleLogRecordProcessorFactory::Create(std::move(exporter));&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;  std::vector&amp;lt;std::unique_ptr&amp;lt;logs_sdk::LogRecordProcessor&amp;gt;&amp;gt; processors; &lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;  processors.push_back(std::move(processor)); &lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;  auto context = logs_sdk::LoggerContextFactory::Create(std::move(processors), resource); &lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;  std::shared_ptr&amp;lt;logs_api::LoggerProvider&amp;gt; provider = logs_sdk::LoggerProviderFactory::Create(std::move(context));&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;  opentelemetry::logs::Provider::SetLoggerProvider(provider);&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;}&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;nostd::shared_ptr&amp;lt;opentelemetry::logs::Logger&amp;gt; get_logger(std::string scope){&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;  // TODO: add your log provider here  &lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;  return logger;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;}&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;opentelemetry::nostd::shared_ptr&amp;lt;opentelemetry::trace::Tracer&amp;gt; get_tracer(std::string tracer_name)&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;{&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;  // TODO: add your trace provider here  &lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;  return tracer;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;}&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;nostd::unique_ptr&amp;lt;opentelemetry::metrics::Counter&amp;lt;uint64_t&amp;gt;&amp;gt; initIntCounter()&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;{&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;  // TODO: add your custom metrics here&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;  return request_counter;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;}&lt;br /&gt;
}&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;u&amp;gt;''Расширение данных Ключ-АСТРОМ''&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Операции чтения файлов, анализирующие файлы &amp;lt;code&amp;gt;dt_metadata&amp;lt;/code&amp;gt; в примере кода, пытаются прочитать файлы данных ЕдиногоАгента, чтобы обогатить запрос '''OTLP''' и гарантировать, что вся соответствующая информация о топологии доступна в Ключ-АСТРОМ.&lt;br /&gt;
&lt;br /&gt;
3. Настройте &amp;lt;code&amp;gt;DT_API_URL&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;DT_API_TOKEN&amp;lt;/code&amp;gt; для URL-адреса Ключ-АСТРОМ и токена доступа в &amp;lt;code&amp;gt;otel.h&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Инструментирование своего приложения ==&lt;br /&gt;
Чтобы использовать '''OpenTelemetry''', вам сначала необходимо выполнить следующие два шага:&lt;br /&gt;
&lt;br /&gt;
1. Добавьте необходимые заголовочные файлы в свой код.&lt;br /&gt;
&lt;br /&gt;
Чтобы добавить заголовочные файлы &amp;lt;code&amp;gt;otel.h&amp;lt;/code&amp;gt;, включите их везде, где вы хотите использовать '''OpenTelemetry'''.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|#include &amp;quot;otel.h&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
2. Инициализируйте '''OpenTelemetry'''.&lt;br /&gt;
&lt;br /&gt;
Для инициализации &amp;lt;code&amp;gt;initOpenTelemetry&amp;lt;/code&amp;gt; используйте функцию &amp;lt;code&amp;gt;otel.h&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;
|auto provider = opentelemetry::trace::Provider::GetTracerProvider();&lt;br /&gt;
|}&lt;br /&gt;
2 Получите объект трассировки.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|// In our case the GetTraces method takes the tracer name and returns the tracer provider&lt;br /&gt;
&lt;br /&gt;
auto tracer = provider-&amp;gt;GetTracer(tracer_name);&lt;br /&gt;
|}&lt;br /&gt;
3. Теперь с помощью &amp;lt;code&amp;gt;tracer&amp;lt;/code&amp;gt;, мы можем запускать новые интервалы и устанавливать их для текущей области выполнения.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|StartSpanOptions options;&lt;br /&gt;
&lt;br /&gt;
options.kind = SpanKind::kServer;&lt;br /&gt;
&lt;br /&gt;
auto span = tracer-&amp;gt;StartSpan(&amp;quot;Call to /myendpoint&amp;quot;, {&lt;br /&gt;
&lt;br /&gt;
    { &amp;quot;http.method&amp;quot;, &amp;quot;GET&amp;quot; },&lt;br /&gt;
&lt;br /&gt;
    { &amp;quot;net.protocol.version&amp;quot;, &amp;quot;1.1&amp;quot; }&lt;br /&gt;
&lt;br /&gt;
  }, options);&lt;br /&gt;
&lt;br /&gt;
auto scope = tracer-&amp;gt;WithActiveSpan(span);&lt;br /&gt;
&lt;br /&gt;
// TODO: Your code goes here&lt;br /&gt;
&lt;br /&gt;
span-&amp;gt;End();&lt;br /&gt;
|}&lt;br /&gt;
В приведенном выше коде мы:&lt;br /&gt;
&lt;br /&gt;
* Создали новый диапазон и назвали его «'''Call to /myendpoint'''».&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;
* Вызвали метод '''span''' &amp;lt;code&amp;gt;End()&amp;lt;/code&amp;gt; для завершения '''span'''.&lt;br /&gt;
&lt;br /&gt;
=== Сбор метрик ===&lt;br /&gt;
1. Получите ссылку на поставщика метрик.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|auto provider = metrics_api::Provider::GetMeterProvider();&lt;br /&gt;
|}&lt;br /&gt;
2. Получите объект метрик.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|nostd::shared_ptr&amp;lt;metrics_api::Meter&amp;gt; meter = provider-&amp;gt;GetMeter(&amp;quot;my-meter&amp;quot;, &amp;quot;1.0.1&amp;quot;);&lt;br /&gt;
|}&lt;br /&gt;
3. С помощью &amp;lt;code&amp;gt;meter&amp;lt;/code&amp;gt; мы теперь можем создавать отдельные инструменты, например, метрики.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|auto request_counter = meter-&amp;gt;CreateUInt64Counter(&amp;quot;request_counter&amp;quot;);&lt;br /&gt;
|}&lt;br /&gt;
4. Теперь мы можем вызвать метод &amp;lt;code&amp;gt;Add()&amp;lt;/code&amp;gt; для записи новых значений с помощью метрики &amp;lt;code&amp;gt;request_counter&amp;lt;/code&amp;gt; и сохранения дополнительных атрибутов (например, &amp;lt;code&amp;gt;action.type&amp;lt;/code&amp;gt;).&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|std::map&amp;lt;std::string, std::string&amp;gt; labels = { {&amp;quot;action.type&amp;quot;, &amp;quot;create&amp;quot;} };&lt;br /&gt;
&lt;br /&gt;
auto labelkv = opentelemetry::common::KeyValueIterableView&amp;lt;decltype(labels)&amp;gt;{ labels };&lt;br /&gt;
&lt;br /&gt;
request_counter-&amp;gt;Add(1, labelkv);&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;
|auto provider = logs_api::Provider::GetLoggerProvider();&lt;br /&gt;
|}&lt;br /&gt;
2. Вызовите метод поставщика &amp;lt;code&amp;gt;GetLogger()&amp;lt;/code&amp;gt; для получения экземпляра логов.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|auto logger = provider-&amp;gt;GetLogger(&amp;quot;scope_name&amp;quot;, &amp;quot;&amp;quot;, OPENTELEMETRY_SDK_VERSION);&lt;br /&gt;
|}&lt;br /&gt;
3. Вызовите любой из доступных методов ведения логов, чтобы записать оператор логов. В следующем примере регистрируется оператор отладки.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|logger-&amp;gt;Debug(&amp;quot;My debug statement here&amp;quot;);&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Обеспечение распространения контекста (необязательно) ===&lt;br /&gt;
Распространение контекста особенно важно, когда задействованы сетевые вызовы (например, '''REST''').&lt;br /&gt;
&lt;br /&gt;
В следующих примерах мы предполагаем, что мы обрабатываем распространение контекста с помощью стандартных заголовков [https://www.w3.org/TR/trace-context/ контекста трассировки W3C]﻿, а также получаем и устанавливаем заголовки '''HTTP''' с помощью объекта '''OpenTelemetry''' &amp;lt;code&amp;gt;http_client::Headers&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для этой цели мы используем экземпляр класса &amp;lt;code&amp;gt;HttpTextMapCarrier&amp;lt;/code&amp;gt;, который мы определили во время настройки и который основан на классе '''OpenTelemetry''' &amp;lt;code&amp;gt;[https://opentelemetry-cpp.readthedocs.io/en/latest/otel_docs/classopentelemetry_1_1context_1_1propagation_1_1TextMapCarrier.html#exhale-class-classopentelemetry-1-1context-1-1propagation-1-1textmapcarrier TextMapCarrier]&amp;lt;/code&amp;gt;.﻿&lt;br /&gt;
&lt;br /&gt;
==== Извлечение контекста при получении запроса ====&lt;br /&gt;
Чтобы извлечь информацию о существующем контексте, мы вызываем метод &amp;lt;code&amp;gt;Extract&amp;lt;/code&amp;gt; глобального propagator singleton и передаем ему экземпляр &amp;lt;code&amp;gt;HttpTextMapCarrier&amp;lt;/code&amp;gt;, а также текущий контекст. Это возвращает новый объект контекста (&amp;lt;code&amp;gt;new_context&amp;lt;/code&amp;gt;), который позволяет нам продолжить предыдущую трассировку с помощью наших интервалов.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|StartSpanOptions options;&lt;br /&gt;
&lt;br /&gt;
options.kind          = SpanKind::kServer;&lt;br /&gt;
&lt;br /&gt;
std::string span_name = request.uri;&lt;br /&gt;
&lt;br /&gt;
// extract context from http header&lt;br /&gt;
&lt;br /&gt;
std::map&amp;lt;std::string, std::string&amp;gt; &amp;amp;request_headers =&lt;br /&gt;
&lt;br /&gt;
const_cast&amp;lt;std::map&amp;lt;std::string, std::string&amp;gt; &amp;amp;&amp;gt;(request.headers);&lt;br /&gt;
&lt;br /&gt;
const HttpTextMapCarrier&amp;lt;std::map&amp;lt;std::string, std::string&amp;gt;&amp;gt; carrier(request_headers);&lt;br /&gt;
&lt;br /&gt;
auto prop        = context::propagation::GlobalTextMapPropagator::GetGlobalPropagator();&lt;br /&gt;
&lt;br /&gt;
auto current_ctx = context::RuntimeContext::GetCurrent();&lt;br /&gt;
&lt;br /&gt;
auto new_context = prop-&amp;gt;Extract(carrier, current_ctx);&lt;br /&gt;
&lt;br /&gt;
options.parent   = GetSpan(new_context)-&amp;gt;GetContext();&lt;br /&gt;
&lt;br /&gt;
auto span = get_tracer(&amp;quot;manual-server&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
         -&amp;gt;StartSpan(&amp;quot;my-server-span&amp;quot;, { //TODO Replace with the name of your span&lt;br /&gt;
&lt;br /&gt;
                     {&amp;quot;my-server-key-1&amp;quot;, &amp;quot;my-server-value-1&amp;quot;} //TODO Add attributes&lt;br /&gt;
&lt;br /&gt;
                     }, options);&lt;br /&gt;
&lt;br /&gt;
auto scope = get_tracer(&amp;quot;http_server&amp;quot;)-&amp;gt;WithActiveSpan(span);&lt;br /&gt;
&lt;br /&gt;
for (auto &amp;amp;kv : request.headers)&lt;br /&gt;
&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
   span-&amp;gt;SetAttribute(&amp;quot;http.header.&amp;quot; + std::string(kv.first.data()), kv.second);&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
span-&amp;gt;AddEvent(&amp;quot;Processing request&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
response.headers[HTTP_SERVER_NS::CONTENT_TYPE] = HTTP_SERVER_NS::CONTENT_TYPE_TEXT;&lt;br /&gt;
&lt;br /&gt;
response.body = doCall();&lt;br /&gt;
&lt;br /&gt;
span-&amp;gt;End();&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Внедрение контекста при отправке запросов ====&lt;br /&gt;
Для внедрения информации о текущем контексте в исходящий запрос мы вызываем метод &amp;lt;code&amp;gt;Inject&amp;lt;/code&amp;gt; глобального propagator singleton и передаем ему экземпляр &amp;lt;code&amp;gt;HttpTextMapCarrier&amp;lt;/code&amp;gt;, а также текущий контекст. Это добавляет к экземпляру &amp;lt;code&amp;gt;carrier&amp;lt;/code&amp;gt; соответствующие заголовки, которые затем используются на этапе текста в нашем '''HTTP'''-запросе.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|auto http_client = http_client::HttpClientFactory::CreateSync(); &lt;br /&gt;
&lt;br /&gt;
std::string url  = std::getenv(&amp;quot;URL&amp;quot;); // TODO set URL you want to call&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
CustomCounter(); // remove&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// start active span &lt;br /&gt;
&lt;br /&gt;
StartSpanOptions options; &lt;br /&gt;
&lt;br /&gt;
options.kind = SpanKind::kClient; &lt;br /&gt;
&lt;br /&gt;
opentelemetry::ext::http::common::UrlParser url_parser(url); &lt;br /&gt;
&lt;br /&gt;
std::string span_name = url_parser.path_; &lt;br /&gt;
&lt;br /&gt;
auto span = get_tracer(&amp;quot;http-client&amp;quot;)-&amp;gt;StartSpan(span_name,&lt;br /&gt;
               &amp;lt;nowiki&amp;gt;{{opentelemetry::semconv::url::kUrlFull, url_parser.url_},&lt;br /&gt;
               {opentelemetry::semconv::url::kUrlScheme, url_parser.scheme_},&lt;br /&gt;
               {opentelemetry::semconv::http::kHttpRequestMethod, &amp;quot;GET&amp;quot;}}&amp;lt;/nowiki&amp;gt;,&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;             options);&lt;br /&gt;
auto scope = get_tracer(&amp;quot;http-client&amp;quot;)-&amp;gt;WithActiveSpan(span); &lt;br /&gt;
&lt;br /&gt;
// inject current context into http header &lt;br /&gt;
&lt;br /&gt;
auto current_ctx = context::RuntimeContext::GetCurrent(); &lt;br /&gt;
&lt;br /&gt;
HttpTextMapCarrier&amp;lt;http_client::Headers&amp;gt; carrier; &lt;br /&gt;
&lt;br /&gt;
auto prop = context::propagation::GlobalTextMapPropagator::GetGlobalPropagator(); &lt;br /&gt;
&lt;br /&gt;
prop-&amp;gt;Inject(carrier, current_ctx);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// send http request &lt;br /&gt;
&lt;br /&gt;
http_client::Result result = http_client-&amp;gt;GetNoSsl(url, carrier.headers_); &lt;br /&gt;
&lt;br /&gt;
//your code goes here &lt;br /&gt;
&lt;br /&gt;
//then end span&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>