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

In diesem Artikel erkläre ich, wie man Pinba zusammen mit ClickHouse und Grafana anstelle von pinba_engine und Pinboard verwenden kann.

Auf dem PHP-Projekt ist Pinba wohl der einzige zuverlässige Weg, um zu verstehen, was mit der Leistung passiert. Pinba wird normalerweise erst dann implementiert, wenn bereits Probleme beobachtet werden und es unklar ist, "wo man ansetzen soll".

Oft hat niemand eine Ahnung, wie oft pro Sekunde/Minute ein bestimmtes Skript aufgerufen wird und man beginnt, "blind" zu optimieren, angefangen bei den Stellen, die logischer erscheinen.

Manche analysieren die Nginx-Logs, während andere langsame Datenbankabfragen betrachten.

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

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

Der erste Grund ist die Installation.

Um von der Implementierung von Pinba mehr oder weniger zu profitieren, ist es sehr wünschenswert, Metriken nicht nur für die letzten Minuten, sondern auch über längere Zeiträume (von Tagen bis Monaten) zu sehen.

Dafür muss man:

  • eine Extension für PHP installieren (und möglicherweise ein Modul für Nginx wünschen)
  • die Extension für MySQL kompilieren
  • Pinboard installieren und Cron einrichten

Wegen des geringen Informationsangebots über Pinba haben viele den Eindruck gewonnen, dass es nur auf PHP5 funktionierte und längst der Vergangenheit angehört. Aber wie wir später sehen werden, ist das nicht der Fall.

Der erste Schritt ist der einfachste, man muss nur den Befehl ausführen:

apt install php-pinba

In den Repositories ist diese Extension bis einschließlich PHP 7.3 verfügbar, und man muss nichts kompilieren.

Nach der Ausführung des Installationsbefehls erhalten wir sofort eine funktionierende Erweiterung, die Metriken jedes Skripts (Laufzeit, Speicher usw.) im Format protobuf über UDP an 127.0.0.1:30002 sendet.

Diese UDP-Pakete werden derzeit von niemandem empfangen und verarbeitet, aber das hat keine negativen Auswirkungen auf die Geschwindigkeit oder Stabilität Ihrer PHP-Skripte.

Bis vor Kurzem war die einzige Anwendung, die diese UDP-Pakete empfangen und verarbeiten konnte, pinba_engine. Beschreibung "einfach und prägnantDie Installation entmutigt, dies jemals wieder zu lesen und zu verstehen. In den kilometerlangen Abhängigkeitstabellen stehen sowohl Paketnamen als auch Programmnamen und Links zu einzelnen Installationsseiten, und diese haben ihre eigenen Links zu weiteren Abhängigkeiten. Sich mit diesem Unsinn auseinanderzusetzen, hat niemand die Zeit oder den Wunsch dazu.

Installationsprozess pinba2 wurde nicht besonders einfacher.

Es ist möglich, dass pinba10 eines Tages mit ein oder zwei Befehlen installiert werden kann, ohne einen Haufen Material lesen zu müssen, um zu verstehen, wie das funktioniert, aber bisher ist das nicht so.

Wenn Sie tatsächlich pinba_engine installiert haben, dann ist das nur die halbe Miete. Denn ohne pinboard sind Sie darauf angewiesen, nur die Daten der letzten Minuten zu erhalten oder die Daten selbst zu aggregieren, zu speichern und zu visualisieren. Es ist gut, dass pinboard relativ einfach zu installieren.

Es scheint, warum solch ein Leiden, wenn alle Metriken aus PHP bereits im UDP-Port im Protobuf-Format gesendet werden und alles, was man tun muss, ist eine Anwendung zu schreiben, die diese abfängt und in ein Speicher integriert? Offenbar haben sich die Entwickler, denen dieser Gedanke gekommen ist, sofort daran gemacht, ihre eigenen Räder zu erfinden, von denen einige auf GitHub landeten.

Hier folgt eine Übersicht über vier Open-Source-Projekte, die Metriken in Speicherorten speichern, aus denen diese Daten leicht abgerufen und visualisiert werden können, zum Beispiel mit Grafana.

olegfedoseev/pinba-server (November 2017)

UDP-Server auf Go, der Metriken in OpenTSDB speichert. Wenn OpenTSDB bereits in Ihrem Projekt verwendet wird, könnte diese Lösung für Sie geeignet sein, andernfalls empfehle ich, vorbeizugehen.

