Statistik und Überwachung von PHP-Skripten in Echtzeit. ClickHouse und Grafana helfen Pinba

In diesem Artikel zeige ich Ihnen, wie Sie Pinba mit Clickhouse und Grafana anstelle von Pinba_engine und Pinnwand verwenden.

Bei einem PHBA-Projekt ist Pinba wahrscheinlich der einzige zuverlässige Weg, um zu verstehen, was mit der Leistung geschieht. Richtig, Pinba wird normalerweise nur implementiert, wenn bereits Probleme beobachtet wurden und nicht klar ist, wo man graben soll.

Oft hat niemand eine Ahnung, wie oft pro Sekunde / Minute ein bestimmtes Skript aufgerufen wird, und beginnt, „durch Berühren“ zu optimieren, beginnend an den Stellen, die logischer erscheinen.

Jemand analysiert Nginx-Protokolle und jemand hat langsame Abfragen in der Datenbank.

Natürlich wäre Pinba nicht überflüssig, aber es gibt mehrere Gründe, warum es nicht bei jedem Projekt so ist.



Und der erste Grund ist die Installation.

Um mehr oder weniger eine Art „Auspuff“ aus der Einführung von Pinba zu ziehen, ist es sehr wünschenswert, Metriken nicht nur in den letzten Minuten, sondern auch über einen langen Zeitraum (von Tagen bis Monaten) zu sehen.

Dazu benötigen Sie:

  • Installiere die Erweiterung für PHP (und vielleicht möchtest du ein Modul für Nginx)
  • Kompilierungserweiterung für MySQL
  • Installieren Sie die Pinnwand und konfigurieren Sie cron

Aufgrund der geringen Menge an Informationen über Pinba haben viele den Eindruck, dass es nur auf PHP5 funktioniert hat und schon lange in der Vergangenheit war, aber wie wir später sehen werden, ist dies nicht der Fall.

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

apt install php-pinba 

In den Repositories ist diese Erweiterung bis zu PHP 7.3 einschließlich und Sie müssen nichts kompilieren.

