In diesem Artikel werde ich erklären, wie man pinba mit clickhouse und grafana anstelle von pinba_engine und pinboard verwendet.
Im PHP-Projekt ist Pinba wahrscheinlich der einzige zuverlässige Weg, um zu verstehen, was mit der Leistung passiert. Aber normalerweise beginnen die Leute mit der Verwendung von Pinba erst, wenn bereits Probleme festgestellt wurden und nicht klar ist, wo sie suchen sollen.
Oft haben Entwickler keine Ahnung, wie viele RPS jedes Skript hat. Sie beginnen also zu optimieren, beginnend an Orten, die Probleme zu haben scheinen.
Jemand analysiert die Nginx-Protokolle und jemand fragt langsam nach der Datenbank.
Natürlich wäre Pinba nicht überflüssig, aber es gibt mehrere Gründe, warum es nicht bei jedem Projekt vorkommt.

Und der erste Grund ist die Installation.
Um mehr oder weniger einen Gewinn aus der Verwendung von Pinba zu ziehen, ist es äußerst wünschenswert, die Metriken nicht nur in den letzten Minuten, sondern auch über einen langen Zeitraum (von Tagen bis Monaten) zu sehen.
Dafür brauchen Sie:
- Installiere die Erweiterung für PHP (und du möchtest vielleicht ein Modul für Nginx haben)
- Kompilieren Sie Erweiterungen für MySQL
- Installieren Sie die Pinnwand und konfigurieren Sie cron
Da wir in letzter Zeit ein paar Informationen über Pinba haben, denken viele Leute, dass es nur auf PHP5 funktioniert hat und weg war, aber wie wir später sehen werden, ist es nicht wahr.
Der erste Schritt ist der einfachste. Sie müssen lediglich den folgenden Befehl ausführen:
apt install php-pinba
In den Repositories existiert diese Erweiterung bis einschließlich PHP 7.3 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.) von udp unter 127.0.0.1:370002 im Format
protobuf sammelt und sendet.
Wir haben noch keine Anwendung zum Abfangen und Verarbeiten dieser udp-Pakete, aber dies hat keinen großen Einfluss auf die Geschwindigkeit oder Stabilität Ihrer PHP-Skripte.
Bis vor kurzem konnte nur
pinba_engine diese udp-Pakete abfangen und verarbeiten. Die Beschreibung der "
einfachen " Installation rät immer wieder davon ab, sie zu lesen. In langen Abhängigkeitslisten gibt es Paketnamen und Programmnamen sowie Links zu anderen Seiten mit anderen Abhängigkeiten. Niemand hat die Zeit oder den Wunsch, mit diesem Mist umzugehen.
Der Installationsprozess für
pinba2 ist nicht
besonders einfach .
Vielleicht kann Pinba10 in Feature mit ein oder zwei Befehlen installiert werden, ohne ein paar Dinge zu lesen, um herauszufinden, wie es geht, aber im Moment ist es nicht so.
Die Installation von pinba_engine ist nur die halbe Wahrheit.
Denn ohne
Pinnwand haben Sie nur in den letzten Minuten begrenzte Daten. Es ist gut, dass die Pinnwand in einer
Installation ziemlich einfach ist.
Aber alle Metriken von PHP gehen bereits im Protobuf-Format zum UDP-Port und alles, was benötigt wird, ist eine Anwendung zu schreiben, die UDP-Pakete abfangen und in eine Art Speicher legen kann? Anscheinend haben die Entwickler, die das dachten, eigene Anwendungen erstellt und einige davon auf dem Githab veröffentlicht.
Im Folgenden finden Sie eine Übersicht über vier Open-Source-Projekte, in denen Metriken gespeichert sind, aus denen diese Daten von der grafana leicht abgerufen und visualisiert werden können.
UDP-Server auf Golang, der Metriken in OpenTSDB speichert. Wenn Sie OpenTSDB bereits in Ihrem Projekt verwenden, passt eine solche Lösung möglicherweise zu Ihnen.
udp-Server auf Golang vom selben
Github-Benutzer , der diesmal Metriken in InfluxDB speichert. Viele Projekte verwenden InfluxDB bereits zur Überwachung, daher ist diese Lösung möglicherweise gut für sie.
Profis:
- Mit Influx können die resultierenden Metriken aggregiert und das Original nach einer bestimmten Zeit entfernt werden.
Nachteile:
- Diese Lösung speichert keine Informationen für Timer.
- InfluxDB speichert die Adressen der Seiten als Tags. Wenn Sie viele eindeutige Adressen von Seiten haben, erhöht sich der RAM-Verbrauch. Ab einem bestimmten Punkt wird " viel Speicher verwendet ". ( Quelle )
UDP-Server auf Golang, der Metriken in ClickHouse speichert. Dies ist die Bewerbung meines Freundes. Nach der Verwendung begann ich mit Clickhouse an meiner eigenen Anwendung für Pinba zu arbeiten.
Profis:
- Das Clickhouse ist ideal für solche Aufgaben. Es ermöglicht Ihnen, die Daten so 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 Informationen für Timer
Nachteile:
Hier nicht erfunden- Es gibt keine Konfiguration für den Namen der Datenbank und der Tabellen, für die Adresse und den Port der
Server. - andere kleine Dinge, die aus dem ersten Minus fließen
UDP-Server auf PHP, der Metriken in ClickHouse speichert. Dies ist meine Anwendung, die das Ergebnis meiner RND von Pinba, ClickHouse und Protobuf ist. Ich schrieb 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 mit den Leuten zu teilen.
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 Pinbasver-Instanzen ausführen können, um Metriken in verschiedenen Tabellen zu speichern. Dies ist nützlich, wenn Sie Messungen nicht nur von PHP, sondern auch von Nginx erfassen möchten.
Nachteile - „Hier nicht erfunden“ und die kleinen Dinge, die nicht zu Ihnen persönlich passen, aber meine Lösung ist sehr einfach und besteht aus nur etwa 100 Codezeilen, sodass jeder PHP-Entwickler in ein paar Minuten alles ändern kann, was er tut nicht wie.
Wie es funktioniertEs hört udp-port 30002 ab. Alle eingehenden Pakete werden gemäß dem Protobuf-Schema decodiert und aggregiert. Einmal pro Minute wird der Paketstapel in das Clickhouse in der Tabelle pinba.requests eingefügt. (Alle Einstellungen werden in der Konfiguration konfiguriert)
Über ClickHouseClickhouse unterstützt verschiedene Datenspeicher-Engines. Am häufigsten wird MergeTree verwendet.
Wenn Sie sich irgendwann dazu entschließen, aggregierte Daten für alle Zeiten und Rohdaten nur für letztere 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 materialisierten Ansicht verbleiben. Darüber hinaus können Sie für die Tabelle pinba.requests "engine = Null" angeben, damit die Rohdaten überhaupt nicht auf der Festplatte gespeichert werden und gleichzeitig weiterhin in der materialisierten Ansicht enthalten sind. Ich benutze dieses Schema für Nginx-Metriken, weil ich auf Nginx 50-mal mehr Anfragen habe als auf PHP.
Sie haben einen langen Weg zurückgelegt, daher finden Sie eine detaillierte Beschreibung der Installation und Konfiguration meiner Lösung sowie alles, was Sie benötigen. Der gesamte Installationsprozess wird für Ubuntu 18.04 LTS und Centos 7 beschrieben. Bei anderen Distributionen und Versionen kann der Prozess geringfügig abweichen.
Installation
Ich habe alle erforderlichen Befehle an
Dockerfile gesendet, um Anweisungen reproduzierbar zu machen. Im Folgenden werden nur Probleme beschrieben.
PHP PinbaStellen Sie nach der Installation sicher, dass Sie alle Optionen in der Datei /etc/php/7.2/fpm/conf.d/20-pinba.ini auskommentiert haben. In einigen Distributionen (z. B. Centos) kann dies auskommentiert werden.
extension = pinba.so pinba.enabled = 1 pinba.server = 127.0.0.1:30002
ClickhouseWährend der Installation werden Sie von clickhouse aufgefordert, ein Kennwort für den Standardbenutzer festzulegen. Standardmäßig ist dieser Benutzer auf allen IP-Adressen verfügbar. Wenn Sie also keine Firewall auf Ihrem Server haben, legen Sie bitte ein Passwort fest. Dies kann auch nach der Installation in der Datei /etc/clickhouse-server/users.xml erfolgen.
Beachten Sie auch, 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 verwenden, können Sie ihn in der Datei /etc/clickhouse-server/config.xml in einen anderen ändern.
grafana mit clickhouse pluginVerwenden Sie nach der Installation der grafana den Benutzernamen "admin" und das Passwort "admin". Wenn Sie sich zum ersten Mal anmelden, werden Sie von der grafana aufgefordert, ein neues Passwort festzulegen.
Gehen Sie als nächstes zum Menü "+" -> importieren und geben Sie die Anzahl der zu importierenden Dashboards
10011 an . Ich habe dieses Dashboard vorbereitet, damit Sie es nicht noch einmal selbst tun müssen.
Grafana unterstützt ClickHouse durch Plugins von Drittanbietern, aber grafana unterstützt keine Warnungen für Plugins von Drittanbietern (das Ticket existiert bereits seit mehreren Jahren).
Pinba ServerDie Installation von protobuf und libevent ist optional, verbessert jedoch die Leistung des Pinba-Servers. Wenn Sie einen Pinba-Server in einem anderen Ordner als / opt installieren, müssen Sie auch die
systemd-Skriptdatei ändern.
Pinba-Modul unter NginxZum Kompilieren des Moduls benötigen Sie den Quellcode derselben Version von nginx, die bereits auf Ihrem Server installiert ist, sowie dieselben Kompilierungsoptionen. Andernfalls ist die Assembly erfolgreich, aber wenn das Modul verbunden ist, tritt ein Fehler auf. " Das Modul ist binär inkompatibel. " Kompilierungsoptionen können mit dem Befehl "nginx -V" angezeigt werden.
LifehacksAlle meine Websites funktionieren nur unter https. Also benutze ich das Feld "Schema" zum Trennen von Web / Konsole.
In den Web-Skripten verwende ich:
if (ini_get('pinba.enabled')) { pinba_schema_set('web'); }
und in der Konsole (zum Beispiel Cron-Skripte):
if (ini_get ('pinba.enabled')) { pinba_schema_set('console'); }
In meinem Dashboard in grafana gibt es ein Switch-Web / eine Switch-Konsole zum separaten Anzeigen von Statistiken.
Sie können Ihre Tags auch an die Pinba senden, zum Beispiel:
pinba_tag_set('country', $countryCode);
Das ist allesSie können auch die
russische Version lesen.
Bitte beantworten Sie Umfragen unter dem Artikel und
unterstützen Sie mich auf Reddit .