pinboard + pinba / Как организовать мониторинг сотни...
TRANSCRIPT
Pinboard + pinba Как организовать мониторинг сотни PHP-
проектов
Ильяс Салихов
Интаро
Интаро — веб-интегратор
Штат > 50 человек
~100 проектов на поддержке
и другие
Об Интаро
1. ТЗ, дизайн, верстка
2. Разработали
3. Протестировали
4. Провели нагрузочное тестирование
5. Сдали проект и забыли
… А дальше?
Новый проект
Проекты на сопровождении – это:
• Постоянно новые фичи
• Неизбежно новые баги
• Неизбежно «медленные» участки
кода и «медленные» запросы
Проекты на сопровождении
требуют постоянного контроля
показателей
Проекты на поддержке и сопровождении
• CPU load average
• Memory usage
• Network traffic
• Disk space usage
• Utilization per device
• Processes count
• Inode table usage
• …
Показатели веб-проекта
• CPU load average
• Memory usage
• Network traffic
• Disk space usage
• Utilization per device
• Processes count
• Inode table usage
• …
Пользователь непосредственно ощущает на себе только request time и отсутствие ошибок
Показатели веб-проекта
• Realtime-статистика о выполнении PHP-
скриптов
• Extension для PHP + storage для MySQL
• Отправка по UDP
• Минимальный overhead для сбора и
отправки данных на сервер статистики
• Realtime-отчеты
• Таймеры
Pinba
Pinba
Pinba
• Сырые данные: • request, timer, tag, timertag
• Отчеты: • report_by_script_name
• report_by_server_name
• report_by_hostname
• report_by_server_and_scriptr
• report_by_hostname_and_script
• report_by_hostname_and_server
• report_by_hostname_server_and_sc
ript
• Отчеты по тегам: • tag info by 1 tag
• tag info by 2 tags
• tag info by N tags
• tag report with grouping by script name
and tag value
• tag report with grouping by script name,
tag value, hostname and server name
• tag report with grouping by script name
and 2 tags
• tag report with grouping by script name
and N tags
• Очень простая в установке:
• Ставите pinba_extension за 30 секунд и статистика по ВСЕМ
запросам начинает отправляться в pinba
• В облаке (AWS, Azure, …) готовите образ с
pinba_extension в комплекте и вся статистика
собирается без дополнительных
телодвижений
Pinba
• Формирует агрегированные
данные
• Хранит статистику дольше
(по умолчанию 1 месяц)
• Доступ к данным pinba
• Мониторит
• Уведомляет
90, 95, 99, 100 персентили для ключевых показателей
Intaro Pinboard / Агрегированные данные
90, 95, 99, 100 персентили для mem_peak_usage и cpu_usage
а тут был деплой
Отслеживание критических показателей
• Следит за 90 и 95
персентилями
• Уведомляет о просадке
показателей
• Уведомляет о
нормализации
показателей
Intaro Pinboard / Border value
Пример конфига для логгирования медленных и тяжелых
страниц:
Intaro Pinboard / Тяжелые страницы
Анализируем тяжелые страницы: время, память, процессор
Intaro Pinboard / Тяжелые страницы
• Лог страниц с ошибками (с указанием сервера)
Intaro Pinboard / В курсе ошибок
Уведомление на почту об ошибках
Intaro Pinboard / В курсе ошибок
Пример конфига уведомлений
Intaro Pinboard / В курсе ошибок
А тут похоже стало все плохо :/
Intaro Pinboard / В курсе ошибок
Наша статистика использования Pinboard на 05.2014:
• Мониторится 226 сайтов
• В pinba ~4 млн. хитов в сутки
• В среднем 30 ошибок в сутки
• Предоставляем в Pinboard доступ заказчикам
• Быстрое реагирование и устранение ошибок до
того, как опомнился пользователь или клиент :)
Кроме нас Pinboard используют сторонние
разработчики с сайтами в десятки миллионов хитов
в сутки
Intaro Pinboard / В Интаро
Плюшки и особенности
PHP-фреймворки с единой точкой входа:
Подробные примеры:
https://github.com/intaro
/pinboard/wiki/Configure
-sending-of-readable-
script-names-in-Pinba
Указание URL
Для SaaS назначаем единый виртуальный домен, а поддомен
выносим в теги запроса
$subdomain = ‘’; //динамический поддомен
if (function_exists('pinba_server_name_set')) {
pinba_server_name_set('+prod.domain.ru');
}
if (function_exists('pinba_tag_set')) {
pinba_tag_set('subdomain', $subdomain);
}
SaaS с динамическими
поддоменами:
http://aa.domain.ru
http://bb.domain.ru
…
http://+prod.domain.ru
http://+prod.domain.ru
Поддомен в тегах запроса
Указание домена
Киллер фича!
Указываем виртуальный домен и параметры для консольного скрипта:
if (function_exists('pinba_script_name_set')) {
$argv = $_SERVER['argv'];
$argv[0] = '/' . basename($argv[0]);
pinba_script_name_set(implode(' ', $argv));
}
if (function_exists('pinba_server_name_set')) {
pinba_server_name_set('+job.domain.ru');
}
Статистика консольных скриптов
Устанавливаем статус ответа для консольного скрипта:
Статистика консольных скриптов
Live-режим для консольных скриптов и API
Помимо php_extension есть расширения для:
• Nginx
• https://github.com/tony2001/ngx_http_pinba_module
• Node.js
• https://github.com/Sannis/node-pinba
• Ruby
• https://github.com/prepor/pinbo
• Python
• https://github.com/IsCoolEntertainment/pynba
• http://habrahabr.ru/post/200128/
• Есть прецеденты сбора через Pinba клиентских метрик Timing API
Мониторим не только PHP
Поддержка тегов и таймеров pinba в Pinboard
Замеряйте отдельные участки кода и помечайте их тегами:
$timer = pinba_timer_start([
‘category’ => ‘database’,
‘group’ => ‘database::select’,
]);
//делаем select в БД
pinba_timer_stop($timer);
Замеряем отдельные участки кода
Общие отчеты во вкладке в Pinboard
Общие отчеты во вкладке в Pinboard
Общие отчеты во вкладке в Pinboard
Таймер для запроса
Таймеры у запросов в Pinboard
Не профилирование, но понимание общей структуры запроса
Чтобы смотреть отчеты в Pinboard по домену/серверу, нужно так:
$pinbaData = pinba_get_info();
$initTags = [];
if (isset($pinbaData['hostname'])) {
$initTags['__hostname'] = $pinbaData['hostname'];
}
if (isset($pinbaData['server_name'])) {
$initTags['__server_name'] = $pinbaData['server_name'];
}
$timer = pinba_timer_start(array_merge($initTags, [
‘category’ => ‘database’,
‘group’ => ‘database::select’,
]));
//делаем select в БД
pinba_timer_stop($timer);
в начале скрипта
Symfony2: https://github.com/intaro/pinba-bundle
• Настраивает script_name
• Автоматические таймеры на Doctrine (БД), Twig
(шаблоны) и Memcached (кеш)
• Позволяет обернуть таймерами любые другие сервисы
(Redis, Queue и др.)
1C-Битрикс: https://gist.github.com/muxx/9cc8b65a9105c8ba18a8
• На старом ядре позволяет отправлять в таймерах статистику
по запросам к БД
Поддержка таймеров в PHP-фреймворках
«Видим» проект так, как «видит» его пользователь
Персентели: В курсе, если проекты проседают по скорости отдачи
В курсе, если на проектах ошибки
Мониторим фоновые скрипты
Таймеры: Быстро локализуем проблему в скриптах
pinba + Pinboard
Пользуйтесь pinba + Pinboard!
И радуйтесь жизни :)
Свободные лицензии:
• GNU GPLv2 для pinba
• MIT для Intaro Pinboard
URLs:
pinba.org
intaro.github.io/pinboard/
Мои контакты:
twitter.com/salikhov
habrahabr.ru/users/muxx/
github.com/muxx
Спасибо!