Statistik och övervakning av PHP-skript i realtid. ClickHouse och Grafana hjÀlper Pinba.

I denna artikel kommer jag att berÀtta hur man anvÀnder Pinba tillsammans med ClickHouse och Grafana istÀllet för Pinba Engine och Pinboard.

PÄ PHP-projektet Àr Pinba troligen det enda pÄlitliga sÀttet att förstÄ vad som hÀnder med prestandan. Problemet Àr att Pinba oftast implementeras först nÀr problem redan observeras och det Àr oklart "vart man ska grÀva".

Ofta har ingen en aning om hur mÄnga gÄnger per sekund/minut ett visst skript anropas och man börjar optimera "pÄ kÀnsla", startande med de platser som verkar logiska.

NÄgon analyserar Nginx-loggar, och nÄgon annan lÄngsamma frÄgor i databasen.

SjÀlvklart skulle Pinba vara till nytta, men det finns flera anledningar till varför den inte finns pÄ varje projekt.

Statistik och övervakning av PHP-skript i realtid. ClickHouse och Grafana hjÀlper Pinba.

Och den första anledningen Àr installationen.

För att pÄ nÄgot sÀtt fÄ ut nÄgot "resultat" frÄn implementeringen av Pinba Àr det vÀldigt önskvÀrt att se mÀtvÀrden inte bara för de senaste minuterna, utan ocksÄ över en lÀngre tidsperiod (frÄn dagar till mÄnader).

För detta behöver man:

  • installera en extension för PHP (och kanske vill du ha en modul för Nginx)
  • kompilera en extension för MySQL
  • installera Pinboard och konfigurera cron

PÄ grund av den begrÀnsade informationen om Pinba har mÄnga fÄtt intrycket att den endast fungerade pÄ PHP5 och lÀnge har varit passé, men som vi kommer att se senare - sÄ Àr det inte.

Första steget Àr det enklaste, bara att köra kommandot:

apt install php-pinba

I repositoryn finns denna extension fram till och med PHP 7.3, och du behöver inte kompilera nÄgot.

Efter att ha kört installationskommandot fÄr vi genast en fungerande extension som samlar och skickar mÀtvÀrden för varje skript (körtid, minne, osv.) i formatet protobuf via UDP pÄ 127.0.0.1:30002.

Dessa UDP-paket fÄngas för nÀrvarande inte av nÄgon och bearbetas inte, men detta pÄverkar inte hastigheten eller stabiliteten för dina PHP-skript.

Tills nyligen fanns det endast en applikation som kunde fÄnga och bearbeta dessa UDP-paket, Pinba Engine. Beskrivningen Àr "enkel och kortfattad» installationer avskrÀcker lusten att nÄgonsin lÀsa och sÀtta sig in i detta igen. I de kilometriska listorna av beroenden finns bÄde paketnamn och programnamn samt lÀnkar till separata sidor för deras installation, och de har sina egna lÀnkar till andra beroenden. Ingen har varken tid eller lust att ta sig an det hÀr.

Installationsprocess pinba2 blev inte sÀrskilt enklare.

Kanske kommer pinba10 nÄgon gÄng kunna installeras med ett par kommandon utan att behöva lÀsa en massa material för att förstÄ hur man gör, men sÄ Àr det inte Àn.

Om du ÀndÄ har installerat pinba_engine, sÄ Àr det bara hÀlften av jobbet. För utan pinboard mÄste du nöja dig med data som bara strÀcker sig nÄgra minuter tillbaka eller samla, spara och visualisera data sjÀlv. Tur att pinboard Àr ganska enkel att installation.

Det verkar som överflödigt lidande nÀr alla metrikvÀrden frÄn php redan skickas över udp-porten i protobuf-format och allt som behövs Àr att skriva en applikation som fÄngar dem och lagrar dem i nÄgot förrÄd? TyvÀrr verkar det som att de utvecklare som haft den tanken direkt satte igÄng med att skriva sina egna lösningar, varav en del hamnat pÄ GitHub.

HÀr följer en översikt av fyra öppen kÀllkod-projekt som sparar metrikvÀrden i databaser, frÄn vilka dessa data lÀtt kan nÄs och visualiseras, till exempel med hjÀlp av grafana.

olegfedoseev/pinba-server (november 2017)

udp-server i Go som sparar metrikvÀrden i OpenTSDB. Om du redan anvÀnder OpenTSDB i ditt projekt, kan den hÀr lösningen passa, annars rekommenderar jag att du gÄr förbi.

