Observability in PHP: Tracing, Metriken und Logs – Der vollständige Leitfaden

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Observability in PHP: Wie man aufhört zu raten und anfängt, alles klar zu sehen

\n\n

Wenn Ihre PHP-Anwendung langsamer wird, 500er-Fehler ausgibt oder sich einfach seltsam verhält, ist die erste Reaktion, in die Logs zu schauen. Aber Logs (selbst perfekt strukturierte) sind nur ein Teil des Puzzles. Die moderne Entwicklung erfordert viel mehr: Sie müssen wissen, wie lange jede Anfrage gedauert hat, welche externen Dienste das System verlangsamen und wie viel Speicher ein bestimmter Endpunkt verbraucht.

\n\n

All das dreht sich um Observability (Beobachtbarkeit). In diesem Artikel werden wir die drei Säulen der Observability in PHP behandeln: Tracing, Metriken und Logs. Sie erfahren, wie Sie mit Codebeispielen ein echtes Monitoring einrichten, und erhalten fertige Rezepte, die Sie noch heute implementieren können.

\n\n

Was ist Observability und warum braucht ein PHP-Entwickler sie?

\n\n

Observability (O11y) ist die Fähigkeit, den inneren Zustand eines Systems anhand seiner externen Ausgabedaten zu verstehen. In der PHP-Welt bedeutet dies, dass Sie Fragen beantworten können wie:

\n\n
    \n
  • Warum hat eine bestimmte API-Anfrage 5 Sekunden gedauert?
  • \n
  • Welche SQL-Abfrage wurde in der letzten Stunde am längsten ausgeführt?
  • \n
  • Wie viele Anfragen pro Sekunde verarbeitet Ihr Server gerade jetzt?
  • \n
  • Wo genau „frisst“ der Speicher?
  • \n
\n\n

Ohne Observability arbeiten Sie im Blindflug. Damit sehen Sie jedes Detail Ihrer Anwendung. Und ja, das gilt nicht nur für Microservices in Go oder Java. Auch ein PHP-Monolith kann und sollte „beobachtet“ werden.

\n\n

Tracing in PHP: Verteiltes Tracing mit OpenTelemetry

\n\n

Tracing (Trace) ist die Geschichte einer einzelnen Anfrage. Sie sehen, wie die Anfrage durch Ihre Anwendung läuft, welche Funktionen aufgerufen werden, welche externen APIs angefragt werden und wie viel Zeit jeder Schritt benötigt. In PHP wird dafür der Standard OpenTelemetry verwendet.

\n\n

Installation von OpenTelemetry für PHP

\n\n

Zuerst installieren wir die notwendigen Pakete über Composer:

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

Jetzt konfigurieren wir einen einfachen Tracer. Erstellen Sie eine Datei 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// Erstellen eines Exporters (vorerst in die Konsole)\n$exporter = new ConsoleSpanExporter();\n$processor = new BatchSpanProcessor($exporter);\n$tracerProvider = new TracerProvider($processor);\n\n// Registrieren des globalen Tracers\nGlobals::setTracerProvider($tracerProvider);\n\n// Holen des Tracers mit dem Namen Ihrer Anwendung\n$tracer = Globals::tracerProvider()->getTracer('my-php-app');\n
\n\n

Erstellen von Spans im eigentlichen Code

\n\n

Angenommen, Sie haben einen Controller, der eine Bestellung verarbeitet. Verpacken wir die wichtigsten Operationen in Spans:

\n\n
// OrderController.php\nclass OrderController {\n    public function createOrder(array $data) {\n        $tracer = Globals::tracerProvider()->getTracer('order-service');\n        \n        // Haupt-Span – die gesamte Anfrage\n        $span = $tracer->spanBuilder('POST /orders')->startSpan();\n        $span->setAttribute('order.id', $data['id'] ?? 'unknown');\n        \n        try {\n            // Span für die Benutzerüberprüfung\n            $userSpan = $tracer->spanBuilder('validate.user')->startSpan();\n            $user = $this->validateUser($data['user_id']);\n            $userSpan->end();\n            \n            // Span für das Speichern in der DB\n            $dbSpan = $tracer->spanBuilder('save.order')->startSpan();\n            $order = $this->saveOrder($data);\n            $dbSpan->end();\n            \n            // Span für das Senden der E-Mail\n            $emailSpan = $tracer->spanBuilder('send.email')                

Blogs

Buchempfehlungen