olegfedoseev/pinba-influxdb (Juni 2018)

UDP-Server auf Go, vom selben Hub-Rutzer, der diesmal die Metriken in InfluxDB speichert. In vielen Projekten wird InfluxDB bereits für Überwachungen genutzt, deshalb könnte diese Lösung für sie hervorragend geeignet sein.

Vorteile:

Nachteile:

  • Diese Lösung speichert keine Informationen zu Timern.
  • InfluxDB wird die Seitenadressen der Website als Tags speichern, und wenn Sie viele einzigartige Seitenadressen haben, kann das zu erhöhtem Verbrauch RAM führen. Ab einem bestimmten Punkt wird es "den Speicher ohne Ende auffressen«. (Quelle)

ClickHouse-Ninja/Proton (Januar 2019)

UDP-Server auf Go, der Metriken in ClickHouse speichert. Dies ist die Lösung meines Freundes. Nach der Auseinandersetzung mit ihm habe ich beschlossen, dass es Zeit ist, sich mit Pinba und ClickHouse zu beschäftigen.

Vorteile:

  • ClickHouse eignet sich ideal für solche Aufgaben, da es die Daten so komprimiert, dass Sie alle Rohdaten sogar ohne Aggregationen speichern können.
  • Wenn erforderlich, können Sie die erhaltenen Metriken leicht aggregieren.
  • Fertige Vorlage für Grafana
  • speichert Informationen zu Timern

Nachteile:

  • fataler Mangel
  • es gibt keine Konfiguration, in der der Name der Datenbank und der Tabellen, die Adresse und der Port des Servers eingestellt werden können.
  • Bei der Speicherung der Rohdaten wird eine Hilfstabelle als Wörterbuch verwendet, um die Seitenadressen und Domains zu speichern, was die späteren Abfragen komplizierter macht.
  • sonstige Kleinigkeiten, die sich aus dem ersten Nachteil ergeben

pinba-server/pinba-server (April 2019)

UDP-Server auf PHP, der Metriken in ClickHouse speichert. Dies ist meine Lösung, die das Ergebnis meiner Auseinandersetzung mit Pinba, ClickHouse und Protobuf ist. Während ich mit all diesen Verknüpfungen beschäftigt war, schrieb ich ein 'Proof of Concept', das zu meiner Überraschung keine erheblichen Ressourcen verbrauchte (30 MB RAM und weniger als 1% eines von acht Prozessorkernen), sodass ich beschloss, es mit der Öffentlichkeit zu teilen.

Vorteile — die gleichen wie bei der vorherigen Lösung; außerdem verwendete ich die gewohnten Bezeichnungen aus der ursprünglichen Pinba-Engine. Ich fügte auch eine Konfiguration hinzu, die es ermöglicht, mehrere Instanzen des Pinba-Servers gleichzeitig zu starten, um Metriken in verschiedene Tabellen zu speichern — das ist nützlich, wenn Sie Daten nicht nur aus PHP, sondern auch aus Nginx sammeln möchten.
Nachteile — 'fataler Mangel' und die Kleinigkeiten, die Ihnen persönlich nicht gefallen, aber meine Lösung ist 'einfach wie ein Hausschuh' und besteht aus nur etwa 100 Zeilen Code, sodass jeder PHP-Entwickler in ein paar Minuten das ändern kann, was ihm nicht gefällt.

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 werden in der Konfiguration)

Ein wenig über ClickHouse

ClickHouse unterstützt verschiedene Speichermotoren. Der am häufigsten verwendete ist MergeTree.

Wenn Sie irgendwann entscheiden, aggregierte Daten über einen längeren Zeitraum zu speichern und Rohdaten nur für die letzte Zeit, können Sie eine materialisierte Sicht mit Gruppierung erstellen, während die Haupttabelle pinba.requests regelmäßig gereinigt wird, wobei alle Daten in der materialisierten Sicht verbleiben. Darüber hinaus können Sie beim Erstellen der Tabelle pinba.requests „engine = Null“ angeben, sodass Rohdaten überhaupt nicht auf die Festplatte gespeichert werden und dennoch in der materialisierten Sicht landen und aggregiert gespeichert werden. Dieses Schema nutze ich für Nginx-Metriken, da Nginx bei mir 50-mal mehr Anfragen hat als PHP.