olegfedoseev/pinba-influxdb (juni 2018)

udp-server i Go, frÄn samma habrauzer, som denna gÄng sparar metrikvÀrden i InfluxDB. MÄnga projekt anvÀnder redan InfluxDB för övervakning, sÄ för dem kan den hÀr lösningen passa bra.

Fördelar:

  • InfluxDB möjliggör aggreggera de mottagna metrikvĂ€rdena och radera originalet efter en viss tidsperiod.

Nackdelar:

(januari 2019) (januari 2019)

En UDP-server pÄ Go som sparar mÀtdata i ClickHouse. Det hÀr Àr en lösning frÄn min vÀn. Det var först efter att jag lÀrde mig om den som jag bestÀmde mig för att ta tag i Pinba och ClickHouse.

Fördelar:

  • ClickHouse Ă€r perfekt för sĂ„dana uppgifter, den gör det möjligt att komprimera data sĂ„ mycket att du kan lagra all rĂ„data Ă€ven utan aggregeringar.
  • Om det behövs kan du enkelt aggregera de mottagna mĂ€tdata.
  • En fĂ€rdig mall för Grafana.
  • Sparar information enligt timers.

Nackdelar:

  • En fatal brist.
  • Det finns ingen konfiguration dĂ€r du kan stĂ€lla in databasens namn och tabeller, adressen och porten för servern.
  • Vid lagring av rĂ„data anvĂ€nds en hjĂ€lptabell för att lagra adresser till sidor och domĂ€ner, vilket komplicerar efterföljande förfrĂ„gningar.
  • Andra smĂ„saker som följer av den första nackdelen.

pinba-server/pinba-server. (april 2019).

En UDP-server pÄ PHP som sparar mÀtdata i ClickHouse. Det hÀr Àr min lösning, resultatet av att jag bekantade mig med Pinba, ClickHouse och Protobuf. Medan jag sorterade ut hela den hÀr kopplingen skrev jag en "proof of concept", som ovÀntat för mig inte krÀvde betydande resurser (30 MB RAM och mindre Àn 1% av en av Ätta processorkÀrnor), sÄ jag bestÀmde mig för att dela med mig till allmÀnheten.

Fördelar — samma som med den föregĂ„ende lösningen, och jag anvĂ€nde Ă€ven de vanliga namnen frĂ„n den ursprungliga pinba_engine. Dessutom lade jag till en konfiguration som gör att du kan starta flera instanser av Pinba-servern samtidigt för att spara mĂ€tdata i olika tabeller — detta Ă€r anvĂ€ndbart om du vill samla in data inte bara frĂ„n PHP utan Ă€ven frĂ„n Nginx.
Nackdelar — "fatal brist" och de smĂ„saker som kanske inte passar just dig, men min lösning Ă€r "enkel som en toffel" och bestĂ„r av ungefĂ€r 100 rader kod, sĂ„ alla PHP-utvecklare kan pĂ„ ett par minuter Ă€ndra det som de inte gillar.

Arbetsprincip.

UDP-port 30002 lyssnas pÄ. Alla inkommande paket avkodas enligt Protobuf-schemat och aggregeras. En gÄng i minuten görs en insÀttning av en bunt i ClickHouse i tabellen pinba.requests. (alla parametrar kan konfigureras i konfigurationen.)

Lite om ClickHouse.

ClickHouse stöder olika datalagringsmotorer. Den vanligaste Àr MergeTree.

Om du bestÀmmer dig för att lagra aggregerade data för alltid och rÄdata endast för den senaste tiden, kan du skapa en materialiserad vy med gruppering, och periodiskt rensa huvudtabellen pinba.requests, medan alla data förblir i den materialiserade vyn. Dessutom, nÀr du skapar tabellen pinba.requests kan du ange "engine = Null", sÄ sparas rÄdata inte pÄ disk, men de kommer fortfarande att gÄ in i den materialiserade vyn och sparas aggregerade. Jag anvÀnder ett sÄdant schema för nginx-metrik, eftersom jag har 50 gÄnger fler begÀrningar pÄ nginx Àn pÄ php.

SÄ, ni har kommit en lÄng vÀg och jag vill inte lÀmna er halvvÀgs, sÄ hÀr kommer en detaljerad beskrivning av installationen och konfigurationen av min lösning och allt ni behöver, samt de fallgropar som mÄnga har stött pÄ. Hela installationsprocessen Àr beskriven för Ubuntu 18.04 LTS och Centos 7, pÄ andra distributioner och versioner kan processen variera nÄgot.

