Statystyki i monitorowanie skryptów PHP w czasie rzeczywistym. ClickHouse i Grafana przybywają z pomocą Pinbie

W tym artykule powiem Ci jak używać Pinby z Clickhouse i Grafaną zamiast Pinba_engine i Pinboard.

W projekcie PHP pinba jest prawdopodobnie jedynym niezawodnym sposobem zrozumienia, co dzieje się z wydajnością. To prawda, pinba jest zwykle wdrażana tylko wtedy, gdy zaobserwowano już problemy i nie jest jasne, „gdzie kopać”.

Często nikt nie ma pojęcia, ile razy na sekundę/minutę wywoływany jest ten czy inny skrypt i zaczynają optymalizować „na dotyk”, zaczynając od miejsc, które wydają się bardziej logiczne.

Niektórzy analizują logi nginx, podczas gdy inni analizują powolne zapytania do bazy danych.

Oczywiście pinba nie byłaby zbędna, ale jest kilka powodów, dla których nie każdy projekt ją posiada.

Statystyki i monitorowanie skryptów PHP w czasie rzeczywistym. ClickHouse i Grafana przybywają z pomocą Pinbie

Pierwszym powodem jest instalacja.

Aby mniej więcej uzyskać pewnego rodzaju „wyczerpanie” z wdrożenia Pinby, bardzo pożądane jest zobaczenie metryk nie tylko dla ostatnich minut, ale także dla długiego okresu czasu (od dni do miesięcy).

Aby to zrobić:

  • zainstaluj rozszerzenie dla php (i możesz potrzebować modułu dla nginx)
  • skompiluj rozszerzenie dla mysql
  • zainstaluj tablicę korkową i skonfiguruj cron

Ze względu na niewielką ilość informacji o Pinbie wiele osób ma wrażenie, że działała ona tylko na PHP5 i już dawno należy do przeszłości, jednak jak zobaczymy później, tak nie jest.

Pierwszy krok jest najprostszy, wystarczy uruchomić komendę:

apt install php-pinba

To rozszerzenie jest dostępne w repozytoriach aż do wersji php 7.3 włącznie i nie trzeba niczego kompilować.

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

Jak dotąd nikt nie przechwycił ani nie przetworzył tych pakietów UDP, ale nie wpływa to w żaden sposób negatywnie na szybkość i stabilność twoich skryptów PHP.

Do niedawna jedyną aplikacją, która mogła przechwytywać i przetwarzać te pakiety UDP, była aplikacja pinba_engine. Opis "proste i zwięzłe„Instalacja zniechęca do chęci ponownego przeczytania i zagłębienia się w nią. Kilometrowe listy zależności zawierają zarówno nazwy pakietów, jak i nazwy programów oraz linki do poszczególnych stron z ich instalacją, a te posiadają własne linki do innych zależności. Nikt nie ma czasu i ochoty zajmować się tym badziewiem.

Proces instalacji pinba2 nie szczególnie łatwiej.

Być może pewnego dnia będzie można zainstalować pinba10 za pomocą jednego lub dwóch poleceń i nie trzeba będzie czytać wielu materiałów, aby zrozumieć, jak to zrobić, ale na razie tak nie jest.

Jeśli zainstalujesz pinba_engine, to tylko połowa sukcesu. Przecież bez tablica korkowa będziesz musiał ograniczyć się do danych z ostatnich kilku minut lub będziesz musiał samodzielnie agregować, przechowywać i wizualizować dane. Dobrze, że tablica korkowa jest w miarę prosta w obsłudze instalacja.

Wydawałoby się, po co takie cierpienie, skoro wszystkie metryki z php są już wysyłane na port udp w formacie protobuf, a wystarczy napisać aplikację, która je przechwyci i umieści w jakiejś pamięci? Najwyraźniej programiści, którzy wpadli na ten pomysł, od razu zabrali się do pisania własnych pomysłów, z których część trafiła na GitHub.

Poniżej znajduje się przegląd czterech projektów open source, które zapisują metryki w magazynie, z którego dane te można łatwo odzyskać i zwizualizować, na przykład za pomocą grafany.

olegfedoseev/pinba-server (listopad 2017)

serwer udp on-go, który zapisuje metryki w OpenTSDB. Być może, jeśli już korzystasz z OpenTSDB w swoim projekcie, to to rozwiązanie będzie Ci odpowiadać, w przeciwnym razie polecam je pominąć.

