Статистика та моніторинг PHP скриптів в реальному часі. ClickHouse та Grafana йдуть на допомогу Pinba

У цій статті я розповім, як використовувати pinba спільно з clickhouse та grafana замість pinba_engine та pinboard.

На php-проекті pinba — мабуть, єдиний надійний спосіб зрозуміти, що відбувається з продуктивністю. Щоправда, зазвичай pinba впроваджується тільки тоді, коли вже спостерігаються проблеми і не зрозуміло «де копати».

Часто ніхто гадки не має, скільки разів на секунду/хвилину викликається той чи інший скрипт і починають оптимізувати «на дотик», починаючи з тих місць, що здаються логічними.

Хтось аналізує логи nginx, а хтось повільні запити у бд.

Звичайно pinba не була б зайвою, але є кілька причин, чому вона далеко не на кожному проекті.

Статистика та моніторинг PHP скриптів в реальному часі. ClickHouse та Grafana йдуть на допомогу Pinba

І перша причина – це встановлення.

Щоб більш-менш отримати якийсь «вихлоп» від впровадження пінби, дуже бажано бачити метрики не лише за останні хвилини, а й на тривалому проміжку часу (від днів до місяців).

Для цього потрібно:

  • встановити екстеншн для php (і можливо ви захочете модуль для nginx)
  • скомпілювати екстеншн для mysql
  • встановити pinboard та налаштувати cron

Через невелику кількість інформації про пінбу у багатьох склалося враження, що вона працювала тільки на php5 і давно залишилася в минулому, але як ми побачимо далі — це не так.

Перший крок - найпростіший, всього потрібно виконати команду:

apt install php-pinba

У репозиторіях цей екстеншн є до php 7.3 включно і вам не потрібно нічого компілювати.

