Statistici și monitorizare a scripturilor PHP în timp real. ClickHouse și Grafana vin în ajutorul lui Pinba

În acest articol vă voi spune cum să utilizați pinba cu clickhouse și grafana în loc de pinba_engine și pinboard.

Într-un proiect PHP, pinba este poate singura modalitate fiabilă de a înțelege ce se întâmplă cu performanța. Adevărat, pinba este de obicei implementat numai atunci când problemele sunt deja observate și nu este clar „unde să sape”.

De multe ori nimeni nu are idee de câte ori pe secundă/minut se numește un script sau altul și încep să optimizeze „prin atingere”, pornind de la acele locuri care par mai logice.

Unii analizează jurnalele nginx, în timp ce alții analizează interogările lente ale bazelor de date.

Desigur, pinba nu ar fi de prisos, dar există mai multe motive pentru care nu orice proiect o are.

Statistici și monitorizare a scripturilor PHP în timp real. ClickHouse și Grafana vin în ajutorul lui Pinba

Și primul motiv este instalarea.

Pentru a obține mai mult sau mai puțin un fel de „epuizare” din implementarea Pinba, este foarte de dorit să vedeți valori nu numai pentru ultimele minute, ci și pentru o perioadă lungă de timp (de la zile la luni).

Pentru a face acest lucru:

  • instalați extensia pentru php (și poate doriți un modul pentru nginx)
  • extensia de compilare pentru mysql
  • instalați panoul și configurați cron

Datorită cantității mici de informații despre Pinba, mulți oameni au impresia că a funcționat doar pe PHP5 și a fost de multă vreme un lucru din trecut, dar așa cum vom vedea mai târziu, nu este cazul.

Primul pas este cel mai simplu, tot ce trebuie să faceți este să rulați comanda:

apt install php-pinba

În depozite, această extensie este disponibilă până la php 7.3 inclusiv și nu trebuie să compilați nimic.

După executarea comenzii de instalare, primim imediat o extensie de lucru care colectează și trimite metrici pentru fiecare script (timp de rulare, memorie etc.) în format protobuf prin udp la 127.0.0.1:30002.

Până acum nimeni nu a prins sau procesat aceste pachete UDP, dar acest lucru nu afectează în niciun fel în mod negativ viteza sau stabilitatea scripturilor dumneavoastră PHP.

Până de curând, singura aplicație care putea prinde și procesa aceste pachete UDP era pinba_engine. Descriere "simplu si concis„instalarea descurajează dorința de a citi și de a aprofunda din nou în ea. Listele de dependențe lungi de un kilometru conțin atât numele pachetelor, cât și numele programelor și link-uri către pagini individuale cu instalarea lor, iar acestea au propriile linkuri către alte dependențe. Nimeni nu are timp sau dorință să se descurce cu porcăria asta.

Procesul de instalare pinba2 nu a mai ales mai usor.

Poate că într-o zi va fi posibil să instalați pinba10 cu una sau două comenzi și să nu fie nevoie să citiți o grămadă de materiale pentru a înțelege cum se face, dar deocamdată nu este cazul.

Dacă instalați pinba_engine, atunci aceasta este doar jumătate din luptă. La urma urmei, fără panou va trebui să vă limitați la datele din ultimele minute sau va trebui să agregați, să stocați și să vizualizați singur datele. Este bine că panoul este destul de simplu de utilizat instalare.

S-ar părea, de ce suferință dacă toate metricile din php sunt deja trimise la portul udp în format protobuf și tot ce ai nevoie este să scrii o aplicație care să le prindă și să le pună într-un fel de stocare? Aparent, acei dezvoltatori care au venit cu această idee s-au așezat imediat să-și scrie propriile idei, dintre care unele au ajuns pe GitHub.

Ceea ce urmează este o prezentare generală a patru proiecte open source care salvează valorile în stocare, din care aceste date pot fi preluate și vizualizate cu ușurință, de exemplu, folosind grafana.

olegfedoseev/pinba-server (noiembrie 2017)

Server udp în mișcare care salvează valorile în OpenTSDB. Poate că dacă utilizați deja OpenTSDB în proiectul dvs., atunci această soluție vi se va potrivi, altfel vă recomand să treceți pe lângă ea.

olegfedoseev/pinba-influxdb (iunie 2018)

