Statistik och övervakning av PHP-skript i realtid. ClickHouse och Grafana kommer till hjälp för Pinba

I den här artikeln kommer jag att berätta hur du använder pinba med clickhouse och grafana istället för pinba_engine och anslagstavla.

I ett PHP-projekt är pinba kanske det enda pålitliga sättet att förstå vad som händer med prestanda. Sant, pinba implementeras vanligtvis endast när problem redan observeras och det inte är klart "var man ska gräva."

Ofta har ingen någon aning om hur många gånger per sekund/minut det eller det skriptet anropas och de börjar optimera "genom beröring", utgående från de platser som verkar mer logiska.

Vissa analyserar nginx-loggar, medan andra analyserar långsamma databasfrågor.

Pinba skulle naturligtvis inte vara överflödigt, men det finns flera anledningar till att inte alla projekt har det.

Statistik och övervakning av PHP-skript i realtid. ClickHouse och Grafana kommer till hjälp för Pinba

Och det första skälet är installationen.

För att mer eller mindre få någon form av "utblåsning" från implementeringen av Pinba är det mycket önskvärt att se mätvärden inte bara för de sista minuterna utan också över en lång tidsperiod (från dagar till månader).

För detta behöver du:

  • installera tillägg för php (och du kanske vill ha en modul för nginx)
  • kompilera tillägg för mysql
  • installera anslagstavla och konfigurera cron

På grund av den ringa mängden information om Pinba har många intrycket att det bara fungerade på PHP5 och länge har tillhört det förflutna, men som vi kommer att se senare är så inte fallet.

Det första steget är det enklaste, allt du behöver göra är att köra kommandot:

apt install php-pinba

Det här tillägget är tillgängligt i arkiven till och med php 7.3 och du behöver inte kompilera något.

Efter att ha utfört installationskommandot får vi omedelbart ett fungerande tillägg som samlar in och skickar mätvärden för varje skript (körtid, minne, etc.) i formatet protobuf via udp till 127.0.0.1:30002.

Hittills har ingen fångat eller bearbetat dessa UDP-paket, men detta påverkar inte på något sätt negativt hastigheten eller stabiliteten hos dina PHP-skript.

Tills nyligen var det enda programmet som kunde fånga och bearbeta dessa UDP-paket pinba_engine. Beskrivning "enkel och kortfattad" Installationen motverkar lusten att någonsin läsa och fördjupa sig i den igen. De kilometerlånga listorna med beroenden innehåller både namn på paket och namn på program och länkar till enskilda sidor med deras installation, och de har sina egna länkar till andra beroenden. Ingen har tid eller lust att ta itu med den här skiten.

Installationsprocess pinba2 gjorde inte särskilt lättare.

Kanske en dag kommer det att vara möjligt att installera pinba10 med ett eller två kommandon och inte behöva läsa en massa material för att förstå hur man gör det, men för närvarande är det inte fallet.

Om du installerar pinba_engine är detta bara halva striden. Trots allt utan anslagstavla du måste begränsa dig till data från bara de senaste minuterna, eller så måste du samla, lagra och visualisera data själv. Det är bra att anslagstavlan är ganska enkel att använda installation.

Det verkar, varför sådant lidande om alla mätvärden från php redan skickas till udp-porten i protobuf-format och allt du behöver är att skriva ett program som kommer att fånga dem och lägga dem i någon form av lagring? Tydligen satte sig de utvecklare som kom på den här idén omedelbart för att skriva sina egna idéer, varav några hamnade på GitHub.

Följande är en översikt över fyra projekt med öppen källkod som sparar mätvärden i lagring, från vilka denna data enkelt kan hämtas och visualiseras, till exempel med hjälp av grafana.

olegfedoseev/pinba-server (november 2017)

udp-server på gång som sparar mätvärden till OpenTSDB. Om du redan använder OpenTSDB i ditt projekt kanske den här lösningen passar dig, annars rekommenderar jag att du går förbi den.

