エクスポーター

OpenTelemetryコレクターにテレメトリーを送信し、正しくエクスポートされることを確認してください。 本番環境でコレクターを使用することはベストプラクティスです。 テレメトリーを可視化するために、JaegerZipkinPrometheus、またはベンダー固有のようなバックエンドにエクスポートしてください。

使用可能なエクスポーター

レジストリには、PHP 用のエクスポーターのリストが含まれています。

エクスポーターの中でも、OpenTelemetry Protocol (OTLP)エクスポーターは、OpenTelemetryのデータモデルを考慮して設計されており、OTelデータを情報の損失なく出力します。 さらに、多くのテレメトリーデータを扱うツールがOTLPに対応しており(たとえば、PrometheusJaegerやほとんどのベンダー)、必要なときに高い柔軟性を提供します。 OTLPについて詳細に学習したい場合は、OTLP仕様を参照してください。

このページでは、主要なOpenTelemetry PHP エクスポーターとその設定方法について説明します。

OTLP

トレースデータを OTLP エンドポイント(Collector や Jaeger など)に送信するには、open-telemetry/exporter-otlp パッケージと psr/http-client-implementation を満たす HTTP クライアントが必要です。

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();

上記の例を試すには、Docker コンテナで Jaeger を実行します。

docker run -d --name jaeger \
  -p 5778:5778 \
  -p 16686:16686 \
  -p 4317:4317 \
  -p 4318:4318 \
  -p 9411:9411 \
  jaegertracing/jaeger:latest

Zipkin

トレースの可視化に 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エージェントとして使用することを検討してください。 エージェントはテレメトリーデータを素早く受け取り、バッチ処理してバックエンドに送信できます。