server udp pe drum, de la același habrowser, care de data aceasta stochează valorile în InfluxDB. Multe proiecte folosesc deja InfluxDB pentru monitorizare, așa că această soluție poate fi perfectă pentru ei.

Pro-uri:

  • InfluxDB Acesta permite agregați valorile primite și ștergeți originalul după un timp specificat.

Contra:

ClickHouse-Ninja/Proton (ianuarie 2019)

server udp pe drum, care salvează valorile în ClickHouse. Aceasta este soluția prietenului meu. După ce m-am familiarizat cu el, am decis că este timpul să mă confrunt cu Pinbu și Clickhouse.

Pro-uri:

  • Clickhouse este ideal pentru astfel de sarcini, vă permite să comprimați atât de mult încât să puteți stoca toate datele brute chiar și fără agregare
  • dacă este necesar, puteți agrega cu ușurință valorile rezultate
  • șablon gata făcut pentru grafana
  • salvează informații despre cronometre

Contra:

  • defect fatal
  • nu există nicio configurație în care să puteți configura numele bazei de date și tabelelor, adresa și portul serverului.
  • la stocarea datelor brute, un tabel de dicționar auxiliar este utilizat pentru a stoca adresele de pagini și de domenii, ceea ce complică interogările ulterioare
  • alte lucruri mărunte care urmează din primul minus

pinba-server/pinba-server (aprilie 2019)

server udp în php, care salvează valorile în ClickHouse. Aceasta este soluția mea, care este rezultatul cunoașterii pinba, ClickHouse și protobuf. În timp ce rezolvam toată grămada asta, am scris o „dovadă de concept”, care, în mod neașteptat pentru mine, nu consuma resurse semnificative (30 MB de RAM și mai puțin de 1% din unul dintre cele opt nuclee de procesor), așa că am a decis să-l împărtășească publicului.

Avantajele sunt aceleași ca și soluția anterioară, am folosit și denumirile obișnuite din originalul pinba_engine. Am adăugat, de asemenea, o configurație care vă permite să lansați mai multe instanțe de server pinbase simultan pentru a salva valorile în tabele diferite - acest lucru este util dacă doriți să colectați date nu numai din php, ci și de la nginx.
Dezavantaje - „defect fatal” și acele lucruri mărunte care nu ți se vor potrivi personal, dar soluția mea este „la fel de simplă ca un papuci” și constă doar din aproximativ 100 de linii de cod, așa că orice dezvoltator PHP poate schimba ceea ce nu-i place în câteva minute.

Principiul de funcționare

Este ascultat portul UDP 30002. Toate pachetele primite sunt decodate în conformitate cu schema protobuf și agregate. O dată pe minut, un pachet este introdus în clickhouse în tabelul pinba.requests. (toți parametrii sunt configurați în config)

Câteva despre clickhouse

Clickhouse acceptă diferite motoare de stocare a datelor. Cel mai des folosit este MergeTree.

Dacă la un moment dat decideți să stocați date agregate pentru tot timpul și datele brute doar pentru ultima dată, atunci puteți crea o vedere materializată cu grupare și puteți curăța periodic tabelul principal pinba.requests, în timp ce toate datele vor rămâne în vedere materializată. Mai mult, la crearea tabelului pinba.requests, puteți specifica „motor = Null”, apoi datele brute nu vor fi salvate deloc pe disc și, în același timp, vor ajunge în continuare în vizualizarea materializată și vor fi salvate agregate. . Folosesc această schemă pentru metricile nginx, deoarece pe nginx am de 50 de ori mai multe solicitări decât pe php.

Deci, ați parcurs un drum lung și nu aș vrea să vă las la jumătate, așa că ceea ce urmează este o descriere detaliată a instalării și configurației soluției mele și a tot ceea ce aveți nevoie, precum și capcanele care au cauzat mai mult de o navă. a prăbuși. Întregul proces de instalare este descris pentru Ubuntu 18.04 LTS și Centos 7, procesul poate diferi ușor pe alte distribuții și versiuni.

Instalare

Am pus toate comenzile necesare Dockerfile pentru a facilita reproductibilitatea instrucțiunilor. Doar capcanele vor fi descrise mai jos.

php-pinba

După instalare, asigurați-vă că în fișierul /etc/php/7.2/fpm/conf.d/20-pinba.ini ați decomentat toate opțiunile. Pe unele distribuții (de exemplu, centos) acestea pot fi comentate.

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

