Mga istatistika at pagsubaybay ng mga script ng PHP sa real time. Ang ClickHouse at Grafana ay tumulong sa Pinba

Sa artikulong ito sasabihin ko sa iyo kung paano gamitin ang pinba gamit ang clickhouse at grafana sa halip na pinba_engine at pinboard.

Sa isang proyekto sa PHP, ang pinba ay marahil ang tanging maaasahang paraan upang maunawaan kung ano ang nangyayari sa pagganap. Totoo, ang pinba ay karaniwang ipinapatupad lamang kapag ang mga problema ay naobserbahan na at ito ay hindi malinaw "kung saan maghukay."

Kadalasan walang sinuman ang may ideya kung ilang beses bawat segundo/minuto ito o ang script na iyon ay tinatawag at nagsisimula silang mag-optimize "sa pamamagitan ng pagpindot", simula sa mga lugar na iyon na tila mas lohikal.

Sinusuri ng ilan ang mga log ng nginx, habang sinusuri ng iba ang mabagal na mga query sa database.

Siyempre, hindi magiging labis ang pinba, ngunit may ilang mga dahilan kung bakit hindi lahat ng proyekto ay mayroon nito.

Mga istatistika at pagsubaybay ng mga script ng PHP sa real time. Ang ClickHouse at Grafana ay tumulong sa Pinba

At ang unang dahilan ay ang pag-install.

Upang mas marami o mas kaunti ay makakuha ng ilang uri ng "tambutso" mula sa pagpapatupad ng Pinba, ito ay lubhang kanais-nais na makita ang mga sukatan hindi lamang para sa mga huling minuto, ngunit din sa loob ng mahabang panahon (mula araw hanggang buwan).

Para sa kailangan mo:

  • i-install ang extension para sa php (at maaaring gusto mo ng isang module para sa nginx)
  • compile extension para sa mysql
  • i-install ang pinboard at i-configure ang cron

Dahil sa maliit na halaga ng impormasyon tungkol sa Pinba, maraming tao ang may impresyon na gumagana lamang ito sa PHP5 at matagal nang nakaraan, ngunit tulad ng makikita natin sa ibang pagkakataon, hindi ito ang kaso.

Ang unang hakbang ay ang pinakasimpleng, ang kailangan mo lang gawin ay patakbuhin ang command:

apt install php-pinba

Ang extension na ito ay magagamit sa mga repositoryo hanggang sa at kabilang ang php 7.3 at hindi mo kailangang mag-compile ng anuman.

Pagkatapos isagawa ang utos sa pag-install, agad kaming makakatanggap ng gumaganang extension na nangongolekta at nagpapadala ng mga sukatan para sa bawat script (oras ng pagtakbo, memorya, atbp.) sa format protobuf sa pamamagitan ng udp hanggang 127.0.0.1:30002.

Sa ngayon, walang nakahuli o nagproseso ng mga UDP packet na ito, ngunit hindi ito negatibong nakakaapekto sa bilis o katatagan ng iyong mga PHP script.

Hanggang kamakailan lamang, ang tanging application na makakahuli at makakapagproseso ng mga UDP packet na ito ay pinba_engine. paglalarawan "simple at maigsi" pinipigilan ng pag-install ang pagnanais na basahin at suriing muli ito. Ang mga listahan ng mga dependency na nasa kilometro ay naglalaman ng parehong mga pangalan ng mga pakete at mga pangalan ng mga programa at mga link sa mga indibidwal na pahina kasama ang kanilang pag-install, at ang mga iyon ay may sariling mga link sa iba pang mga dependency. Walang sinuman ang may oras o pagnanais na harapin ang kalokohang ito.

Proseso ng pag-install pinba2 hindi lalo na mas madali.

Marahil sa ibang araw posible na mag-install ng pinba10 na may isa o dalawang utos at hindi na kailangang magbasa ng isang grupo ng materyal upang maunawaan kung paano ito gagawin, ngunit sa ngayon ay hindi ito ang kaso.

