# Instrumentation Zero-code PHP

## Prérequis {#requirements}

L'instrumentation automatique avec PHP nécessite :

- PHP 8.0 ou supérieur
- [l'extension PHP OpenTelemetry](https://github.com/open-telemetry/opentelemetry-php-instrumentation)
- [Composer autoloading](https://getcomposer.org/doc/01-basic-usage.md#autoloading)
- [le SDK OpenTelemetry](https://packagist.org/packages/open-telemetry/sdk)
- Une ou plusieurs
  [des bibliothèques d'instrumentation](/ecosystem/registry/?component=instrumentation&language=php)
- [une configuration](#configuration)

## Installer l'extension OpenTelemetry {#install-the-opentelemetry-extension}

<div class="alert alert-warning" role="alert"><div class="h4 alert-heading" role="heading">Important</div>

L'installation de l'extension
OpenTelemetry seule ne génère pas de traces. </div>


L'extension peut être installée via pecl,
[pickle](https://github.com/FriendsOfPHP/pickle),
[PIE](https://github.com/php/pie) ou
[php-extension-installer](https://github.com/mlocati/docker-php-extension-installer)
(spécifique à docker). Il existe également des versions packagées de l'extension
disponibles pour certains gestionnaires de paquets Linux.

### Paquets Linux {#linux-packages}

Les paquets RPM et APK sont fournis par les sources suivantes :

- [Dépôt Remi](https://blog.remirepo.net/pages/PECL-extensions-RPM-status) - RPM
- [Alpine Linux](https://pkgs.alpinelinux.org/packages?name=*pecl-opentelemetry) -
  APK (actuellement dans la
  [branche _testing_](https://wiki.alpinelinux.org/wiki/Repositories#Testing))

   <ul class="nav nav-tabs" id="tabs-1" role="tablist">
  <li class="nav-item">
      <button class="nav-link active"
          id="tabs-01-00-tab" data-bs-toggle="tab" data-bs-target="#tabs-01-00" role="tab"
          data-td-tp-persist="rpm" aria-controls="tabs-01-00" aria-selected="true">
        RPM
      </button>
    </li><li class="nav-item">
      <button class="nav-link"
          id="tabs-01-01-tab" data-bs-toggle="tab" data-bs-target="#tabs-01-01" role="tab"
          data-td-tp-persist="apk" aria-controls="tabs-01-01" aria-selected="false">
        APK
      </button>
    </li>
</ul>

<div class="tab-content" id="tabs-1-content">
    <div class="tab-body tab-pane fade show active"
        id="tabs-01-00" role="tabpanel" aria-labelled-by="tabs-01-00-tab" tabindex="1">
        <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sh" data-lang="sh"><span class="line"><span class="cl"><span class="c1">#cet exemple est pour CentOS 7. La version PHP peut être changée en</span>
</span></span><span class="line"><span class="cl"><span class="c1">#activant remi-&lt;version&gt;, exemple: &#34;yum config-manager --enable remi-php83&#34;</span>
</span></span><span class="line"><span class="cl">yum update -y
</span></span><span class="line"><span class="cl">yum install -y epel-release yum-utils
</span></span><span class="line"><span class="cl">yum install -y http://rpms.remirepo.net/enterprise/remi-release-7.rpm
</span></span><span class="line"><span class="cl">yum-config-manager --enable remi-php81
</span></span><span class="line"><span class="cl">yum install -y php php-pecl-opentelemetry
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">php --ri opentelemetry
</span></span></code></pre></div>
    </div>
    <div class="tab-body tab-pane fade"
        id="tabs-01-01" role="tabpanel" aria-labelled-by="tabs-01-01-tab" tabindex="1">
        <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sh" data-lang="sh"><span class="line"><span class="cl"><span class="c1">#Au moment de la rédaction, PHP 8.1 était la version PHP par défaut. Vous devrez peut-être</span>
</span></span><span class="line"><span class="cl"><span class="c1">#changer &#34;php81&#34; si la valeur par défaut change. Vous pouvez alternativement choisir une version PHP</span>
</span></span><span class="line"><span class="cl"><span class="c1">#avec &#34;apk add php&lt;version&gt;&#34;, ex &#34;apk add php83&#34;.</span>
</span></span><span class="line"><span class="cl"><span class="nb">echo</span> <span class="s2">&#34;@testing https://dl-cdn.alpinelinux.org/alpine/edge/testing&#34;</span> &gt;&gt; /etc/apk/repositories
</span></span><span class="line"><span class="cl">apk add php php81-pecl-opentelemetry@testing
</span></span><span class="line"><span class="cl">php --ri opentelemetry
</span></span></code></pre></div>
    </div>
</div>


### PECL

1. Configurer l'environnement de développement. L'installation depuis les
   sources nécessite un environnement de développement approprié et quelques
   dépendances :

      <ul class="nav nav-tabs" id="tabs-2" role="tablist">
  <li class="nav-item">
      <button class="nav-link active"
          id="tabs-02-00-tab" data-bs-toggle="tab" data-bs-target="#tabs-02-00" role="tab"
          data-td-tp-persist="linux (apt)" aria-controls="tabs-02-00" aria-selected="true">
        Linux (apt)
      </button>
    </li><li class="nav-item">
      <button class="nav-link"
          id="tabs-02-01-tab" data-bs-toggle="tab" data-bs-target="#tabs-02-01" role="tab"
          data-td-tp-persist="macos (homebrew)" aria-controls="tabs-02-01" aria-selected="false">
        macOS (homebrew)
      </button>
    </li>
</ul>

<div class="tab-content" id="tabs-2-content">
    <div class="tab-body tab-pane fade show active"
        id="tabs-02-00" role="tabpanel" aria-labelled-by="tabs-02-00-tab" tabindex="2">
        <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sh" data-lang="sh"><span class="line"><span class="cl">sudo apt-get install gcc make autoconf
</span></span></code></pre></div>
    </div>
    <div class="tab-body tab-pane fade"
        id="tabs-02-01" role="tabpanel" aria-labelled-by="tabs-02-01-tab" tabindex="2">
        <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sh" data-lang="sh"><span class="line"><span class="cl">brew install gcc make autoconf
</span></span></code></pre></div>
    </div>
</div>


2. Compiler/installer l'extension. Avec votre environnement configuré, vous
   pouvez installer l'extension :

       <ul class="nav nav-tabs" id="tabs-3" role="tablist">
  <li class="nav-item">
      <button class="nav-link active"
          id="tabs-03-00-tab" data-bs-toggle="tab" data-bs-target="#tabs-03-00" role="tab"
          data-td-tp-persist="pecl" aria-controls="tabs-03-00" aria-selected="true">
        pecl
      </button>
    </li><li class="nav-item">
      <button class="nav-link"
          id="tabs-03-01-tab" data-bs-toggle="tab" data-bs-target="#tabs-03-01" role="tab"
          data-td-tp-persist="pickle" aria-controls="tabs-03-01" aria-selected="false">
        pickle
      </button>
    </li><li class="nav-item">
      <button class="nav-link"
          id="tabs-03-02-tab" data-bs-toggle="tab" data-bs-target="#tabs-03-02" role="tab"
          data-td-tp-persist="php-extension-installer (docker)" aria-controls="tabs-03-02" aria-selected="false">
        php-extension-installer (docker)
      </button>
    </li>
</ul>

<div class="tab-content" id="tabs-3-content">
    <div class="tab-body tab-pane fade show active"
        id="tabs-03-00" role="tabpanel" aria-labelled-by="tabs-03-00-tab" tabindex="3">
        <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sh" data-lang="sh"><span class="line"><span class="cl">pecl install opentelemetry
</span></span></code></pre></div>
    </div>
    <div class="tab-body tab-pane fade"
        id="tabs-03-01" role="tabpanel" aria-labelled-by="tabs-03-01-tab" tabindex="3">
        <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sh" data-lang="sh"><span class="line"><span class="cl">php pickle.phar install opentelemetry
</span></span></code></pre></div>
    </div>
    <div class="tab-body tab-pane fade"
        id="tabs-03-02" role="tabpanel" aria-labelled-by="tabs-03-02-tab" tabindex="3">
        <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sh" data-lang="sh"><span class="line"><span class="cl">install-php-extensions opentelemetry
</span></span></code></pre></div>
    </div>
</div>


3. Ajouter l'extension à votre fichier `php.ini` :

   ```ini
   [opentelemetry]
   extension=opentelemetry.so
   ```

4. Vérifier que l'extension est installée et activée :

   ```sh
   php -m | grep opentelemetry
   ```

## Installer le SDK et les bibliothèques d'instrumentation {#install-sdk-and-instrumentation-libraries}

Maintenant que l'extension est installée, installez le SDK OpenTelemetry et une
ou plusieurs bibliothèques d'instrumentation.

L'instrumentation automatique est disponible pour un certain nombre de
bibliothèques PHP couramment utilisées. Pour voir la liste complète, rendez vous
sur la page:
[bibliothèques d'instrumentation sur packagist](https://packagist.org/search/?query=open-telemetry&tags=instrumentation).

Supposons que votre application utilise Slim Framework et un client HTTP PSR-18,
et que nous exporterons les traces avec le protocole OTLP.

Vous installeriez alors le SDK, un exportateur, et les paquets
d'auto-instrumentation pour Slim Framework et PSR-18 :

```shell
composer require \
    open-telemetry/sdk \
    open-telemetry/exporter-otlp \
    open-telemetry/opentelemetry-auto-slim \
    open-telemetry/opentelemetry-auto-psr18
```

## Configuration

Lorsqu'elle est utilisée conjointement avec le SDK OpenTelemetry, vous pouvez
utiliser des variables d'environnement ou le fichier `php.ini` pour configurer
l'auto-instrumentation.

### Configuration par variables d'environnement {#environment-configuration}

```sh
OTEL_PHP_AUTOLOAD_ENABLED=true \
OTEL_SERVICE_NAME=your-service-name \
OTEL_TRACES_EXPORTER=otlp \
OTEL_EXPORTER_OTLP_PROTOCOL=http/protobuf \
OTEL_EXPORTER_OTLP_ENDPOINT=http://collector:4318 \
OTEL_PROPAGATORS=baggage,tracecontext \
php myapp.php
```

### Configuration php.ini {#phpini-configuration}

Ajoutez ce qui suit à `php.ini`, ou à un autre fichier `ini` qui sera traité par
PHP :

```ini
OTEL_PHP_AUTOLOAD_ENABLED="true"
OTEL_SERVICE_NAME=your-service-name
OTEL_TRACES_EXPORTER=otlp
OTEL_EXPORTER_OTLP_PROTOCOL=http/protobuf
OTEL_EXPORTER_OTLP_ENDPOINT=http://collector:4318
OTEL_PROPAGATORS=baggage,tracecontext
```

## Exécuter votre application {#run-your-application}

Une fois que tout ce qui précède soit installé et configuré, démarrez votre
application comme vous le feriez normalement.

Les traces exportées vers le Collecteur OpenTelemetry dépendent des
bibliothèques d'instrumentation que vous avez installées, et du chemin de code
qui a été pris à l'intérieur de l'application. Dans l'exemple précédent
(utilisant les bibliothèques d'instrumentation Slim Framework et PSR-18) vous
devriez voir des spans tels que :

- Un span racine représentant la transaction HTTP
- Un span pour l'action qui a été exécutée
- Un span pour chaque transaction HTTP que le client PSR-18 a envoyée

Notez que l'instrumentation du client PSR-18 ajoute des en-têtes de
[trace distribuée](/docs/concepts/context-propagation/#propagation) aux requêtes
HTTP sortantes.

## Comment ça fonctionne {#how-it-works}

<div class="alert alert-primary" role="alert"><div class="h4 alert-heading" role="heading">Optionnel</div>

 Vous pouvez ignorer cette section si vous voulez
juste démarrer rapidement, et qu'il existe des bibliothèques d'instrumentation
appropriées pour votre application. </div>


L'extension permet d'enregistrer des fonctions d'observation en tant que code
PHP contre des classes et méthodes, et d'exécuter ces fonctions avant et après
l'exécution de la méthode observée.

S'il n'y a pas de bibliothèque d'instrumentation pour votre framework ou
application, vous pouvez écrire la vôtre. L'exemple suivant fournit du code à
instrumenter, puis illustre comment utiliser l'extension OpenTelemetry pour
tracer l'exécution de ce code.

```php
<?php

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

require 'vendor/autoload.php';

/* La classe à instrumenter */
class DemoClass
{
    public function run(): void
    {
        echo 'Hello, world';
    }
}

/* Le code d'auto-instrumentation */
OpenTelemetry\Instrumentation\hook(
    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();
        Context::storage()->attach($span->storeInContext(Context::getCurrent()));
    },
    post: static function (DemoClass $demo, array $params, $returnValue, ?Throwable $exception) {
        $scope = Context::storage()->scope();
        $scope->detach();
        $span = Span::fromContext($scope->context());
        if ($exception) {
            $span->recordException($exception);
            $span->setStatus(StatusCode::STATUS_ERROR);
        }
        $span->end();
    }
);

/* Exécuter le code instrumenté, qui générera une trace */
$demo = new DemoClass();
$demo->run();
```

L'exemple précédent définit `DemoClass`, puis enregistre des fonctions de hook
`pre` et `post` sur sa méthode `run`. Les fonctions de hook s'exécutent avant et
après chaque exécution de la méthode `DemoClass::run()`. La fonction `pre`
démarre et active un span, tandis que la fonction `post` le termine.

Si `DemoClass::run()` lève une exception, la fonction `post` l'enregistre sans
affecter la propagation de l'exception.

## Étapes suivantes {#next-steps}

Après avoir configuré l'instrumentation automatique pour votre application, vous
pourriez ajouter une
[instrumentation manuelle](/docs/languages/php/instrumentation) pour collecter
des données de télémétrie personnalisées.

Pour plus d'exemples, voir
[opentelemetry-php-contrib/examples](https://github.com/open-telemetry/opentelemetry-php-contrib/tree/main/examples).
