PHP zero-code instrumentation

Automatic instrumentation with PHP requires at least PHP 8.0, and the OpenTelemetry PHP extension. The extension enables registering observer functions (as PHP code) against classes and methods, and executing those functions before and after the observed method runs.



use OpenTelemetry\API\Common\Instrumentation\CachedInstrumentation;
use OpenTelemetry\API\Trace\Span;
use OpenTelemetry\API\Trace\StatusCode;
use OpenTelemetry\Context\Context;

require 'vendor/autoload.php';

class DemoClass
    public function run(): void
        echo 'Hello, world';

    class: DemoClass::class,
    function: 'run',
    pre: static function (DemoClass $demo, array $params, string $class, string $function, ?string $filename, ?int $lineno) {
        static $instrumentation;
        $instrumentation ??= new CachedInstrumentation('example');
        $span = $instrumentation->tracer()->spanBuilder('democlass-run')->startSpan();
    post: static function (DemoClass $demo, array $params, $returnValue, ?Throwable $exception) {
        $scope = Context::storage()->scope();
        $span = Span::fromContext($scope->context());
        if ($exception) {

$demo = new DemoClass();

In the example above we define DemoClass, then register pre and post hook functions on its run method. The hook functions will run before and after each execution of the DemoClass::run() method. The pre function starts and activates a span, and the post function ends it.

If an exception was thrown by DemoClass::run(), the post function will record it, without affecting exception propagation.


The extension can be installed via pecl, pickle or php-extension-installer (docker specific). There are also packaged versions of the extension available for some Linux package managers.

Linux packages

RPM and APK packages are provided by the following:

#this example is for CentOS 7. The PHP version can be changed by
#enabling remi-<version>, eg "yum config-manager --enable remi-php83"
yum update -y
yum install -y epel-release yum-utils
yum install -y
yum-config-manager --enable remi-php81
yum install -y php php-pecl-opentelemetry

php --ri opentelemetry
#At the time of writing, PHP 8.1 was the default PHP version. You may need to
#change "php81" if the default changes. You can alternatively choose a PHP
#version with "apk add php<version>", eg "apk add php83".
echo "@testing" >> /etc/apk/repositories
apk add php php81-pecl-opentelemetry@testing
php --ri opentelemetry


  1. Setup development environment. Installing from source requires proper development environment and some dependencies:

    sudo apt-get install gcc make autoconf
    brew install gcc make autoconf
  2. Build/install the extension. With your environment set up you can install the extension:

    pecl install opentelemetry
    php pickle.phar install opentelemetry
    install-php-extensions opentelemetry
  3. Add the extension to your php.ini file:

  4. Verify that the extension is installed and enabled:

    php -m | grep opentelemetry

Zero-code configuration for automatic instrumentation

When used in conjunction with the OpenTelemetry SDK, you can use environment variables or php.ini to configure auto-instrumentation:

OTEL_SERVICE_NAME=your-service-name \
OTEL_EXPORTER_OTLP_ENDPOINT=http://collector:4317 \
OTEL_PROPAGATORS=baggage,tracecontext \
php myapp.php

Manual setup for automatic instrumentation

OpenTelemetry\API\Globals::registerInitializer(function (Configurator $configurator) {
    $propagator = TraceContextPropagator::getInstance();
    $spanProcessor = new BatchSpanProcessor(/*params*/);
    $tracerProvider = (new TracerProviderBuilder())
        ->setSampler(new ParentBased(new AlwaysOnSampler()))

    ShutdownHandler::register([$tracerProvider, 'shutdown']);

    return $configurator

//instrumentation libraries can access the configured providers (or a no-op implementation) via `Globals`
$tracer = Globals::tracerProvider()->getTracer('example');
//or, via CachedInstrumentation which uses `Globals` internally
$instrumentation = new CachedInstrumentation('example');
$tracer = $instrumentation->tracer();

Supported libraries and frameworks

Automatic Instrumentation is available for a number of instrumentation libraries for commonly used PHP libraries. For the full list, see instrumentation libraries on packagist.

Next steps

After you have automatic instrumentation configured for your app or service, you might want to add manual instrumentation to collect custom telemetry data.

For more examples, see opentelemetry-php-contrib/examples.

Last modified June 28, 2024: improve php zero-code (#4763) (b3af5907)