Статистика и мониторинг на PHP скриптове в реално време. ClickHouse и Grafana идват на помощ на Pinba.

В тази статия ще обясня как да използвате pinba заедно с clickhouse и grafana вместо pinba_engine и pinboard.

В php проекта, pinba е вероятно единственият надежден начин да разберете какво се случва с производителността. Истина е, че обикновено pinba се внедрява само когато вече се наблюдават проблеми и не е ясно "къде да се копае".

Често никой няма представа колко пъти в секунда/минута се извиква даден скрипт и започват да оптимизират "на сляпо", започвайки от местата, които изглеждат най-логични.

Някои анализират логовете на nginx, а други - бавните заявки в базата данни.

Разбира се, pinba няма да е излишна, но има няколко причини, поради които тя не се среща на всеки проект.

Статистика и мониторинг на PHP скриптове в реално време. ClickHouse и Grafana идват на помощ на Pinba.

И първата причина е инсталацията.

За да получите някакъв "вихър" от внедряването на pinba, е много желателно да виждате метрики не само за последните минути, но и за дълъг период от време (от дни до месеци).

За това е нужно:

  • да инсталирате разширение за php (и може да искате модул за nginx)
  • да компилирате разширение за mysql
  • да инсталирате pinboard и да настроите cron

Поради малкото информация за pinba, много хора си създават впечатлението, че тя работеше само на php5 и отдавна е останала в миналото, но както ще видим по-нататък - това не е така.

Първата стъпка - най-простата, просто трябва да изпълните командата:

apt install php-pinba

В хранилищата това разширение е налично до php 7.3 включително и не е нужно да компилирате нищо.

След изпълнението на командата за инсталация, веднага получаваме работещо разширение, което събира и изпраща метрики на всеки скрипт (време на работа, памет и т.н.) в формат protobuf по udp на 127.0.0.1:30002.

Тези udp пакети все още никой не улавя и не обработва, но това не влияе неблагоприятно на скоростта или стабилността на работа на вашите php скриптове.

До неотдавна приложения, които можеха да улавят и обработват тези udp пакети, беше само pinba_engine. Описанието "прост и кратък" инсталация отблъсква желанието някога отново да я прочетете и задълбочите. В километражни списъци с зависимости има както имена на пакети, така и имена на програми и линкове към отделни страници с тяхната инсталация, а те имат свои линкове към други зависимости. Няма никой, който да има време или желание да се занимава с тази бъркотия.

Процесът на инсталация pinba2 не стана особено по-лесен.

Може би някой ден pinba10 ще може да бъде инсталиран с една-две команди и без да се чете куп материал за това как да го направите, но засега не е така.

Ако все пак сте инсталирали pinba_engine, това е само половината от работата. Все пак без pinboard ще трябва да се ограничите до данни само за последните няколко минути или сами да агрегатирате, запазвате и визуализирате данните. Добре, че pinboard е достатъчно прост в инсталацията.

На пръв поглед, защо да страдате, когато всички метрики от php вече отиват на udp порт в формат protobuf и всичко, което трябва, е да напишете приложение, което да ги хваща и съхранява в някакво хранилище? Явно разработчиците, на които им е хрумнала тази идея, веднага са се захванали да напишат собствените си велосипеди, част от които е попаднала на gitHub.

Следва преглед на четири опенсурсни проекта, които съхраняват метрики в хранилища, от които тези данни лесно могат да бъдат извлечени и визуализирани, например, с помощта на grafana.

olegfedoseev/pinba-server (ноември 2017)

udp сървър на go, който съхранява метрики в OpenTSDB. Може би, ако OpenTSDB вече се използва във вашия проект, това решение би ви подхождало, в противен случай ви препоръчвам да преминете покрай него.

olegfedoseev/pinba-influxdb (юни 2018)

udp сървър на go, от същия хабраюзер, който този път съхранява метрики в InfluxDB. На много проекти за мониторинг вече сега се използва InfluxDB, затова за тях това решение може да е отличен избор.

Плюсове:

  • InfluxDB позволява агрегиране на получените метрики и изтриване на оригиналите след определено време.

Недостатъци:

ClickHouse-Ninja/Proton (януари 2019)

udp сървър на go, който съхранява метрики в ClickHouse. Това е решение на моя приятел. Всъщност след запознаването с него реших, че е време да се захвана с пинба и кликхаус.

Плюсове:

  • кликхаус е идеален за такива задачи, той позволява компресиране на данните до такава степен, че можете да съхранявате всичките сурови данни дори без агрегиране.
  • ако е необходимо, можете лесно да агрегиране на получените метрики.
  • готов шаблон за графана.
  • съхранява информация по таймери.

Недостатъци:

  • фатален недостатък.
  • няма конфигурация, в която може да се настрои името на базата данни и таблиците, адреса и порта на сървъра.
  • при запазване на сурови данни се използва помощна таблица-словар, за да се съхраняват адресите на страниците и домейните, което усложнява впоследствие запитванията.
  • други дребни неща, които произтичат от първия недостатък.

pinba-server/pinba-server (април 2019)

udp сървър на php, който запазва метрики в ClickHouse. Това е моето решение, резултат от запознанството ми с pinba, ClickHouse и protobuf. Докато се запознавах с цялата тази комбинация, написах "proof of concept", който, неочаквано за мен, не консумира значителни ресурси (30 mb оперативна памет и под 1% от едно от осемте ядра на процесора), затова реших да го споделя с обществеността.