olegfedoseev/pinba-influxdb (czerwiec 2018)

serwer udp w ruchu, z tego samego przeglądarka, który tym razem przechowuje metryki w InfluxDB. Wiele projektów wykorzystuje już InfluxDB do monitorowania, więc to rozwiązanie może być dla nich idealne.

Plusy:

  • NapływDB pozwala on agreguj otrzymane metryki i usuwaj oryginał po określonym czasie.

Wady:

ClickHouse-Ninja/Proton (styczeń 2019)

serwer udp on go, który zapisuje metryki w ClickHouse. To jest rozwiązanie mojego znajomego. Dopiero po zapoznaniu się z nim zdecydowałem, że czas zmierzyć się z Pinbu i Clickhouse.

Plusy:

  • Do takich zadań idealnie nadaje się Clickhouse, pozwala skompresować dane do tego stopnia, że ​​można przechowywać wszystkie surowe dane nawet bez agregacji
  • w razie potrzeby można łatwo agregować powstałe metryki
  • gotowy szablon na grafanę
  • zapisuje informacje o timerach

Wady:

  • fatalny błąd
  • nie ma konfiguracji, w której można skonfigurować nazwę bazy danych i tabel, adres i port serwera.
  • podczas przechowywania danych surowych do przechowywania adresów stron i domen wykorzystywana jest tabela słowników pomocniczych, co komplikuje późniejsze zapytania
  • inne drobnostki, które wynikają z pierwszego minusa

serwer-pinba/serwer-pinba (kwiecień 2019)

serwer udp w php, który zapisuje metryki w ClickHouse. To jest moje rozwiązanie, które jest efektem poznania pinby, ClickHouse i protobufa. W trakcie porządkowania tej całej masy napisałem „proof of concept”, który niespodziewanie dla mnie nie pochłonął znacznych zasobów (30 MB RAM i niecałe 1% jednego z ośmiu rdzeni procesora), więc postanowił podzielić się tym z opinią publiczną.

Zalety są takie same jak w poprzednim rozwiązaniu, użyłem również zwykłych nazw z oryginalnego pinba_engine. Dodałem także konfigurację, która pozwala na uruchomienie kilku instancji serwera pinbase na raz w celu zapisania metryk w różnych tabelach - jest to przydatne, jeśli chcesz zbierać dane nie tylko z php, ale także z nginx.
Wady - „fatalna wada” i te drobnostki, które nie będą Ci osobiście odpowiadać, ale moje rozwiązanie jest „proste jak pantofelek” i składa się tylko z około 100 linii kodu, więc każdy programista PHP może zmienić to, co mu się nie podoba za parę minut.

Zasada działania

Odsłuchiwany jest port UDP 30002. Wszystkie przychodzące pakiety są dekodowane zgodnie ze schematem protobuf i agregowane. Raz na minutę pakiet jest umieszczany w Clickhouse w tabeli pinba.requests. (wszystkie parametry są skonfigurowane w konfiguracja)

Trochę o Clickhouse

Clickhouse obsługuje różne silniki przechowywania danych. Najczęściej używanym jest MergeTree.

Jeśli w którymś momencie zdecydujesz się na przechowywanie danych zagregowanych przez cały czas, a danych surowych tylko dla ostatniego, możesz utworzyć widok zmaterializowany z grupowaniem i okresowo czyścić główną tabelę pinba.requests, podczas gdy wszystkie dane pozostaną w zmaterializowany pogląd. Co więcej, tworząc tabelę pinba.requests, możesz określić „engine = Null”, wtedy surowe dane w ogóle nie zostaną zapisane na dysku, a jednocześnie nadal wylądują w widoku zmaterializowanym i zostaną zapisane zagregowane . Używam tego schematu do metryk nginx, ponieważ na nginx mam 50 razy więcej żądań niż na php.

Tak więc przebyłeś długą drogę i nie chciałbym Cię zostawiać w połowie drogi, dlatego poniżej znajduje się szczegółowy opis instalacji i konfiguracji mojego rozwiązania oraz wszystkiego, czego potrzebujesz, a także pułapek, które spowodowały więcej niż jeden statek rozbić się. 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

Wpisałem wszystkie niezbędne polecenia Dockerfile aby ułatwić powtarzalność instrukcji. Poniżej zostaną opisane jedynie pułapki.

php-pinba

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

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

