2. Давайте познакомимся
§ Меня зовут Саша
§ Я работаю в компании Git in Sky
§ Мне, почему-то, не нравится должность “Chief
Monitoring Officer”
§ Поэтому моя должность называется просто
“главный инженер”
Использование стека Graphite/StatsD для мониторинга. 2014
3. А как называется ваша должность?
§ Старший веб-разработчик?
§ Ведущий системный администратор?
§ Главный архитектор?
§ Верховный шаман?
§ Президент Галактики?
Использование стека Graphite/StatsD для мониторинга. 2014
4. О чем пойдет речь?
§ Всё плохо зделоно!
§ “Всё” — мы занимаемся веб-проектами, поэтому
речь пойдет о них
§ Если точнее — серверной частью веб-проектов
§ “Плохо” — работает медленно, некачественно, с
ошибками, ресурсоемко
Использование стека Graphite/StatsD для мониторинга. 2014
5. Краткое руководство “как сделать хорошо”
§ Нажать на кнопку “сделать хорошо”
§ Если кнопки поблизости нет:
§ Собрать стенд — измерить — подумать — что-то
поменять — измерить — подумать — ... — стало
хорошо
§ Вопросов нет, кроме
§ “Как собрать стенд?” и “как измерить?”
Использование стека Graphite/StatsD для мониторинга. 2014
6. Как собрать стенд?
§ Лучший стенд повторяет ситуацию в продакшне 1:1
§ Надо взять такие же машины, таких же
пользователей и такую же нагрузку
§ Чем больше и сложнее проект, тем меньше
вероятность построения хорошего стенда
§ Почему бы не измерять параметры “живой”
системы?
Использование стека Graphite/StatsD для мониторинга. 2014
7. Какие параметры измерять?
§ Стандартные параметры любого сервера:
потребление CPU, потребление памяти,
количество занятого места на диске, IOPS на диске
§ Измеряются в первую очередь, любое средство
мониторинга думает, что умеет эти параметры
измерять
§ Почему “думает”? (Как измеряется disk latency в
Munin?)
Использование стека Graphite/StatsD для мониторинга. 2014
8. Какие параметры измерять?
§ Параметры самого приложения:
§ Сколько времени приложение тормозило при обращении к БД?
§ Сколько времени приложение тормозило при обращении к внешнему API?
§ Какова частота попаданий в кэш? (У нас ведь есть кэш?)
§ Важные бизнес-метрики:
§ Как идут продажи?
§ Сколько пользователей залогинено и кто они?
Использование стека Graphite/StatsD для мониторинга. 2014
9. Что потом делать с этими параметрами?
§ Давайте нарисуем котика!
§ Давайте нарисуем графики!
§ Важные свойства графиков:
§ На них видно, что происходит сейчас
§ На них видно, что было в прошлом
§ Если долго смотреть на графики, начинаешь
понимать, что происходит в приложении
Использование стека Graphite/StatsD для мониторинга. 2014
10. Переходим к заключительной части
§ Лучшее средство рисования графиков — Graphite
§ Почему?
§ Потому что его используют в Mail.Ru
Использование стека Graphite/StatsD для мониторинга. 2014
11. Как, вообще, рисуют графики?
§ Надо принять данные
§ Надо сохранить данные
§ Надо извлечь данные за указанный период
§ И нарисовать их на графике!
§ Звучит довольно несложно
Использование стека Graphite/StatsD для мониторинга. 2014
12. Как всегда, все дело в деталях
§ Как принять данные?
§ Надо написать веб-сервис приема данных, или REST-сервис
приема данных, или просто TCP-сервис приема данных
§ Как сохранить данные?
§ В базе данных, например, в MySQL
§ Как извлечь и нарисовать данные?
§ Еще один веб-сервис, умеющий отвечать на GET-запросы
Использование стека Graphite/StatsD для мониторинга. 2014
13. Мы только что придумали Zabbix :(
§ Чем проще протокол обмена данными, тем он
лучше будет работать
§ Чем короче сообщения, тем меньше нагрузки на
канал они создадут
§ TCP лучше не использовать — что будет, если
сервер приема статистики упадет?
§ MySQL тоже лучше не использовать, даже если его
использует Mail.Ru
Использование стека Graphite/StatsD для мониторинга. 2014
14. Что мы можем улучшить?
§ Мы всегда точно знаем, сколько именно данных мы
будем хранить для заданного параметра удержания
§ Round Robin Database
§ Каждая метрика хранится отдельно в своем файле
§ Метрики могут усредняться
§ ^ Это хорошая идея, если у вас нет бесконечного диска
§ UDP, а не TCP
Использование стека Graphite/StatsD для мониторинга. 2014
15. Но постойте
§ Я девочка, я не хочу ничего решать, я хочу платье
§ Я верховный шаман, я не хочу ничего настраивать, я
хочу бубен
§ Я программист, я не хочу никакие метрики, я хочу
фреймворк
Использование стека Graphite/StatsD для мониторинга. 2014
16. Существуют законченные решения
§ Как мы сюда попали? (Если вы не помните — значит,
вы внутри сна)
§ Я приехал сюда на машине
§ Как я начал рисовать графики в Graphite?
§ Сначала я делал это в Munin, Munin — офигенный!
§ Потом появился NewRelic, он настолько офигенный,
что стоит кучу денег
Использование стека Graphite/StatsD для мониторинга. 2014
17. Что не устраивало?
§ Период опроса у Munin — 5 минут, это редко
§ Писать плагины для Munin просто, но неэффективно
§ Если у вас 50 серверов, однажды Munin начнет
страшно тормозить
§ NewRelic, кроме того, что стоит денег, ничего не знает
ни о потрохах конкретного приложения, ни о
потрохах виртуальной машины языка Perl
Использование стека Graphite/StatsD для мониторинга. 2014
18. Как устроен Graphite/StatsD стек
§ Dashboard (сначала я пользовался
стандартным от Graphite)
§ Веб-сервис отдачи графиков (на
Python/Django)
§ Коллектор с RRD-like хранилищем, которое
называется Whisper (тоже на Python)
§ Агрегатор/препроцессор с UDP-
интерфейсом (собственно, StatsD)
Нетрадиционный PostgreSQL: хранение бинарных данных в БД . 2014
19. Как выглядит стандартный dashboard Graphite
Использование стека Graphite/StatsD для мониторинга. 2014
20. Имплементации StatsD-сервера
§ Исходно — Node.JS
§ Есть на C, Perl, Ruby, Python, Go, ...
§ Сначала я взял Python
§ Потом был Perl, сейчас я перехожу на Go (меньше памяти, быстрее)
Использование стека Graphite/StatsD для мониторинга. 2014
21. Что работает хорошо
§ Метрики сохраняются
§ Графики рисуются :)
§ Легко расставлять в коде новые метрики
§ Легко создавать новые графики
Использование стека Graphite/StatsD для мониторинга. 2014
22. Что работает плохо
§ Почему-то исторические данные Graphite у меня
рисует очень плохо
§ Grafana использует ElasticSearch
§ ElasticSearch лучше наружу не выставлять — в нем
уязвимость
Использование стека Graphite/StatsD для мониторинга. 2014
23. Как это выглядит?
§
§ Надо сохранить данные
§ Надо извлечь данные за указанный период
§ И нарисовать их на графике!
§ Звучит довольно несложно
Использование стека Graphite/StatsD для мониторинга. 2014
24. Как этим пользуюсь я
§ Смотрю в редакторе унаследованный код
§ Не понимаю в нем НИЧЕГО
§ Расставляю в коде какие-нибудь таймеры и какие-
нибудь счетчики
§ Смотрю на полученные графики
§ Смотрю в редакторе унаследованный код
Использование стека Graphite/StatsD для мониторинга. 2014
25. Кусочек моей работы
§
§ Надо сохранить данные
§ Надо извлечь данные за указанный период
§ И нарисовать их на графике!
§ Звучит довольно несложно
Использование стека Graphite/StatsD для мониторинга. 2014
26. Истории успеха (офигительные)
§ Однажды я инструментировал интерпретатор Perl,
чтобы убедиться, что в нем не течет память
§ Это было очень печально:
§ В программах на C есть глобальное внутреннее
состояние (переменная errno)
§ Аллокации памяти происходят по 5000 раз в секунду
§ Передать по сети 5000 метрик — это непросто (я так и
не делал, агрегировал метрики по месту)
Использование стека Graphite/StatsD для мониторинга. 2014
27. Истории успеха (офигительные)
§ Однажды у нас было два асинхронных сервиса на
Perl, которые общались друг с другом по HTTP
§ Кроме того, один из них общался со внешним
источником
§ Пару раз в месяц в продакшне все начинало
переставать работать
§ Пришлось обвешать всё внутри графиками, чтобы
найти магическую глобальную переменную
Использование стека Graphite/StatsD для мониторинга. 2014
28. Выводы
§ Рисуйте графики и котиков
§ Непрерывно улучшайтесь
§ Приходите послушать меня еще раз
Использование стека Graphite/StatsD для мониторинга. 2014
29. С вами был Александр Чистяков,
главный инженер Git in Sky
alex@gitinsky.com
http://gitinsky.com
http://meetup.com/DevOps-40
Пожалуйста, ваши вопросы.
Спасибо за внимание!