<?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=%D0%A0%D1%83%D1%87%D0%BD%D0%BE%D0%B5_%D0%B2%D0%BD%D0%B5%D0%B4%D1%80%D0%B5%D0%BD%D0%B8%D0%B5_OpenTelemetry_%D0%B2_PHP-%D0%BF%D1%80%D0%B8%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5</id>
	<title>Ручное внедрение OpenTelemetry в PHP-приложение - История изменений</title>
	<link rel="self" type="application/atom+xml" href="https://doc.ruscomtech.ru/index.php?action=history&amp;feed=atom&amp;title=%D0%A0%D1%83%D1%87%D0%BD%D0%BE%D0%B5_%D0%B2%D0%BD%D0%B5%D0%B4%D1%80%D0%B5%D0%BD%D0%B8%D0%B5_OpenTelemetry_%D0%B2_PHP-%D0%BF%D1%80%D0%B8%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5"/>
	<link rel="alternate" type="text/html" href="https://doc.ruscomtech.ru/index.php?title=%D0%A0%D1%83%D1%87%D0%BD%D0%BE%D0%B5_%D0%B2%D0%BD%D0%B5%D0%B4%D1%80%D0%B5%D0%BD%D0%B8%D0%B5_OpenTelemetry_%D0%B2_PHP-%D0%BF%D1%80%D0%B8%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5&amp;action=history"/>
	<updated>2026-05-02T12:13:39Z</updated>
	<subtitle>История изменений этой страницы в вики</subtitle>
	<generator>MediaWiki 1.36.1</generator>
	<entry>
		<id>https://doc.ruscomtech.ru/index.php?title=%D0%A0%D1%83%D1%87%D0%BD%D0%BE%D0%B5_%D0%B2%D0%BD%D0%B5%D0%B4%D1%80%D0%B5%D0%BD%D0%B8%D0%B5_OpenTelemetry_%D0%B2_PHP-%D0%BF%D1%80%D0%B8%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5&amp;diff=5851&amp;oldid=prev</id>
		<title>IKuznetsov: Новая страница: «В этом пошаговом руководстве показано, как добавить возможность наблюдения в ваше '''PHP-п...»</title>
		<link rel="alternate" type="text/html" href="https://doc.ruscomtech.ru/index.php?title=%D0%A0%D1%83%D1%87%D0%BD%D0%BE%D0%B5_%D0%B2%D0%BD%D0%B5%D0%B4%D1%80%D0%B5%D0%BD%D0%B8%D0%B5_OpenTelemetry_%D0%B2_PHP-%D0%BF%D1%80%D0%B8%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5&amp;diff=5851&amp;oldid=prev"/>
		<updated>2025-10-09T18:12:30Z</updated>

		<summary type="html">&lt;p&gt;Новая страница: «В этом пошаговом руководстве показано, как добавить возможность наблюдения в ваше &amp;#039;&amp;#039;&amp;#039;PHP-п...»&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Новая страница&lt;/b&gt;&lt;/p&gt;&lt;div&gt;В этом пошаговом руководстве показано, как добавить возможность наблюдения в ваше '''PHP-приложение''' с помощью '''PHP-библиотек''' и инструментов '''OpenTelemetry'''.&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;
1. Используйте [https://getcomposer.org/ Composer]﻿ для установки следующих двух зависимостей.&lt;br /&gt;
&lt;br /&gt;
* [https://packagist.org/packages/php-http/guzzle7-adapter php-http/guzzle7-adapter]﻿&lt;br /&gt;
* [https://packagist.org/packages/open-telemetry/opentelemetry open-telemetry/opentelemetry]&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|composer require php-http/guzzle7-adapter&lt;br /&gt;
&lt;br /&gt;
composer require open-telemetry/opentelemetry&lt;br /&gt;
|}&lt;br /&gt;
﻿2. Создайте новый файл &amp;lt;code&amp;gt;otel.php&amp;lt;/code&amp;gt; и сохраните следующий код.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|&amp;lt;?php&lt;br /&gt;
&lt;br /&gt;
declare(strict_types=1);&lt;br /&gt;
&lt;br /&gt;
require __DIR__ . '/vendor/autoload.php';&lt;br /&gt;
&lt;br /&gt;
// ===== OpenTelemetry Imports =====&lt;br /&gt;
&lt;br /&gt;
use Monolog\Handler\StreamHandler;&lt;br /&gt;
&lt;br /&gt;
use Monolog\Logger;&lt;br /&gt;
&lt;br /&gt;
use OpenTelemetry\Contrib\Otlp\OtlpHttpTransportFactory;&lt;br /&gt;
&lt;br /&gt;
use OpenTelemetry\Contrib\Otlp\SpanExporter;&lt;br /&gt;
&lt;br /&gt;
use OpenTelemetry\SDK\Sdk;&lt;br /&gt;
&lt;br /&gt;
use OpenTelemetry\SDK\Trace\SpanProcessor\SimpleSpanProcessor;&lt;br /&gt;
&lt;br /&gt;
use OpenTelemetry\SDK\Trace\TracerProvider;&lt;br /&gt;
&lt;br /&gt;
use OpenTelemetry\SDK\Resource\ResourceInfoFactory;&lt;br /&gt;
&lt;br /&gt;
use OpenTelemetry\SDK\Resource\ResourceInfo;&lt;br /&gt;
&lt;br /&gt;
use OpenTelemetry\SDK\Common\Attribute\Attributes;&lt;br /&gt;
&lt;br /&gt;
use OpenTelemetry\API\Trace\Propagation\TraceContextPropagator;&lt;br /&gt;
&lt;br /&gt;
use OpenTelemetry\SemConv\ResourceAttributes;&lt;br /&gt;
&lt;br /&gt;
use OpenTelemetry\SDK\Metrics\MeterProvider;&lt;br /&gt;
&lt;br /&gt;
use OpenTelemetry\Contrib\Otlp\MetricExporter;&lt;br /&gt;
&lt;br /&gt;
use OpenTelemetry\SDK\Common\Time\ClockFactory;&lt;br /&gt;
&lt;br /&gt;
use OpenTelemetry\SDK\Metrics\MetricReader\ExportingReader;&lt;br /&gt;
&lt;br /&gt;
use OpenTelemetry\Contrib\Otlp\LogsExporter;&lt;br /&gt;
&lt;br /&gt;
use OpenTelemetry\SDK\Logs\LoggerProvider;&lt;br /&gt;
&lt;br /&gt;
use OpenTelemetry\SDK\Logs\Processor\SimpleLogRecordProcessor;&lt;br /&gt;
&lt;br /&gt;
use OpenTelemetry\Contrib\Logs\Monolog\Handler;&lt;br /&gt;
&lt;br /&gt;
use Psr\Log\LogLevel;&lt;br /&gt;
&lt;br /&gt;
// ===== GENERAL SETUP =====&lt;br /&gt;
&lt;br /&gt;
$DT_API_URL = &amp;lt;nowiki&amp;gt;''&amp;lt;/nowiki&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
$DT_API_TOKEN = &amp;lt;nowiki&amp;gt;''&amp;lt;/nowiki&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
$dtMetadata = [];&lt;br /&gt;
&lt;br /&gt;
foreach (['/var/lib/astromkey/enrichment/dt_metadata.properties',&lt;br /&gt;
&lt;br /&gt;
              'dt_metadata_e617c525669e072eebe3d0f08212e8f2.properties',&lt;br /&gt;
&lt;br /&gt;
              '/var/lib/astromkey/enrichment/dt_host_metadata.properties'] as $filePath) {&lt;br /&gt;
&lt;br /&gt;
try {&lt;br /&gt;
&lt;br /&gt;
if (file_exists($filePath)) {&lt;br /&gt;
&lt;br /&gt;
$props = str_starts_with($filePath, '/var/') ? parse_ini_file($filePath) : parse_ini_file(trim(file_get_contents($filePath)));&lt;br /&gt;
&lt;br /&gt;
$dtMetadata = array_merge($dtMetadata, $props);&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
} catch (Exception $e) {}&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
$resource = ResourceInfoFactory::defaultResource()-&amp;gt;merge(ResourceInfo::create(Attributes::create([$dtMetadata,&lt;br /&gt;
&lt;br /&gt;
        ResourceAttributes::SERVICE_NAME =&amp;gt; 'php-quickstart'])));&lt;br /&gt;
&lt;br /&gt;
// ===== TRACING SETUP =====&lt;br /&gt;
&lt;br /&gt;
$transport = (new OtlpHttpTransportFactory())-&amp;gt;create($DT_API_URL . '/v1/traces', 'application/x-protobuf', [ 'Authorization' =&amp;gt; 'Api-Token ' . $DT_API_TOKEN ]);&lt;br /&gt;
&lt;br /&gt;
$exporter = new SpanExporter($transport);&lt;br /&gt;
&lt;br /&gt;
$tracerProvider =  new TracerProvider(new SimpleSpanProcessor($exporter), null, $resource);&lt;br /&gt;
&lt;br /&gt;
// ===== METRIC SETUP =====&lt;br /&gt;
&lt;br /&gt;
$reader = new ExportingReader(&lt;br /&gt;
&lt;br /&gt;
new MetricExporter((new OtlpHttpTransportFactory())-&amp;gt;create($DT_API_URL . '/v1/metrics', 'application/x-protobuf', [ 'Authorization' =&amp;gt; 'Api-Token ' . $DT_API_TOKEN ])),&lt;br /&gt;
&lt;br /&gt;
ClockFactory::getDefault()&lt;br /&gt;
&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
$meterProvider = MeterProvider::builder()-&amp;gt;setResource($resource)-&amp;gt;addReader($reader)-&amp;gt;build();&lt;br /&gt;
&lt;br /&gt;
// ===== LOG SETUP =====&lt;br /&gt;
&lt;br /&gt;
$transport = (new OtlpHttpTransportFactory())-&amp;gt;create($DT_API_URL . '/v1/logs', 'application/x-protobuf', [ 'Authorization' =&amp;gt; 'Api-Token ' . $DT_API_TOKEN ]);&lt;br /&gt;
&lt;br /&gt;
$exporter = new LogsExporter($transport);&lt;br /&gt;
&lt;br /&gt;
$loggerProvider = LoggerProvider::builder()&lt;br /&gt;
&lt;br /&gt;
-&amp;gt;addLogRecordProcessor(new SimpleLogRecordProcessor($exporter))&lt;br /&gt;
&lt;br /&gt;
-&amp;gt;setResource($resource)&lt;br /&gt;
&lt;br /&gt;
-&amp;gt;build();&lt;br /&gt;
&lt;br /&gt;
$handler = new Handler($loggerProvider, LogLevel::INFO);&lt;br /&gt;
&lt;br /&gt;
$monolog = new Logger('example', [$handler]);&lt;br /&gt;
&lt;br /&gt;
// ===== REGISTRATION =====&lt;br /&gt;
&lt;br /&gt;
Sdk::builder()&lt;br /&gt;
&lt;br /&gt;
-&amp;gt;setTracerProvider($tracerProvider)&lt;br /&gt;
&lt;br /&gt;
-&amp;gt;setMeterProvider($meterProvider)&lt;br /&gt;
&lt;br /&gt;
-&amp;gt;setLoggerProvider($loggerProvider)&lt;br /&gt;
&lt;br /&gt;
-&amp;gt;setPropagator(TraceContextPropagator::getInstance())&lt;br /&gt;
&lt;br /&gt;
-&amp;gt;setAutoShutdown(true)&lt;br /&gt;
&lt;br /&gt;
-&amp;gt;buildAndRegisterGlobal();&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; с &amp;lt;code&amp;gt;otel.php&amp;lt;/code&amp;gt; соответствующими значениями.&lt;br /&gt;
&lt;br /&gt;
4. Включите &amp;lt;code&amp;gt;otel.php&amp;lt;/code&amp;gt; во все '''PHP-файлы''' где необходимо инициализировать '''OpenTelemetry'''.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|require('otel.php');&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 = Globals::tracerProvider()-&amp;gt;getTracer('my-tracer');&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-&amp;gt;spanBuilder('Call to /myendpoint')-&amp;gt;startSpan();&lt;br /&gt;
&lt;br /&gt;
try&lt;br /&gt;
&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
    $span-&amp;gt;setAttribute('http.method', 'GET');&lt;br /&gt;
&lt;br /&gt;
    $span-&amp;gt;setAttribute('net.protocol.version', '1.1');&lt;br /&gt;
&lt;br /&gt;
    // TODO your code goes here&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
finally&lt;br /&gt;
&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
    $span-&amp;gt;end();&lt;br /&gt;
&lt;br /&gt;
}&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''' (в блоке &amp;lt;code&amp;gt;finally&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;
|$meterProvider = Globals::meterProvider();&lt;br /&gt;
&lt;br /&gt;
$meter = $meterProvider-&amp;gt;getMeter('my-meter');&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-&amp;gt;createCounter('request_counter');&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; с помощью счетчика и сохранения дополнительных атрибутов (например, &amp;lt;code&amp;gt;action.type&amp;lt;/code&amp;gt;).&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|$requestCounter-&amp;gt;add(1, [ 'action.type' =&amp;gt; 'create' ]);&lt;br /&gt;
|}&lt;br /&gt;
4. Синхронные показатели, такие как счетчик, экспортируются при вызове &amp;lt;code&amp;gt;forceFlush()&amp;lt;/code&amp;gt; или &amp;lt;code&amp;gt;shutdown()&amp;lt;/code&amp;gt; счетчиков.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|$meterProvider-&amp;gt;forceFlush();&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Подключение логов ===&lt;br /&gt;
Поскольку переменная &amp;lt;code&amp;gt;$monolog&amp;lt;/code&amp;gt; уже инициализирована и настроена (см. выше), мы можем напрямую подключаться к настроенной конечной точке '''OpenTelemetry''' в Ключ-АСТРОМ.&lt;br /&gt;
&lt;br /&gt;
== Обеспечение распространения контекста (необязательно) ==&lt;br /&gt;
Распространение контекста особенно важно, когда задействованы сетевые вызовы (например, '''REST''').&lt;br /&gt;
&lt;br /&gt;
Если вы используете автоматическое инструментирование и ваши сетевые библиотеки соответствуют [https://www.php-fig.org/psr/psr-15/ PSR-15]﻿ (извлечение для входящих запросов) и [https://www.php-fig.org/psr/psr-18/ PSR-18]﻿ (внедрение для исходящих запросов), распространение контекста будет обрабатываться автоматически. В противном случае ваш код должен это учитывать.&lt;br /&gt;
&lt;br /&gt;
=== Извлечение контекста при получении запроса ===&lt;br /&gt;
В следующем примере мы предполагаем, что получили '''HTTP-запрос''' со встроенной контекстной информацией, которую мы собираемся извлечь для продолжения трассировки.&lt;br /&gt;
&lt;br /&gt;
Для этого сначала создаем объект &amp;lt;code&amp;gt;request&amp;lt;/code&amp;gt; с &amp;lt;code&amp;gt;[https://packagist.org/packages/httpsoft/http-server-request ServerRequestCreator::createFromGlobals()]&amp;lt;/code&amp;gt;﻿.&lt;br /&gt;
&lt;br /&gt;
Затем мы получаем объект &amp;lt;code&amp;gt;TraceContextPropagator&amp;lt;/code&amp;gt; и передаём наш объект &amp;lt;code&amp;gt;request&amp;lt;/code&amp;gt; методу &amp;lt;code&amp;gt;extract()&amp;lt;/code&amp;gt;. Это возвращает объект контекста (на основе информации, предоставленной нам через '''HTTP-вызов'''), который мы можем впоследствии использовать для продолжения этой трассировки с нашими собственными интервалами.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|// Create a request object based on PHP's global arrays (for example, $_SERVER)&lt;br /&gt;
&lt;br /&gt;
$request = ServerRequestCreator::createFromGlobals();&lt;br /&gt;
&lt;br /&gt;
// Obtain propagator instance&lt;br /&gt;
&lt;br /&gt;
$tracePropagator = TraceContextPropagator::getInstance();&lt;br /&gt;
&lt;br /&gt;
// Extract context information from headers and recreate context&lt;br /&gt;
&lt;br /&gt;
$context = $tracePropagator-&amp;gt;extract($request-&amp;gt;getHeaders());&lt;br /&gt;
&lt;br /&gt;
// Start new span and set received context as parent&lt;br /&gt;
&lt;br /&gt;
$span = $tracer-&amp;gt;spanBuilder(&amp;quot;my-span&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
  -&amp;gt;setParent($context)&lt;br /&gt;
&lt;br /&gt;
  -&amp;gt;setSpanKind(SpanKind::KIND_SERVER)&lt;br /&gt;
&lt;br /&gt;
  -&amp;gt;startSpan();&lt;br /&gt;
&lt;br /&gt;
$scope = $span-&amp;gt;activate();&lt;br /&gt;
&lt;br /&gt;
try&lt;br /&gt;
&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
    // TODO your code here&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
finally&lt;br /&gt;
&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
    $span-&amp;gt;end();&lt;br /&gt;
&lt;br /&gt;
    $scope-&amp;gt;detach();&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Внедрение контекста при отправке запросов ===&lt;br /&gt;
В следующем примере мы используем [https://www.php.net/manual/book.curl.php PHP-библиотеку cURL]﻿ для отправки '''HTTP-запроса''' другому сервису и предоставляем наш существующий контекст как часть '''HTTP-заголовков''' нашего запроса.&lt;br /&gt;
&lt;br /&gt;
Для этого мы сначала получаем экземпляр &amp;lt;code&amp;gt;TraceContextPropagator&amp;lt;/code&amp;gt;, для которого вызываем метод &amp;lt;code&amp;gt;inject&amp;lt;/code&amp;gt; и передаем пустой массив &amp;lt;code&amp;gt;$traceContext&amp;lt;/code&amp;gt;. Этот вызов заполняет массив соответствующими данными заголовка ассоциативным образом.&lt;br /&gt;
&lt;br /&gt;
Поскольку для вызова '''cURL''' нам нужен простой строковый массив, нам нужно преобразовать его перед передачей в '''cURL'''. Для этого &amp;lt;code&amp;gt;$traceContext&amp;lt;/code&amp;gt; на следующем шаге мы выполняем цикл и добавляем имена и значения в &amp;lt;code&amp;gt;$contextData&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Теперь мы готовы инициализировать наш экземпляр '''cURL''', передать &amp;lt;code&amp;gt;$contextData&amp;lt;/code&amp;gt; и выполнить '''HTTP-вызов.'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|$traceContext = []; $contextData = [];&lt;br /&gt;
&lt;br /&gt;
$tracePropagator = TraceContextPropagator::getInstance();&lt;br /&gt;
&lt;br /&gt;
$tracePropagator-&amp;gt;inject($traceContext);&lt;br /&gt;
&lt;br /&gt;
// Convert associative array into plain string array&lt;br /&gt;
&lt;br /&gt;
foreach ($traceContext as $name =&amp;gt; $value) $contextData[] = &amp;quot;$name: $value&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
// Initialize cURL&lt;br /&gt;
&lt;br /&gt;
$ch = curl_init('[URL]');&lt;br /&gt;
&lt;br /&gt;
// Set propagation headers&lt;br /&gt;
&lt;br /&gt;
curl_setopt($ch, CURLOPT_HTTPHEADER, $contextData);&lt;br /&gt;
&lt;br /&gt;
// Execute cURL call&lt;br /&gt;
&lt;br /&gt;
curl_exec($ch);&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>