PHP
---
title : 'OpenTelemetry PHP'
summary : 'OpenTelemetry PHP の自動インスツルメンテーションにより、コードを変更せずに Guance で可観測性データを収集します'
tags :
- 'PHP'
- 'OpenTelemetry'
- '分散型トレーシング'
- 'APM'
__int_icon: 'icon/opentelemetry'
---
# OpenTelemetry PHP
OpenTelemetry PHP は、PHP 拡張機能による実行時フックと、Composer でインストールしたフレームワーク用インスツルメンテーションライブラリを組み合わせてテレメトリデータを生成します。ビジネスロジックを変更することなく、サポート対象の Web フレームワーク、HTTP クライアント、データベースなどの呼び出しを収集できます。
このドキュメントでは、DataKit の OpenTelemetry コレクターを使用して OTLP データを受信し、Guance に転送する手順を説明します。
```text
PHP アプリケーション + OpenTelemetry 拡張機能/インスツルメンテーションライブラリ -> OTLP -> DataKit -> Guance
前提条件¶
- PHP 8.0 以降
- Composer、および PHP 拡張機能をインストール可能な PECL またはシステムパッケージマネージャー
- アプリケーションが Composer により
vendor/autoload.phpを読み込んでいること - DataKit がインストール済みで、対象の Guance ワークスペースに接続されていること
- PHP アプリケーションから DataKit へのネットワーク到達性があること:OTLP/HTTP は DataKit HTTP ポート
9529、OTLP/gRPC はデフォルトで4317を使用します。
一、OpenTelemetry コレクターを有効にする¶
DataKit インストールディレクトリの conf.d/opentelemetry に移動します。コレクターの設定ファイルがまだ存在しない場合は、サンプルファイルをコピーします。
opentelemetry.conf に、少なくとも以下の受信設定が含まれていることを確認します。
[[inputs.opentelemetry]]
# Guance でタグとして保持するカスタム属性をホワイトリストに追加します。
customer_tags = ["team", "project"]
[inputs.opentelemetry.http]
http_status_ok = 200
trace_api = "/otel/v1/traces"
metric_api = "/otel/v1/metrics"
logs_api = "/otel/v1/logs"
[inputs.opentelemetry.grpc]
addr = "127.0.0.1:4317"
max_payload = 16777216
受信アドレスは次のとおりです。
| プロトコル | データ種別 | DataKit 受信アドレス |
|---|---|---|
| OTLP/HTTP + Protobuf | Trace | http://<DataKit-IP>:9529/otel/v1/traces |
| OTLP/HTTP + Protobuf | Metric | http://<DataKit-IP>:9529/otel/v1/metrics |
| OTLP/HTTP + Protobuf | Log | http://<DataKit-IP>:9529/otel/v1/logs |
| OTLP/gRPC | Trace、Metric、Log | http://<DataKit-IP>:4317 |
PHP アプリケーションと DataKit が同一ホスト上にない場合は、実際のデプロイメントに合わせて DataKit のリッスンアドレス、ファイアウォール、その他のネットワークアクセス制御を調整する必要があります。gRPC の場合は addr をアプリケーションからアクセス可能なアドレス(例:0.0.0.0:4317)に変更します。OTLP 受信ポートをインターネットに直接公開しないでください。
DataKit を再起動し、サービスを確認します。
二、アプリケーションに OpenTelemetry を導入する¶
OpenTelemetry PHP 拡張機能をインストールする¶
まず、PHP CLI のバージョンと設定ファイルの場所を確認します。
PHP 開発環境、PECL、コンパイラ、make、autoconf を準備したら、PECL 公式リポジトリから拡張機能をインストールします。
PHP がスキャンする追加設定ディレクトリに 99-opentelemetry.ini を作成するか、次の設定を現在の php.ini に追加します。
PHP-FPM、Apache、またはその他の PHP アプリケーションプロセスを再起動し、拡張機能が読み込まれたことを確認します。
拡張機能だけをインストールしても Trace は自動生成されません。SDK、OTLP エクスポーター、およびアプリケーションフレームワークに対応するインスツルメンテーションパッケージもインストールする必要があります。
SDK と自動インスツルメンテーションパッケージをインストールする¶
以下は、Slim と PSR-18 HTTP クライアントを例にしています。アプリケーションの Composer プロジェクトディレクトリで次のコマンドを実行します。
composer require \
open-telemetry/sdk \
open-telemetry/exporter-otlp \
open-telemetry/opentelemetry-auto-slim \
open-telemetry/opentelemetry-auto-psr18
アプリケーションに OTLP HTTP エクスポーターで使用可能な PSR-17 Factory と非同期 HTTP Client の実装がまだない場合は、次のパッケージも追加します。
フレームワークごとに、異なる open-telemetry/opentelemetry-auto-* パッケージをインストールする必要があります。使用しているフレームワーク、データベース、またはクライアントに一致するパッケージは、OpenTelemetry PHP インスツルメンテーションパッケージ一覧 から選択できます。対応するインスツルメンテーションパッケージがインストールされていないコンポーネントでは、Span は自動生成されません。
環境変数による起動¶
以下は、OTLP/HTTP + Protobuf を使用し、Trace のみをデフォルトで有効にし、Metric と Log は一時的に無効にする例です。
export OTEL_PHP_AUTOLOAD_ENABLED="true"
export OTEL_SERVICE_NAME="order-service"
export OTEL_RESOURCE_ATTRIBUTES="env=prod,version=1.0.0,team=backend"
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="tracecontext,baggage"
php -S 0.0.0.0:8080 -t public
OTEL_EXPORTER_OTLP_ENDPOINT はベースアドレスです。OTLP/HTTP エクスポーターはデータ種別に応じて自動的に /v1/traces、/v1/metrics、または /v1/logs を追加し、最終的に DataKit の /otel/v1/* ルートに対応します。
PHP-FPM、Apache、Supervisor、または systemd は、現在のターミナルの環境変数を継承しない場合があります。変数は実際のサービスプロセスの起動環境に書き込むか、次のセクションで説明する PHP 設定方法を使用し、サービスを再起動してください。
PHP 設定による有効化¶
次の内容を、PHP-FPM または Apache が実際に読み込む php.ini または追加の INI ファイルに追加することもできます。
OTEL_PHP_AUTOLOAD_ENABLED="true"
OTEL_SERVICE_NAME="order-service"
OTEL_RESOURCE_ATTRIBUTES="env=prod,version=1.0.0,team=backend"
OTEL_TRACES_EXPORTER="otlp"
OTEL_METRICS_EXPORTER="none"
OTEL_LOGS_EXPORTER="none"
OTEL_EXPORTER_OTLP_PROTOCOL="http/protobuf"
OTEL_EXPORTER_OTLP_ENDPOINT="http://127.0.0.1:9529/otel"
OTEL_PROPAGATORS="tracecontext,baggage"
PHP CLI と PHP-FPM は異なる設定ファイルを読み込む可能性があります。php --ini で確認できるのは CLI の設定のみです。Web アプリケーションに導入する場合は、PHP-FPM または Apache の対応する SAPI が拡張機能と上記の設定を読み込んでいることを確認してください。
OTLP/gRPC を使用する¶
PHP で OTLP/gRPC を使用するには、追加で grpc PHP 拡張機能と Composer トランスポートパッケージが必要です。
sudo pecl install grpc
composer require open-telemetry/transport-grpc
export OTEL_EXPORTER_OTLP_PROTOCOL="grpc"
export OTEL_EXPORTER_OTLP_ENDPOINT="http://127.0.0.1:4317"
gRPC エンドポイントには /v1/traces などの HTTP パスを追加しないでください。
三、データ送信パラメータ¶
基本パラメータ¶
| 環境変数 | 説明 | 推奨値または例 |
|---|---|---|
OTEL_SERVICE_NAME |
service.name を設定します。未設定の場合、サービスを安定して識別できません。 |
order-service。本番環境では明示的に設定する必要があります。 |
OTEL_RESOURCE_ATTRIBUTES |
リソース属性。カンマ区切りの key=value 形式。 |
env=prod,version=1.0.0,team=backend |
OTEL_TRACES_EXPORTER |
Trace エクスポーター。 | DataKit に送信する場合は otlp を設定。無効にする場合は none。 |
OTEL_METRICS_EXPORTER |
Metric エクスポーター。 | メトリクスを送信する必要がある場合は otlp、それ以外は none。 |
OTEL_LOGS_EXPORTER |
Log エクスポーター。 | ログを送信する必要がある場合は otlp、それ以外は none。 |
OTEL_PROPAGATORS |
サービス間のコンテキスト伝搬形式。 | デフォルトは tracecontext,baggage。全トレースチェーンで互換性を保つ必要があります。 |
OTEL_SDK_DISABLED |
OpenTelemetry SDK を無効にします。 | デフォルトは false。緊急時に無効にする場合は true。 |
service.name は Guance 内でのサービス帰属に使用されます。env と version も設定することを推奨します。これにより、環境やバージョンによるフィルタリングが可能になります。その他のカスタムリソース属性をタグとして保持するには、DataKit の customer_tags ホワイトリストに追加する必要があります。属性名の . は _ に変換されます。
PHP 自動インスツルメンテーションパラメータ¶
| 環境変数 | 説明 | デフォルト値または例 |
|---|---|---|
OTEL_PHP_AUTOLOAD_ENABLED |
SDK と自動インスツルメンテーションの Composer オートロードを有効にします。 | デフォルトは false。コード変更不要で導入する場合は true に設定する必要があります。 |
OTEL_PHP_DISABLED_INSTRUMENTATIONS |
インストール済みの特定のインスツルメンテーションを無効にします。複数指定する場合はカンマ区切り。all も使用可能。 |
psr15,psr18 |
OTEL_PHP_EXCLUDED_URLS |
SDK を読み込まないリクエスト URL の正規表現。複数指定する場合はカンマ区切り。 | healthz,readyz |
OTEL_PHP_LOG_DESTINATION |
OpenTelemetry PHP 内部のエラーと警告の出力先。 | stderr、error_log、none など。 |
OTEL_PHP_FIBERS_ENABLED |
Fiber コンテキストストレージを有効にします。非 CLI SAPI の場合は追加のプリロード設定が必要です。 | デフォルトは false。 |
OTLP パラメータ¶
| 環境変数 | 説明 | 推奨値または例 |
|---|---|---|
OTEL_EXPORTER_OTLP_PROTOCOL |
すべてのシグナルに使用する OTLP プロトコル。 | DataKit は http/protobuf または grpc をサポートしています。 |
OTEL_EXPORTER_OTLP_ENDPOINT |
すべてのシグナルに共通のベースアドレス。 | HTTP:http://datakit-host:9529/otel;gRPC:http://datakit-host:4317。 |
OTEL_EXPORTER_OTLP_TRACES_ENDPOINT |
Trace のみに使用するアドレス。共通アドレスより優先されます。 | http://datakit-host:9529/otel/v1/traces |
OTEL_EXPORTER_OTLP_METRICS_ENDPOINT |
Metric のみに使用するアドレス。共通アドレスより優先されます。 | http://datakit-host:9529/otel/v1/metrics |
OTEL_EXPORTER_OTLP_LOGS_ENDPOINT |
Log のみに使用するアドレス。共通アドレスより優先されます。 | http://datakit-host:9529/otel/v1/logs |
OTEL_EXPORTER_OTLP_HEADERS |
すべての OTLP リクエストに付与するヘッダー。複数指定する場合はカンマ区切り。 | x-tenant=tenant-a;DataKit の expected_headers と一致させる必要があります。 |
OTEL_EXPORTER_OTLP_COMPRESSION |
OTLP リクエストの圧縮方式。 | zlib 拡張機能がインストールされている場合は gzip を設定可能。 |
OTEL_EXPORTER_OTLP_TIMEOUT |
1 回のエクスポートのタイムアウト(ミリ秒)。 | 10000 |
DataKit の OTLP/HTTP コレクションは Protobuf のみをサポートしています。http/protobuf を使用し、http/json は使用しないでください。共通エンドポイントと特定のデータ種別のエンドポイントが両方存在する場合、特定のデータ種別の設定が優先されます。
サンプリングパラメータ¶
| 環境変数 | 説明 | デフォルト値または例 |
|---|---|---|
OTEL_TRACES_SAMPLER |
Trace ヘッダーサンプラー。 | デフォルトは parentbased_always_on。比率サンプリングの場合は parentbased_traceidratio を使用します。 |
OTEL_TRACES_SAMPLER_ARG |
サンプラーへの引数。 | 0.1 はルート Trace の 10% をサンプリングします。 |
本番環境では、トラフィックとデータ予算に応じてサンプリングレートを設定してください。アプリケーション側のヘッダーサンプリングと DataKit 側のサンプリングを同時に有効にすると、最終的な保持率は乗算で低下するため、サンプリングの場所を統一して計画する必要があります。
導入の確認¶
自動インスツルメンテーションパッケージがインストールされたアプリケーションのルートにリクエストを送信し、DataKit ホストで受信ログを確認します。
/otel/v1/traces への POST リクエストが表示され、ステータスコードが 200 であれば、DataKit が Trace を受信したことを意味します。その後、Guance の「APM > トレース」に移動し、service:order-service で検索します。
データが表示されない場合は、以下の項目を順に確認してください:PHP Web SAPI が opentelemetry 拡張機能を読み込んでいるか、アプリケーションが Composer オートローダーを読み込んでいるか、OTEL_PHP_AUTOLOAD_ENABLED が true に設定されているか、実際のコードパスに一致する自動インスツルメンテーションパッケージがインストールされているか、OTLP エンドポイントに到達可能かどうか。