Statistik und Monitoring von PHP-Skripten in Echtzeit. ClickHouse und Grafana unterstützen Pinba.

In diesem Artikel erkläre ich, wie man Pinba in Kombination mit ClickHouse und Grafana nutzt, anstelle von pinba_engine und pinboard.

In PHP-Projekten ist Pinba wahrscheinlich die einzige zuverlässige Methode, um die Leistung zu verstehen. Allerdings wird Pinba oft erst implementiert, wenn bereits Probleme festzustellen sind und unklar ist, wo man ansetzen soll.

Oft hat niemand eine Ahnung, wie oft pro Sekunde/Minute ein bestimmtes Skript aufgerufen wird, und man beginnt, nach Gefühl zu optimieren, beginnend mit denjenigen Stellen, die am logischsten erscheinen.

Einige analysieren die Nginx-Logs, während andere die langsamen Datenbankabfragen unter die Lupe nehmen.

Natürlich wäre Pinba nicht fehl am Platz, aber es gibt mehrere Gründe, warum es nicht in jedem Projekt zu finden ist.

Statistik und Monitoring von PHP-Skripten in Echtzeit. ClickHouse und Grafana unterstützen Pinba.

Der erste Grund ist die Installation.

Um irgendeinen brauchbaren Output aus der Implementierung von Pinba zu erhalten, ist es sehr wünschenswert, die Metriken nicht nur für die letzten Minuten, sondern auch über einen längeren Zeitraum (von Tagen bis Monaten) zu sehen.

Dazu ist es notwendig:

  • die Erweiterung für PHP zu installieren (und möglicherweise möchten Sie ein Modul für Nginx)
  • die Erweiterung für MySQL zu kompilieren
  • Pinboard zu installieren und Cron einzurichten.

Aufgrund der begrenzten Informationen über Pinba haben viele den Eindruck, dass es nur mit PHP5 funktionierte und längst überholt ist. Doch wie wir später sehen werden, ist das nicht der Fall.

Der erste Schritt ist der einfachste: Sie müssen lediglich den Befehl ausführen:

apt install php-pinba

Dieser Erweiterung ist in den Repositories bis einschließlich PHP 7.3 verfügbar, und es ist keine Kompilierung erforderlich.

Nach der Ausführung des Installationsbefehls erhalten wir sofort eine funktionsfähige Erweiterung, die die Metriken jedes Skripts (Ausführungsdauer, Speicher usw.) im Format protobuf per UDP an 127.0.0.1:30002 sendet.

Diese UDP-Pakete werden bislang von niemandem empfangen oder verarbeitet, was sich jedoch nicht negativ auf die Geschwindigkeit oder Stabilität Ihrer PHP-Skripte auswirkt.

Bis vor kurzem gab es nur eine Anwendung, die diese UDP-Pakete empfangen und verarbeiten konnte: pinba_engine. Beschreibung „einfach und prägnantDie Installation wird zur Qual und hält einen davon ab, es jemals wieder zu lesen oder zu verstehen. In endlosen Abhängigkeitslisten gibt es sowohl Paketnamen als auch Programmnamen und Links zu einzelnen Installationsseiten, die wiederum ihre eigenen Links zu anderen Abhängigkeiten haben. Niemand hat die Zeit oder den Willen, sich mit diesem Wirrwarr auseinanderzusetzen.

Installationsprozess pinba2 wurde nicht wirklich einfacher.

Vielleicht kann man irgendwann pinba10 mit ein oder zwei Befehlen installieren, ohne einen riesigen Materialstapel lesen zu müssen, um herauszufinden, wie man das macht, aber derzeit ist das nicht der Fall.

Selbst wenn Sie pinba_engine installiert haben, ist das nur die halbe Miete. Denn ohne pinboard sind Sie nur in der Lage, Daten der letzten paar Minuten zu sammeln oder müssen selbst aggregieren, speichern und visualisieren. Gut, dass die Installation von pinboard recht einfach ist. die Installation.