Nach dem Ausführen des Installationsbefehls erhalten wir sofort eine bereits funktionierende Erweiterung, die die Metriken jedes Skripts (Dauer, Speicher usw.) im Protobuf- Format von udp an 127.0.0.1 {0002 sammelt und sendet.

Bisher hat noch niemand diese udp-Pakete abgefangen oder verarbeitet, aber dies hat keinen Einfluss auf die Geschwindigkeit oder Stabilität Ihrer PHP-Skripte.

Bis vor kurzem war nur pinba_engine die einzige Anwendung, die diese udp-Pakete abfangen und verarbeiten konnte. Die Beschreibung der " einfachen und prägnanten " Installation entmutigt den Wunsch, sie jemals wieder zu lesen und zu vertiefen. In kilometerlangen Abhängigkeitslisten gibt es sowohl Paketnamen als auch Programmnamen und Links zu einzelnen Seiten mit ihrer Installation, und diese haben ihre eigenen Links zu anderen Abhängigkeiten. Um mit diesem Mist fertig zu werden, hat niemand weder die Zeit noch den Wunsch.

Der Pinba2- Installationsprozess ist nicht viel einfacher geworden .

Vielleicht kann pinba10 eines Tages mit ein oder zwei Befehlen installiert werden und nicht eine Menge Material lesen, um zu verstehen, wie es geht, aber bisher ist dies nicht so.

Wenn Sie pinba_engine noch installiert haben, ist dies nur die halbe Miete. Schließlich müssen Sie sich ohne Pinnwand nur in den letzten Minuten auf Daten beschränken oder Ihre Daten selbst aggregieren, speichern und visualisieren. Es ist gut, dass die Pinnwand recht einfach zu installieren ist .

Es scheint, warum solch ein Leid, wenn alle Metriken von PHP bereits im Protobuf-Format an den UDP-Port gehen und alles, was benötigt wird, ist, eine Anwendung zu schreiben, die sie abfängt und in einer Art Speicher speichert? Anscheinend haben sich die Entwickler, die auf diese Idee gekommen sind, sofort hingesetzt, um ihre eigenen Fahrräder zu schreiben, von denen einige auf den Github fielen.

Das Folgende ist eine Übersicht über vier Open-Source-Projekte, in denen Metriken gespeichert sind, aus denen diese Daten leicht abgerufen und visualisiert werden können, beispielsweise mit grafana.

olegfedoseev / pinba-server (november 2017)


udp server on go, der Metriken in OpenTSDB speichert. Wenn Sie OpenTSDB bereits für das Projekt verwenden, passt eine solche Lösung möglicherweise zu Ihnen. Andernfalls empfehle ich, vorbeizukommen.

Olegfedoseev / pinba-influxdb (Juni 2018)


udp server on go, vom selben habrayuzer, der diesmal metriken in influxDB speichert. In vielen Projekten wird InfluxDB bereits zur Überwachung verwendet, daher kann diese Lösung für sie großartig sein.

Vorteile:

  • Mit InfluxDB können Sie die empfangenen Metriken aggregieren und das Original nach einer bestimmten Zeit löschen.

Nachteile:


ClickHouse-Ninja / Proton (Januar 2019)


udp server on go speichert Metriken in ClickHouse. Dies ist die Entscheidung meines Freundes. Nachdem ich ihn kennengelernt hatte, entschied ich, dass es Zeit war, Pinbu und Clickhouse zu übernehmen.

Vorteile:

  • Das Clickhouse ist ideal für solche Aufgaben. Es ermöglicht Ihnen, Daten so stark zu komprimieren, dass Sie alle Rohdaten auch ohne Aggregationen speichern können
  • Bei Bedarf können Sie die resultierenden Metriken einfach aggregieren
  • fertige Vorlage für Grafana
  • speichert Timer-Informationen

Nachteile:

  • tödlicher Fehler
  • Es gibt keine Konfiguration, in der der Name der Datenbank und der Tabellen, die Adresse und der Port des Servers konfiguriert werden könnten.
  • Beim Speichern von Rohdaten wird eine Hilfswörterbuchtabelle zum Speichern von Seiten- und Domänenadressen verwendet, wodurch Abfragen kompliziert werden
  • andere kleine Dinge, die aus dem ersten Minus fließen

Pinba-Server / Pinba-Server (April 2019)


UDP-Server in PHP, der Metriken in ClickHouse speichert. Dies ist meine Lösung, die sich aus meiner Bekanntschaft mit Pinba, ClickHouse und Protobuf ergibt. Während ich mich mit diesem ganzen Haufen beschäftigte, schrieb ich einen „Proof of Concept“, der für mich unerwartet keine nennenswerten Ressourcen verbrauchte (30 MB RAM und weniger als 1% eines der acht Prozessorkerne), und beschloss, ihn der Öffentlichkeit zugänglich zu machen.

Die Vorteile sind die gleichen wie in der vorherigen Lösung. Ich habe auch die üblichen Namen aus der ursprünglichen pinba_engine verwendet. Ich habe auch eine Konfiguration hinzugefügt, mit der Sie mehrere Pinbaserver-Instanzen gleichzeitig ausführen können, um Metriken in verschiedenen Tabellen zu speichern. Dies ist nützlich, wenn Sie Daten nicht nur von PHP, sondern auch von Nginx erfassen möchten.
Nachteile - ein "schwerwiegender Fehler" und die kleinen Dinge, mit denen Sie sich persönlich nicht wohl fühlen, aber meine Lösung ist "so einfach wie Hausschuhe" und besteht aus nur etwa 100 Codezeilen, sodass jeder PHP-Entwickler in wenigen Minuten ändern kann, was ihm nicht gefällt.

Arbeitsprinzip

Der udp-Port 30002 wird abgehört. Alle eingehenden Pakete werden gemäß dem Protobuf-Schema decodiert und aggregiert. Einmal pro Minute wird das Paket in das Clickhouse in der Tabelle pinba.requests eingefügt. (Alle Parameter werden in der Konfiguration konfiguriert)

Ein bisschen über Clickhouse

Clickhouse unterstützt verschiedene Speicher-Engines. Am häufigsten wird MergeTree verwendet.

Wenn Sie sich irgendwann dazu entschließen, aggregierte Daten für die gesamte Zeit und Rohdaten nur für die letzte Zeit zu speichern, können Sie eine materialisierte Ansicht mit einer Gruppierung erstellen und die Haupttabelle pinba.requests regelmäßig bereinigen, während alle Daten in der materialisierten Ansicht verbleiben. Darüber hinaus können Sie beim Erstellen der Tabelle pinba.requests "engine = Null" angeben. Die Rohdaten werden dann überhaupt nicht auf der Festplatte gespeichert und gleichzeitig in die materialisierte Ansicht übertragen und aggregiert gespeichert. Ich benutze dieses Schema für Nginx-Metriken, weil ich auf Nginx 50-mal mehr Anfragen habe als auf PHP.

Sie haben also einen langen Weg zurückgelegt, und ich möchte Sie nicht auf halbem Weg verlassen. Dann finden Sie eine detaillierte Beschreibung der Installation und Konfiguration meiner Lösung und alles, was Sie benötigen, sowie Fallstricke, gegen die mehr als ein Schiff gekracht ist. Der gesamte Installationsprozess wird für Ubuntu 18.04 LTS und Centos 7 beschrieben. Bei anderen Distributionen und Versionen kann der Prozess geringfügig variieren.

Installation


Ich habe alle notwendigen Befehle in der Docker-Datei ausgeführt , um die Reproduzierbarkeit von Anweisungen zu erleichtern. Im Folgenden werden nur 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 kommentiert sind. In einigen Distributionen (z. B. Centos) können sie auskommentiert werden.

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

Clickhouse

Während der Installation werden Sie von clickhouse aufgefordert, ein Kennwort für den Standardbenutzer festzulegen. Standardmäßig ist dieser Benutzer für alle IP-Adressen verfügbar. Wenn Sie also keine Firewall auf dem Server haben, müssen Sie ein Kennwort dafür festlegen. Dies kann auch nach der Installation in der Datei /etc/clickhouse-server/users.xml erfolgen.

Es ist auch erwähnenswert, dass Clickhouse mehrere Ports verwendet, einschließlich 9000. Dieser Port wird in einigen Distributionen (z. B. Centos) auch für PHP-Fpm verwendet. Wenn Sie diesen Port bereits verwendet haben, können Sie ihn in der Datei /etc/clickhouse-server/config.xml in einen anderen ändern.

grafana mit clickhouse plugin

Verwenden Sie nach der Installation von grafana den Administrator-Benutzernamen und das Administratorkennwort. Beim ersten Eingang werden Sie vom Graphan aufgefordert, ein neues Passwort festzulegen.

Gehen Sie als Nächstes zum Menü "+" -> Importieren und geben Sie die Dashboard-Nummer für den Import 10011 an . Ich habe dieses Dashboard vorbereitet und ausgefüllt, damit Sie es nicht noch einmal selbst tun müssen.

Die grafana unterstützt die Arbeit mit dem Clickhouse über ein Plug-In eines Drittanbieters. Bei Plug-Ins von Drittanbietern funktioniert grafana jedoch nicht für Warnungen (ein Ticket dafür gibt es seit mehreren Jahren).

Pinba Server

Die Installation von protobuf und libevent ist optional, verbessert jedoch die Leistung des Pinba-Servers. Wenn Sie pinba-server in einem anderen Ordner als / opt installieren, müssen Sie auch die systemd-Skriptdatei reparieren.

Pinba-Modul unter Nginx

Zum Kompilieren des Moduls benötigen Sie die Quellen derselben Version von nginx, die bereits auf Ihrem Server installiert ist, sowie dieselben Kompilierungsoptionen. Andernfalls ist die Assembly erfolgreich. Wenn das Modul verbunden ist, wird jedoch ein Fehler generiert, dass das Modul binär inkompatibel ist. Kompilierungsoptionen können mit dem Befehl nginx -V angezeigt werden

Leben hackt

Alle meine Websites funktionieren nur unter https. Das Schema-Feld wird bedeutungslos, daher verwende ich es, um das Web / die Konsole zu trennen.

In Skripten, auf die über das Internet zugegriffen werden kann, verwende ich:

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

Und in der Konsole (zum Beispiel Kronenskripte):

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

In meinem Dashboard in Graphan gibt es einen Web- / Konsolenschalter zum separaten Anzeigen von Statistiken.

Sie können Ihre Tags auch auf Pinbu übertragen, zum Beispiel:

 pinba_tag_set('country', $countryCode); 

Das ist alles

Eine große Bitte, die Umfragen unter dem Artikel zu beantworten.

Traditionell warne ich, dass ich nicht berate und nicht durch persönliche Nachrichten von Habr und sozialen Netzwerken helfe.

Starten Sie ein Ticket auf Github.

Bitte unterstützen Sie auch die englische Version dieses Artikels auf reddit mit Likes .

Source: https://habr.com/ru/post/de444610/


All Articles