Statistikat dhe monitorimi i skripteve PHP në kohë reale. Pinba-s i vijnë në ndihmë ClickHouse dhe Grafana

Në këtë artikull do t'ju tregoj se si të përdorni pinba me clickhouse dhe grafana në vend të pinba_engine dhe pinboard.

Në një projekt PHP, pinba është ndoshta mënyra e vetme e besueshme për të kuptuar se çfarë po ndodh me performancën. Vërtetë, pinba zakonisht zbatohet vetëm kur problemet tashmë janë vërejtur dhe nuk është e qartë "ku të gërmoni".

Shpesh askush nuk e ka idenë se sa herë në sekondë/minutë thirret ky apo ai skenar dhe ata fillojnë të optimizohen “me prekje”, duke u nisur nga ato vende që duken më logjike.

Disa analizojnë regjistrat e nginx, ndërsa të tjerët analizojnë pyetje të ngadalta të bazës së të dhënave.

Sigurisht, pinba nuk do të ishte e tepërt, por ka disa arsye pse jo çdo projekt e ka atë.

Statistikat dhe monitorimi i skripteve PHP në kohë reale. Pinba-s i vijnë në ndihmë ClickHouse dhe Grafana

Dhe arsyeja e parë është instalimi.

Për të marrë pak a shumë një lloj "shterimi" nga zbatimi i Pinba, është shumë e dëshirueshme të shihni metrikë jo vetëm për minutat e fundit, por edhe për një periudhë të gjatë kohore (nga ditët në muaj).

Për këtë ju duhet:

  • instaloni shtesën për php (dhe mund të dëshironi një modul për nginx)
  • përpiloni shtesën për mysql
  • instaloni pinboard dhe konfiguroni cron

Për shkak të sasisë së vogël të informacionit për Pinba, shumë njerëz kanë përshtypjen se ai funksiononte vetëm në PHP5 dhe ka kohë që i përket së shkuarës, por siç do të shohim më vonë, nuk është kështu.

Hapi i parë është më i thjeshtë, gjithçka që duhet të bëni është të ekzekutoni komandën:

apt install php-pinba

Kjo shtesë është e disponueshme në depot deri dhe duke përfshirë php 7.3 dhe nuk keni nevojë të përpiloni asgjë.

Pas ekzekutimit të komandës së instalimit, ne marrim menjëherë një shtesë pune që mbledh dhe dërgon metrikë për çdo skript (koha e ekzekutimit, memoria, etj.) në format protobuf nëpërmjet udp në 127.0.0.1:30002.

Deri më tani askush nuk i ka kapur ose përpunuar këto pako UDP, por kjo nuk ndikon në asnjë mënyrë negativisht në shpejtësinë ose stabilitetin e skripteve tuaja PHP.

Deri kohët e fundit, i vetmi aplikacion që mund të kapte dhe përpunonte këto pako UDP ishte pinba_motor. Përshkrim "e thjeshtë dhe koncize"Instalimi dekurajon dëshirën për të lexuar dhe thelluar përsëri në të. Listat kilometrike të varësive përmbajnë emrat e paketave dhe emrat e programeve dhe lidhjet me faqet individuale me instalimin e tyre, dhe ato kanë lidhjet e tyre me varësi të tjera. Askush nuk ka kohë apo dëshirë të merret me këtë katrahurë.

Procesi i instalimit pinba2 nuk e bëri veçanërisht më e lehtë.

Ndoshta një ditë do të jetë e mundur të instaloni pinba10 me një ose dy komanda dhe të mos keni nevojë të lexoni një mori materialesh për të kuptuar se si ta bëni atë, por tani për tani nuk është kështu.

Nëse instaloni pinba_engine, atëherë kjo është vetëm gjysma e betejës. Në fund të fundit, pa pinboard do t'ju duhet të kufizoheni në të dhënat vetëm nga minutat e fundit, ose do t'ju duhet t'i grumbulloni, ruani dhe vizualizoni vetë të dhënat. Është mirë që pinboard është mjaft i thjeshtë për t'u përdorur instalimi.

Do të duket, pse vuajtje të tilla nëse të gjitha metrikat nga php janë dërguar tashmë në portin udp në formatin protobuf dhe gjithçka që ju nevojitet është të shkruani një aplikacion që do t'i kapë dhe do t'i vendosë në një lloj ruajtjeje? Me sa duket, ata zhvillues që erdhën me këtë ide u ulën menjëherë për të shkruar idetë e tyre, disa prej të cilave përfunduan në GitHub.

Ajo që vijon është një përmbledhje e katër projekteve me burim të hapur që ruajnë metrikat në ruajtje, nga të cilat këto të dhëna mund të merren lehtësisht dhe të vizualizohen, për shembull, duke përdorur grafana.

olegfedoseev/pinba-server (nëntor 2017)

Serveri udp në lëvizje që ruan metrikat në OpenTSDB. Ndoshta nëse tashmë po përdorni OpenTSDB në projektin tuaj, atëherë kjo zgjidhje do t'ju përshtatet, përndryshe ju rekomandoj ta kaloni atë.