Kung nag-install ka ng pinba_engine, ito ay kalahati lamang ng labanan. Pagkatapos ng lahat, wala pinboard kakailanganin mong limitahan ang iyong sarili sa data mula lamang sa huling ilang minuto, o kailangan mong pagsama-samahin, iimbak, at i-visualize ang data sa iyong sarili. Mabuti na ang pinboard ay medyo simple gamitin pag-install.

Tila, bakit ganoong pagdurusa kung ang lahat ng mga sukatan mula sa php ay naipadala na sa udp port sa protobuf na format at ang kailangan mo lang ay magsulat ng isang application na kukuha sa kanila at ilagay ang mga ito sa ilang uri ng imbakan? Tila, agad na umupo ang mga developer na nakaisip ng ideyang ito para magsulat ng sarili nilang mga ideya, na ang ilan ay napunta sa GitHub.

Ang sumusunod ay isang pangkalahatang-ideya ng apat na open source na proyekto na nagse-save ng mga sukatan sa storage, kung saan ang data na ito ay madaling makuha at makita, halimbawa, gamit ang grafana.

olegfedoseev/pinba-server (Nobyembre 2017)

udp server on go na nagse-save ng mga sukatan sa OpenTSDB. Marahil kung gumagamit ka na ng OpenTSDB sa iyong proyekto, ang solusyon na ito ay angkop sa iyo, kung hindi, inirerekumenda ko na ipasa ito.

olegfedoseev/pinba-influxdb (Hunyo 2018)

udp server on go, mula sa parehong habrowser, na sa pagkakataong ito ay nag-iimbak ng mga sukatan sa InfluxDB. Maraming mga proyekto ang gumagamit na ng InfluxDB para sa pagsubaybay, kaya ang solusyon na ito ay maaaring perpekto para sa kanila.

Pros:

  • InfluxDB ay nagbibigay-daan sa pagsama-samahin ang natanggap na mga sukatan, at tanggalin ang orihinal pagkatapos ng isang tinukoy na oras.

Cons:

ClickHouse-Ninja/Proton (Enero 2019)

udp server on go, na nakakatipid ng mga sukatan sa ClickHouse. Ito ang solusyon ng aking kaibigan. Ito ay matapos makilala ito na napagpasyahan kong oras na upang kunin ang Pinbu at Clickhouse.

Pros:

  • Tamang-tama ang Clickhouse para sa mga ganoong gawain; pinapayagan ka nitong i-compress ang data nang labis na maiimbak mo ang lahat ng hilaw na data kahit na walang mga pagsasama-sama.
  • kung kinakailangan, madali mong pagsasama-samahin ang mga resultang sukatan
  • nakahandang template para sa grafana
  • nagse-save ng impormasyon sa mga timer

Cons:

  • nakamamatay na kapintasan
  • walang config kung saan maaari mong i-configure ang pangalan ng database at mga talahanayan, ang address at port ng server.
  • kapag nag-iimbak ng raw data, ginagamit ang isang auxiliary na talahanayan ng diksyunaryo upang mag-imbak ng mga address ng page at domain, na nagpapalubha sa mga kasunod na query
  • iba pang maliliit na bagay na sumusunod mula sa unang minus

pinba-server/pinba-server (Abril 2019)

udp server sa php, na nagse-save ng mga sukatan sa ClickHouse. Ito ang aking solusyon, na resulta ng pagkilala sa pinba, ClickHouse at protobuf. Habang inaayos ko ang buong grupong ito, sumulat ako ng isang "patunay ng konsepto", na, sa hindi inaasahan para sa akin, ay hindi kumonsumo ng makabuluhang mapagkukunan (30 MB ng RAM at mas mababa sa 1% ng isa sa walong mga core ng processor), kaya ako nagpasya na ibahagi ito sa publiko.

