Statistieken en monitoring van PHP-scripts in realtime. ClickHouse en Grafana komen Pinba te hulp

In dit artikel vertel ik je hoe je pinba gebruikt met clickhouse en grafana in plaats van pinba_engine en pinboard.

Bij een PHP-project is pinba misschien wel de enige betrouwbare manier om te begrijpen wat er met de prestaties gebeurt. Toegegeven, pinba wordt meestal alleen geïmplementeerd als er al problemen zijn waargenomen en het niet duidelijk is ‘waar te graven’.

Vaak heeft niemand enig idee hoe vaak per seconde/minuut dit of dat script wordt aangeroepen en beginnen ze “door aanraking” te optimaliseren, te beginnen vanaf die plaatsen die logischer lijken.

Sommigen analyseren nginx-logboeken, terwijl anderen langzame databasequery's analyseren.

Natuurlijk zou pinba niet overbodig zijn, maar er zijn verschillende redenen waarom niet elk project het heeft.

Statistieken en monitoring van PHP-scripts in realtime. ClickHouse en Grafana komen Pinba te hulp

En de eerste reden is installatie.

Om min of meer een soort ‘uitputting’ uit de implementatie van Pinba te halen, is het zeer wenselijk om de statistieken niet alleen voor de laatste minuten te zien, maar ook over een lange periode (van dagen tot maanden).

Hiervoor heeft u nodig:

  • installeer extensie voor php (en misschien wil je een module voor nginx)
  • compileer extensie voor mysql
  • installeer het prikbord en configureer cron

Door de kleine hoeveelheid informatie over Pinba hebben veel mensen de indruk dat het alleen op PHP5 werkte en al lang tot het verleden behoort, maar zoals we later zullen zien is dit niet het geval.

De eerste stap is de eenvoudigste. Het enige wat u hoeft te doen is de opdracht uit te voeren:

apt install php-pinba

Deze extensie is beschikbaar in de repositories tot en met php 7.3 en je hoeft niets te compileren.

Na het uitvoeren van de installatieopdracht ontvangen we onmiddellijk een werkende extensie die voor elk script statistieken verzamelt en verzendt (looptijd, geheugen, enz.) in het formaat prototype via udp naar 127.0.0.1:30002.

Tot nu toe heeft niemand deze UDP-pakketten onderschept of verwerkt, maar dit heeft op geen enkele manier een negatieve invloed op de snelheid of stabiliteit van uw PHP-scripts.

Tot voor kort was de enige applicatie die deze UDP-pakketten kon opvangen en verwerken pinba_engine. Beschrijving "eenvoudig en beknoptDe installatie ontmoedigt de wens om het ooit nog eens te lezen en erin te duiken. De kilometerslange lijsten met afhankelijkheden bevatten zowel de namen van pakketten als de namen van programma's en links naar individuele pagina's met hun installatie, en die hebben hun eigen links naar andere afhankelijkheden. Niemand heeft de tijd of het verlangen om met deze onzin om te gaan.

Installatie proces pinba2 deed niet vooral makkelijker.

Misschien zal het op een dag mogelijk zijn om pinba10 met een of twee commando's te installeren en niet een hoop materiaal te hoeven lezen om te begrijpen hoe het moet, maar voorlopig is dit niet het geval.

Als je pinba_engine hebt geïnstalleerd, is dit slechts het halve werk. Zonder immers prikbord je zult je moeten beperken tot gegevens van slechts de laatste paar minuten, of je zult de gegevens zelf moeten aggregeren, opslaan en visualiseren. Het is goed dat het prikbord vrij eenvoudig te gebruiken is installatie.

Het lijkt erop, waarom zo'n lijden als alle statistieken van php al in protobuf-formaat naar de udp-poort zijn verzonden en het enige dat je nodig hebt is een applicatie te schrijven die ze opvangt en in een soort opslag plaatst? Blijkbaar zijn de ontwikkelaars die met dit idee kwamen meteen aan de slag gegaan om hun eigen ideeën te schrijven, waarvan sommige op GitHub terechtkwamen.

Wat volgt is een overzicht van vier open source-projecten die metrics opslaan in storage, waaruit deze data eenvoudig kunnen worden opgehaald en gevisualiseerd, bijvoorbeeld met behulp van grafana.

olegfedoseev/pinba-server (november 2017)

udp-server on go die statistieken opslaat in OpenTSDB. Misschien als u OpenTSDB al in uw project gebruikt, dan zal deze oplossing bij u passen, anders raad ik u aan deze voorbij te laten gaan.

olegfedoseev/pinba-influxdb (juni 2018)

