Pinba — мониторим php в реальном времени

:

Как сказано на официальном сайте
Pinba is a realtime monitoring/statistics server for PHP using MySQL as a read-only interface.

И это действительно так. Она позволит вам в реальном времени получать статистику по работающему приложению, при этом не замедляя само приложение.
Что делать со статистикой — это уже ваше дело, например, мы выводим ее в заббикс и используем как для мониторинга стабильности (нет ошибок, мало число длинных запросов), так и для аналитики.
Удивительно, что про это действительно замечательное изобретение не было еще ни одной статьи на хабре.

Мне захотелось сделать что-нибудь хорошее для этого opensource проекта, а что может быть лучше упоминания на хабре ;)

Установка


Сама пинба состоит из двух частей — это php extention и engine (движок для mysql).
И то и другое поставляется в исходном коде. Сама установка достаточно тривиальна и хорошо описана в справочном руководстве.

Прицип работы и конфигурация


Клиент (модуль)
На каждом сервере, где выполняется php надо установить модуль и добавить в php.ini следующие строки:
; configuration for php pinba module
extension=pinba.so
pinba.enabled=1
pinba.server=192.168.1.42:3300 ; адрес и порт сервера пинбы

После этого каждый php скрипт, cli в том числе, перед завершением работы будет посылать отчет по udp на указанный адрес и порт.
На этом установка завершена, клиент настроен.

Сервер (движок mysql).
При первом прочтении документации я не мог понять, зачем пинбе нужен mysql. Оказалось, что все просто — mysql — это интерфейс/точка входа в систему аналитики.
Это очень удобно, ведь под данную СУБД есть уже куча решений и все умеет с ним работать.

Сервер pinba конфигурируется как движок mysql. Настроек не много и имена их очевидны:

[mysqld]
pinba_port=3300 #порт
pinba_address=192.168.1.205
pinba_stats_gathering_period=10000 #(microseconds)
pinba_stats_history=900 #(seconds)
pinba_temp_pool_size=10000
pinba_request_pool_size=1000000 #<max expected requests per second> * <stats_history> = <request pool size>
pinba_tag_report_timeout=-1 #Default value is -1, i.e. keep the data updated forever. 


Подробнее смотрите в документации.

После того, как вы установите сервер и включите модуль на клиентах в пинбу (mysql) будут поступать данные о всех скриптах, которые были выполнены с этим модулем.
Данные о всех уникальных запросах попадут в табличку request. Так же вам доступны группировки:
report_by_hostname, report_by_hostname_and_script, report_by_hostname_and_server, report_by_hostname_server_and_script, report_by_script_name, report_by_server_and_script, report_by_server_name.

И вообще, это же mysql, так что:
show tables;

Резюмирую — не настраивая практически ничего мы получили систему аналитики всего php в продакшене.
Например, мы знаем суммарное число обращений (rps):

mysql> select req_per_sec from report_by_server_name where server_name = 'ro.plus1.wapstart.ru';
+-------------+
| req_per_sec |
+-------------+
|     547.161 |
+-------------+
1 row in set (0.00 sec)

То же самое, но по каждому хосту (серверу прода):

mysql> select hostname, req_per_sec from report_by_hostname_and_server where server_name = 'ro.plus1.wapstart.ru';
+----------+-------------+
| hostname | req_per_sec |
+----------+-------------+
| a....    |     81.7561 |
| b..      |     59.0298 |
| c...     |     90.8049 |
| f....    |     54.5014 |
| f....    |     54.5122 |
| h......  |     63.5664 |
| k...     |     54.5068 |
| s....    |     90.8211 |
+----------+-------------+
8 rows in set (0.00 sec)


И еще большой набор различных отчетов. Все отчеты будут обновляться оперативно и содержать самые свежие данные.
Это не анализ логов apache, это профайлинг и мониторинг прямо на продакшене!

Таймеры и теги


Теперь о самом вкусном.
Вы можете измерять продолжительность какого-либо события в скриптах и тэггировать его. Эти данные так же будут доступны для отчетов.

Например, если у вас есть длинная выборка пользователей из базы, то можно сделать так:
$t = pinba_timer_start(array("group"=>"mysql", "server"=>"dbs2", "operation"=>"select"));
//работа с базой
pinba_timer_stop($t);

Я добавил таймеры прямо в фреймворк, который мы используем, и сейчас в той или иной мере у меня измеряются все запросы к базам, memcached и т.д.

Отдельно отмечу, что эти данные легко доступны в интерфейсе сервера.
Их можно выбрать или из сырых данных — см. таблицы report, timer, timertag, либо создать таблицы, в которых данные будут находится уже в аггрегированном состоянии.

Пример (из вики):
CREATE TABLE `tag_info_group_server` (
`group_value` varchar(32) DEFAULT NULL,
`server_value` varchar(32) DEFAULT NULL,
`req_count` int(11) DEFAULT NULL,
`req_per_sec` float DEFAULT NULL,
`hit_count` int(11) DEFAULT NULL,
`hit_per_sec` float DEFAULT NULL,
`timer_value` float DEFAULT NULL
) ENGINE=PINBA DEFAULT CHARSET=latin1 COMMENT='tag2_info:group,server'

NOTE: Комментарий к таблице важен.
После создания, в эту таблицу будут автоматически (!) аггрегироваться данные по тегу group и серверу (server).

Стабильность


Мы используем ее в продакшене. Она работает ;)

Я не ставлю целью сделать какое-то законченное описание pinba, тем более мне не хочется копировать мануал.
Если вы используете php в продакшене, попробуйте pinba. Она действительно хороша!

Литература:
* wiki
* группа google

upd: Встречайте автора текущей реализации — tony2001!