Surveillance des applications PHP : métriques et alertes avancées

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

Introduction : du healthcheck de base à l'observabilité profonde

\n

La surveillance de base des applications PHP, incluant la vérification de disponibilité (healthcheck) et la charge CPU, est le minimum à configurer en premier lieu. Cependant, pour les systèmes de production à forte charge et avec une logique métier complexe, cela ne suffit pas. La surveillance avancée déplace le focus du « vivant/mort » vers l'observabilité et permet de répondre aux questions : « Pourquoi le taux de conversion a-t-il chuté ? », « Quel endpoint a ralenti le travail ? », « Combien d'utilisateurs n'ont pas pu terminer leur paiement ? ».

\n

Dans cet article, nous examinerons l'architecture de la surveillance avancée des applications PHP, apprendrons à collecter des métriques personnalisées (y compris les métriques métier), à configurer des alertes basées sur les anomalies et à intégrer le tout dans un tableau de bord Grafana unifié. Tous les exemples de code sont écrits en PHP et prêts à être déployés.

\n\n

1. Architecture de collecte de métriques : Prometheus et exportateurs personnalisés

\n

Le standard de facto moderne pour la collecte de métriques est Prometheus avec le modèle pull. L'application PHP n'est pas obligée de fournir directement les métriques sur le port /metrics. Nous utilisons plutôt un exportateur personnalisé — un script séparé qui interroge l'application (via Redis, une base de données ou un fichier) et génère une réponse au format Prometheus.

\n\n

1.1. Installation du client Prometheus pour PHP

\n

La bibliothèque recommandée est promphp/prometheus_client_php. Installation via Composer :

\n
composer require promphp/prometheus_client_php
\n\n

1.2. Exemple d'exportateur de métriques (metrics.php)

\n

Créons un script qui renvoie les métriques au format Prometheus. Pour le stockage, nous utilisons Redis (flag PERSISTENT pour la production).

\n
<?php\nrequire 'vendor/autoload.php';\n\nuse Prometheus\\CollectorRegistry;\nuse Prometheus\\Storage\\Redis;\nuse Prometheus\\RenderTextFormat;\n\n// Connexion à Redis\nRedis::setDefaultOptions(['host' => '127.0.0.1', 'port' => 6379]);\n$registry = new CollectorRegistry(new Redis());\n\n// Enregistrement d'un histogramme pour le temps de réponse\n$histogram = $registry->getOrRegisterHistogram(\n    'app_http_request_duration_seconds',\n    'HTTP request duration in seconds',\n    ['method', 'endpoint', 'status']\n);\n\n// Enregistrement d'un compteur de métrique métier\n$counter = $registry->getOrRegisterCounter(\n    'app_orders_total',\n    'Total number of orders processed',\n    ['status'] // success, failed\n);\n\n// Simulation de données (en réalité, lecture depuis la base de données ou les logs)\n$histogram->observe(0.12, ['GET', '/api/orders', '200']);\n$counter->incBy(1, ['success']);\n\n// Renvoi des métriques\n$renderer = new RenderTextFormat();\nheader('Content-Type: text/plain');\necho $renderer->render($registry->getMetricFamilySamples());\n
\n

Ensuite, configurez Nginx ou Apache pour que ce script soit accessible via le chemin /metrics, et ajoutez la cible dans Prometheus.

\n\n

2. Métriques métier : surveiller ce qui compte vraiment

\n

Les métriques techniques (latence, taux d'erreur) sont la base, mais les métriques métier permettent de comprendre la santé du produit. Exemples de telles métriques :

\n
    \n
  • Nombre de commandes réussies par minute — une baisse signale des problèmes avec la passerelle de paiement.
  • \n
  • Temps moyen de traitement du panier — une augmentation peut indiquer une régression dans le code.
  • \n
  • Pourcentage d'abandons d'inscription — s'il augmente brusquement, le formulaire est peut-être cassé.
  • \n
\n\n

2.1. Intégration des métriques métier dans le code de l'application

\n

Nous utilisons le même prometheus_client_php, mais nous encapsulons les appels dans un middleware ou une couche de service. Exemple pour Laravel :

\n
<?php\nnamespace App\\Http\\Middleware;\n\nuse Closure;\nuse Prometheus\\CollectorRegistry;\n\nclass MetricsMiddleware\n{\n    protected $registry;\n\n    public function __construct(CollectorRegistry $registry)\n    {\n        $this->registry = $registry;\n    }\n\n    publi                

Blogs

Book Recommendations