Also, Sie haben einen langen Weg zurückgelegt und ich möchte Sie nicht auf halbem Weg lassen, deshalb folgt eine ausführliche Beschreibung der Installation und Konfiguration meiner Lösung sowie alles, was Sie benötigen, und die Fallstricke, an denen nicht nur ein Schiff gescheitert ist. Der gesamte Installationsprozess ist für Ubuntu 18.04 LTS und Centos 7 beschrieben; auf anderen Distributionen und Versionen kann der Prozess geringfügig abweichen.

Installation

Alle erforderlichen Befehle habe ich in das Dockerfile für die einfachere Wiederholbarkeit der Anweisungen ausgegliedert. 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 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 IP-Adressen aus erreichbar; wenn Sie daher keine Firewall auf dem Server haben, stellen Sie sicher, dass Sie ihm ein Passwort zuweisen. Dies kann auch nach der Installation in der Datei /etc/clickhouse-server/users.xml gemacht werden.

Es ist auch zu beachten, dass Clickhouse mehrere Ports verwendet, darunter 9000. Dieser Port wird auch für php-fpm in einigen Distributionen (z. B. Centos) verwendet. Wenn dieser Port bereits verwendet wird, können Sie ihn in der Datei /etc/clickhouse-server/config.xml auf einen anderen ändern.

grafana mit Plugin für clickhouse

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

Gehen Sie dann in das Menü „+“ -> importieren und geben Sie die Nummer des Dashboards zum Importieren an 10011. Dieses Dashboard habe ich vorbereitet und hochgeladen, damit Sie es nicht noch einmal selbst erstellen müssen.

Grafana unterstützt die Arbeit mit ClickHouse über ein externes Plugin, aber für externe Plugins funktionieren die Benachrichtigungen in Grafana nicht (ein Ticket dazu gibt es bereits seit mehreren Jahren).

pinba-server

Die Installation von Protobuf und libevent ist nicht obligatorisch, verbessert aber 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.

Das pinba-Modul für nginx

Um das Modul zu kompilieren, sind die Quellcodes derselben Version von nginx erforderlich, die auf Ihrem Server installiert ist, sowie die gleichen Kompilierungsoptionen; andernfalls wird die Kompilierung zwar erfolgreich sein, aber beim Anschluss des Moduls wird eine Fehlermeldung angezeigt, dass „das Modul binär inkompatibel ist“. Die Kompilierungsoptionen können Sie mit dem Befehl nginx -V einsehen.

Lifehacks

Ich lasse alle meine Seiten nur über https laufen. Das Feld schema wird daher nutzlos, weshalb ich es zur Trennung von web/console verwende.

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

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

In den Konsolenskripten (zum Beispiel Cron-Skripten):

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

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

Zusätzlich können in Pinba eigene Tags übergeben werden, zum Beispiel:

pinba_tag_set('country', $countryCode);

Das wäre alles.

Ich bitte um eine Rückmeldung zu den Umfragen unter dem Artikel.

Ich warne traditionell, dass ich nicht berate und nicht über persönliche Nachrichten auf Habra und in sozialen Netzwerken hilfe.

Erstellen Sie ein Ticket auf GitHub.

Ich bitte auch um Unterstützung in Form von Likes der englischen Version dieses Artikels auf Reddit.

Nur registrierte Benutzer können an der Umfrage teilnehmen. Bitte einloggen.

Welches Betriebssystem verwenden Sie auf dem Server?

  • Ubuntu

  • CentOS

  • Debian

  • Gentoo

  • Red Hat

  • Fedora

  • OpenSUSE

  • SuSE

  • Unix

  • Windows

  • andere

114 Benutzer haben abgestimmt. 11 Benutzer haben sich enthalten.

Welche PHP-Version verwenden Sie auf Ihrem Server?

  • 7.3

  • 7.2

  • 7.1

  • 7.0

  • 5

  • andere

105 Benutzer haben abgestimmt. 17 Benutzer haben sich enthalten.

Haben Sie schon einmal Pinba verwendet?

  • ja

  • nein, aber ich würde es gerne ausprobieren

  • nein, und ich würde es nicht wollen

  • 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 werde mein eigenes schreiben

  • andere

39 Benutzer haben abgestimmt. 47 Benutzer haben sich enthalten.

Quelle: habr.com

60GB SSD 8Gb DDR4