ProHoster > Blog > uprava > Statistika i praćenje PHP skripti u stvarnom vremenu. ClickHouse i Grafana priskaču u pomoć Pinbi
Statistika i praćenje PHP skripti u stvarnom vremenu. ClickHouse i Grafana priskaču u pomoć Pinbi
U ovom ću vam članku reći kako koristiti pinbu s clickhouseom i grafanom umjesto pinba_enginea i pinboarda.
Na PHP projektu, pinba je možda jedini pouzdan način da shvatite što se događa s performansama. Istina, pinba se obično implementira samo kada su problemi već uočeni i nije jasno "gdje kopati".
Često nitko nema pojma koliko se puta u sekundi/minuti poziva ova ili ona skripta i počinju optimizirati "na dodir", počevši od onih mjesta koja se čine logičnijima.
Neki analiziraju nginx zapise, dok drugi analiziraju spore upite baze podataka.
Naravno, pinba ne bi bila suvišna, ali postoji nekoliko razloga zašto je nema svaki projekt.
A prvi razlog je instalacija.
Kako bi se koliko-toliko dobio neka vrsta "ispuha" od implementacije Pinbe, vrlo je poželjno vidjeti metriku ne samo za posljednje minute, već i tijekom dugog vremenskog razdoblja (od dana do mjeseci).
Za to vam je potrebna:
instalirajte ekstenziju za php (i možda želite modul za nginx)
kompilirati proširenje za mysql
instalirajte pinboard i konfigurirajte cron
Zbog male količine informacija o Pinbi, mnogi ljudi imaju dojam da je radila samo na PHP5 i da je odavno stvar prošlosti, ali kao što ćemo kasnije vidjeti, to nije tako.
Prvi korak je najjednostavniji, sve što trebate učiniti je pokrenuti naredbu:
apt install php-pinba
Ovo proširenje dostupno je u spremištima do i uključujući php 7.3 i ne morate ništa kompajlirati.
Nakon izvršenja instalacijske naredbe, odmah dobivamo radno proširenje koje prikuplja i šalje metriku za svaku skriptu (vrijeme rada, memorija itd.) u formatu protobuf putem udp-a na 127.0.0.1:30002.
Do sada nitko nije uhvatio ili obradio ove UDP pakete, ali to ni na koji način ne utječe negativno na brzinu ili stabilnost vaših PHP skripti.
Do nedavno, jedina aplikacija koja je mogla uhvatiti i obraditi te UDP pakete bila je pinba_motor. Opis "jednostavno i sažeto" Instalacija obeshrabruje želju da se ikada više pročita i udubi u nju. Kilometarske liste ovisnosti sadrže i nazive paketa i nazive programa i poveznice na pojedine stranice s njihovom instalacijom, a one imaju svoje poveznice na druge ovisnosti. Nitko nema vremena ni želje baviti se ovim sranjem.
Možda će jednog dana biti moguće instalirati pinba10 s jednom ili dvije naredbe i ne morati čitati hrpu materijala da biste razumjeli kako to učiniti, ali za sada to nije slučaj.
Ako ipak instalirate pinba_engine, onda je ovo samo pola bitke. Uostalom, bez pinboard morat ćete se ograničiti na podatke iz samo nekoliko zadnjih minuta ili ćete sami morati prikupljati, pohranjivati i vizualizirati podatke. Dobro je što je pinboard vrlo jednostavan za korištenje montaža.
Čini se, čemu takva patnja ako su sve metrike iz php-a već poslane na udp port u protobuf formatu i sve što trebate je napisati aplikaciju koja će ih uhvatiti i staviti u neku vrstu pohrane? Navodno su oni programeri koji su došli na ovu ideju odmah sjeli napisati svoje ideje, od kojih su neke završile na GitHubu.
Slijedi pregled četiri projekta otvorenog koda koji spremaju metriku u pohranu, odakle se ti podaci mogu lako dohvatiti i vizualizirati, na primjer, pomoću grafane.
udp poslužitelj u pokretu koji sprema metriku u OpenTSDB. Možda ako već koristite OpenTSDB u svom projektu, onda će vam ovo rješenje odgovarati, inače preporučujem da ga propustite.
udp server on go, od istog habrowser, koji ovaj put pohranjuje metriku u InfluxDB. Mnogi projekti već koriste InfluxDB za nadzor, pa bi ovo rješenje moglo biti savršeno za njih.
Pros:
InfluxDB to omogućuje agregirati primljene metrike i izbrisati original nakon određenog vremena.
Cons:
Ovo rješenje ne sprema informacije o mjeračima vremena.
udp server on go, koji sprema metriku u ClickHouse. Ovo je rješenje mog prijatelja. Nakon što sam se s njime upoznao, odlučio sam da je vrijeme da se suprotstavim Pinbuu i Clickhouseu.
Pros:
Clickhouse je idealan za takve zadatke; omogućuje vam komprimiranje podataka u tolikoj mjeri da možete pohraniti sve neobrađene podatke čak i bez agregacija
ako je potrebno, možete jednostavno agregirati dobivene metrike
udp poslužitelj u php, koji sprema metriku u ClickHouse. Ovo je moje rješenje koje je rezultat upoznavanja pinbe, ClickHousea i protobufa. Dok sam sređivao cijelu ovu gomilu, napisao sam “proof of concept” koji, za mene neočekivano, nije trošio značajne resurse (30 MB RAM-a i manje od 1% jedne od osam procesorskih jezgri), pa sam odlučio to podijeliti s javnošću.
Prednosti su iste kao i kod prethodnog rješenja, također sam koristio uobičajena imena iz originalnog pinba_engine. Također sam dodao konfiguraciju koja vam omogućuje pokretanje nekoliko instanci pinbase poslužitelja odjednom kako biste spremili metriku u različite tablice - ovo je korisno ako želite prikupljati podatke ne samo iz php-a, već i iz nginx-a.
Nedostaci - “fatalna mana” i one sitnice koje vama osobno neće odgovarati, ali moje rješenje je “jednostavno kao papuča” i sastoji se od samo 100-tinjak linija koda, tako da svaki PHP developer može promijeniti ono što mu se ne sviđa za nekoliko minuta.
Princip rada
Osluškuje se UDP port 30002. Svi dolazni paketi se dekodiraju prema protobuf shemi i agregiraju. Jednom u minuti, paket se ubacuje u kućicu za klikanje u tablicu pinba.requests. (svi parametri su konfigurirani u konfiguracija)
Malo o Clickhouseu
Clickhouse podržava različite mehanizme za pohranu podataka. Najčešće korišten je MergeTree.
Ako u nekom trenutku odlučite pohraniti agregirane podatke za sva vremena, a neobrađene podatke samo za posljednje, tada možete kreirati materijalizirani pogled s grupiranjem, te povremeno čistiti glavnu pinba.requests tablicu, dok će svi podaci ostati u materijalizirani pogled. Štoviše, kada kreirate tablicu pinba.requests, možete navesti "engine = Null", tada neobrađeni podaci uopće neće biti spremljeni na disk, a istovremeno će i dalje završiti u materijaliziranom prikazu i biti spremljeni agregirani . Koristim ovu shemu za nginx metriku, jer na nginxu imam 50 puta više zahtjeva nego na php-u.
Dakle, prešli ste dug put i ne bih vas volio ostaviti na pola puta, stoga slijedi detaljan opis instalacije i konfiguracije mog rješenja i svega što vam je potrebno, kao i zamke koje su izazvale više od jednog broda sudariti se. Cijeli postupak instalacije opisan je za Ubuntu 18.04 LTS i Centos 7; proces se može malo razlikovati u drugim distribucijama i verzijama.
Instalacija
Ubacio sam sve potrebne naredbe dockerfile kako bi se olakšala ponovljivost uputa. U nastavku će biti opisane samo zamke.
php-pinba
Nakon instalacije provjerite jeste li u datoteci /etc/php/7.2/fpm/conf.d/20-pinba.ini odkomentirali sve opcije. Na nekim distribucijama (npr. centos) mogu biti komentirani.
Tijekom instalacije, clickhouse će od vas tražiti da postavite lozinku za zadanog korisnika. Prema zadanim postavkama, ovom je korisniku moguće pristupiti sa svih IP adresa, pa ako nemate vatrozid na svom poslužitelju, svakako postavite lozinku za njega. To se također može učiniti nakon instalacije u datoteci /etc/clickhouse-server/users.xml.
Također je vrijedno napomenuti da Clickhouse koristi nekoliko portova, uključujući 9000. Ovaj port se također koristi za php-fpm u nekim distribucijama (na primjer, centos). Ako već koristite ovaj priključak, možete ga promijeniti u drugi u datoteci /etc/clickhouse-server/config.xml.
grafana s dodatkom clickhouse
Nakon instaliranja Grafana koristite login admin i password admin. Kada se prvi put prijavite, Grafana će od vas tražiti da postavite novu lozinku.
Zatim idite na “+” -> izbornik za uvoz i označite broj nadzorne ploče za uvoz 10011. Pripremio sam i prenio ovu nadzornu ploču tako da to ne morate ponovno raditi sami.
Grafana podržava rad s clickhouseom putem dodatka treće strane, ali Grafana nema upozorenja za dodatke trećih strana (za to postoji ulaznica već nekoliko godina).
pinba-poslužitelj
Instaliranje protobufa i libeventa nije obavezno, ali poboljšava performanse pinba poslužitelja. Ako instalirate pinba-poslužitelj u mapu koja nije /opt, tada ćete također morati ispraviti systemd skripta datoteka.
pinba modul za nginx
Za kompajliranje modula potrebni su vam izvorni kodovi iste verzije nginxa koja je već instalirana na vašem poslužitelju, kao i iste opcije kompilacije, u protivnom će build biti uspješan, ali prilikom spajanja modula pojavit će se pogreška koja "modul nije binarno kompatibilan." Opcije kompilacije mogu se vidjeti pomoću naredbe nginx -V
Life hacks
Sve moje stranice rade samo na https. Polje sheme postaje besmisleno, pa ga koristim za odvajanje weba od konzole.
U skriptama koje su dostupne s weba koristim:
if (ini_get('pinba.enabled')) {
pinba_schema_set('web');
}
I u konzolnim skriptama (na primjer, cron skriptama):
if (ini_get('pinba.enabled')) {
pinba_schema_set('console');
}
Na mojoj nadzornoj ploči u Grafani postoji web/console switch za odvojeni pregled statistike.
Također možete poslati svoje oznake Pinbi, na primjer:
pinba_tag_set('country', $countryCode);
To je sve.
Molimo odgovorite na ankete ispod članka.
Kao i obično, upozoravam vas da ne savjetujem niti pomažem putem osobnih poruka na Habru i društvenim mrežama.