Statistik und Überwachung von PHP-Skripten in Echtzeit. ClickHouse und Grafana kommen Pinba zu Hilfe

In diesem Artikel erkläre ich Ihnen, wie Sie Pinba mit Clickhouse und Grafana anstelle von Pinba_Engine und Pinboard verwenden.

Bei einem PHP-Projekt ist Pinba möglicherweise die einzige zuverlässige Möglichkeit, zu verstehen, was mit der Leistung passiert. Zwar wird Pinba normalerweise nur dann implementiert, wenn bereits Probleme beobachtet werden und nicht klar ist, „wo man graben soll“.

Oft hat niemand eine Ahnung, wie oft pro Sekunde/Minute dieses oder jenes Skript aufgerufen wird, und beginnt mit der Optimierung „auf Knopfdruck“, beginnend an den Stellen, die logischer erscheinen.

Einige analysieren Nginx-Protokolle, während andere langsame Datenbankabfragen analysieren.

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

Statistik und Überwachung von PHP-Skripten in Echtzeit. ClickHouse und Grafana kommen Pinba zu Hilfe

Und der erste Grund ist die Installation.

Um mehr oder weniger eine Art „Erschöpfung“ aus der Pinba-Implementierung zu ziehen, ist es sehr wünschenswert, Metriken nicht nur für die letzten Minuten, sondern auch über einen langen Zeitraum (von Tagen bis Monaten) anzuzeigen.

Um dies zu tun:

  • Installieren Sie die Erweiterung für PHP (und Sie möchten möglicherweise ein Modul für Nginx).
  • Kompilierungserweiterung für MySQL
  • Pinnwand installieren und Cron konfigurieren

Aufgrund der wenigen Informationen über Pinba haben viele den Eindruck, dass es nur auf PHP5 funktionierte und schon lange der Vergangenheit angehörte, 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

Diese Erweiterung ist in den Repositories bis einschließlich PHP 7.3 verfügbar und Sie müssen nichts kompilieren.

Nach Ausführung des Installationsbefehls erhalten wir sofort eine funktionierende Erweiterung, die Metriken für jedes Skript (Laufzeit, Speicher usw.) im Format sammelt und sendet protobuf über udp an 127.0.0.1:30002.

Bisher hat noch niemand diese UDP-Pakete abgefangen oder verarbeitet, was sich jedoch in keiner Weise negativ auf die Geschwindigkeit oder Stabilität Ihrer PHP-Skripte auswirkt.

Bis vor kurzem war die einzige Anwendung, die diese UDP-Pakete abfangen und verarbeiten konnte pinba_engine. Beschreibung "einfach und prägnant„Die Installation entmutigt den Wunsch, es jemals wieder zu lesen und sich damit zu befassen. Die kilometerlangen Abhängigkeitslisten enthalten sowohl die Namen von Paketen als auch die Namen von Programmen und Links zu einzelnen Seiten mit deren Installation, und diese verfügen über eigene Links zu anderen Abhängigkeiten. Niemand hat die Zeit oder Lust, sich mit diesem Mist auseinanderzusetzen.

Der Installationsprozess pinba2 nicht vor allem einfacher.

Vielleicht wird es eines Tages möglich sein, pinba10 mit ein oder zwei Befehlen zu installieren, ohne dass man eine Menge Material lesen muss, um zu verstehen, wie es geht, aber im Moment ist das nicht der Fall.

Wenn Sie pinba_engine installieren, ist dies nur die halbe Miete. Immerhin ohne Pinnwand Sie müssen sich auf die Daten der letzten Minuten beschränken oder die Daten selbst aggregieren, speichern und visualisieren. Es ist gut, dass die Pinnwand recht einfach zu bedienen ist Installation.

Es scheint, warum so viel Leid zu erleiden, wenn alle Metriken von PHP bereits im Protobuf-Format an den UDP-Port gesendet werden und Sie nur eine Anwendung schreiben müssen, die sie abfängt und in einer Art Speicher ablegt? Anscheinend haben sich die Entwickler, die diese Idee hatten, sofort daran gemacht, ihre eigenen Ideen zu schreiben, von denen einige auf GitHub landeten.

Im Folgenden finden Sie eine Übersicht über vier Open-Source-Projekte, die Metriken im Speicher speichern, aus denen diese Daten beispielsweise mithilfe von Grafana einfach abgerufen und visualisiert werden können.

olegfedoseev/pinba-server (November 2017)