Ang mga pakinabang ay pareho sa nakaraang solusyon, ginamit ko rin ang karaniwang mga pangalan mula sa orihinal na pinba_engine. Nagdagdag din ako ng isang config na nagpapahintulot sa iyo na maglunsad ng ilang mga instance ng pinbase server nang sabay-sabay upang mai-save ang mga sukatan sa iba't ibang mga talahanayan - ito ay kapaki-pakinabang kung nais mong mangolekta ng data hindi lamang mula sa php, kundi pati na rin mula sa nginx.
Mga disadvantages - "fatal flaw" at mga maliliit na bagay na hindi angkop sa iyo nang personal, ngunit ang aking solusyon ay "kasing simple ng tsinelas" at binubuo lamang ng halos 100 linya ng code, kaya maaaring baguhin ng sinumang developer ng PHP ang hindi niya gusto sa loob ng ilang minuto.

Prinsipyo ng operasyon

Pinakikinggan ang UDP port 30002. Ang lahat ng mga papasok na packet ay nade-decode ayon sa protobuf scheme at pinagsama-sama. Minsan sa isang minuto, isang packet ang ipinapasok sa clickhouse sa talahanayan ng pinba.requests. (lahat ng mga parameter ay naka-configure sa config)

Kaunti tungkol sa clickhouse

Sinusuportahan ng Clickhouse ang iba't ibang mga engine ng pag-iimbak ng data. Ang pinakakaraniwang ginagamit ay ang MergeTree.

Kung sa isang punto ay magpasya kang mag-imbak ng pinagsama-samang data para sa lahat ng oras, at raw data lamang para sa huling isa, pagkatapos ay maaari kang lumikha ng isang materyalized na view na may pagpapangkat, at pana-panahong linisin ang pangunahing talahanayan ng pinba.requests, habang ang lahat ng data ay mananatili sa materialized view. Bukod dito, kapag lumilikha ng talahanayan ng pinba.requests, maaari mong tukuyin ang "engine = Null", kung gayon ang hilaw na data ay hindi mase-save sa disk, at sa parehong oras ay mapupunta pa rin ito sa materyalized na view at mai-save na pinagsama-sama. . Ginagamit ko ang scheme na ito para sa mga sukatan ng nginx, dahil sa nginx mayroon akong 50 beses na higit pang mga kahilingan kaysa sa php.

Kaya, malayo ka na at hindi ko nais na iwanan ka sa kalahati, kaya ang sumusunod ay isang detalyadong paglalarawan ng pag-install at pagsasaayos ng aking solusyon at lahat ng kailangan mo, pati na rin ang mga pitfalls na nagdulot ng higit sa isang barko mag-crash. Ang buong proseso ng pag-install ay inilarawan para sa Ubuntu 18.04 LTS at Centos 7; ang proseso ay maaaring bahagyang naiiba sa iba pang mga distribusyon at bersyon.

Instalasyon

Inilagay ko ang lahat ng kinakailangang mga utos dockerfile upang mapadali ang muling paggawa ng mga tagubilin. Ang mga pitfalls lamang ang ilalarawan sa ibaba.

php-pinba

Pagkatapos ng pag-install, siguraduhin na sa /etc/php/7.2/fpm/conf.d/20-pinba.ini file ay inalis mo ang komento sa lahat ng mga opsyon. Sa ilang mga distribusyon (hal. centos) maaari silang maikomento.

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

clickhouse

Sa panahon ng pag-install, hihilingin sa iyo ng clickhouse na magtakda ng password para sa default na user. Bilang default, ang user na ito ay naa-access mula sa lahat ng mga IP, kaya kung wala kang firewall sa iyong server, tiyaking magtakda ng password para dito. Magagawa rin ito pagkatapos ng pag-install sa /etc/clickhouse-server/users.xml file.

