Überwachung von PHP-Anwendungen mit Prometheus: Die Bibliothek promphp/prometheus_client_php

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

Prometheus-Metriken in PHP: Vollständige Anleitung zur Bibliothek promphp/prometheus_client_php

\n\n

Prometheus ist der De-facto-Standard für die Metrikenerfassung in der modernen DevOps-Infrastruktur. Wenn Ihre Backend-Anwendung in PHP geschrieben ist, benötigen Sie ein Tool, das Metriken in einem für den Prometheus-Server verständlichen Format exportieren kann. Die Bibliothek promphp/prometheus_client_php ist die ausgereifteste und am besten unterstützte Lösung für diese Aufgabe. In diesem Artikel werden wir erläutern, wie Sie die Bibliothek installieren, grundlegende Metriken (Zähler, Histogramme, Summary) erstellen und diese über den Endpunkt /metrics bereitstellen.

\n\n

Was ist promphp/prometheus_client_php?

\n\n

Dies ist der offizielle PHP-Client für Prometheus, entwickelt von der Community promphp. Die Bibliothek unterstützt:

\n
    \n
  • Vier Hauptmetriktypen: Counter (Zähler), Gauge (Messer), Histogram (Histogramm), Summary (Quantile).
  • \n
  • Speicheradapter: im Speicher (für Tests), in Redis, APCu oder im Dateisystem.
  • \n
  • Formatierung der Ausgabe im Textformat von Prometheus (text/plain).
  • \n
  • Unterstützung von Labels für mehrdimensionale Daten.
  • \n
\n\n

Installation

\n\n

Die Installation erfolgt über Composer. Öffnen Sie ein Terminal im Stammverzeichnis Ihres Projekts und führen Sie Folgendes aus:

\n
composer require promphp/prometheus_client_php
\n\n

Nach der Installation binden Sie den Composer-Autoloader in Ihr PHP-Skript ein:

\n
require __DIR__ . '/vendor/autoload.php';
\n\n

Erstellung eines Metrik-Registrierungs- und Speicheradapters

\n\n

Der erste Schritt besteht darin, ein Registry-Objekt (Register) zu erstellen, in dem alle Metriken gespeichert werden, und einen Speicheradapter auszuwählen. Der Einfachheit halber verwenden wir einen In-Memory-Adapter (Daten leben nur innerhalb einer Anfrage). Für die Produktion wird häufiger Redis oder APCu verwendet.

\n\n
use Prometheus\\CollectorRegistry;\nuse Prometheus\\Storage\\InMemory;\n\n$registry = new CollectorRegistry(new InMemory());
\n\n

Beispiel 1: Counter – Anzahl der Anfragen zählen

\n\n

Ein Zähler (Counter) ist ein monoton steigender Wert. Ideal zum Zählen von HTTP-Anfragen, Fehlern, Datenbankzugriffen.

\n\n
// Zähler abrufen oder erstellen\n$counter = $registry->getOrRegisterCounter(\n    'my_app',           // Namespace\n    'http_requests_total', // Metrikname\n    'Total number of HTTP requests', // Hilfe-Beschreibung\n    ['method', 'endpoint'] // Labels\n);\n\n// Zähler mit bestimmten Labels erhöhen\n$counter->incBy(1, ['GET', '/api/users']);
\n\n

In der Ausgabe von /metrics sieht das so aus:

\n
# HELP my_app_http_requests_total Total number of HTTP requests\n# TYPE my_app_http_requests_total counter\nmy_app_http_requests_total{method="GET",endpoint="/api/users"} 1
\n\n

Beispiel 2: Gauge – Aktuelle Werte (Speicher, Verbindungen)

\n\n

Ein Gauge kann sowohl erhöht als auch verringert werden. Es wird verwendet, um den aktuellen Zustand zu verfolgen: Anzahl aktiver Verbindungen, belegter Speicher, Aufgabenwarteschlange.

\n\n
use Prometheus\\Gauge;\n\n$gauge = $registry->getOrRegisterGauge(\n    'my_app',\n    'memory_usage_bytes',\n    'Current memory usage in bytes',\n    ['pool']\n);\n\n// Wert setzen\n$gauge->set(memory_get_usage(true), ['main']);\n// Oder relativ zum aktuellen Wert ändern\n$gauge->inc(1024, ['main']);   // +1KB\n$gauge->dec(512, ['main']);    // -512B
\n\n

Beispiel 3: Histogram – Werteverteilung (Antwortzeit)

\n\n

Ein Histogramm gruppiert Beobachtungen in vorgegebene Buckets. Es eignet sich hervorragend zur Messung der Ausführungszeit von Anfragen oder der Antwortgrößen.

\n\n
use Prometheus\\Histogram;\n\n$histogram = $registry->getOrRegisterHistogram(\n    'my_app',\n    'http_request_duration_seconds',\n    'Duration of HTTP requests in seconds',\n    ['method', 'endpoint'],\n    [0.1, 0.5, 1.0, 2.0, 5.0] // Bucke                    

Empfehlungen