Skip to content

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 opentelemetry

Using the official Docker images? Use install-php-extensions opentelemetry instead.

Then enable it in php.ini:

ini
[opentelemetry]
extension=opentelemetry.so

Check it loaded:

bash
php -m | grep opentelemetry

2. Install the packages ​

bash
composer require \
    open-telemetry/sdk \
    open-telemetry/exporter-otlp \
    open-telemetry/opentelemetry-auto-laravel \
    php-http/guzzle7-adapter

Not 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.

© 2026 Latency Labs LLC