olegfedoseev/pinba-influxdb (juni 2018)

udp-server på gång, från samma habrowser, som denna gång lagrar måtten i InfluxDB. Många projekt använder redan InfluxDB för övervakning, så den här lösningen kan vara perfekt för dem.

Fördelar:

  • InfluxDB det gör aggregera mottagna mätvärden och radera originalet efter en angiven tid.

Nackdelar:

Klicka på House-Ninja/Proton (januari 2019)

udp-server på väg, som sparar mätvärden i ClickHouse. Det här är min väns lösning. Det var efter att ha bekantat mig med det som jag bestämde mig för att det var dags att ta mig an Pinbu och Clickhouse.

Fördelar:

  • Clickhouse är idealiskt för sådana uppgifter; det låter dig komprimera data så mycket att du kan lagra all rådata även utan aggregering
  • vid behov kan du enkelt sammanställa de resulterande mätvärdena
  • färdig mall för grafana
  • sparar information om timers

Nackdelar:

  • ödesdigert fel
  • det finns ingen konfiguration där du kan konfigurera namnet på databasen och tabellerna, adressen och porten för servern.
  • vid lagring av rådata används en extra ordbokstabell för att lagra sid- och domänadresser, vilket komplicerar efterföljande frågor
  • andra småsaker som följer av första minus

pinba-server/pinba-server (april 2019)

udp-server i php, som sparar mätvärden i ClickHouse. Det här är min lösning, som är resultatet av att jag lärt känna pinba, ClickHouse och protobuf. Medan jag sorterade ut hela det här gänget skrev jag ett "proof of concept", som, oväntat för mig, inte förbrukade betydande resurser (30 MB RAM och mindre än 1% av en av de åtta processorkärnorna), så jag beslutade att dela det med allmänheten.

Fördelarna är desamma som den tidigare lösningen, jag använde även de vanliga namnen från den ursprungliga pinba_engine. Jag lade också till en konfiguration som låter dig starta flera pinbase-serverinstanser samtidigt för att spara mätvärden i olika tabeller - detta är användbart om du vill samla in data inte bara från php, utan också från nginx.
Nackdelar - "fatalt fel" och de där små sakerna som inte passar dig personligen, men min lösning är "enkel som en toffel" och består av endast cirka 100 rader kod, så vilken PHP-utvecklare som helst kan ändra vad han inte gillar om ett par minuter.

Funktionsprincip

Avlyssnas på UDP-port 30002. Alla inkommande paket avkodas enligt protobuf-schemat och aggregeras. En gång i minuten infogas ett paket i klickhuset i pinba.requests-tabellen. (alla parametrar är konfigurerade i config)

Lite om clickhouse

Clickhouse stöder olika datalagringsmotorer. Den mest använda är MergeTree.

Om du någon gång bestämmer dig för att lagra aggregerad data för all tid, och rådata endast för den sista, kan du skapa en materialiserad vy med gruppering och regelbundet rensa pinba.requests huvudtabell, medan all data kommer att finnas kvar i materialiserad syn. Dessutom, när du skapar pinba.requests-tabellen, kan du ange "engine = Null", då kommer rådata inte att sparas på disken alls, och samtidigt kommer det fortfarande att hamna i den materialiserade vyn och sparas aggregerat . Jag använder det här schemat för nginx-mått, för på nginx har jag 50 gånger fler förfrågningar än på php.

Så, du har kommit långt och jag skulle inte vilja lämna dig halvvägs, så vad som följer är en detaljerad beskrivning av installationen och konfigurationen av min lösning och allt du behöver, samt fallgroparna som har orsakat mer än ett fartyg att krascha. Hela installationsprocessen beskrivs för Ubuntu 18.04 LTS och Centos 7; processen kan skilja sig något på andra distributioner och versioner.

Installation

Jag lägger in alla nödvändiga kommandon Dockerfile för att underlätta reproducerbarheten av instruktioner. Endast fallgroparna kommer att beskrivas nedan.

php-pinba

