ProHoster > Blog > podávání > Statistiky a sledování PHP skriptů v reálném čase. ClickHouse a Grafana přicházejí na pomoc Pinba
Statistiky a sledování PHP skriptů v reálném čase. ClickHouse a Grafana přicházejí na pomoc Pinba
V tomto článku vám řeknu, jak používat pinbu s clickhousem a grafana místo pinba_engine a pinboard.
Na projektu PHP je pinba možná jediný spolehlivý způsob, jak pochopit, co se děje s výkonem. Je pravda, že pinba se obvykle implementuje pouze tehdy, když jsou již pozorovány problémy a není jasné, „kam kopat“.
Často nikdo netuší, kolikrát za sekundu/minutu se ten či onen skript volá, a začnou optimalizovat „dotykem“, počínaje těmi místy, která se zdají logičtější.
Někteří analyzují protokoly nginx, zatímco jiní analyzují pomalé databázové dotazy.
Pinba by samozřejmě nebyla zbytečná, ale existuje několik důvodů, proč ji nemá každý projekt.
A prvním důvodem je instalace.
Abychom si z implementace Pinby víceméně „vyčerpali“, je velmi žádoucí vidět metriky nejen za poslední minuty, ale i za dlouhé časové období (od dnů po měsíce).
Za tímto účelem:
nainstalovat rozšíření pro php (a možná budete chtít modul pro nginx)
kompilovat rozšíření pro mysql
nainstalovat nástěnku a nakonfigurovat cron
Vzhledem k malému množství informací o Pinbě má mnoho lidí dojem, že fungovala pouze na PHP5 a je již dávno minulostí, ale jak uvidíme později, není tomu tak.
První krok je nejjednodušší, vše, co musíte udělat, je spustit příkaz:
apt install php-pinba
Toto rozšíření je dostupné v repozitářích do php 7.3 včetně a nemusíte nic kompilovat.
Po provedení instalačního příkazu okamžitě obdržíme funkční rozšíření, které shromažďuje a odesílá metriky pro každý skript (doba běhu, paměť atd.) ve formátu protobuf přes udp na 127.0.0.1:30002.
Tyto UDP pakety zatím nikdo nezachytil ani nezpracoval, ale nijak to negativně neovlivňuje rychlost ani stabilitu vašich PHP skriptů.
Až donedávna byla jedinou aplikací, která dokázala zachytit a zpracovat tyto UDP pakety pinba_engine. popis"jednoduché a výstižné"instalace odrazuje od touhy ještě někdy číst a ponořit se do ní. Kilometrové seznamy závislostí obsahují jak názvy balíčků, tak názvy programů a odkazy na jednotlivé stránky s jejich instalací a ty mají vlastní odkazy na další závislosti. Nikdo nemá čas ani chuť se tímhle svinstvem zabývat.
Možná, že někdy bude možné nainstalovat pinba10 jedním nebo dvěma příkazy a nebudete muset číst spoustu materiálů, abyste pochopili, jak na to, ale prozatím tomu tak není.
Pokud si pinba_engine nainstalujete, pak je to jen polovina úspěchu. Ostatně bez nástěnka budete se muset omezit na data z posledních několika minut, nebo budete muset data agregovat, ukládat a vizualizovat sami. Je dobré, že použití nástěnky je docela jednoduché instalace.
Zdálo by se, proč takové utrpení, když jsou všechny metriky z php již odesílány na port udp ve formátu protobuf a stačí napsat aplikaci, která je zachytí a uloží do nějakého úložiště? Zřejmě ti vývojáři, kteří s tímto nápadem přišli, okamžitě sedli k sepsání vlastních nápadů, z nichž některé skončily na GitHubu.
Následuje přehled čtyř open source projektů, které ukládají metriky do úložiště, ze kterých lze tato data snadno získat a vizualizovat například pomocí grafana.
udp server na cestách, který ukládá metriky do OpenTSDB. Snad pokud již OpenTSDB ve svém projektu používáte, tak vám toto řešení bude vyhovovat, jinak doporučuji přejít.
udp server na cestách, ze stejného prohlížeč, který tentokrát ukládá metriky do InfluxDB. Mnoho projektů již používá InfluxDB pro monitorování, takže toto řešení může být pro ně perfektní.
výhody:
InfluxDB umožňuje agregovat přijaté metriky a po určité době odstranit původní.
nevýhody:
Toto řešení neukládá informace o časovačích.
InfluxDB bude ukládat adresy stránek webu jako značky, a pokud máte mnoho jedinečných adres stránek, povede to k zvýšená spotřeba paměť s náhodným přístupem. Od určitého okamžiku on"začne požírat paměť jako blázen". (zdroj)
udp server on go, který ukládá metriky v ClickHouse. Toto je řešení mého přítele. Až po seznámení jsem se rozhodl, že je čas pustit se do Pinbu a Clickhouse.
výhody:
Clickhouse je pro takové úkoly ideální; umožňuje komprimovat data natolik, že můžete ukládat všechna nezpracovaná data i bez agregací
v případě potřeby můžete výsledné metriky snadno agregovat
udp server v php, který ukládá metriky v ClickHouse. Toto je moje řešení, které je výsledkem seznámení se s pinba, ClickHouse a protobuf. Zatímco jsem celou tuhle partu třídil, napsal jsem „proof of concept“, který pro mě nečekaně nespotřeboval značné prostředky (30 MB RAM a méně než 1 % jednoho z osmi procesorových jader), takže rozhodla se o to podělit s veřejností.
Výhody jsou stejné jako u předchozího řešení, také jsem použil obvyklé názvy z původního pinba_engine. Přidal jsem také konfiguraci, která vám umožňuje spustit několik instancí serveru pinbase najednou, abyste uložili metriky v různých tabulkách - to je užitečné, pokud chcete sbírat data nejen z php, ale také z nginx.
Nevýhody - „fatální chyba“ a takové drobnosti, které vám osobně nebudou vyhovovat, ale moje řešení je „jednoduché jako bačkora“ a skládá se pouze z cca 100 řádků kódu, takže každý PHP vývojář může změnit, co se mu nelíbí za několik minut.
Princip činnosti
Poslouchá se UDP port 30002. Všechny příchozí pakety jsou dekódovány podle schématu protobuf a agregovány. Jednou za minutu se paket vloží do clickhouse do tabulky pinba.requests. (všechny parametry se konfigurují v config)
Něco málo o clickhouse
Clickhouse podporuje různé motory pro ukládání dat. Nejčastěji používaným je MergeTree.
Pokud se v určitém okamžiku rozhodnete uložit agregovaná data pro celou dobu a nezpracovaná data pouze pro poslední, pak můžete vytvořit materializovaný pohled se seskupením a pravidelně čistit hlavní tabulku pinba.requests, zatímco všechna data zůstanou v materializovaný pohled. Navíc při vytváření tabulky pinba.requests můžete zadat „engine = Null“, pak se nezpracovaná data vůbec neuloží na disk a zároveň budou stále končit v materializovaném pohledu a budou uložena agregovaná . Toto schéma používám pro metriky nginx, protože na nginx mám 50krát více požadavků než na php.
Tak to jste ušli dlouhou cestu a nerad bych vás nechal na půli cesty, takže následuje podrobný popis instalace a konfigurace mého řešení a všeho potřebného a také úskalí, která způsobila nejednu loď havarovat. Celý instalační proces je popsán pro Ubuntu 18.04 LTS a Centos 7, u jiných distribucí a verzí se může tento proces mírně lišit.
Instalace
Zadal jsem všechny potřebné příkazy dockerfile pro usnadnění reprodukovatelnosti pokynů. Níže budou popsána pouze úskalí.
php-pinba
Po instalaci se ujistěte, že v souboru /etc/php/7.2/fpm/conf.d/20-pinba.ini jste odkomentovali všechny možnosti. U některých distribucí (např. centos) mohou být zakomentovány.
Během instalace vás clickhouse požádá o nastavení hesla pro výchozího uživatele. Ve výchozím nastavení je tento uživatel přístupný ze všech IP adres, takže pokud na svém serveru nemáte firewall, nezapomeňte pro něj nastavit heslo. To lze také provést po instalaci do souboru /etc/clickhouse-server/users.xml.
Za zmínku také stojí, že clickhouse používá několik portů, včetně 9000. Tento port se také používá pro php-fpm v některých distribucích (například centos). Pokud již tento port používáte, můžete jej změnit na jiný v souboru /etc/clickhouse-server/config.xml.
grafana s pluginem clickhouse
Po instalaci Grafany použijte přihlašovací jméno admin a heslo admin. Při prvním přihlášení vás Grafana požádá o nastavení nového hesla.
Dále přejděte do nabídky „+“ -> import a zadejte číslo řídicího panelu pro import 10011. Připravil jsem a nahrál jsem tento řídicí panel, abyste to nemuseli znovu dělat sami.
Grafana podporuje práci s clickhousem prostřednictvím pluginu třetích stran, Grafana však nemá upozornění na pluginy třetích stran (tam již několik let existuje lístek).
pinba-server
Instalace protobuf a libevent je volitelná, ale zlepšuje výkon serveru pinba. Pokud instalujete pinba-server do jiné složky než /opt, budete také muset opravit systemd skript soubor.
modul pinba pro nginx
Ke kompilaci modulu potřebujete zdrojové kódy stejné verze nginx, která je již nainstalována na vašem serveru, a také stejné možnosti kompilace, jinak bude sestavení úspěšné, ale při připojování modulu bude vyvolána chyba, že "modul není binárně kompatibilní." Možnosti kompilace lze zobrazit pomocí příkazu nginx -V
Životní hacky
Všechny mé stránky fungují pouze na https. Pole schéma ztrácí smysl, takže jej používám k oddělení webu/konzole.
Ve skriptech, které jsou přístupné z webu, používám:
if (ini_get('pinba.enabled')) {
pinba_schema_set('web');
}
A ve skriptech konzoly (například skripty cron):
if (ini_get('pinba.enabled')) {
pinba_schema_set('console');
}
Na mém dashboardu v Grafaně je přepínač web/konzole pro samostatné prohlížení statistik.
Své značky můžete také odeslat společnosti Pinba, například:
pinba_tag_set('country', $countryCode);
To je vše.
Odpovězte prosím na ankety pod článkem.
Jako obvykle upozorňuji, že neradím ani nepomáhám prostřednictvím osobních zpráv na Habr a sociálních sítích.