udp-server op go, van hetzelfde browser, die deze keer de statistieken opslaat in InfluxDB. Veel projecten gebruiken InfluxDB al voor monitoring, dus deze oplossing kan perfect voor hen zijn.

Voors:

  • InstroomDB laat verzamel de ontvangen statistieken en verwijder het origineel na een bepaalde tijd.

Tegens:

ClickHouse-Ninja/Proton (januari 2019)

udp-server op go, die statistieken in ClickHouse opslaat. Dit is de oplossing van mijn vriend. Nadat ik ermee kennis had gemaakt, besloot ik dat het tijd was om de strijd aan te gaan met Pinbu en Clickhouse.

Voors:

  • Clickhouse is ideaal voor dergelijke taken; u kunt gegevens zo veel comprimeren dat u alle onbewerkte gegevens kunt opslaan, zelfs zonder aggregaties
  • indien nodig kunt u de resulterende statistieken eenvoudig samenvoegen
  • kant-en-klare sjabloon voor grafana
  • slaat informatie over timers op

Tegens:

  • fatale fout
  • er is geen configuratie waarin u de naam van de database en tabellen, het adres en de poort van de server kunt configureren.
  • bij het opslaan van onbewerkte gegevens wordt een hulpwoordenboektabel gebruikt om pagina- en domeinadressen op te slaan, wat daaropvolgende zoekopdrachten bemoeilijkt
  • andere kleine dingen die volgen uit het eerste minpuntje

pinba-server/pinba-server (april 2019)

udp-server in php, die statistieken opslaat in ClickHouse. Dit is mijn oplossing, die het resultaat is van het leren kennen van pinba, ClickHouse en protobuf. Terwijl ik deze hele boel aan het uitzoeken was, schreef ik een ‘proof of concept’, die, onverwacht voor mij, geen noemenswaardige bronnen in beslag nam (30 MB RAM en minder dan 1% van een van de acht processorkernen), dus ik besloten om het met het publiek te delen.

De voordelen zijn hetzelfde als de vorige oplossing, ik heb ook de gebruikelijke namen van de originele pinba_engine gebruikt. Ik heb ook een configuratie toegevoegd waarmee je meerdere pinbase-serverinstanties tegelijk kunt starten om statistieken in verschillende tabellen op te slaan - dit is handig als je niet alleen gegevens uit php wilt verzamelen, maar ook uit nginx.
Nadelen - "fatale fout" en die kleine dingen die persoonlijk niet bij je passen, maar mijn oplossing is "zo simpel als een slipper" en bestaat uit slechts ongeveer 100 regels code, dus elke PHP-ontwikkelaar kan veranderen wat hij niet leuk vindt over een paar minuten.

Werking

Er wordt geluisterd naar UDP-poort 30002. Alle binnenkomende pakketten worden gedecodeerd volgens het protobuf-schema en geaggregeerd. Eén keer per minuut wordt er een pakketje in het clickhouse in de pinba.requests-tabel geplaatst. (alle parameters zijn geconfigureerd in configuratie)

Iets over clickhouse

Clickhouse ondersteunt verschillende dataopslag-engines. De meest gebruikte is MergeTree.

Als u op een gegeven moment besluit om de geaggregeerde gegevens voor altijd op te slaan, en alleen de onbewerkte gegevens voor de laatste, dan kunt u een gematerialiseerde weergave met groepering creëren en periodiek de hoofdtabel pinba.requests opschonen, terwijl alle gegevens in de tabel blijven staan. gematerialiseerde visie. Bovendien kunt u bij het maken van de pinba.requests-tabel “engine = Null” opgeven, waarna de onbewerkte gegevens helemaal niet op schijf worden opgeslagen en tegelijkertijd nog steeds in de gerealiseerde weergave terechtkomen en geaggregeerd worden opgeslagen. . Ik gebruik dit schema voor nginx-statistieken, omdat ik op nginx 50 keer meer verzoeken heb dan op php.

Je hebt dus een lange weg afgelegd en ik zou je niet halverwege willen verlaten, dus wat volgt is een gedetailleerde beschrijving van de installatie en configuratie van mijn oplossing en alles wat je nodig hebt, evenals de valkuilen die ervoor hebben gezorgd dat meer dan één schip botsen. Het volledige installatieproces wordt beschreven voor Ubuntu 18.04 LTS en Centos 7; het proces kan enigszins afwijken op andere distributies en versies.

installatie

Ik heb alle benodigde commando's ingevoerd Dockerfile om de reproduceerbaarheid van instructies te vergemakkelijken. Hieronder worden alleen de valkuilen beschreven.

php-pinba