clickhouse

În timpul instalării, clickhouse vă va cere să setați o parolă pentru utilizatorul implicit. În mod implicit, acest utilizator este accesibil de la toate IP-urile, așa că dacă nu aveți un firewall pe server, asigurați-vă că setați o parolă pentru acesta. Acest lucru se poate face și după instalare în fișierul /etc/clickhouse-server/users.xml.

De asemenea, este de remarcat faptul că clickhouse folosește mai multe porturi, inclusiv 9000. Acest port este folosit și pentru php-fpm în unele distribuții (de exemplu, centos). Dacă utilizați deja acest port, îl puteți schimba cu altul în fișierul /etc/clickhouse-server/config.xml.

grafana cu plugin clickhouse

După instalarea Grafana, utilizați administratorul de autentificare și administratorul parolei. Când vă conectați pentru prima dată, Grafana vă va cere să setați o nouă parolă.

Apoi, accesați meniul „+” -> import și indicați numărul tabloului de bord pentru import 10011. Am pregătit și am încărcat acest tablou de bord, astfel încât să nu mai fii nevoit să o faci singur.

Grafana acceptă lucrul cu clickhouse printr-un plugin terță parte, dar Grafana nu are alerte pentru pluginuri terță parte (a existat un bilet pentru acest lucru de câțiva ani).

pinba-server

Instalarea protobuf și libevent este opțională, dar îmbunătățește performanța serverului pinba. Dacă instalați pinba-server într-un folder altul decât /opt, atunci va trebui și să corectați script systemd fişier.

modul pinba pentru nginx

Pentru a compila un modul, aveți nevoie de coduri sursă ale aceleiași versiuni de nginx care este deja instalată pe serverul dvs., precum și de aceleași opțiuni de compilare, altfel construirea va avea succes, dar atunci când conectați modulul, se va afișa o eroare că „modulul nu este compatibil binar.” Opțiunile de compilare pot fi vizualizate folosind comanda nginx -V

Hacks-uri de viață

Toate site-urile mele funcționează numai pe https. Câmpul de schemă devine lipsit de sens, așa că îl folosesc pentru a separa web/consola.

În scripturile care sunt accesibile de pe web folosesc:

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

Și în scripturile de consolă (de exemplu, scripturile cron):

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

În tabloul de bord din Grafana există un comutator web/consolă pentru vizualizarea separată a statisticilor.

De asemenea, puteți trimite etichetele dvs. către Pinba, de exemplu:

pinba_tag_set('country', $countryCode);

Asta e tot.

Vă rugăm să răspundeți la sondajele de sub articol.

Ca de obicei, vă avertizez că nu sfătuiesc și nici nu ajut prin mesaje personale pe Habr și rețelele de socializare.

Creați un bilet pe Github.

De asemenea, vă rugăm să susțineți cu aprecieri versiune în limba engleză din acest articol pe reddit.

Numai utilizatorii înregistrați pot participa la sondaj. Loghează-te, Vă rog.

Ce sistem de operare folosești pe server?

  • Ubuntu

  • CentOS

  • Debian

  • Gentoo

  • Red Hat

  • Fedora

  • OpenSUSE

  • ELVEŢIA

  • Unix

  • ferestre din

  • alte

Au votat 114 utilizatori. 11 utilizatori s-au abținut.

Ce versiune de php folosești pe server?

  • 7.3

  • 7.2

  • 7.1

  • 7.0

  • 5

  • alte

Au votat 105 utilizatori. 17 utilizatori s-au abținut.

Ați folosit vreodată pinba?

  • da

  • nu, dar as vrea

  • nu și nu aș vrea

  • nu si nu am auzit de ea

Au votat 100 utilizatori. 14 utilizatori s-au abținut.

Ce versiune de server Pinba ați dori să încercați?

  • pinba_engine (motor mysql)

  • pinba2 (motor mysql)

  • panou (php + mysql)

  • olegfedoseev/pinba-server (go + OpenTSDB)

  • olegfedoseev/pinba-influxdb (go + influxdb)

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

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

  • O voi scrie eu pe al meu

  • alte

Au votat 39 utilizatori. 47 utilizatori s-au abținut.

Sursa: www.habr.com

Adauga un comentariu