Statystyka i monitorowanie skryptów PHP w czasie rzeczywistym. ClickHouse i Grafana wspierają Pinbę.

W tym artykule opowiem, jak używać Pinby wraz z ClickHouse i Grafana zamiast pinba_engine i pinboard.

Na projektach PHP Pinba to chyba jedyny niezawodny sposób, aby zrozumieć, co dzieje się z wydajnością. Zazwyczaj Pinba jest wdrażana dopiero wtedy, gdy pojawiają się problemy i nie wiadomo 'gdzie szukać'.

Często nikt nie ma pojęcia, ile razy na sekundę/minutę wywoływany jest dany skrypt i zaczyna optymalizować 'na czuja', rozpoczynając od tych miejsc, które wydają się najbardziej logiczne.

Niektórzy analizują logi nginx, a inni wolne zapytania w bazie danych.

Oczywiście Pinba nie byłaby zbędna, ale są pewne powody, dla których nie występuje na każdym projekcie.

Statystyka i monitorowanie skryptów PHP w czasie rzeczywistym. ClickHouse i Grafana wspierają Pinbę.

Pierwszym powodem jest instalacja.

Aby uzyskać jakiekolwiek 'wyjście' z wdrożenia Pinby, bardzo wskazane jest widzieć metryki nie tylko za ostatnie minuty, ale także na dłuższym okresie (od dni do miesięcy).

W tym celu należy:

  • zainstalować rozszerzenie dla PHP (możliwe, że zechcesz również moduł dla nginx)
  • skompilować rozszerzenie dla MySQL
  • zainstalować pinboard i skonfigurować cron

Z powodu niewielkiej ilości informacji na temat Pinby, wielu wyrobiło sobie przekonanie, że działała tylko na PHP5 i od dawna odeszła w przeszłość, ale jak zobaczymy dalej — to nieprawda.

Pierwszy krok — najprostszy, wystarczy wykonać polecenie:

apt install php-pinba

To rozszerzenie jest dostępne w repozytoriach aż do PHP 7.3 włącznie i nie musisz nic kompilować.

Po wykonaniu polecenia instalacji od razu otrzymujemy działające rozszerzenie, które zbiera i wysyła metryki każdego skryptu (czas działania, pamięć itd.) w formacie protobuf przez UDP na 127.0.0.1:30002.

Te pakiety UDP nikt obecnie nie przechwytuje ani nie przetwarza, ale nie wpływa to negatywnie na szybkość czy stabilność działania twoich skryptów PHP.

Do niedawna jedyną aplikacją, która mogła przechwytywać i przetwarzać te pakiety UDP był tylko pinba_engine. Opis ‘prosty i zwięzły» instalacja odstrasza od ponownego czytania i zagłębiania się w temat. Na kilometrowych listach zależności znajdują się zarówno nazwy pakietów, jak i nazwiska programów oraz odnośniki do poszczególnych stron ich instalacji, które również zawierają odnośniki do innych zależności. Nikt nie ma ani czasu, ani chęci, aby zajmować się tym chaotycznym gąszczem.

Proces instalacji pinba2 nie stał się szczególnie łatwiejszy.

Może kiedyś pinba10 uda się zainstalować w jednej lub dwóch komendach, nie przeglądając ogromnych ilości materiałów, ale na razie tak nie jest.

Jeśli jednak udało ci się zainstalować pinba_engine, to jest to tylko połowa sukcesu. Bo bez pinboard będziesz musiał ograniczyć się do danych tylko z ostatnich kilku minut lub samodzielnie agregować, przechowywać i wizualizować dane. Na szczęście pinboard jest wystarczająco prosty w instalacji.

Z pozoru, po co takie cierpienia, skoro wszystkie metryki z php już trafiają na port udp w formacie protobuf, a wszystko, co trzeba zrobić, to napisać aplikację, która je złapie i złoży w jakieś magazyn? Wygląda na to, że deweloperzy, którzy wpadli na ten pomysł, od razu brali się za pisanie swoich rozwiązań, z których część trafiła na GitHub.

Następnie przedstawimy przegląd czterech projektów open source, które zapisują metryki w magazynach, z których te dane można łatwo wydobyć i wizualizować, na przykład za pomocą grafana.

olegfedoseev/pinba-server (listopad 2017)

serwer udp na go, który zapisuje metryki w OpenTSDB. Jeśli OpenTSDB jest już używany w twoim projekcie, to to rozwiązanie może być odpowiednie; w przeciwnym wypadku zalecam omijać je szerokim łukiem.

olegfedoseev/pinba-influxdb (czerwiec 2018)