Kapansin-pansin din na gumagamit ang clickhouse ng ilang port, kabilang ang 9000. Ginagamit din ang port na ito para sa php-fpm sa ilang distribusyon (halimbawa, centos). Kung ginagamit mo na ang port na ito, maaari mo itong baguhin sa isa pa sa /etc/clickhouse-server/config.xml file.

grafana na may clickhouse plugin

Pagkatapos i-install ang Grafana, gamitin ang login admin at password admin. Kapag nag-log in ka sa unang pagkakataon, hihilingin sa iyo ng Grafana na magtakda ng bagong password.

Susunod, pumunta sa "+" -> menu ng pag-import at ipahiwatig ang numero ng dashboard para sa pag-import 10011. Inihanda at in-upload ko ang dashboard na ito para hindi mo na kailangang gawin itong muli.

Sinusuportahan ng Grafana ang pagtatrabaho sa clickhouse sa pamamagitan ng isang third-party na plugin, ngunit ang Grafana ay walang mga alerto para sa mga third-party na plugin (mayroong tiket para dito sa loob ng ilang taon).

pinba-server

Opsyonal ang pag-install ng protobuf at libevent, ngunit pinapabuti ang pagganap ng pinba-server. Kung nag-install ka ng pinba-server sa isang folder maliban sa /opt, kakailanganin mo ring itama systemd script file

pinba module para sa nginx

Upang mag-compile ng isang module, kailangan mo ng mga source code ng parehong bersyon ng nginx na naka-install na sa iyong server, pati na rin ang parehong mga pagpipilian sa compilation, kung hindi, ang build ay magiging matagumpay, ngunit kapag ikinonekta ang module, isang error ang itatapon na "ang module ay hindi binary compatible." Maaaring matingnan ang mga opsyon sa compilation gamit ang nginx -V command

Mga hack sa buhay

Gumagana lang ang lahat ng aking site sa https. Ang field ng schema ay nagiging walang kabuluhan, kaya ginagamit ko ito upang paghiwalayin ang web/console.

Sa mga script na naa-access mula sa web na ginagamit ko:

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

At sa mga console script (halimbawa, mga cron script):

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

Sa aking dashboard sa Grafana mayroong switch sa web/console para sa hiwalay na pagtingin sa mga istatistika.

Maaari mo ring ipadala ang iyong mga tag sa Pinba, halimbawa:

pinba_tag_set('country', $countryCode);

Iyan na ang lahat.

Mangyaring sagutin ang mga botohan sa ibaba ng artikulo.

Gaya ng dati, binabalaan ko kayo na hindi ako nagpapayo o tumulong sa pamamagitan ng mga personal na mensahe sa Habr at mga social network.

Lumikha ng tiket sa Github.

Suportahan din ng may likes English version ng artikulong ito sa reddit.

Ang mga rehistradong user lamang ang maaaring lumahok sa survey. Mag-sign in, pakiusap

Anong OS ang ginagamit mo sa server?

  • Ubuntu

  • CentOS

  • Debian

  • Gentoo

  • Red sumbrero

  • Fedora

  • OpenSUSE

  • SWITZERLAND

  • Unix

  • Windows

  • iba

114 user ang bumoto. 11 na user ang umiwas.

Anong bersyon ng php ang ginagamit mo sa server?

  • 7.3

  • 7.2

  • 7.1

  • 7.0

  • 5

  • iba

105 user ang bumoto. 17 na user ang umiwas.

Nakagamit ka na ba ng pinba?

  • oo

  • hindi, pero gusto ko

  • hindi at ayaw ko

  • hindi at hindi ko narinig ang tungkol sa kanya

100 user ang bumoto. 14 na user ang umiwas.

Aling bersyon ng Pinba server ang gusto mong subukan?

  • pinba_engine (mysql engine)

  • pinba2 (mysql engine)

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

  • Isusulat ko ang sarili ko

  • iba

39 user ang bumoto. 47 na user ang umiwas.

Pinagmulan: www.habr.com

Magdagdag ng komento