olegfedoseev/pinba-influxdb (qershor 2018)

server udp në lëvizje, nga i njëjti shfletues, e cila këtë herë ruan matjet në InfluxDB. Shumë projekte tashmë po përdorin InfluxDB për monitorim, kështu që kjo zgjidhje mund të jetë perfekte për ta.

Pro:

  • InfluxDB Kjo i lejon grumbulloni metrikat e marra dhe fshini origjinalin pas një kohe të caktuar.

Cons:

ClickHouse-Ninja/Proton (janar 2019)

Serveri udp në lëvizje, i cili kursen matjet në ClickHouse. Kjo është zgjidhja e mikut tim. Pasi u njoha me të, vendosa se ishte koha të merrja me Pinbu dhe Clickhouse.

Pro:

  • Clickhouse është ideal për detyra të tilla; ju lejon të kompresoni të dhënat aq shumë sa të mund të ruani të gjitha të dhënat e papërpunuara edhe pa grumbullime
  • nëse kërkohet, mund të grumbulloni lehtësisht metrikat që rezultojnë
  • shabllon i gatshëm për grafana
  • kursen informacionin në kohëmatës

Cons:

  • e metë fatale
  • Nuk ka asnjë konfigurim në të cilin mund të konfiguroni emrin e bazës së të dhënave dhe tabelave, adresën dhe portin e serverit.
  • kur ruani të dhëna të papërpunuara, një tabelë fjalori ndihmëse përdoret për të ruajtur adresat e faqeve dhe domeneve, gjë që ndërlikon pyetjet pasuese
  • gjëra të tjera të vogla që pasojnë nga minusi i parë

pinba-server/pinba-server (Prill 2019)

server udp në php, i cili kursen metrikë në ClickHouse. Kjo është zgjidhja ime, e cila është rezultat i njohjes me pinba, ClickHouse dhe protobuf. Ndërsa po zgjidhja të gjithë këtë grup, shkrova një "provë koncepti", e cila, papritur për mua, nuk konsumoi burime të konsiderueshme (30 MB RAM dhe më pak se 1% e një prej tetë bërthamave të procesorit), kështu që unë vendosi ta ndajë me publikun.

Përparësitë janë të njëjta me zgjidhjen e mëparshme, kam përdorur edhe emrat e zakonshëm nga pinba_engine origjinale. Shtova gjithashtu një konfigurim që ju lejon të nisni disa raste të serverit pinbase në të njëjtën kohë për të ruajtur metrikat në tabela të ndryshme - kjo është e dobishme nëse doni të mblidhni të dhëna jo vetëm nga php, por edhe nga nginx.
Disavantazhet - "të meta fatale" dhe ato gjëra të vogla që nuk do t'ju përshtaten personalisht, por zgjidhja ime është "e thjeshtë sa një pantofla" dhe përbëhet nga vetëm rreth 100 rreshta kodi, kështu që çdo zhvillues PHP mund të ndryshojë atë që nuk i pëlqen në disa minuta.

Parimi i operacionit

Dëgjohet porta UDP 30002. Të gjitha paketat hyrëse deshifrohen sipas skemës protobuf dhe grumbullohen. Një herë në minutë, një paketë futet në klikimin në tabelën pinba.kërkesat. (të gjithë parametrat janë konfiguruar në konfigurim)

Pak për clickhouse

Clickhouse mbështet motorë të ndryshëm të ruajtjes së të dhënave. Më i përdoruri është MergeTree.

Nëse në një moment vendosni të ruani të dhëna të grumbulluara për të gjithë kohën, dhe të dhëna të papërpunuara vetëm për të fundit, atëherë mund të krijoni një pamje të materializuar me grupim dhe të pastroni periodikisht tabelën kryesore pinba.requests, ndërsa të gjitha të dhënat do të mbeten në pamje e materializuar. Për më tepër, kur krijoni tabelën pinba.requests, mund të specifikoni "engine = Null", atëherë të dhënat e papërpunuara nuk do të ruhen fare në disk dhe në të njëjtën kohë do të përfundojnë në pamjen e materializuar dhe do të ruhen të grumbulluara. . Unë e përdor këtë skemë për matjet nginx, sepse në nginx kam 50 herë më shumë kërkesa sesa në php.

Pra, ju keni bërë një rrugë të gjatë dhe unë nuk do të doja t'ju lë në gjysmë të rrugës, kështu që ajo që vijon është një përshkrim i detajuar i instalimit dhe konfigurimit të zgjidhjes sime dhe gjithçka që ju nevojitet, si dhe grackat që kanë shkaktuar më shumë se një anije të rrëzohet. I gjithë procesi i instalimit përshkruhet për Ubuntu 18.04 LTS dhe Centos 7; procesi mund të ndryshojë pak në shpërndarjet dhe versionet e tjera.

Instalim

