Observabilité en PHP : tracing, métriques et logs — guide complet

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

Observabilité en PHP : comment arrêter de deviner et commencer à tout voir en transparence

\n\n

Lorsque votre application PHP commence à ralentir, à générer des erreurs 500 ou simplement à se comporter étrangement, la première réaction est de consulter les logs. Mais les logs (même parfaitement structurés) ne sont qu'une partie du puzzle. Le développement moderne exige bien plus : vous devez savoir combien de temps chaque requête a pris, quels services externes ralentissent le système, et combien de mémoire consomme un endpoint spécifique.

\n\n

Tout cela relève de l'observabilité. Dans cet article, nous allons décomposer les trois piliers de l'observabilité en PHP : le tracing, les métriques et les logs. Vous apprendrez à configurer une surveillance réelle avec des exemples de code, et obtiendrez des recettes prêtes à l'emploi que vous pouvez mettre en œuvre dès aujourd'hui.

\n\n

Qu'est-ce que l'observabilité et pourquoi en tant que développeur PHP en avez-vous besoin ?

\n\n

L'observabilité (O11y) est la capacité à comprendre l'état interne d'un système à partir de ses données de sortie externes. Dans le monde PHP, cela signifie que vous pouvez répondre aux questions :

\n\n
    \n
  • Pourquoi une requête API spécifique a-t-elle pris 5 secondes ?
  • \n
  • Quelle requête SQL a été la plus longue au cours de la dernière heure ?
  • \n
  • Combien de requêtes par seconde votre serveur traite-t-il en ce moment ?
  • \n
  • Où exactement la mémoire « fuit-elle » ?
  • \n
\n\n

Sans observabilité, vous travaillez à l'aveugle. Avec elle, vous voyez chaque mouvement de votre application. Et oui, cela ne s'applique pas seulement aux microservices en Go ou Java. Un monolithe PHP peut et doit aussi être « observé ».

\n\n

Tracing en PHP : traçage distribué avec OpenTelemetry

\n\n

Le tracing (traçage) est l'historique d'une seule requête. Vous voyez comment la requête traverse votre application, quelles fonctions sont appelées, quelles API externes sont sollicitées, et combien de temps chaque étape prend. En PHP, la norme utilisée est OpenTelemetry.

\n\n

Installation d'OpenTelemetry pour PHP

\n\n

Commençons par installer les paquets nécessaires via Composer :

\n\n
composer require open-telemetry/opentelemetry\ncomposer require open-telemetry/transport-grpc\ncomposer require open-telemetry/exporter-otlp\n
\n\n

Configurons maintenant un traceur de base. Créons un fichier tracing.php :

\n\n
// tracing.php\nuse OpenTelemetry\\API\\Globals;\nuse OpenTelemetry\\SDK\\Trace\\TracerProvider;\nuse OpenTelemetry\\SDK\\Trace\\SpanProcessor\\BatchSpanProcessor;\nuse OpenTelemetry\\SDK\\Trace\\Exporter\\ConsoleSpanExporter;\n\nrequire 'vendor/autoload.php';\n\n// Création d'un exportateur (pour le moment vers la console)\n$exporter = new ConsoleSpanExporter();\n$processor = new BatchSpanProcessor($exporter);\n$tracerProvider = new TracerProvider($processor);\n\n// Enregistrement du traceur global\nGlobals::setTracerProvider($tracerProvider);\n\n// Obtention du traceur avec le nom de votre application\n$tracer = Globals::tracerProvider()->getTracer('my-php-app');\n
\n\n

Création de spans dans le code réel

\n\n

Supposons que vous ayez un contrôleur qui traite une commande. Encapsulons les opérations clés dans des spans :

\n\n
// OrderController.php\nclass OrderController {\n    public function createOrder(array $data) {\n        $tracer = Globals::tracerProvider()->getTracer('order-service');\n        \n        // Span principal — toute la requête\n        $span = $tracer->spanBuilder('POST /orders')->startSpan();\n        $span->setAttribute('order.id', $data['id'] ?? 'unknown');\n        \n        try {\n            // Span pour la validation de l'utilisateur\n            $userSpan = $tracer->spanBuilder('validate.user')->startSpan();\n            $user = $this->validateUser($data['user_id']);\n            $userSpan->end();\n            \n            // Span pour la sauvegarde en base de données\n            $dbSpan = $tracer->spanBuilder('save.order')->startSpan();\n            $order = $this->saveOrder($data);\n            $dbSpan->end();\n            \n            // Span pour l'envoi de l'email\n            $emailSpan = $tracer->spanBuilder('send.email')                

Blogs

Book Recommendations