# Експортери

LLMS index: [llms.txt](/llms.txt)

---


Надсилайте телеметрію до [OpenTelemetry Collector](/docs/collector/), щоб переконатися, що вона експортується правильно. Використання Collector у виробничих середовищах є найкращою практикою. Щоб візуалізувати вашу телеметрію, експортуйте її до бекенду, такого як [Jaeger](https://jaegertracing.io/), [Zipkin](https://zipkin.io/), [Prometheus](https://prometheus.io/) або [бекенд, специфічний для постачальника](/ecosystem/vendors/).



## Доступні експортери {#available-exporters}

Реєстр містить [список експортерів для PHP][reg].




Серед експортерів, експортери [OpenTelemetry Protocol (OTLP)][OTLP] розроблені з урахуванням моделі даних OpenTelemetry, що передають дані OTel без втрати інформації. Крім того, багато інструментів, які працюють з телеметричними даними, підтримують OTLP (таких як [Prometheus][], [Jaeger][] і більшість [постачальників][vendors]), надаючи вам високий ступінь гнучкості, коли це потрібно. Щоб дізнатися більше про OTLP, дивіться [Специфікацію OTLP][OTLP].

[Jaeger]: /blog/2022/jaeger-native-otlp/
[OTLP]: /docs/specs/otlp/
[Prometheus]: https://prometheus.io/docs/prometheus/2.55/feature_flags/#otlp-receiver
[reg]: </ecosystem/registry/?component=exporter&language=php>
[vendors]: /ecosystem/vendors/



Ця сторінка охоплює основні експортери OpenTelemetry PHP та як їх налаштувати.






{{__hugo_ctx/}}


> [!NOTE]
>
> Якщо ви використовуєте [інструментування без коду](/docs/zero-code/php/), ви можете налаштувати експортери за допомогою [конфігурації без коду для налаштування експортерів](/docs/zero-code/php#configuration).

## OTLP

Щоб надіслати дані трасування на точку доступу OTLP (наприклад, [колектор](/docs/collector) або Jaeger), вам потрібно використовувати пакунок `open-telemetry/exporter-otlp` та HTTP клієнт, який задовольняє `psr/http-client-implementation`:

```shell
composer require \
  open-telemetry/exporter-otlp \
  php-http/guzzle7-adapter
```

Щоб використовувати експортер [gRPC](https://grpc.io/), вам також потрібно встановити пакунок `open-telemetry/transport-grpc` та розширення `grpc`:

```shell
pecl install grpc
composer require open-telemetry/transport-grpc
```

Далі, налаштуйте експортер з точкою доступу OTLP. Наприклад:

     <ul class="nav nav-tabs" id="tabs-1" role="tablist">
  <li class="nav-item">
      <button class="nav-link active"
          id="tabs-01-00-tab" data-bs-toggle="tab" data-bs-target="#tabs-01-00" role="tab"
          data-td-tp-persist="grpc" aria-controls="tabs-01-00" aria-selected="true">
        gRPC
      </button>
    </li><li class="nav-item">
      <button class="nav-link"
          id="tabs-01-01-tab" data-bs-toggle="tab" data-bs-target="#tabs-01-01" role="tab"
          data-td-tp-persist="protobuf" aria-controls="tabs-01-01" aria-selected="false">
        protobuf
      </button>
    </li><li class="nav-item">
      <button class="nav-link"
          id="tabs-01-02-tab" data-bs-toggle="tab" data-bs-target="#tabs-01-02" role="tab"
          data-td-tp-persist="json" aria-controls="tabs-01-02" aria-selected="false">
        JSON
      </button>
    </li><li class="nav-item">
      <button class="nav-link"
          id="tabs-01-03-tab" data-bs-toggle="tab" data-bs-target="#tabs-01-03" role="tab"
          data-td-tp-persist="ndjson" aria-controls="tabs-01-03" aria-selected="false">
        NDJSON
      </button>
    </li>
</ul>

<div class="tab-content" id="tabs-1-content">
    <div class="tab-body tab-pane fade show active"
        id="tabs-01-00" role="tabpanel" aria-labelled-by="tabs-01-00-tab" tabindex="1">
        <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-php" data-lang="php"><span class="line"><span class="cl"><span class="o">&lt;?</span><span class="nx">php</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">require</span> <span class="no">__DIR__</span> <span class="o">.</span> <span class="s1">&#39;/vendor/autoload.php&#39;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">use</span> <span class="nx">OpenTelemetry\API\Signals</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="k">use</span> <span class="nx">OpenTelemetry\Contrib\Grpc\GrpcTransportFactory</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="k">use</span> <span class="nx">OpenTelemetry\Contrib\Otlp\OtlpUtil</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="k">use</span> <span class="nx">OpenTelemetry\Contrib\Otlp\SpanExporter</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="k">use</span> <span class="nx">OpenTelemetry\SDK\Trace\SpanProcessor\SimpleSpanProcessor</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="k">use</span> <span class="nx">OpenTelemetry\SDK\Trace\TracerProvider</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nv">$transport</span> <span class="o">=</span> <span class="p">(</span><span class="k">new</span> <span class="nx">GrpcTransportFactory</span><span class="p">())</span><span class="o">-&gt;</span><span class="na">create</span><span class="p">(</span><span class="s1">&#39;http://jaeger:4317&#39;</span> <span class="o">.</span> <span class="nx">OtlpUtil</span><span class="o">::</span><span class="na">method</span><span class="p">(</span><span class="nx">Signals</span><span class="o">::</span><span class="na">TRACE</span><span class="p">));</span>
</span></span><span class="line"><span class="cl"><span class="nv">$exporter</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">SpanExporter</span><span class="p">(</span><span class="nv">$transport</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nv">$tracerProvider</span> <span class="o">=</span>  <span class="k">new</span> <span class="nx">TracerProvider</span><span class="p">(</span>
</span></span><span class="line"><span class="cl">    <span class="k">new</span> <span class="nx">SimpleSpanProcessor</span><span class="p">(</span><span class="nv">$exporter</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="p">);</span>
</span></span></code></pre></div>
    </div>
    <div class="tab-body tab-pane fade"
        id="tabs-01-01" role="tabpanel" aria-labelled-by="tabs-01-01-tab" tabindex="1">
        <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-php" data-lang="php"><span class="line"><span class="cl"><span class="o">&lt;?</span><span class="nx">php</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">require</span> <span class="no">__DIR__</span> <span class="o">.</span> <span class="s1">&#39;/vendor/autoload.php&#39;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">use</span> <span class="nx">OpenTelemetry\Contrib\Otlp\OtlpHttpTransportFactory</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="k">use</span> <span class="nx">OpenTelemetry\Contrib\Otlp\SpanExporter</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="k">use</span> <span class="nx">OpenTelemetry\SDK\Trace\SpanProcessor\SimpleSpanProcessor</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="k">use</span> <span class="nx">OpenTelemetry\SDK\Trace\TracerProvider</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nv">$transport</span> <span class="o">=</span> <span class="p">(</span><span class="k">new</span> <span class="nx">OtlpHttpTransportFactory</span><span class="p">())</span><span class="o">-&gt;</span><span class="na">create</span><span class="p">(</span><span class="s1">&#39;http://jaeger:4318/v1/traces&#39;</span><span class="p">,</span> <span class="s1">&#39;application/x-protobuf&#39;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="nv">$exporter</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">SpanExporter</span><span class="p">(</span><span class="nv">$transport</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nv">$tracerProvider</span> <span class="o">=</span>  <span class="k">new</span> <span class="nx">TracerProvider</span><span class="p">(</span>
</span></span><span class="line"><span class="cl">    <span class="k">new</span> <span class="nx">SimpleSpanProcessor</span><span class="p">(</span><span class="nv">$exporter</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="p">);</span>
</span></span></code></pre></div>
    </div>
    <div class="tab-body tab-pane fade"
        id="tabs-01-02" role="tabpanel" aria-labelled-by="tabs-01-02-tab" tabindex="1">
        <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-php" data-lang="php"><span class="line"><span class="cl"><span class="o">&lt;?</span><span class="nx">php</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">require</span> <span class="no">__DIR__</span> <span class="o">.</span> <span class="s1">&#39;/vendor/autoload.php&#39;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">use</span> <span class="nx">OpenTelemetry\Contrib\Otlp\OtlpHttpTransportFactory</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="k">use</span> <span class="nx">OpenTelemetry\Contrib\Otlp\SpanExporter</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="k">use</span> <span class="nx">OpenTelemetry\SDK\Trace\SpanProcessor\SimpleSpanProcessor</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="k">use</span> <span class="nx">OpenTelemetry\SDK\Trace\TracerProvider</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nv">$transport</span> <span class="o">=</span> <span class="p">(</span><span class="k">new</span> <span class="nx">OtlpHttpTransportFactory</span><span class="p">())</span><span class="o">-&gt;</span><span class="na">create</span><span class="p">(</span><span class="s1">&#39;http://jaeger:4318/v1/traces&#39;</span><span class="p">,</span> <span class="s1">&#39;application/json&#39;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="nv">$exporter</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">SpanExporter</span><span class="p">(</span><span class="nv">$transport</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nv">$tracerProvider</span> <span class="o">=</span>  <span class="k">new</span> <span class="nx">TracerProvider</span><span class="p">(</span>
</span></span><span class="line"><span class="cl">    <span class="k">new</span> <span class="nx">SimpleSpanProcessor</span><span class="p">(</span><span class="nv">$exporter</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="nv">$tracer</span> <span class="o">=</span> <span class="nv">$tracerProvider</span><span class="o">-&gt;</span><span class="na">getTracer</span><span class="p">(</span><span class="s1">&#39;io.opentelemetry.contrib.php&#39;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="nv">$tracer</span><span class="o">-&gt;</span><span class="na">spanBuilder</span><span class="p">(</span><span class="s1">&#39;example&#39;</span><span class="p">)</span><span class="o">-&gt;</span><span class="na">startSpan</span><span class="p">()</span><span class="o">-&gt;</span><span class="na">end</span><span class="p">();</span>
</span></span></code></pre></div>
    </div>
    <div class="tab-body tab-pane fade"
        id="tabs-01-03" role="tabpanel" aria-labelled-by="tabs-01-03-tab" tabindex="1">
        <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-php" data-lang="php"><span class="line"><span class="cl"><span class="o">&lt;?</span><span class="nx">php</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">require</span> <span class="no">__DIR__</span> <span class="o">.</span> <span class="s1">&#39;/vendor/autoload.php&#39;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">use</span> <span class="nx">OpenTelemetry\Contrib\Otlp\OtlpHttpTransportFactory</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="k">use</span> <span class="nx">OpenTelemetry\Contrib\Otlp\SpanExporter</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="k">use</span> <span class="nx">OpenTelemetry\SDK\Trace\SpanProcessor\SimpleSpanProcessor</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="k">use</span> <span class="nx">OpenTelemetry\SDK\Trace\TracerProvider</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nv">$transport</span> <span class="o">=</span> <span class="p">(</span><span class="k">new</span> <span class="nx">OtlpHttpTransportFactory</span><span class="p">())</span><span class="o">-&gt;</span><span class="na">create</span><span class="p">(</span><span class="s1">&#39;http://jaeger:4318/v1/traces&#39;</span><span class="p">,</span> <span class="s1">&#39;application/x-ndjson&#39;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="nv">$exporter</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">SpanExporter</span><span class="p">(</span><span class="nv">$transport</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nv">$tracerProvider</span> <span class="o">=</span>  <span class="k">new</span> <span class="nx">TracerProvider</span><span class="p">(</span>
</span></span><span class="line"><span class="cl">    <span class="k">new</span> <span class="nx">SimpleSpanProcessor</span><span class="p">(</span><span class="nv">$exporter</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="nv">$tracer</span> <span class="o">=</span> <span class="nv">$tracerProvider</span><span class="o">-&gt;</span><span class="na">getTracer</span><span class="p">(</span><span class="s1">&#39;io.opentelemetry.contrib.php&#39;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="nv">$tracer</span><span class="o">-&gt;</span><span class="na">spanBuilder</span><span class="p">(</span><span class="s1">&#39;example&#39;</span><span class="p">)</span><span class="o">-&gt;</span><span class="na">startSpan</span><span class="p">()</span><span class="o">-&gt;</span><span class="na">end</span><span class="p">();</span>
</span></span></code></pre></div>
    </div>
</div>


Потім додайте наступний код для генерації відрізка:

```php
$tracer = $tracerProvider->getTracer('io.opentelemetry.contrib.php');
$tracer
  ->spanBuilder('example')
  ->startSpan()
  ->end();
```

Щоб спробувати приклад вище, ви можете запустити [Jaeger](https://www.jaegertracing.io/) у контейнері Docker:

```shell
docker run -d --name jaeger \
  -e COLLECTOR_ZIPKIN_HOST_PORT=:9411 \
  -e COLLECTOR_OTLP_ENABLED=true \
  -p 6831:6831/udp \
  -p 6832:6832/udp \
  -p 5778:5778 \
  -p 16686:16686 \
  -p 4317:4317 \
  -p 4318:4318 \
  -p 14250:14250 \
  -p 14268:14268 \
  -p 14269:14269 \
  -p 9411:9411 \
  jaegertracing/all-in-one:latest
```

## Zipkin

Якщо ви використовуєте [Zipkin](https://zipkin.io/) для візуалізації трасувань, вам потрібно спочатку налаштувати його. Ось як запустити його локально у контейнері Docker.

```shell
docker run --rm -d -p 9411:9411 --name zipkin openzipkin/zipkin
```

Встановіть пакунок експорту як залежність для вашого застосунку:

```shell
composer require open-telemetry/exporter-zipkin
```

Оновіть приклад для використання експорту Zipkin і надсилання даних на ваш бекенд Zipkin:

```php
$transport = \OpenTelemetry\SDK\Common\Export\Http\PsrTransportFactory::discover()
    ->create('http://zipkin:9411/api/v2/spans', 'application/json');
$zipkinExporter = new ZipkinExporter($transport);
$tracerProvider =  new TracerProvider(
    new SimpleSpanProcessor($zipkinExporter)
);
$tracer = $tracerProvider->getTracer('io.opentelemetry.contrib.php');
```

## Мінімізація затримок експорту {#minimize-export-delays}

Більшість PHP середовищ є синхронними та блокуючими. Надсилання телеметричних даних [може затримати](/docs/specs/otel/performance/#shutdown-and-explicit-flushing-could-block) отримання HTTP відповідей вашими користувачами.

Якщо ви використовуєте `fastcgi`, ви можете викликати `fastcgi_finish_request()` після надсилання відповіді користувачу, що означає, що затримки у надсилання телеметричних даних не будуть затримувати обробку запитів.

Щоб мінімізувати вплив повільного транспорту телеметричних даних, особливо для зовнішніх або хмарних бекендів, вам слід розглянути використання [OpenTelemetry Collector](/docs/collector/) як [агента](/docs/collector/deploy/agent/). Агент може швидко приймати, а потім пакетно відправляти телеметричні дані до бекенду.