Після виконання команди установки ми відразу отримуємо вже працююче розширення, яке збирає та шле метрики кожного скрипта (тривалість роботи, пам'ять тощо) у форматі протобуф з udp на 127.0.0.1:30002.

Ці udp-пакети поки що ніхто не ловить і не обробляє, але це ніяк погано не впливає на швидкість або стабільність роботи ваших php-скриптів.

До недавнього часу як додаток, який міг ловити та обробляти ці udp-пакети був тільки pinba_engine. Опис «простий та лаконічний» установки відбиває бажання ще раз це читати і вникати. У кілометрових списках залежностей є як назви пакетів, так і назви програм та посилання на окремі сторінки з їх встановленням, а ті мають свої посилання на інші залежності. Розбиратися з цією лабудою ні в кого не вистачає часу, бажання.

Процес установки pinba2 не став особливо легше.

Можливо, коли-небудь pinba10 можна буде встановити однією-двома командами і не читати купу матеріалу, щоб зрозуміти як це зробити, але поки що це не так.

Якщо ви таки встановили pinba_engine, то це лише половина справи. Адже без щит вам доведеться обмежитися даними лише за останні кілька хвилин або самостійно агрегувати, зберігати та візуалізувати дані. Добре, що pinboard досить простий у установці.

Здавалося б, навіщо такі страждання якщо всі метрики з php вже йдуть на udp-порт у форматі protobuf і все що потрібно, це написати програму, яка їх ловитиме і складатиме в якесь сховище? Мабуть тим розробникам, кому приходила ця думка на думку, відразу сідали за написання своїх велосипедів, частина яких потрапила на гітхаб.

Далі слідує огляд з чотирьох опенсурсних проектів, які зберігають метрики в сховищах, з яких ці дані легко дістати і візуалізувати, наприклад, за допомогою графана.

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 мегабайт оперативної пам'яті і менше 1% від одного з восьми ядер процесора), тому я вирішив поділитися ним із громадськістю.

Плюси - ті ж, що й у попереднього рішення, також я використав звичні назви з оригінальної pinba_engine. Ще я додав конфіг, який дозволяє запустити відразу кілька інстансів пінбасервера, щоб зберігати метрики в різні таблиці - це корисно, якщо ви захочете збирати дані не тільки з php, але і nginx.
Мінуси - "фатальний недолік" і ті дрібниці, які не влаштують особисто вас, але моє рішення - "просте як тапок" і складається всього з близько 100 рядків коду, так що будь-який php-розробник зможе за пару хвилин поміняти що йому не сподобається.

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

Прослуховується udp-порт 30002. Усі вхідні пакети декодуються згідно з protobuf-схемою та агрегуються. Раз на хвилину робиться вставка пачки в клікхаус до таблиці pinba.requests. (усі параметри налаштовуються в конфізі)

Трохи про клікхаус

Clickhouse підтримує різні двигуни зберігання даних. Найчастіше використовуваний – MergeTree.

Якщо ви в якийсь момент вирішите, зберігати агреговані дані за весь час, а сирі - тільки за останній, то можна створити materialized view з угрупованням, а основну таблицю pinba.requests періодично чистити, всі дані залишатимуться в materialized view. Більше того, при створенні таблиці pinba.requests ви можете вказати «engine = Null», тоді сирі дані взагалі не будуть зберігатися на диск і при цьому вони все одно потраплятимуть у materialized view і зберігатимуться агрегованими. Такою схемою я користуюся для метрик nginx, тому що на nginx у мене разів у 50 більше запитів, ніж на php.

Отже, ви пройшли довгий шлях і мені не хотілося б залишати вас на півдорозі, так що далі буде докладний опис установки та налаштування мого рішення і всього, що вам знадобиться, а також підводне каміння, про яке розбився не один корабель. Весь процес установки описаний для Ubuntu 18.04 LTS та Centos 7, на інших дистрибутивах та версіях процес може незначно відрізнятися.

Встановлення

Усі необхідні команди я виніс у Докер-файл для полегшення відтворюваності інструкцій. Нижче буде описано тільки підводне каміння.

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

Після встановлення графани використовуйте логін admin та пароль admin. При першому вході графану попросить вас задати новий пароль.

Далі заходимо в меню "+" -> import і вказуємо номер дашборду для імпорту 10011. Цей дашборд я підготував і залив, щоб вам не треба було робити його ще раз.

Графана підтримує роботу з клікхаусом через сторонній плагін, але для сторонніх плагінів у графани не працюють алерти (тикет на це важить уже кілька років).

pinba-server

Установка protobuf і libevent не обов'язкова, але покращує продуктивність pinba-server. Якщо ви встановите pinba-server в папку відмінну від /opt, то вам також потрібно буде підправити systemd скрипт файл.

pinba-модуль під nginx

Для компіляції модуля потрібні вихідні джерела тієї ж версії nginx, що вже встановлена ​​у вас на сервері, а також ті ж опції компіляції інакше збірка пройде успішно, але при підключенні модуля буде видаватися помилка, що «модуль бінарно не сумісний». Опції компіляції можна переглянути за допомогою команди nginx -V

Лайфхак

У мене всі сайти працюють лише за https. Поле schema стає безглуздим, тому я використовую його для розділення web/console.

У скриптах, які доступні з Інтернету я використовую:

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

А в консольних (наприклад, крон-скрипти):

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

У дашборді в графані є перемикач web/console для перегляду статистики окремо.

Також у пінбу можна передавати свої теги, наприклад:

pinba_tag_set('country', $countryCode);

На цьому все.

Велике прохання відповісти на опитування під статтею.

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

Заводьте тикет на гітхабі.

Також прохання підтримати лайками англійську версію цієї статті на реддіті.

Тільки зареєстровані користувачі можуть брати участь в опитуванні. Увійдіть, будь ласка.

Яку ОС на сервері ви використовуєте?

  • Ubuntu

  • CentOS

  • Debian

  • Gentoo

  • Red Hat

  • Fedora

  • OpenSUSE

  • SUSE

  • Юнекс

  • Windows

  • інше

Проголосували 114 користувачів. Утрималися 11 користувачів.

Яку версію PHP на сервері ви використовуєте?

  • 7.3

  • 7.2

  • 7.1

  • 7.0

  • 5

  • інше

Проголосували 105 користувачів. Утрималися 17 користувачів.

Ви використовували колись pinba?

  • да

  • Ні, але хотілося б

  • ні і не хотілося б

  • ні і не чув про неї

Проголосували 100 користувачів. Утрималися 14 користувачів.

Яку версію пінба-сервера ви хотіли б спробувати?

  • 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

Додати коментар або відгук