Експортери

Надсилайте телеметрію до OpenTelemetry Collector, щоб переконатися, що вона експортується правильно. Використання Collector у виробничих середовищах є найкращою практикою. Щоб візуалізувати вашу телеметрію, експортуйте її до бекенду, такого як Jaeger, Zipkin, Prometheus або бекенд, специфічний для постачальника.

Доступні експортери

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

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

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

OTLP

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

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

Щоб використовувати експортер gRPC, вам також потрібно встановити пакунок open-telemetry/transport-grpc та розширення grpc:

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

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

<?php require __DIR__ . '/vendor/autoload.php'; use OpenTelemetry\API\Signals; use OpenTelemetry\Contrib\Grpc\GrpcTransportFactory; use OpenTelemetry\Contrib\Otlp\OtlpUtil; use OpenTelemetry\Contrib\Otlp\SpanExporter; use OpenTelemetry\SDK\Trace\SpanProcessor\SimpleSpanProcessor; use OpenTelemetry\SDK\Trace\TracerProvider; $transport = (new GrpcTransportFactory())->create('http://jaeger:4317' . OtlpUtil::method(Signals::TRACE)); $exporter = new SpanExporter($transport); $tracerProvider = new TracerProvider( new SimpleSpanProcessor($exporter) );
<?php require __DIR__ . '/vendor/autoload.php'; use OpenTelemetry\Contrib\Otlp\OtlpHttpTransportFactory; use OpenTelemetry\Contrib\Otlp\SpanExporter; use OpenTelemetry\SDK\Trace\SpanProcessor\SimpleSpanProcessor; use OpenTelemetry\SDK\Trace\TracerProvider; $transport = (new OtlpHttpTransportFactory())->create('http://jaeger:4318/v1/traces', 'application/x-protobuf'); $exporter = new SpanExporter($transport); $tracerProvider = new TracerProvider( new SimpleSpanProcessor($exporter) );
<?php require __DIR__ . '/vendor/autoload.php'; use OpenTelemetry\Contrib\Otlp\OtlpHttpTransportFactory; use OpenTelemetry\Contrib\Otlp\SpanExporter; use OpenTelemetry\SDK\Trace\SpanProcessor\SimpleSpanProcessor; use OpenTelemetry\SDK\Trace\TracerProvider; $transport = (new OtlpHttpTransportFactory())->create('http://jaeger:4318/v1/traces', 'application/json'); $exporter = new SpanExporter($transport); $tracerProvider = new TracerProvider( new SimpleSpanProcessor($exporter) ); $tracer = $tracerProvider->getTracer('io.opentelemetry.contrib.php'); $tracer->spanBuilder('example')->startSpan()->end();
<?php require __DIR__ . '/vendor/autoload.php'; use OpenTelemetry\Contrib\Otlp\OtlpHttpTransportFactory; use OpenTelemetry\Contrib\Otlp\SpanExporter; use OpenTelemetry\SDK\Trace\SpanProcessor\SimpleSpanProcessor; use OpenTelemetry\SDK\Trace\TracerProvider; $transport = (new OtlpHttpTransportFactory())->create('http://jaeger:4318/v1/traces', 'application/x-ndjson'); $exporter = new SpanExporter($transport); $tracerProvider = new TracerProvider( new SimpleSpanProcessor($exporter) ); $tracer = $tracerProvider->getTracer('io.opentelemetry.contrib.php'); $tracer->spanBuilder('example')->startSpan()->end();

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

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

Щоб спробувати приклад вище, ви можете запустити Jaeger у контейнері Docker:

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 для візуалізації трасувань, вам потрібно спочатку налаштувати його. Ось як запустити його локально у контейнері Docker.

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

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

composer require open-telemetry/exporter-zipkin

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

$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');

Мінімізація затримок експорту

Більшість PHP середовищ є синхронними та блокуючими. Надсилання телеметричних даних може затримати отримання HTTP відповідей вашими користувачами.

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

Щоб мінімізувати вплив повільного транспорту телеметричних даних, особливо для зовнішніх або хмарних бекендів, вам слід розглянути використання OpenTelemetry Collector як агента. Агент може швидко приймати, а потім пакетно відправляти телеметричні дані до бекенду.