serwer udp na go, od tego samego habrajuzera, który tym razem zapisuje metryki w InfluxDB. Wiele projektów monitorujących korzysta już obecnie z InfluxDB, więc takie rozwiązanie może być świetnie dopasowane do nich.

Zalety:

  • InfluxDB przekazywanie agregować otrzymane metryki, a oryginał usuwać po zadanym czasie.

Wady:

  • to rozwiązanie nie zapisuje informacji dotyczących timerów.
  • InfluxDB będzie przechowywać adresy stron jako tagi, a jeśli masz wiele unikalnych adresów, to prowadzi to do zwiększonego zużycia pamięci operacyjnej. Od pewnego momentu zacznie "żreć pamięć jak szalony".źródło«. (ClickHouse-Ninja/Proton)

(styczeń 2019) (styczeń 2019)

serwer UDP na Go, który zapisuje metryki w ClickHouse. To rozwiązanie jest mojego przyjaciela. Po zapoznaniu się z nim postanowiłem, że czas zająć się Pinbą i ClickHouse.

Zalety:

  • ClickHouse idealnie nadaje się do takich zadań, pozwala na kompresję danych tak, że możesz przechowywać wszystkie surowe dane nawet bez agregacji.
  • jeśli zajdzie potrzeba, możesz łatwo agregować uzyskane metryki.
  • gotowy szablon do Grafany.
  • przechowuje informacje o timerach.

Wady:

  • fatalna wada.
  • brak konfiguracji, w której można by ustawić nazwę bazy danych i tabel, adres oraz port serwera.
  • przy zapisywaniu surowych danych używana jest pomocnicza tabela-słownik do przechowywania adresów stron i domen, co utrudnia później zapytania.
  • inne drobiazgi, które wynikają z pierwszej wady.

pinba-server/pinba-server. (kwiecień 2019)

serwer UDP na PHP, który zapisuje metryki w ClickHouse. To moje rozwiązanie, będące wynikiem zapoznania się z Pinbą, ClickHouse i Protobuf. Gdy zgłębiałem cały ten zestaw, napisałem «dowód koncepcji», który, ku mojemu zaskoczeniu, nie zużywał znaczących zasobów (30 MB pamięci RAM i mniej niż 1% jednego z ośmiu rdzeni procesora), więc postanowiłem podzielić się nim z publicznością.

Zalety — te same, co w poprzednim rozwiązaniu, również użyłem znanych nazewnictw z oryginalnej pinba_engine. Dodałem także konfigurację, która pozwala na uruchomienie kilku instancji serwera Pinba, aby zapisywać metryki do różnych tabel — to przydatne, jeśli zechcesz zbierać dane nie tylko z PHP, ale i z Nginx.
Wady — „fatalna wada” i te drobiazgi, które mogą ci osobno nie odpowiadać, ale moje rozwiązanie jest „proste jak kapcie” i składa się z około 100 linii kodu, więc każdy programista PHP może w ciągu kilku minut zmienić to, co mu się nie podoba.

Zasada działania

Nasłuchuje na porcie UDP 30002. Wszystkie przychodzące pakiety są dekodowane zgodnie z schematem Protobuf i agregowane. Co minutę wykonuje się wstawienie partii do ClickHouse w tabeli pinba.requests. (wszystkie parametry są konfigurowane w konfiguracji.)

Trochę o ClickHouse.

ClickHouse wspiera różne silniki przechowywania danych. Najczęściej używany — MergeTree.

Jeśli kiedykolwiek zdecydujesz się przechowywać zebrane dane przez cały czas, a surowe tylko za ostatni okres, możesz stworzyć materializ widok z grupowaniem, a główną tabelę pinba.requests okresowo czyścić, przy czym wszystkie dane pozostaną w materializ widoku. Co więcej, przy tworzeniu tabeli pinba.requests możesz wskazać „engine = Null”, wtedy surowe dane w ogóle nie będą zapisywane na dysku, a mimo to będą trafić do materializ widoku i będą przechowywane w formie zgrupowanej. Tę metodę stosuję dla metryk nginx, ponieważ na nginx mam razy 50 więcej zapytań niż na php.

Tak więc przeszedłeś długą drogę i nie chciałbym zostawiać cię w połowie drogi, więc poniżej znajduje się szczegółowy opis instalacji i konfiguracji mojego rozwiązania oraz wszystko, czego będziesz potrzebować, a także pułapki, które zrujnowały nie jeden statek. Cały proces instalacji opisano dla Ubuntu 18.04 LTS i Centos 7, w innych dystrybucjach i wersjach proces może się nieznacznie różnić.

Instalacja