Es scheint, als wäre es unnötig, so viel Mühe zu investieren, wenn alle Metriken von PHP bereits über UDP-Ports im Protobuf-Format gesendet werden. Eigentlich müsste man nur eine Anwendung schreiben, die diese abfängt und in einem Speicherplatz ablegt. Offensichtlich haben sich Entwickler, denen dieser Gedanke gekommen ist, direkt daran gemacht, ihre eigenen Lösungen zu programmieren, von denen einige auf GitHub gelandet sind.

Im Folgenden finden Sie eine Übersicht über vier Open-Source-Projekte, die Metriken in Speicherlösungen speichern, aus denen diese Daten leicht abgerufen und beispielsweise mit Grafana visualisiert werden können.

olegfedoseev/pinba-server (November 2017)

Ein UDP-Server in Go, der Metriken in OpenTSDB speichert. Wenn Sie OpenTSDB bereits in Ihrem Projekt verwenden, könnte diese Lösung für Sie geeignet sein, andernfalls empfehle ich, lieber weiterzuziehen.

olegfedoseev/pinba-influxdb (Juni 2018)

Ein UDP-Server in Go, von demselben Habr-Nutzer, der diesmal Metriken in InfluxDB speichert. Viele Projekte verwenden bereits InfluxDB für die Überwachung, sodass diese Lösung hervorragend passen könnte.

Vorteile:

  • InfluxDB ermöglicht es Die erhaltenen Metriken aggregieren und das Original nach einer bestimmten Zeit löschen.

Nachteile:

ClickHouse-Ninja/Proton (Januar 2019)

ein UDP-Server in Go, der Metriken in ClickHouse speichert. Diese Lösung stammt von einem Freund von mir. Nachdem ich damit vertraut geworden bin, war ich überzeugt, dass es an der Zeit war, mich mit Pinba und ClickHouse zu beschäftigen.

Vorteile:

  • ClickHouse eignet sich hervorragend für solche Aufgaben, da es ermöglicht, Daten so stark zu komprimieren, dass Sie alle Rohdaten sogar ohne Aggregationen speichern können.
  • Falls erforderlich, können Sie die erhaltenen Metriken problemlos aggregieren.
  • eine fertige Vorlage für Grafana
  • speichert Informationen zu Timern.

Nachteile:

  • ein schwerwiegender Nachteil
  • es gibt keine Konfiguration, in der der Name der Datenbank und Tabellen, Adresse und Port des Servers eingestellt werden können.
  • Beim Speichern von Rohdaten wird eine Hilfstabelle als Wörterbuch verwendet, um die Seitenadressen und Domains zu speichern, was die Abfragen anschließend komplizierter macht.
  • sonstige Kleinigkeiten, die sich aus dem ersten Nachteil ergeben

pinba-server/pinba-server (April 2019)

Ein UDP-Server in PHP, der Metriken in ClickHouse speichert. Dies ist meine Lösung, die aus der Auseinandersetzung mit Pinba, ClickHouse und Protobuf entstanden ist. Während ich mich mit diesem gesamten Setup beschäftigte, schrieb ich ein „Proof of Concept“, das unerwartet wenig Ressourcen benötigte (30 MB RAM und weniger als 1 % eines von acht CPU-Kernen). Daher habe ich beschlossen, es der Öffentlichkeit zur Verfügung zu stellen.

Die Vorteile sind die gleichen wie bei der vorherigen Lösung, und ich habe auch die vertrauten Bezeichnungen aus der Original-Pinba-Engine verwendet. Außerdem habe ich eine Konfiguration hinzugefügt, die es ermöglicht, mehrere Instanzen des Pinba-Servers gleichzeitig zu starten, um Metriken in verschiedene Tabellen zu speichern – dies ist nützlich, wenn Sie Daten nicht nur aus PHP, sondern auch aus Nginx sammeln möchten.
Nachteile sind der „fatale Mangel“ und einige Kleinigkeiten, die Ihnen persönlich nicht gefallen könnten. Aber meine Lösung ist „so einfach wie ein Schlappen“ und besteht aus etwa 100 Zeilen Code, so dass jeder PHP-Entwickler in ein paar Minuten Änderungen vornehmen kann, die ihm nicht gefallen.

