OpenTelemetry PHP
導入する前に、DataKit の OpenTelemetry コレクター を有効化してください。
前提条件¶
- PHP 8.1、8.2、8.3、8.4 のいずれか
- Composer
- DataKit と PHP アプリケーション間で疎通可能なポート
1. ゼロコード方式の導入¶
拡張モジュールをインストール¶
PHP のバージョン、スレッドモード、拡張ディレクトリを確認します。
php -r 'printf("PHP=%s.%s MODE=%s EXT=%s\n", PHP_MAJOR_VERSION, PHP_MINOR_VERSION, PHP_ZTS ? "ts" : "nts", ini_get("extension_dir"));'
uname -m
Release ページから、PHP のバージョン、ts/nts、OS、CPU アーキテクチャに一致するアセットをダウンロードします。たとえば PHP 8.2 NTS、Linux x86_64 では次を使用します。
拡張モジュールをインストールします。
tar -xzf php_opentelemetry-1.3.4-gtrace-8.2-nts-linux-x86_64.tar.gz
sudo install -m 0755 \
php_opentelemetry-1.3.4-gtrace-8.2-nts-linux-x86_64/opentelemetry.so \
"$(php -r 'echo ini_get("extension_dir");')/opentelemetry.so"
php --ini
PHP が読み込む設定ディレクトリに 99-opentelemetry.ini を作成します。
PHP-FPM、Apache、またはアプリケーションプロセスを再起動し、拡張モジュールを確認します。
自動インストゥルメンテーションの依存関係をインストール¶
自動インストゥルメンテーション用パッケージは、アプリケーションで使用するフレームワークやコンポーネントに対応している必要があります。以下は Slim と PSR-18 の例です。
composer config allow-plugins.php-http/discovery false
composer require \
open-telemetry/sdk \
open-telemetry/exporter-otlp \
open-telemetry/opentelemetry-auto-slim \
open-telemetry/opentelemetry-auto-psr18 \
php-http/guzzle7-adapter \
nyholm/psr7
送信設定¶
アプリケーションと DataKit が同一ホスト上にある場合は、ループバックアドレスへ送信します。
export OTEL_PHP_AUTOLOAD_ENABLED=true
export OTEL_SERVICE_NAME=my-php-service
export OTEL_SERVICE_VERSION=1.0.0
export OTEL_RESOURCE_ATTRIBUTES=deployment.environment.name=prod
export OTEL_TRACES_EXPORTER=otlp
export OTEL_METRICS_EXPORTER=none
export OTEL_LOGS_EXPORTER=none
export OTEL_EXPORTER_OTLP_PROTOCOL=http/protobuf
export OTEL_EXPORTER_OTLP_ENDPOINT=http://127.0.0.1:9529/otel
export OTEL_PROPAGATORS=baggage,tracecontext
php -S 0.0.0.0:8080 -t public
PHP-FPM、Supervisor、systemd、またはコンテナでデプロイする場合は、これらの変数を各プロセスの起動環境に設定し、プロセスを再起動してください。
OTLP/gRPC 4317 を使う場合は、PHP grpc 拡張と Composer の transport パッケージも追加でインストールします。
composer require open-telemetry/transport-grpc
export OTEL_EXPORTER_OTLP_PROTOCOL=grpc
export OTEL_EXPORTER_OTLP_ENDPOINT=http://127.0.0.1:4317
確認¶
アプリケーションのルートにアクセスしたあと、DataKit の受信ログを確認します。
ログに POST /otel/v1/traces が表示され、ステータスコードが 200 であれば、Trace は DataKit に受信されています。
2. SDK 方式¶
SDK 方式では業務コードで Span を作成するため、自動インストゥルメンテーション拡張のインストールは不要です。
依存関係をインストール¶
composer config allow-plugins.php-http/discovery false
composer require \
open-telemetry/sdk \
open-telemetry/exporter-otlp \
php-http/guzzle7-adapter \
nyholm/psr7
Span を作成する¶
<?php
declare(strict_types=1);
require __DIR__ . '/vendor/autoload.php';
use OpenTelemetry\API\Trace\StatusCode;
use OpenTelemetry\Contrib\Otlp\OtlpHttpTransportFactory;
use OpenTelemetry\Contrib\Otlp\SpanExporter;
use OpenTelemetry\SDK\Common\Attribute\Attributes;
use OpenTelemetry\SDK\Resource\ResourceInfo;
use OpenTelemetry\SDK\Resource\ResourceInfoFactory;
use OpenTelemetry\SDK\Trace\SpanProcessor\BatchSpanProcessorBuilder;
use OpenTelemetry\SDK\Trace\TracerProvider;
$resource = ResourceInfoFactory::defaultResource()->merge(
ResourceInfo::create(Attributes::create([
'service.name' => 'my-php-service',
'service.version' => '1.0.0',
'deployment.environment.name' => 'prod',
]))
);
$transport = (new OtlpHttpTransportFactory())->create(
'http://127.0.0.1:9529/otel/v1/traces',
'application/x-protobuf'
);
$exporter = new SpanExporter($transport);
$processor = (new BatchSpanProcessorBuilder($exporter))->build();
$tracerProvider = TracerProvider::builder()
->setResource($resource)
->addSpanProcessor($processor)
->build();
$tracer = $tracerProvider->getTracer('application');
$span = $tracer->spanBuilder('order.submit')->startSpan();
$scope = $span->activate();
try {
$span->setAttribute('order.id', 'A1001');
// 業務コード
} catch (Throwable $exception) {
$span->recordException($exception);
$span->setStatus(StatusCode::STATUS_ERROR, $exception->getMessage());
throw $exception;
} finally {
$scope->detach();
$span->end();
$tracerProvider->shutdown();
}