Zorg er na de installatie voor dat u in het bestand /etc/php/7.2/fpm/conf.d/20-pinba.ini alle opties hebt verwijderd. Bij sommige distributies (bijvoorbeeld centos) kan er commentaar op worden gegeven.

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

klikhuis

Tijdens de installatie zal Clickhouse u vragen een wachtwoord in te stellen voor de standaardgebruiker. Standaard is deze gebruiker toegankelijk vanaf alle IP's, dus als u geen firewall op uw server heeft, zorg er dan voor dat u er een wachtwoord voor instelt. Dit kan ook worden gedaan na installatie in het bestand /etc/clickhouse-server/users.xml.

Het is ook vermeldenswaard dat clickhouse verschillende poorten gebruikt, waaronder 9000. Deze poort wordt in sommige distributies (bijvoorbeeld centos) ook gebruikt voor php-fpm. Als u deze poort al gebruikt, kunt u deze wijzigen in een andere poort in het bestand /etc/clickhouse-server/config.xml.

grafana met clickhouse-plug-in

Na het installeren van Grafana gebruikt u de login admin en wachtwoord admin. Wanneer u voor de eerste keer inlogt, zal Grafana u vragen een nieuw wachtwoord in te stellen.

Ga vervolgens naar het “+” -> importmenu en geef het dashboardnummer aan dat u wilt importeren 10011. Ik heb dit dashboard voorbereid en geüpload, zodat je het niet nog een keer zelf hoeft te doen.

Grafana ondersteunt het werken met clickhouse via een plug-in van derden, maar Grafana heeft geen waarschuwingen voor plug-ins van derden (hier bestaat al enkele jaren een ticket voor).

pinba-server

Het installeren van protobuf en libevent is optioneel, maar verbetert de prestaties van de pinba-server. Als u pinba-server in een andere map dan /opt installeert, moet u dit ook corrigeren systemd-script het dossier.

pinba-module voor nginx

Om een ​​module te compileren, heb je broncodes nodig van dezelfde versie van nginx die al op je server is geïnstalleerd, evenals dezelfde compilatie-opties, anders zal de build succesvol zijn, maar bij het verbinden van de module zal er een foutmelding verschijnen dat “de module is niet binair compatibel.” Compilatieopties kunnen worden bekeken met de opdracht nginx -V

Lifehacks

Al mijn sites werken alleen op https. Het schemaveld wordt betekenisloos, dus gebruik ik het om web/console te scheiden.

In scripts die toegankelijk zijn vanaf internet gebruik ik:

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

En in consolescripts (bijvoorbeeld cron-scripts):

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

In mijn dashboard in Grafana zit een web/console-schakelaar om statistieken afzonderlijk te bekijken.

Je kunt je tags ook naar Pinba sturen, bijvoorbeeld:

pinba_tag_set('country', $countryCode);

Dat is alles.

Beantwoord de polls onder het artikel.

Zoals gewoonlijk waarschuw ik je dat ik geen advies of hulp geef via persoonlijke berichten op Habr en sociale netwerken.

Maak een ticket op Github.

Steun ook met likes Engelse versie dit artikel op reddit.

Alleen geregistreerde gebruikers kunnen deelnemen aan het onderzoek. Inloggen, Alsjeblieft.

Welk besturingssysteem gebruik je op de server?

  • Ubuntu

  • CentOS

  • Debian

  • Gentoo

  • Red Hat

  • Fedora

  • OpenSUSE

  • ZOALS

  • Unix

  • Dakramen en raamkozijnen

  • ander

114 gebruikers hebben gestemd. 11 gebruikers onthielden zich van stemming.

Welke versie van PHP gebruik je op de server?

  • 7.3

  • 7.2

  • 7.1

  • 7.0

  • 5

  • ander

105 gebruikers hebben gestemd. 17 gebruikers onthielden zich van stemming.

Heeft u ooit pinba gebruikt?

  • ja

  • nee, maar ik zou het wel graag willen

  • nee en dat zou ik ook niet willen

  • nee en heb nog nooit van haar gehoord

100 gebruikers hebben gestemd. 14 gebruikers onthielden zich van stemming.

Welke versie van Pinba-server wilt u proberen?

  • pinba_engine (mysql-engine)

  • pinba2 (mysql-engine)

  • prikbord (php + mysql)

  • olegfedoseev/pinba-server (go + OpenTSDB)

  • olegfedoseev/pinba-influxdb (go + influxdb)

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

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

  • Ik zal de mijne zelf schrijven

  • ander

39 gebruikers hebben gestemd. 47 gebruikers onthielden zich van stemming.

Bron: www.habr.com

Voeg een reactie