Wszystkie potrzebne polecenia umieściłem w Dockerfile w celu ułatwienia reprodukcji instrukcji. Poniżej będą opisane tylko pułapki.

php-pinba

Po instalacji upewnij się, że w pliku /etc/php/7.2/fpm/conf.d/20-pinba.ini masz odkomentowane wszystkie opcje. W niektórych dystrybucjach (np. centos) mogą być zakomentowane.

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

clickhouse

Podczas instalacji clickhouse poprosi cię o podanie hasła dla użytkownika default. Domyślnie ten użytkownik jest dostępny z wszystkich ip, więc jeśli nie masz na serwerze zapory, koniecznie ustaw mu hasło. Można to również zrobić już po instalacji w pliku /etc/clickhouse-server/users.xml.

Warto również zwrócić uwagę, że clickhouse używa kilku portów, w tym 9000. Ten port jest również używany dla php-fpm w niektórych dystrybucjach (np. centos). Jeśli ten port jest już używany, możesz go zmienić na inny w pliku /etc/clickhouse-server/config.xml.

grafana z wtyczką dla clickhouse

Po zainstalowaniu grafany użyj loginu admin i hasła admin. Przy pierwszym logowaniu grafana poprosi cię o ustawienie nowego hasła.

Następnie przejdź do menu „+” -> importuj i wprowadź numer dashboardu do importu 10011. Ten dashboard przygotowałem i załadowałem, aby nie było potrzeby tworzenia go samodzielnie jeszcze raz.

Grafana obsługuje współpracę z ClickHouse za pomocą wtyczki firm trzecich, ale dla wtyczek zewnętrznych alerty w Grafanie nie działają (zgłoszenie na ten temat wisi już od kilku lat).

pinba-server

Instalacja protobuf i libevent nie jest obowiązkowa, ale poprawia wydajność pinba-server. Jeśli zainstalujesz pinba-server w folderze innym niż /opt, będziesz musiał również dostosować skrypt systemd plik.

moduł pinba dla nginx

Do skompilowania modułu potrzebujesz źródeł tej samej wersji nginx, którą masz już zainstalowaną na serwerze, oraz tych samych opcji kompilacji, w przeciwnym razie kompilacja powiedzie się, ale podczas podłączania modułu wystąpi błąd, że „moduł jest binarnie niekompatybilny”. Opcje kompilacji można sprawdzić za pomocą polecenia nginx -V

Wskazówki

Wszystkie moje strony działają tylko przez https. Pole schema staje się bezsensowne, dlatego używam go do rozdzielania web/console.

W skryptach dostępnych z sieci używam:

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

A w skryptach konsolowych (np. cron-skripty):

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

Na moim pulpicie nawigacyjnym w Grafanie znajduje się przełącznik web/console do przeglądania statystyk osobno.

Możesz również przekazywać własne tagi do pinby, na przykład:

pinba_tag_set('country', $countryCode);

To wszystko.

Proszę, odpowiedz na ankiety pod artykułem.

Tradycyjnie ostrzegam, że nie udzielam porad ani nie pomagam przez wiadomości prywatne na Habrze i w mediach społecznościowych.

Załóż zgłoszenie na GitHubie.

Proszę również o wsparcie w postaci polubień wersji angielskiej tego artykułu na Reddicie.

Tylko zarejestrowani użytkownicy mogą brać udział w ankiecie. Zaloguj się, proszę.

Jakiego systemu operacyjnego używasz na serwerze?

  • Ubuntu

  • CentOS

  • Debian

  • Gentoo

  • Red Hat

  • Fedora

  • OpenSUSE

  • SuSE

  • Unix

  • Windows

  • inne

114 użytkowników oddało głosy. 11 użytkowników się wstrzymało.

Jaką wersję PHP używasz na serwerze?

  • 7.3

  • 7.2

  • 7.1

  • 7.0

  • 5

  • inne

105 użytkowników oddało głosy. 17 użytkowników się wstrzymało.

Czy kiedykolwiek używałeś pinba?

  • tak

  • nie, ale chciałbym

  • nie i nie chciałbym

  • nie i nie słyszałem o niej

100 użytkowników oddało głosy. 14 użytkowników się wstrzymało.

Jaką wersję serwera pinba chciałbyś wypróbować?

  • pinba_engine (silnik mysql)

  • pinba2 (silnik mysql)

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

  • napiszę własną

  • inne

39 użytkowników oddało głosy. 47 użytkowników się wstrzymało.

Źródło: habr.com

Kup solidny hosting stron z ochroną przed DDoS, serwery VPS VDS 🔥 Kup solidny hosting stron z ochroną przed DDoS, serwery VPS VDS | ProHoster