Appearance
PHP
Automatic traces for Laravel, Symfony, Slim, PDO, Guzzle and more, without changing your code. The examples use Laravel. Swap the auto-instrumentation package for your framework's.
Before you start
You need a Traces stream and an ingest key for it. See OpenTelemetry → Before you start.
1. Install the extension
The OpenTelemetry PHP extension hooks into your framework. It needs PHP 8.0 or newer:
bash
pecl install opentelemetryUsing the official Docker images? Use install-php-extensions opentelemetry instead.
Then enable it in php.ini:
ini
[opentelemetry]
extension=opentelemetry.soCheck it loaded:
bash
php -m | grep opentelemetry2. Install the packages
bash
composer require \
open-telemetry/sdk \
open-telemetry/exporter-otlp \
open-telemetry/opentelemetry-auto-laravel \
php-http/guzzle7-adapterNot on Laravel? Find your framework's package on Packagist, such as open-telemetry/opentelemetry-auto-symfony or open-telemetry/opentelemetry-auto-slim.
3. Configure
Add to php.ini (or your PHP-FPM pool's environment):
ini
OTEL_PHP_AUTOLOAD_ENABLED="true"
OTEL_SERVICE_NAME="checkout-api"
OTEL_TRACES_EXPORTER="otlp"
OTEL_METRICS_EXPORTER="none"
OTEL_LOGS_EXPORTER="none"
OTEL_EXPORTER_OTLP_PROTOCOL="http/protobuf"
OTEL_EXPORTER_OTLP_TRACES_ENDPOINT="https://ws.latency.app/v1/telemetry/traces"
OTEL_EXPORTER_OTLP_TRACES_HEADERS="authorization=Bearer%20lit_your_traces_key"
OTEL_PROPAGATORS="baggage,tracecontext"Not in Laravel's .env
OpenTelemetry starts before Laravel reads .env, so it never sees values set there. Use php.ini, your PHP-FPM pool config, or real environment variables.
4. Check it's working
Restart PHP-FPM (or your server), make a few requests, then open Telemetry in the Console and pick your traces stream.
Custom spans
php
use OpenTelemetry\API\Globals;
$tracer = Globals::tracerProvider()->getTracer('checkout');
$span = $tracer->spanBuilder('charge-card')->startSpan();
$scope = $span->activate();
try {
$span->setAttribute('order.id', $order->id);
$this->chargeCard($order);
} finally {
$scope->detach();
$span->end();
}Logs
To send Monolog logs as well, add a Logs stream and use OpenTelemetry's Monolog handler with OTEL_LOGS_EXPORTER="otlp" and your logs stream's endpoint and key.
Or send logs over the HTTP API.