Vendosa të gjitha komandat e nevojshme dockerfile për të lehtësuar riprodhueshmërinë e udhëzimeve. Vetëm kurthet do të përshkruhen më poshtë.

php-pinba

Pas instalimit, sigurohuni që në skedarin /etc/php/7.2/fpm/conf.d/20-pinba.ini të keni çkomentuar të gjitha opsionet. Në disa shpërndarje (p.sh. centos) ato mund të komentohen.

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

klikim shtëpie

Gjatë instalimit, clickhouse do t'ju kërkojë të vendosni një fjalëkalim për përdoruesin e paracaktuar. Si parazgjedhje, ky përdorues është i aksesueshëm nga të gjitha IP-të, kështu që nëse nuk keni një mur zjarri në serverin tuaj, sigurohuni që të vendosni një fjalëkalim për të. Kjo mund të bëhet edhe pas instalimit në skedarin /etc/clickhouse-server/users.xml.

Vlen gjithashtu të theksohet se clickhouse përdor disa porte, duke përfshirë 9000. Ky port përdoret gjithashtu për php-fpm në disa shpërndarje (për shembull, centos). Nëse e përdorni tashmë këtë portë, mund ta ndryshoni në një tjetër në skedarin /etc/clickhouse-server/config.xml.

grafana me plugin clickhouse

Pas instalimit të Grafana-s, përdorni administratorin e hyrjes dhe fjalëkalimin. Kur hyni për herë të parë, Grafana do t'ju kërkojë të vendosni një fjalëkalim të ri.

Më pas, shkoni te menyja "+" -> importi dhe tregoni numrin e pultit për import 10011. E përgatita dhe ngarkova këtë panel në mënyrë që të mos kesh nevojë ta bësh më vetë.

Grafana mbështet punën me clickhouse përmes një shtojce të palës së tretë, por Grafana nuk ka sinjalizime për shtojcat e palëve të treta (ka disa vite që ka një biletë për këtë).

pinba-server

Instalimi i protobuf dhe libevent është opsional, por përmirëson performancën e serverit pinba. Nëse instaloni serverin pinba në një dosje tjetër përveç /opt, atëherë do t'ju duhet gjithashtu të korrigjoni skript i sistemuar dosje.

Moduli pinba për nginx

Për të përpiluar modulin, ju nevojiten kodet burimore të të njëjtit version të nginx që është instaluar tashmë në serverin tuaj, si dhe të njëjtat opsione përpilimi, përndryshe ndërtimi do të jetë i suksesshëm, por kur lidhni modulin, do të hidhet një gabim që "Moduli nuk është i pajtueshëm binar." Opsionet e përpilimit mund të shihen duke përdorur komandën nginx -V

Jeta hacks

Të gjitha faqet e mia funksionojnë vetëm në https. Fusha e skemës bëhet e pakuptimtë, kështu që unë e përdor atë për të ndarë ueb/konsolën.

Në skriptet që janë të aksesueshme nga uebi, unë përdor:

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

Dhe në skriptet e konsolës (për shembull, skriptet cron):

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

Në pultin tim në Grafana ka një ndërprerës në ueb/konsolë për të parë veçmas statistikat.

Ju gjithashtu mund të dërgoni etiketat tuaja në Pinba, për shembull:

pinba_tag_set('country', $countryCode);

Kjo është e gjitha.

Ju lutemi përgjigjuni sondazheve poshtë artikullit.

Si zakonisht, ju paralajmëroj se nuk këshilloj dhe nuk ndihmoj përmes mesazheve personale në Habr dhe rrjetet sociale.

Krijo një biletë në Github.

Gjithashtu ju lutemi mbështesni me pëlqime versioni anglisht Ky artikull në reddit.

Vetëm përdoruesit e regjistruar mund të marrin pjesë në anketë. Hyni, te lutem

Çfarë OS po përdorni në server?

  • Ubuntu

  • CentOS

  • Debian

  • Gentoo

  • Red Hat

  • Fedora

  • OpenSUSE

  • SUSE

  • Unix

  • Dritaret

  • tjetër

114 përdorues votuan. 11 përdorues abstenuan.

Çfarë versioni të php po përdorni në server?

  • 7.3

  • 7.2

  • 7.1

  • 7.0

  • 5

  • tjetër

105 përdorues votuan. 17 përdorues abstenuan.

A keni përdorur ndonjëherë pinba?

  • po

  • jo, por unë do të doja

  • jo dhe nuk do të doja

  • jo dhe nuk kam dëgjuar për të

100 përdorues votuan. 14 përdorues abstenuan.

Cilin version të serverit Pinba dëshironi të provoni?

  • pinba_engine (motor mysql)

  • pinba2 (motor mysql)

  • pinboard (php + mysql)

  • olegfedoseev/server pinba (shko + OpenTSDB)

  • olegfedoseev/pinba-influxdb (shko + influxdb)

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

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

  • Unë do të shkruaj vetë

  • tjetër

39 përdorues votuan. 47 përdorues abstenuan.

Burimi: www.habr.com

Shto një koment