dom kliknięć

Podczas instalacji Clickhouse poprosi Cię o ustawienie hasła dla domyślnego użytkownika. Domyślnie ten użytkownik jest dostępny ze wszystkich adresów IP, więc jeśli nie masz zapory ogniowej na swoim serwerze, pamiętaj o ustawieniu dla niego hasła. Można to również zrobić po instalacji w pliku /etc/clickhouse-server/users.xml.

Warto również zauważyć, że Clickhouse korzysta z kilku portów, w tym 9000. Port ten jest również używany do php-fpm w niektórych dystrybucjach (np. Centos). Jeśli już używasz tego portu, możesz go zmienić na inny w pliku /etc/clickhouse-server/config.xml.

grafana z wtyczką 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 „+” -> import i wskaż numer dashboardu do importu 10011. Przygotowałem i przesłałem ten pulpit nawigacyjny, abyś nie musiał robić tego sam ponownie.

Grafana obsługuje współpracę z Clickhouse za pośrednictwem wtyczki innej firmy, ale Grafana nie ma alertów dotyczących wtyczek innych firm (istniało to zgłoszenie od kilku lat).

serwer pinba

Instalacja protobuf i libevent jest opcjonalna, ale poprawia wydajność serwera pinba. Jeśli zainstalujesz pinba-server w folderze innym niż /opt, będziesz musiał również poprawić skrypt systemowy plik.

moduł pinba dla nginx

Do skompilowania modułu potrzebujesz kodów źródłowych tej samej wersji nginx, która jest już zainstalowana na Twoim serwerze, a także tych samych opcji kompilacji, w przeciwnym razie kompilacja zakończy się sukcesem, ale przy podłączeniu modułu zostanie wyrzucony błąd, który „moduł nie jest kompatybilny binarnie.” Opcje kompilacji można wyświetlić za pomocą polecenia nginx -V

Życie hacki

Wszystkie moje strony działają tylko na https. Pole schematu staje się bez znaczenia, więc używam go do oddzielenia Internetu/konsoli.

W skryptach dostępnych z Internetu używam:

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

A w skryptach konsolowych (na przykład skryptach cron):

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

Na moim pulpicie nawigacyjnym w Grafanie znajduje się przełącznik WWW/konsola umożliwiający oddzielne przeglądanie statystyk.

Możesz także wysłać swoje tagi do Pinby, na przykład:

pinba_tag_set('country', $countryCode);

I to wszystko.

Prosimy o wypełnienie ankiet pod artykułem.

Jak zwykle ostrzegam, że nie doradzam i nie pomagam poprzez prywatne wiadomości na Habr i portalach społecznościowych.

Utwórz zgłoszenie na Githubie.

Prosimy również o wsparcie lajkami angielska wersja ten artykuł na Reddicie.

W ankiecie mogą brać udział tylko zarejestrowani użytkownicy. Zaloguj się, Proszę.

Jakiego systemu operacyjnego używasz na serwerze?

  • Ubuntu

  • CentOS

  • Debian

  • Gentoo

  • Red Hat

  • Fedora

  • OpenSUSE

  • SZWAJCARIA

  • Unix

  • Windows

  • inny

Głosowało 114 użytkowników. 11 użytkowników wstrzymało się od głosu.

Jakiej wersji php używasz na serwerze?

  • 7.3

  • 7.2

  • 7.1

  • 7.0

  • 5

  • inny

Głosowało 105 użytkowników. 17 użytkowników wstrzymało się od głosu.

Czy kiedykolwiek korzystałeś z pinby?

  • tak

  • nie, ale chciałbym

  • nie i nie chciałbym

  • nie i nie słyszałem o niej

Głosowało 100 użytkowników. 14 użytkowników wstrzymało się od głosu.

Którą wersję serwera Pinba chciałbyś wypróbować?

  • pinba_engine (silnik mysql)

  • pinba2 (silnik mysql)

  • tablica korkowa (php + mysql)

  • olegfedoseev/pinba-server (go + OpenTSDB)

  • olegfedoseev/pinba-influxdb (go + influxdb)

  • serwer pinba/serwer pinba (go + clickhouse)

  • serwer pinba/serwer pinba (php + clickhouse)

  • Sam napiszę swoje

  • inny

Głosowało 39 użytkowników. 47 użytkowników wstrzymało się od głosu.

Źródło: www.habr.com

Dodaj komentarz