Funktionsweise

Der UDP-Port 30002 wird überwacht. Alle eingehenden Pakete werden gemäß dem Protobuf-Schema dekodiert und aggregiert. Einmal pro Minute wird ein Batch in ClickHouse in die Tabelle pinba.requests eingefügt. (Alle Parameter können in der Konfiguration)

Einige Informationen zu ClickHouse

ClickHouse unterstützt verschiedene Speicher-Engines. Die am häufigsten verwendete ist MergeTree.

Wenn Sie zu einem bestimmten Zeitpunkt entscheiden, aggregierte Daten über einen längeren Zeitraum zu speichern und Rohdaten nur für die letzten Zeiträume, können Sie eine materialisierte Sicht mit Gruppierung erstellen und die Haupttabelle pinba.requests regelmäßig bereinigen, während alle Daten in der materialisierten Sicht bleiben. Darüber hinaus können Sie beim Erstellen der Tabelle pinba.requests «engine = Null» angeben, wodurch Rohdaten nicht auf die Festplatte geschrieben werden, sie aber dennoch in die materialisierte Sicht gelangen und aggregiert gespeichert werden. Dieses Schema verwende ich für Nginx-Metriken, da ich bei Nginx 50-mal mehr Anfragen habe als bei PHP.

Sie haben einen langen Weg zurückgelegt, und ich möchte Sie nicht auf halbem Weg zurücklassen. Daher folgt eine detaillierte Beschreibung der Installation und Konfiguration meiner Lösung sowie alles, was Sie benötigen, einschließlich potenzieller Fallstricke, an denen bereits viele gescheitert sind. Der gesamte Installationsprozess ist für Ubuntu 18.04 LTS und CentOS 7 beschrieben. Bei anderen Distributionen und Versionen kann der Prozess geringfügig abweichen.

Installation von

Ich habe alle notwendigen Befehle in Dockerfile zusammengefasst, um die Reproduzierbarkeit der Anweisungen zu erleichtern. Unten werden nur die Fallstricke beschrieben.

php-pinba

Stellen Sie nach der Installation sicher, dass in der Datei /etc/php/7.2/fpm/conf.d/20-pinba.ini alle Optionen nicht auskommentiert sind. In einigen Distributionen (z. B. CentOS) können sie auskommentiert sein.

extension=pinba.so
pinba.enabled=1
pinba.server=127.0.0.1:30002

clickhouse

Während der Installation wird ClickHouse Sie auffordern, ein Passwort für den Benutzer default festzulegen. Standardmäßig ist dieser Benutzer von allen IPs aus zugänglich. Wenn Sie keine Firewall auf dem Server haben, stellen Sie sicher, dass Sie ein Passwort festlegen. Dies kann auch nach der Installation in der Datei /etc/clickhouse-server/users.xml erfolgen.

Es ist auch zu beachten, dass ClickHouse mehrere Ports verwendet, darunter auch 9000. Dieser Port wird in einigen Distributionen (z.B. CentOS) auch für PHP-FPM verwendet. Falls Sie diesen Port bereits nutzen, können Sie ihn in der Datei /etc/clickhouse-server/config.xml auf einen anderen ändern.

Grafana mit dem ClickHouse-Plugin

Nach der Installation von Grafana verwenden Sie den Benutzernamen admin und das Passwort admin. Bei der ersten Anmeldung wird Grafana Sie auffordern, ein neues Passwort festzulegen.

Gehen Sie dann zum Menü „+“ -> Import und geben Sie die Dashboard-Nummer zum Import ein. 10011. Dieses Dashboard habe ich vorbereitet und hochgeladen, damit Sie es nicht selbst noch einmal erstellen müssen.