UDP-Server unterwegs, der Metriken in OpenTSDB speichert. Wenn Sie in Ihrem Projekt bereits OpenTSDB verwenden, ist diese Lösung möglicherweise das Richtige für Sie. Ansonsten empfehle ich, darauf zu verzichten.

olegfedoseev/pinba-influxdb (Juni 2018)

UDP-Server unterwegs, vom selben habrowser, das dieses Mal die Metriken in InfluxDB speichert. Viele Projekte nutzen InfluxDB bereits zur Überwachung, daher könnte diese Lösung perfekt für sie sein.

Profis:

  • InfluxDB ermöglicht Aggregieren Sie die empfangenen Metriken und löschen Sie das Original nach einer bestimmten Zeit.

Nachteile:

ClickHouse-Ninja/Proton (Januar 2019)

UDP-Server unterwegs, der Metriken in ClickHouse speichert. Das ist die Lösung meines Freundes. Nachdem ich mich damit vertraut gemacht hatte, beschloss ich, dass es an der Zeit war, es mit Pinbu und Clickhouse aufzunehmen.

Profis:

  • Für solche Aufgaben ist Clickhouse ideal, da es die Möglichkeit bietet, Daten so stark zu komprimieren, dass alle Rohdaten auch ohne Aggregationen gespeichert werden können
  • Bei Bedarf können Sie die resultierenden Kennzahlen problemlos aggregieren
  • fertige Vorlage für Grafana
  • speichert Informationen zu Timern

Nachteile:

  • fataler Fehler
  • Es gibt keine Konfiguration, in der Sie den Namen der Datenbank und Tabellen, die Adresse und den Port des Servers konfigurieren können.
  • Beim Speichern von Rohdaten wird eine Hilfswörterbuchtabelle zum Speichern von Seiten- und Domänenadressen verwendet, was nachfolgende Abfragen erschwert
  • andere Kleinigkeiten, die sich aus dem ersten Minus ergeben

pinba-server/pinba-server (April 2019)

UDP-Server in PHP, der Metriken in ClickHouse speichert. Dies ist meine Lösung, die das Ergebnis des Kennenlernens von pinba, ClickHouse und protobuf ist. Während ich diesen ganzen Haufen sortierte, 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), also habe ich beschlossen, es mit der Öffentlichkeit zu teilen.

Die Vorteile sind die gleichen wie bei der vorherigen Lösung, ich habe auch die üblichen Namen aus der ursprünglichen pinba_engine verwendet. Ich habe auch eine Konfiguration hinzugefügt, die es Ihnen ermöglicht, mehrere Pinbase-Serverinstanzen gleichzeitig zu starten, um Metriken in verschiedenen Tabellen zu speichern – das ist nützlich, wenn Sie Daten nicht nur von PHP, sondern auch von Nginx sammeln möchten.
Nachteile – „fataler Fehler“ und diese kleinen Dinge, die Ihnen persönlich nicht passen, aber meine Lösung ist „so einfach wie ein Pantoffel“ und besteht nur aus etwa 100 Codezeilen, sodass jeder PHP-Entwickler ändern kann, was ihm nicht gefällt in ein paar Minuten.

Arbeitsprinzip

Abgehört wird der UDP-Port 30002. Alle eingehenden Pakete werden nach dem Protobuf-Schema dekodiert und aggregiert. Einmal pro Minute wird ein Paket in das Clickhouse in die Tabelle pinba.requests eingefügt. (Alle Parameter werden in konfiguriert config)

Ein wenig über Clickhouse

Clickhouse unterstützt verschiedene Datenspeicher-Engines. Das am häufigsten verwendete ist MergeTree.

Wenn Sie sich irgendwann dazu entschließen, aggregierte Daten für alle Zeiten und Rohdaten nur für das letzte Mal zu speichern, können Sie eine materialisierte Ansicht mit Gruppierung erstellen und die Haupttabelle pinba.requests regelmäßig bereinigen, während alle Daten in der bleiben materialisierte Sicht. Darüber hinaus können Sie beim Erstellen der pinba.requests-Tabelle „engine = Null“ angeben, dann werden die Rohdaten überhaupt nicht auf der Festplatte gespeichert und landen gleichzeitig trotzdem in der materialisierten Ansicht und werden aggregiert gespeichert . Ich verwende dieses Schema für Nginx-Metriken, da 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 zurücklassen. Im Folgenden finden Sie eine detaillierte Beschreibung der Installation und Konfiguration meiner Lösung und alles, was Sie benötigen, sowie der Fallstricke, die mehr als ein Schiff verursacht haben zerstören. Der gesamte Installationsvorgang wird für Ubuntu 18.04 LTS und Centos 7 beschrieben; bei anderen Distributionen und Versionen kann der Vorgang geringfügig abweichen.

