Einleitung: Warum reicht eine grundlegende Überwachung nicht aus?
Die grundlegende Überwachung von PHP-Anwendungen („Lebend/Tot“-Prüfung und CPU-Auslastung) funktioniert bei hohen Lasten nicht mehr. Wenn Ihre Anwendung Tausende von Anfragen pro Sekunde verarbeitet, zeigen Standardmetriken keine Engpässe an: langsame Datenbankabfragen, Speicherlecks in langlaufenden Prozessen oder plötzliche Latenzspitzen.
In diesem Artikel betrachten wir die fortgeschrittene Überwachung: Sammlung von Geschäftsmetriken, Echtzeit-Profiling, Konfiguration von Alarmen basierend auf Perzentilen und Integration mit modernen Observability-Stacks (Prometheus + Grafana). Sie lernen, Werkzeuge zu implementieren, die nicht nur anzeigen, dass die Anwendung „abgestürzt“ ist, sondern Probleme vorhersagen, bevor sie auftreten.
1. Erweiterte Metriken: Von HTTP-Codes zu Geschäftskennzahlen
Standardzähler (Anzahl der Anfragen, 200/500-Status) sind das Minimum. Für eine tiefgehende Analyse müssen Sie Folgendes sammeln:
- Latenz: p50, p95, p99 Antwortzeit. Anomalien bei p99 weisen auf „Ausreißer“ in der Arbeit hin.
- Speicherverbrauch: nicht nur der Spitzenwert, sondern auch die Wachstumsrate innerhalb einer einzelnen Anfrage.
- Ausführungszeit externer Aufrufe: Redis, MySQL, RabbitMQ – jeder Dienst sollte seine eigene Metrik haben.
- Geschäftsmetriken: Anzahl der aufgegebenen Bestellungen, Validierungsfehler, Warteschlangengeschwindigkeit.
Beispiel für die Metriksammlung mit promphp/prometheus_client_php:
use Prometheus\\CollectorRegistry;use Prometheus\\RenderTextFormat;use Prometheus\\Storage\\InMemory;
$registry = new CollectorRegistry(new InMemory());
// Histogramm für die Anfrageausführungszeit$histogram = $registry->registerHistogram( 'app', 'request_duration_seconds', 'HTTP request duration', ['method', 'endpoint'], [0.1, 0.5, 1.0, 2.0, 5.0]);
// Zähler für Geschäftsereignisse$counter = $registry->registerCounter( 'business', 'orders_total', 'Total orders created', ['status'] // success/failed);
// In der Middleware messen wir die Zeit$start = microtime(true);// ... Ausführung der Anfrage ...$duration = microtime(true) - $start;$histogram->observe($duration, ['GET', '/api/orders']);2. Health Checks und Deep Probing: Überprüfung von Abhängigkeiten
Ein einfacher ping-Endpunkt prüft nicht die Verfügbarkeit der Datenbank, des Caches oder der Warteschlangen. Erstellen Sie einen umfassenden Health Check, der reale Anfragen simuliert:
// health.php$checks = [ 'database' => function () { $db = new PDO('mysql:host=localhost;dbname=test', 'user', 'pass'); $db->query('SELECT 1'); return true; }, 'redis' => function () { $redis = new Redis(); $redis->connect('127.0.0.1', 6379); $redis->ping(); return true; }, 'queue' => function () { // Prüfen, ob RabbitMQ nicht überlastet ist $channel = new AMQPChannel(new AMQPConnection()); $queue = new AMQPQueue($channel); return $queue->declareQueue() !== false; }];
$results = [];$healthy = true;foreach ($checks as $name => $check) { try { $check(); $results[$name] = 'ok'; } catch (\\Throwable $e) { $results[$name] = 'failed: ' . $e->getMessage(); $healthy = false; }}
header('Content-Type: application/json');http_response_code($healthy ? 200 : 503);echo json_encode(['status' => $healthy ? 'healthy' : 'unhealthy', 'checks' => $results]);Einen solchen Endpunkt können Sie an Kubernetes-Liveness/Readiness-Probes oder an eine externe Überwachung (z. B. UptimeRobot) anschließen, die nicht nur die Verfügbarkeit, sondern auch die Funktionsfähigkeit aller Abhängigkeiten prüft.
3. Alarme basierend auf Perzentilen und Anomalien
Alarme auf Basis der „durchschnittlichen Antwortzeit“ verpassen oft