Всем ясно, что в любом ИТ проекте важно иметь систему мониторинга для отслеживания системных метрик.
Обычно задача мониторинга спихивается на SysOps. Однако, кроме системных метрик существуют еще и метрики уровня приложения, а также бизнес метрики. Они позволяют быть в курсе не только ошибок аппаратного уровня, а и отклонений более высокого уровня (например, замедление обработки вызова API, замедление процесса парсинга источников, ухудшения конверсии в покупки, увеличение времени прохождения воронок и т.п.)
Именно тут MDD (Metric-driven Development) приходится как нельзя кстати. MDD — это методология разработки, основанная на измерении всего — от производительности до дохода. Она была представлена в 2012 году на дне DevOps в Риме, и применяется в таких компаниях как Spotify, StackEngine и во многих других, использующих философию Lean Startup.
Кастомные метрики должны быть встроены прямо в код. Например, счётчик или таймер на важном участке кода:
Другой пример — отслеживание количества разных событий для понимания и проверки логики выполнения кода:
MDD — это не серебряная пуля, ошибки могут и будут появляться в продакшне. MDD предоставляет хорошую основу для отлавливания ошибок, которые тяжело или невозможно проверить лабораторным путем.
Допустим, программист Пётр, тимлид, ведет приложение для составления тренировок используя технику TDD (test-driven development). Приложение готово и выходит в продакшн, все тесты работают. Но попав к новым пользователям, обнаруживается баг — при синхронизации с Google календарем, часть тренировок пропадает. В данном случае TDD не помог избежать бага. Да и никакая методика не помогла бы. Но MDD позволит быстрее найти и сам баг и его причину:
Часто, начав использовать MDD, команда начинает следовать анти-паттерну — «мониторить все подряд». Хороший способ проверить полезность метрики — это спросить себя, зачем эта метрика может понадобиться.
Итеративное направление MDD основывается на постоянном добавлении новых метрик и удалении устаревших. Неиспользованные метрики не только занимают место в коде, но и требуют дополнительных ресурсов.
Предположим, необходимо отследить все запросы к внешнему сервису. Для этого не нужно каждое обращение к этому сервису оборачивать в счётчик — выйдет не код, а вермишель. Лучше посчитать успешность группы событий. Добавление метрик «а может пригодится» не оправдает себя:
Очевидно, что для проверки этого кода будет достаточно первой и последней метрики.
Для эффективного использования MDD в проекте, должна быть создана одна универсальная платформа мониторинга, доступная для всех разработчиков и имеющая данные со всех источников.
Не смотря на банальность, этот пункт важен для достижения эффективности при реагировании на проблемы. Допустим у Вас просела конверсия с 14:45 до 15:15. Чтобы найти причину Вам нужно проверить ряд гипотез — сломалось что-то? Может это новая функция? Может нагрузка выросла? А может отпал важный маркетинговый канал? Если все эти метрики будут находиться в пределах одной платформы, ответы можно будет получить быстрее (и даже автоматически, с помощью обнаружения корреляций).
Дашборды — это важная часть MDD. При работе над какой-то частью продукта выбираются релевантные метрики и выводятся на монитор. Это позволяет постоянно быть в курсе и сразу понимать влияние изменений. Нормальная практика — это создание новых дашбордов каждые несколько дней.
Алерты помогут следить за важными показателями без необходимости постоянно проверять их руками. На начальном этапе у Вас будет 10 метрик, но уже скоро их станет 100, потом 1000 и так далее. Сольем небольшой инсайт — на одном из крупных русских социальных ресурсов их 17 тысяч. За таким количеством метрик уследить невозможно. Настройте правила и попросите Вашу систему анализа проверять метрики за Вас.
Opensource система Graphite хранит данные и рендерит их по запросу. Поддерживает разную «математику» и очень прост в использовании:
Сервис t.onthe.io — что-то вроде облачного Графита. Основные фичи тут — это автоматическое обнаружение аномалий и корреляций. Поддерживает протокол statsd.
Librato ориентирован на мониторинг — в пакете уже есть плагины для различных сервисов:
Метрики добавляются через дашборд. Подробнее об API в документации.
Stathat умеет строить прогнозы, очень удобно для ответа на вопрос — «когда нужно будет ставить новый сервер»:
Обычно задача мониторинга спихивается на SysOps. Однако, кроме системных метрик существуют еще и метрики уровня приложения, а также бизнес метрики. Они позволяют быть в курсе не только ошибок аппаратного уровня, а и отклонений более высокого уровня (например, замедление обработки вызова API, замедление процесса парсинга источников, ухудшения конверсии в покупки, увеличение времени прохождения воронок и т.п.)
Именно тут MDD (Metric-driven Development) приходится как нельзя кстати. MDD — это методология разработки, основанная на измерении всего — от производительности до дохода. Она была представлена в 2012 году на дне DevOps в Риме, и применяется в таких компаниях как Spotify, StackEngine и во многих других, использующих философию Lean Startup.
Принципы MDD
1. Мониторинг — это часть кода
Кастомные метрики должны быть встроены прямо в код. Например, счётчик или таймер на важном участке кода:
$ts = microtime(true);
facebook_get_photos($user_id);
track_time('api.facebook.photos_fetch', microtime(true) - $ts)
Другой пример — отслеживание количества разных событий для понимания и проверки логики выполнения кода:
$_SESSION['user_id'] = $user_id;
track('user.signin');
if ( !$has_photo )
{
$ask_for_upload = true;
track('user.has_no_photo');
}
2. Более эффективный дебаг
MDD — это не серебряная пуля, ошибки могут и будут появляться в продакшне. MDD предоставляет хорошую основу для отлавливания ошибок, которые тяжело или невозможно проверить лабораторным путем.
Допустим, программист Пётр, тимлид, ведет приложение для составления тренировок используя технику TDD (test-driven development). Приложение готово и выходит в продакшн, все тесты работают. Но попав к новым пользователям, обнаруживается баг — при синхронизации с Google календарем, часть тренировок пропадает. В данном случае TDD не помог избежать бага. Да и никакая методика не помогла бы. Но MDD позволит быстрее найти и сам баг и его причину:
$calendar_events = [];
track('api.calendar.try');
$google_events = call_google_api($user_id);
if ( $google_events ) track('api.calendar.success');
3. Мерять нужно много, но не все
Часто, начав использовать MDD, команда начинает следовать анти-паттерну — «мониторить все подряд». Хороший способ проверить полезность метрики — это спросить себя, зачем эта метрика может понадобиться.
Итеративное направление MDD основывается на постоянном добавлении новых метрик и удалении устаревших. Неиспользованные метрики не только занимают место в коде, но и требуют дополнительных ресурсов.
Предположим, необходимо отследить все запросы к внешнему сервису. Для этого не нужно каждое обращение к этому сервису оборачивать в счётчик — выйдет не код, а вермишель. Лучше посчитать успешность группы событий. Добавление метрик «а может пригодится» не оправдает себя:
track('uploads.started');
$file = $_FILES['file']['tmp_name'];
if ( $file ) track('uploads.uploaded');
$name = $some_random . '.jpg';
if ( move_uploaded_file($file, $name) ) track('uploads.moved');
exec('convert - strip ' . $name . ' ' . $name, $o, $r);
if ( !$r ) track('uploads.converted');
else unlink($name);
if ( is_file($name) ) track('uploads.finished');
Очевидно, что для проверки этого кода будет достаточно первой и последней метрики.
4. Системные и бизнес метрики в одном месте
Для эффективного использования MDD в проекте, должна быть создана одна универсальная платформа мониторинга, доступная для всех разработчиков и имеющая данные со всех источников.
Не смотря на банальность, этот пункт важен для достижения эффективности при реагировании на проблемы. Допустим у Вас просела конверсия с 14:45 до 15:15. Чтобы найти причину Вам нужно проверить ряд гипотез — сломалось что-то? Может это новая функция? Может нагрузка выросла? А может отпал важный маркетинговый канал? Если все эти метрики будут находиться в пределах одной платформы, ответы можно будет получить быстрее (и даже автоматически, с помощью обнаружения корреляций).
5. Дашборды и алерты
Дашборды — это важная часть MDD. При работе над какой-то частью продукта выбираются релевантные метрики и выводятся на монитор. Это позволяет постоянно быть в курсе и сразу понимать влияние изменений. Нормальная практика — это создание новых дашбордов каждые несколько дней.
Алерты помогут следить за важными показателями без необходимости постоянно проверять их руками. На начальном этапе у Вас будет 10 метрик, но уже скоро их станет 100, потом 1000 и так далее. Сольем небольшой инсайт — на одном из крупных русских социальных ресурсов их 17 тысяч. За таким количеством метрик уследить невозможно. Настройте правила и попросите Вашу систему анализа проверять метрики за Вас.
Некоторые инструменты
Graphite
Opensource система Graphite хранит данные и рендерит их по запросу. Поддерживает разную «математику» и очень прост в использовании:
echo "test.bash.stats 42 `date +%s`" | nc graphite.example.com 2003
t.onthe.io
Сервис t.onthe.io — что-то вроде облачного Графита. Основные фичи тут — это автоматическое обнаружение аномалий и корреляций. Поддерживает протокол statsd.
$api_id = 1;
$api_key = "aslkdj";
$metric = "users.payment";
$track_url = "https://tapi.onthe.io/?k={$api_id}:{$metric}&s=" .
md5("{$api_id}:{$metric}{$api_key}";
file_get_contents($track_url);
Librato
Librato ориентирован на мониторинг — в пакете уже есть плагины для различных сервисов:
<?php
use Services\Librato\Metrics\Metric;
$metric = new Metric('counter');
$metric->value = 1;
?>
Метрики добавляются через дашборд. Подробнее об API в документации.
StatHat
Stathat умеет строить прогнозы, очень удобно для ответа на вопрос — «когда нужно будет ставить новый сервер»:
stathat_ez_count('info@stathat.com', 'queue.pushed', 1);
Конспект
- MDD — крутая методология разработки основанная на метриках.
- Мерить нужно много, но далеко не все.
- Удобные инструменты: librato, StatHat, Graphite и t.