<?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-09-16T15:24:32Z</updated>
	<subtitle>История изменений этой страницы в вики</subtitle>
	<generator>MediaWiki 1.43.9</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: Новая страница: «В этом пошаговом руководстве показано, как добавить возможность наблюдения в ваше &#039;&#039;&#039;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;В этом пошаговом руководстве показано, как добавить возможность наблюдения в ваше &amp;#039;&amp;#039;&amp;#039;PHP-приложение&amp;#039;&amp;#039;&amp;#039; с помощью &amp;#039;&amp;#039;&amp;#039;PHP-библиотек&amp;#039;&amp;#039;&amp;#039; и инструментов &amp;#039;&amp;#039;&amp;#039;OpenTelemetry&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
== Получение данных для доступа к Ключ-АСТРОМ ==&lt;br /&gt;
&lt;br /&gt;
=== Определить базовый URL API ===&lt;br /&gt;
Подробную информацию о сборке базового &amp;#039;&amp;#039;&amp;#039;URL-адреса&amp;#039;&amp;#039;&amp;#039; конечной точки &amp;#039;&amp;#039;&amp;#039;OTLP&amp;#039;&amp;#039;&amp;#039; см. в разделе [[Экспорт с помощью OTLP]]. &amp;#039;&amp;#039;&amp;#039;URL-адрес&amp;#039;&amp;#039;&amp;#039; должен заканчиваться на &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;
Экспорт с помощью &amp;#039;&amp;#039;&amp;#039;OTLP&amp;#039;&amp;#039;&amp;#039; содержит более подробную информацию о формате и необходимых областях доступа.&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__ . &amp;#039;/vendor/autoload.php&amp;#039;;&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;#039;&amp;#039;&amp;lt;/nowiki&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
$DT_API_TOKEN = &amp;lt;nowiki&amp;gt;&amp;#039;&amp;#039;&amp;lt;/nowiki&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
$dtMetadata = [];&lt;br /&gt;
&lt;br /&gt;
foreach ([&amp;#039;/var/lib/astromkey/enrichment/dt_metadata.properties&amp;#039;,&lt;br /&gt;
&lt;br /&gt;
              &amp;#039;dt_metadata_e617c525669e072eebe3d0f08212e8f2.properties&amp;#039;,&lt;br /&gt;
&lt;br /&gt;
              &amp;#039;/var/lib/astromkey/enrichment/dt_host_metadata.properties&amp;#039;] 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, &amp;#039;/var/&amp;#039;) ? 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; &amp;#039;php-quickstart&amp;#039;])));&lt;br /&gt;
&lt;br /&gt;
// ===== TRACING SETUP =====&lt;br /&gt;
&lt;br /&gt;
$transport = (new OtlpHttpTransportFactory())-&amp;gt;create($DT_API_URL . &amp;#039;/v1/traces&amp;#039;, &amp;#039;application/x-protobuf&amp;#039;, [ &amp;#039;Authorization&amp;#039; =&amp;gt; &amp;#039;Api-Token &amp;#039; . $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 . &amp;#039;/v1/metrics&amp;#039;, &amp;#039;application/x-protobuf&amp;#039;, [ &amp;#039;Authorization&amp;#039; =&amp;gt; &amp;#039;Api-Token &amp;#039; . $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 . &amp;#039;/v1/logs&amp;#039;, &amp;#039;application/x-protobuf&amp;#039;, [ &amp;#039;Authorization&amp;#039; =&amp;gt; &amp;#039;Api-Token &amp;#039; . $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(&amp;#039;example&amp;#039;, [$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;#039;&amp;#039;&amp;lt;u&amp;gt;Расширение данных Ключ-АСТРОМ&amp;lt;/u&amp;gt;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Операции чтения файлов, анализирующие файлы &amp;lt;code&amp;gt;dt_metadata&amp;lt;/code&amp;gt; в примере кода, пытаются прочитать файлы данных ЕдиногоАгента, чтобы расширить запрос &amp;#039;&amp;#039;&amp;#039;OTLP&amp;#039;&amp;#039;&amp;#039; и гарантировать, что вся соответствующая информация о топологии доступна в Ключ-АСТРОМ.&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; во все &amp;#039;&amp;#039;&amp;#039;PHP-файлы&amp;#039;&amp;#039;&amp;#039; где необходимо инициализировать &amp;#039;&amp;#039;&amp;#039;OpenTelemetry&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|require(&amp;#039;otel.php&amp;#039;);&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(&amp;#039;my-tracer&amp;#039;);&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(&amp;#039;Call to /myendpoint&amp;#039;)-&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(&amp;#039;http.method&amp;#039;, &amp;#039;GET&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
    $span-&amp;gt;setAttribute(&amp;#039;net.protocol.version&amp;#039;, &amp;#039;1.1&amp;#039;);&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;
* Создали новый диапазон и назовите его «&amp;#039;&amp;#039;&amp;#039;Call to /myendpoint&amp;#039;&amp;#039;&amp;#039;».&lt;br /&gt;
* Добавили два атрибута, следуя [https://opentelemetry.io/docs/specs/semconv/general/trace/ семантическому соглашению об именовании]﻿, специфичные для действия этого диапазона: информацию о методе &amp;#039;&amp;#039;&amp;#039;HTTP&amp;#039;&amp;#039;&amp;#039; и версии.&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;, чтобы закрыть &amp;#039;&amp;#039;&amp;#039;span&amp;#039;&amp;#039;&amp;#039; (в блоке &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(&amp;#039;my-meter&amp;#039;);&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(&amp;#039;request_counter&amp;#039;);&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, [ &amp;#039;action.type&amp;#039; =&amp;gt; &amp;#039;create&amp;#039; ]);&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; уже инициализирована и настроена (см. выше), мы можем напрямую подключаться к настроенной конечной точке &amp;#039;&amp;#039;&amp;#039;OpenTelemetry&amp;#039;&amp;#039;&amp;#039; в Ключ-АСТРОМ.&lt;br /&gt;
&lt;br /&gt;
== Обеспечение распространения контекста (необязательно) ==&lt;br /&gt;
Распространение контекста особенно важно, когда задействованы сетевые вызовы (например, &amp;#039;&amp;#039;&amp;#039;REST&amp;#039;&amp;#039;&amp;#039;).&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;
В следующем примере мы предполагаем, что получили &amp;#039;&amp;#039;&amp;#039;HTTP-запрос&amp;#039;&amp;#039;&amp;#039; со встроенной контекстной информацией, которую мы собираемся извлечь для продолжения трассировки.&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;. Это возвращает объект контекста (на основе информации, предоставленной нам через &amp;#039;&amp;#039;&amp;#039;HTTP-вызов&amp;#039;&amp;#039;&amp;#039;), который мы можем впоследствии использовать для продолжения этой трассировки с нашими собственными интервалами.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|// Create a request object based on PHP&amp;#039;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]﻿ для отправки &amp;#039;&amp;#039;&amp;#039;HTTP-запроса&amp;#039;&amp;#039;&amp;#039; другому сервису и предоставляем наш существующий контекст как часть &amp;#039;&amp;#039;&amp;#039;HTTP-заголовков&amp;#039;&amp;#039;&amp;#039; нашего запроса.&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;
Поскольку для вызова &amp;#039;&amp;#039;&amp;#039;cURL&amp;#039;&amp;#039;&amp;#039; нам нужен простой строковый массив, нам нужно преобразовать его перед передачей в &amp;#039;&amp;#039;&amp;#039;cURL&amp;#039;&amp;#039;&amp;#039;. Для этого &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;
Теперь мы готовы инициализировать наш экземпляр &amp;#039;&amp;#039;&amp;#039;cURL&amp;#039;&amp;#039;&amp;#039;, передать &amp;lt;code&amp;gt;$contextData&amp;lt;/code&amp;gt; и выполнить &amp;#039;&amp;#039;&amp;#039;HTTP-вызов.&amp;#039;&amp;#039;&amp;#039;&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(&amp;#039;[URL]&amp;#039;);&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;
Хотя Ключ-АСТРОМ автоматически собирает все атрибуты &amp;#039;&amp;#039;&amp;#039;OpenTelemetry&amp;#039;&amp;#039;&amp;#039;, в веб-интерфейсе Ключ-АСТРОМ сохраняются и отображаются только значения атрибутов, указанные в списке разрешенных. Это предотвращает случайное сохранение персональных данных, позволяя вам соблюдать требования к конфиденциальности и контролировать объем хранимых данных мониторинга.&lt;br /&gt;
&lt;br /&gt;
Чтобы просматривать пользовательские атрибуты, необходимо сначала разрешить их использование в веб-интерфейсе Ключ-АСТРОМ. &lt;br /&gt;
&lt;br /&gt;
== Проверка загрузки данных в Ключ-АСТРОМ ==&lt;br /&gt;
После завершения инструментирования вашего приложения выполните несколько тестовых действий для создания и отправки демонстрационных трассировок, метрик и логов, а также проверьте, что они были правильно загружены в Ключ-АСТРОМ.&lt;br /&gt;
&lt;br /&gt;
Чтобы сделать это для трассировок, перейдите в раздел &amp;#039;&amp;#039;&amp;#039;Трассировки&amp;#039;&amp;#039;&amp;#039; и выберите вкладку &amp;#039;&amp;#039;&amp;#039;Распределенные трассировки&amp;#039;&amp;#039;&amp;#039;. Если вы используете ЕдиныйАгент, выберите &amp;#039;&amp;#039;&amp;#039;PurePaths&amp;#039;&amp;#039;&amp;#039; .&lt;br /&gt;
&lt;br /&gt;
Для просмотра метрик и логов перейдите в раздел &amp;#039;&amp;#039;&amp;#039;Метрики&amp;#039;&amp;#039;&amp;#039; или &amp;#039;&amp;#039;&amp;#039;Логов&amp;#039;&amp;#039;&amp;#039; или &amp;#039;&amp;#039;&amp;#039;Логи и события&amp;#039;&amp;#039;&amp;#039;.&lt;/div&gt;</summary>
		<author><name>IKuznetsov</name></author>
	</entry>
</feed>