Плюсовете са същите като при предишното решение, освен това използвах познатите названия от оригиналната pinba_engine. Също така добавих конфигурация, която позволява да се стартират няколко инстанции на pinba сървъра, за да се запазват метрики в различни таблици - това е полезно, ако искате да събирате данни не само от php, но и от nginx.
Недостатъците - "фатален недостатък" и други дребни неща, които няма да задоволят вас лично, но моето решение е "простичко като чехъл" и се състои от около 100 реда код, така че всеки php разработчик може за няколко минути да промени това, което не му харесва.

Принцип на работа

Слуша се udp порт 30002. Всички входящи пакети се декодират според protobuf схемата и се агрегира. На всеки минута се прави вмъкване на пакет в ClickHouse в таблицата pinba.requests. (всички параметри се настройват в конфигурацията.)

Няколко думи за ClickHouse.

ClickHouse поддържа различни движества за съхранение на данни. Най-често използваният е MergeTree.

Ако в някакъв момент решите да съхранявате агрегирани данни за целия период, а сурови - само за последното, можете да създадете materialized view с групировка, а основната таблица pinba.requests периодично да се почиства, като всички данни остават в materialized view. Освен това, при създаване на таблицата pinba.requests, можете да укажете "engine = Null", така че суровите данни изобщо да не се съхраняват на диск, а все пак да попада в materialized view и да се запазват агрегирани. Ползвам такава схема за метриките на nginx, защото на nginx имам 50 пъти повече запитвания, отколкото на php.

И така, вие сте изминали дълъг път и не искам да ви оставя на половината път, затова следва подробен опис на инсталацията и настройките на моето решение, всичко, от което ще имате нужда, както и подводните камъни, о които се е спънал не един кораб. Целият процес на инсталация е описан за Ubuntu 18.04 LTS и CentOS 7, на други дистрибуции и версии процесът може да се различава.

Инсталиране

Всички необходими команди съм извел в Dockerfile за улесняване на възпроизвеждането на инструкциите. По-долу ще бъдат описани само подводните камъни.

php-pinba

След инсталацията се уверете, че във файла /etc/php/7.2/fpm/conf.d/20-pinba.ini всички опции са разкоментирани. В някои дистрибуции (например CentOS) те могат да бъдат коментирани.

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

clickhouse

По време на инсталацията ClickHouse ще ви помоли да зададете парола за потребителя default. По подразбиране този потребител е достъпен от всички IP адреси, затова, ако нямате защитна стена на сървера, непременно задайте парола. Това може да се направи и след инсталацията във файла /etc/clickhouse-server/users.xml.

Също така е добре да обърнете внимание, че ClickHouse използва няколко порта, включително 9000. Този порт се използва и за php-fpm в някои дистрибуции (например CentOS). Ако този порт вече е зает, можете да го промените на друг във файла /etc/clickhouse-server/config.xml.

Grafana с плъгин за ClickHouse

След инсталацията на Grafana използвайте логин admin и парола admin. При първото влизане Grafana ще ви помоли да зададете нова парола.

След това отиваме в менюто „+” -> import и указваме номера на таблото за управление за импортиране 10011. Това табло подготвих и качих, за да не ви се налага да го правите отново.

Grafana поддържа работа с ClickHouse чрез външен плъгин, но за външните плъгини Grafana не работят алерти (заявката за това е на сайта вече няколко години).

pinba-сървър

Инсталацията на protobuf и libevent е не задължителна, но подобрява производителността на pinba-сървъра. Ако инсталирате pinba-сървъра в директория, различна от /opt, ще трябва да коригирате systemd скрипта файла.

pinba-модул за nginx

За компилацията на модула са необходими изходни файлове от същата версия на nginx, която вече е инсталирана на вашия сървър, както и същите опции за компилация. В противен случай сборката ще премине успешно, но при свързването на модула ще се появи грешка, че "модулът е бинарно несъвместим". Опциите за компилация могат да бъдат видяни с командата nginx -V

Лайфхаки

Всички мои сайтове работят само по https. Полето schema става безсмислено, затова го използвам за разделяне на web/console.

В скриптовете, достъпни от уеба, използвам:

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

А в конsoлни (например, cron скриптове):

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

В моята табло в Grafana има превключвател web/console за отделен преглед на статистиката.

Също така в pinba могат да се предават собствени етикети, например:

pinba_tag_set('country', $countryCode);

На това е всичко.

Моля, отговорете на анкетите под статията.

Традиционно предупреждавам, че не консултирам и не помагам чрез лични съобщения в Хабра и социалните мрежи.

Създайте тикет на GitHub.

Също така, моля, подкрепете с лайкове английската версия тази статия в Reddit.

Само регистрирани потребители могат да участват в анкетата. Влезте, моля.

Коя ОС използвате на сървера?

  • Ubuntu

  • CentOS

  • Debian

  • Gentoo

  • Red Hat

  • Fedora

  • OpenSUSE

  • SuSE

  • Unix

  • Windows

  • друго

Гласували 114 потребители. Съхранили 11 потребители.

Коя версия на PHP използвате на сървера?

  • 7.3

  • 7.2

  • 7.1

  • 7.0

  • 5

  • друго

Гласували 105 потребители. Съхранили 17 потребители.

Случвало ли ви се е да използвате pinba?

  • да

  • не, но бих искал

  • не и не бих желал

  • не и не съм чувал за него

Гласували 100 потребители. Съхранили 14 потребители.

Коя версия на pinba-сървъра бихте искали да опитате?

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

  • ще напиша своя

  • друго

Гласували 39 потребители. Съхранили 47 потребители.

Източник: habr.com

Купете надежден хостинг за сайтове със защита от DDoS, VPS и VDS сървъри 🔥 Купете надежден хостинг за сайтове със защита от DDoS, VPS и VDS сървъри | ProHoster