Einstellung

Ich habe alle notwendigen Befehle eingegeben Dockerfile um die Reproduzierbarkeit von Anweisungen zu erleichtern. Im Folgenden werden nur die Fallstricke beschrieben.

php-pinba

Stellen Sie nach der Installation sicher, dass Sie in der Datei /etc/php/7.2/fpm/conf.d/20-pinba.ini alle Optionen auskommentiert haben. Bei einigen Distributionen (z. B. Centos) sind sie möglicherweise auskommentiert.

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

Clickhouse

Während der Installation werden Sie von Clickhouse aufgefordert, ein Passwort für den Standardbenutzer festzulegen. Standardmäßig ist dieser Benutzer von allen IPs aus erreichbar. Wenn Sie also keine Firewall auf Ihrem Server haben, stellen Sie sicher, dass Sie ein Passwort 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, darunter 9000. Dieser Port wird in einigen Distributionen (z. B. Centos) auch für PHP-FPM verwendet. Wenn Sie diesen Port bereits verwenden, 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 Login-Administrator und das Passwort Admin. Wenn Sie sich zum ersten Mal anmelden, werden Sie von Grafana aufgefordert, ein neues Passwort festzulegen.

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

Grafana unterstützt die Arbeit mit Clickhouse über ein Drittanbieter-Plugin, Grafana verfügt jedoch nicht über Benachrichtigungen für Drittanbieter-Plugins (hierfür gibt es seit mehreren Jahren ein Ticket).

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 ebenfalls eine Korrektur vornehmen systemd-Skript Datei.

Pinba-Modul für Nginx

Um ein Modul zu kompilieren, benötigen Sie Quellcodes derselben Nginx-Version, die bereits auf Ihrem Server installiert ist, sowie dieselben Kompilierungsoptionen. Andernfalls ist der Build erfolgreich, aber beim Verbinden des Moduls wird ein Fehler ausgegeben „Das Modul ist nicht binärkompatibel.“ Kompilierungsoptionen können mit dem Befehl nginx -V angezeigt werden

Leben hackt

Alle meine Websites funktionieren nur auf https. Das Schemafeld wird bedeutungslos, daher verwende ich es, um Web/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 Konsolenskripten (z. B. Cron-Skripten):

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

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

Sie können Ihre Tags auch an Pinba senden, zum Beispiel:

pinba_tag_set('country', $countryCode);

Das ist alles.

Bitte beantworten Sie die Umfragen unter dem Artikel.

Wie üblich warne ich Sie davor, durch persönliche Nachrichten auf Habr und in sozialen Netzwerken Ratschläge oder Hilfe zu geben.

Erstellen Sie ein Ticket auf Github.

Bitte unterstützen Sie auch mit Likes englische Version dieser Artikel auf reddit.

An der Umfrage können nur registrierte Benutzer teilnehmen. Einloggenbitte.

Welches Betriebssystem verwenden Sie auf dem Server?

  • Ubuntu

  • CentOS

  • Debian

  • Gentoo

  • Red Hat

  • Fedora

  • OpenSUSE

  • SCHWEIZ

  • Unix

  • Windows

  • andere

114 Benutzer haben abgestimmt. 11 Benutzer enthielten sich der Stimme.

Welche PHP-Version verwenden Sie auf dem Server?

  • 7.3

  • 7.2

  • 7.1

  • 7.0

  • 5

  • andere

105 Benutzer haben abgestimmt. 17 Benutzer enthielten sich der Stimme.

Haben Sie jemals Pinba verwendet?

  • ja

  • Nein, aber ich würde gerne

  • Nein, und das würde ich auch nicht wollen

  • Nein und ich habe noch nie von ihr gehört

100 Benutzer haben abgestimmt. 14 Benutzer enthielten sich der Stimme.

Welche Version des Pinba-Servers würden Sie gerne ausprobieren?

  • pinba_engine (MySQL-Engine)

  • pinba2 (MySQL-Engine)

  • Pinnwand (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 werde meine selbst schreiben

  • andere

39 Benutzer haben abgestimmt. 47 Benutzer enthielten sich der Stimme.

Source: habr.com

Kommentar hinzufügen