Grafana unterstützt die Arbeit mit ClickHouse über ein Drittanbieter-Plugin, jedoch funktionieren die Alarme für Drittanbieter-Plugins in Grafana nicht (es gibt bereits seit mehreren Jahren ein Ticket dafür).

Pinba-Server

Die Installation von Protobuf und Libevent ist nicht zwingend erforderlich, verbessert jedoch die Leistung des Pinba-Servers. Wenn Sie den Pinba-Server in einem anderen Verzeichnis als /opt installieren, müssen Sie auch das Systemd-Skript anpassen.

Pinba-Modul für Nginx

Um das Modul zu kompilieren, benötigen Sie die Quellen der gleichen Version von nginx, die bereits auf Ihrem Server installiert ist, sowie die gleichen Kompilierungsoptionen. Andernfalls wird die Kompilierung zwar erfolgreich sein, aber beim Laden des Moduls wird eine Fehlermeldung angezeigt, dass «das Modul binär nicht kompatibel» ist. Die Kompilierungsoptionen können Sie mit dem Befehl nginx -V ansehen.

Lifehacks

Alle meine Webseiten laufen ausschließlich über https. Das Schema-Feld wird dadurch bedeutungslos, deshalb benutze ich es zur Trennung von web/console.

In den Skripten, die über das Web zugänglich sind, verwende ich:

if (ini_get('pinba.enabled')) {
    pinba_schema_set('web');
}

Und in den Konsolenskripten (zum Beispiel Cron-Jobs):

if (ini_get('pinba.enabled')) {
    pinba_schema_set('console');
}

In meinem Grafana-Dashboard gibt es einen Schalter für web/console, um die Statistiken getrennt anzusehen.

Außerdem können Sie in Pinba eigene Tags übergeben, zum Beispiel:

pinba_tag_set('country', $countryCode);

Das ist alles.

Bitte antworten Sie auf die Umfragen unter dem Artikel.

Traditionell weise ich darauf hin, dass ich keine Beratungen oder Hilfe über persönliche Nachrichten in Habr oder sozialen Netzwerken anbiete.

Erstellen Sie ein Ticket auf GitHub.

Ich bitte auch um Unterstützung durch Likes für die englische Version dieses Artikels auf Reddit.

Nur registrierte Benutzer können an der Umfrage teilnehmen. Bitte melden Sie sich an.Sind Sie an Contour interessiert?

Welches Betriebssystem verwenden Sie auf dem Server?

  • Ubuntu

  • CentOS

  • Debian

  • Gentoo

  • Red Hat

  • , aber bisher ist er noch nicht in

  • OpenSUSE

  • SuSE

  • Unix

  • Windows

  • anderes

114 Benutzer haben abgestimmt. 11 Benutzer haben sich enthalten.

Welche PHP-Version verwenden Sie auf dem Server?

  • 7.3

  • 7.2

  • 7.1

  • 7.0

  • 5

  • anderes

105 Benutzer haben abgestimmt. 17 Benutzer haben sich enthalten.

Haben Sie jemals Pinba verwendet?

  • ja

  • nein, aber ich würde gerne

  • nein und ich möchte nicht

  • nein und ich habe noch nie davon gehört

100 Benutzer haben abgestimmt. 14 Benutzer haben sich enthalten.

Welche Version des Pinba-Servers möchten Sie ausprobieren?

  • pinba_engine (mysql engine)

  • pinba2 (mysql engine)

  • pinboard (php + mysql)

  • olegfedoseev/pinba-server (go + OpenTSDB)

  • olegfedoseev/pinba-influxdb (go + influxdb)

  • pinba-server/pinba-server (go + clickhouse)

  • pinba-server/pinba-server (php + clickhouse)

  • ich schreibe mein eigenes

  • anderes

39 Benutzer haben abgestimmt. 47 Benutzer haben sich enthalten.

Quelle: habr.com

Kaufen Sie zuverlässiges Hosting für Websites mit DDoS-Schutz, VPS VDS-Server 🔥 Kaufen Sie zuverlässiges Hosting für Websites mit DDoS-Schutz, VPS VDS-Server | ProHoster