Installation

Alla nödvÀndiga kommandon har jag samlat i Dockerfile för att underlÀtta reproducerbarheten av instruktionerna. Nedan beskrivs endast fallgroparna.

php-pinba

Efter installationen, se till att alla alternativ Àr avkommenterade i filen /etc/php/7.2/fpm/conf.d/20-pinba.ini. I vissa distributioner (till exempel centos) kan de vara kommenterade.

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

clickhouse

Under installationen kommer clickhouse att be dig att ange ett lösenord för anvÀndaren default. Som standard Àr denna anvÀndare tillgÀnglig frÄn alla ip-adresser, sÄ om du inte har en brandvÀgg pÄ servern, se till att stÀlla in ett lösenord för honom. 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 ocksÄ för php-fpm i vissa distributioner (till exempel centos). Om denna port redan anvÀnds kan du Àndra den i filen /etc/clickhouse-server/config.xml.

grafana med plugin för clickhouse

Efter installationen av grafana, anvÀnd inloggningen admin och lösenordet admin. Vid första inloggningen kommer grafana att be dig stÀlla in ett nytt lösenord.

GÄ sedan till menyn «+» -> importera och ange numret pÄ instrumentpanelen för import 10011. Denna instrumentpanel har jag förberett och laddat upp sÄ att ni inte behöver göra den sjÀlva igen.

Grafana stödjer arbete med ClickHouse genom en tredjepartsplugin, men för tredjepartsplugins fungerar inte larm (biljetten har legat öppen i flera Är).

pinba-server

Installation av protobuf och libevent Àr inte obligatorisk, men förbÀttrar prestanda för pinba-server. Om du installerar pinba-server i en annan mapp Àn /opt, mÄste du ocksÄ justera systemd-skript filen.

pinba-modul för nginx

För att kompilera modulen behövs kÀllkoden i samma version av nginx som redan Àr installerad pÄ din server, samt samma kompilationsalternativ, annars kommer sammanstÀllningen att lyckas men modulens anslutning resultera i ett felmeddelande om att "modulen Àr binÀrt inkompatibel". Kompilationsalternativen kan ses med kommandot nginx -V.

Livsstips

Jag har alla mina webbplatser som arbetar endast via https. FÀltet schema blir meningslöst, sÄ jag anvÀnder det för att separera web/console.

I de skript som Àr tillgÀngliga frÄn webben anvÀnder jag:

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

Och i konsolskrift (t.ex. cron-skript):

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

I min dashboard i Grafana finns det en omkopplare för web/console för att se statistik separat.

Du kan ocksÄ skicka dina egna taggar i Pinba, till exempel:

pinba_tag_set('country', $countryCode);

Detta Àr allt.

Jag ber vÀnligen att svara pÄ enkÀterna under artikeln.

Jag varnar traditionellt för att jag inte ger konsultationer och inte hjÀlper via privata meddelanden pÄ Habré eller sociala nÀtverk.

Öppna en biljett pĂ„ GitHub.

Jag ber ocksÄ att stödja med gilla-markeringar den engelska versionen denna artikel pÄ Reddit.

Endast registrerade anvÀndare kan delta i omröstningen. Logga in, tack.

Vilket operativsystem anvÀnder du pÄ servern?

  • Ubuntu

  • CentOS

  • Debian

  • Gentoo

  • Red Hat

  • Fedora

  • OpenSUSE

  • SuSE

  • Unix

  • Windows

  • annat

114 anvÀndare röstat. 11 anvÀndare avstod.

Vilken version av PHP anvÀnder du pÄ servern?

  • 7.3

  • 7.2

  • 7.1

  • 7.0

  • 5

  • annat

105 anvÀndare röstat. 17 anvÀndare avstod.

Har du nÄgonsin anvÀnt Pinba?

  • ja

  • nej, men jag skulle vilja

  • nej och jag skulle inte vilja

  • nej och jag har inte hört talas om det

100 anvÀndare röstat. 14 anvÀndare avstod.

Vilken version av Pinba-server skulle du vilja testa?

  • pinba_engine (mysql-motor)

  • pinba2 (mysql-motor)

  • 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)

  • jag skriver min egen

  • annat

39 anvÀndare röstat. 47 anvÀndare avstod.

KĂ€lla: habr.com

Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar đŸ”„ Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar | ProHoster