Efter installationen, se till att du har avkommenterat alla alternativ i filen /etc/php/7.2/fpm/conf.d/20-pinba.ini. På vissa distributioner (t.ex. centos) kan de komma att kommenteras bort.

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

klickhus

Under installationen kommer clickhouse att be dig ställa in ett lösenord för standardanvändaren. Som standard är denna användare tillgänglig från alla IP-adresser, så om du inte har en brandvägg på din server, se till att ange ett lösenord för den. Detta kan också göras efter installationen i filen /etc/clickhouse-server/users.xml.

Det är också värt att notera att clickhouse använder flera portar, inklusive 9000. Denna port används även för php-fpm i vissa distributioner (till exempel centos). Om du redan använder den här porten kan du ändra den till en annan i filen /etc/clickhouse-server/config.xml.

grafana med clickhouse-plugin

Efter att ha installerat Grafana, använd inloggningsadmin och lösenordsadmin. När du loggar in för första gången kommer Grafana att be dig ange ett nytt lösenord.

Gå sedan till "+" -> import-menyn och ange instrumentbrädans nummer för import 10011. Jag förberedde och laddade upp den här instrumentpanelen så att du inte behöver göra det själv igen.

Grafana stöder att arbeta med clickhouse genom ett tredjepartsplugin, men Grafana har inga varningar för tredjepartsplugins (det har funnits en biljett för detta i flera år).

pinba-server

Installation av protobuf och libevent är valfritt, men förbättrar pinba-serverns prestanda. Om du installerar pinba-server i en annan mapp än /opt, måste du också korrigera systemd skript fil.

pinba-modul för nginx

För att kompilera en modul behöver du källkoder för samma version av nginx som redan är installerad på din server, samt samma kompileringsalternativ, annars kommer bygget att lyckas, men när du ansluter modulen kommer ett fel att visas som "modulen är inte binärkompatibel." Kompileringsalternativ kan ses med kommandot nginx -V

Livet hackar

Alla mina sajter fungerar bara på https. Schemafältet blir meningslöst, så jag använder det för att separera webb/konsol.

I skript som är tillgängliga från webben använder jag:

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

Och i konsolskript (till exempel cron-skript):

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

I min instrumentpanel i Grafana finns en webb/konsolswitch för att se statistik separat.

Du kan också skicka dina taggar till Pinba, till exempel:

pinba_tag_set('country', $countryCode);

Det är allt.

Svara gärna på omröstningarna under artikeln.

Som vanligt varnar jag för att jag inte ger råd eller hjälper till genom personliga meddelanden på Habr och sociala nätverk.

Skapa en biljett på Github.

Stöd även gärna med likes engelsk version den här artikeln på reddit.

Endast registrerade användare kan delta i undersökningen. Logga in, Snälla du.

Vilket OS använder du på servern?

  • ubuntu

  • CentOS

  • Debian

  • Gentoo

  • Red Hat

  • fedora

  • OpenSUSE

  • SCHWEIZ

  • Unix

  • Windows

  • andra

114 användare röstade. 11 användare avstod från att rösta.

Vilken version av php använder du på servern?

  • 7.3

  • 7.2

  • 7.1

  • 7.0

  • 5

  • andra

105 användare röstade. 17 användare avstod från att rösta.

Har du någonsin använt pinba?

  • ja

  • nej men jag skulle vilja

  • nej och det skulle jag inte vilja

  • nej och har inte hört talas om henne

100 användare röstade. 14 användare avstod från att rösta.

Vilken version av Pinba-servern skulle du vilja prova?

  • pinba_engine (mysql-motor)

  • pinba2 (mysql-motor)

  • anslagstavla (php + mysql)

  • olegfedoseev/pinba-server (go + OpenTSDB)

  • olegfedoseev/pinba-influxdb (gå + influxdb)

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

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

  • Jag ska skriva min själv

  • andra

39 användare röstade. 47 användare avstod från att rösta.

Källa: will.com

Lägg en kommentar