27
Мониторинг производительности web-приложений на Python Special for Minsk Python Meetup

мониторинг производительности Web приложений на python

  • Upload
    slach

  • View
    665

  • Download
    3

Embed Size (px)

Citation preview

Page 1: мониторинг производительности Web приложений на python

Мониторинг производительности web-приложений на Python

Special for Minsk Python Meetup

Page 2: мониторинг производительности Web приложений на python

Коротно о себе

Занимаюсь web программированием с 1999 года

Работал в Badoo, LinguaLeo и много где еще ;)

В настоящий момент работаю в http://melesta-games.com

Текущий проект небольшой

150-200 rps, 1 сервер, 300kb JSON на запрос ;)

Но мы активно РАСТЕМ

Page 3: мониторинг производительности Web приложений на python

Виды мониторинга в web проектах● Мониторинг программной и аппаратной

инфраструктуры (Zabbix, Icinga, Munin)● Мониторинг пользовательской активности

(Google Analytics Alerts, внутренняя аналитика)● Функциональный мониторинг

(Zabbix+Selenium+BrowserMob, site24x7.com)● Мониторинг производительности приложения(graphite, grafana, influxdb, pinba, statsd, datadoghq, NewRelic) - НАШ ВЫБОР ;)

Page 4: мониторинг производительности Web приложений на python

Мониторинг производительности приложения это:● Измерение и анализ времени на обработку запроса и

различных его частей на application серверах● Измерение и анализ времени загрузки страниц и ajax

запросов в браузере (на клиенте)● Измерение потребления системных ресурсов (Disk,

Network, RAM, CPU) на application серверах в рамках приложения

● Мониторинг кол-ва и аггрегация по типам ошибок, возникающих при обработке запросов

Page 5: мониторинг производительности Web приложений на python

Цели и особенности мониторинга производительности:

● Отвечает на вопрос какие именно участки кода тормозят, но не отвечает на вопрос ПОЧЕМУ

● Помогает понять, какое влияние на скорость обработки запросов оказывает то или иное изменение в коде

● Помогает принять быстрое решение в случае «выкатили новый релиз и все вкорячило»

Page 6: мониторинг производительности Web приложений на python

Инструменты для сбора и анализа данных (1 из 3)

● Время исполнения на клиенте: https://github.com/dpp-name/jinba - сбор метрик

● Время исполения на сервере:https://github.com/johnnoone/pynba - сбор метрикhttp://statsd.readthedocs.org - сбор метрикhttp://pinba.org/, https://bitbucket.org/bloodjazman/pinba2graphite - аггрегация метрикhttps://github.com/github/brubeck - аггрегация метрикhttp://influxdb.org/ - хранение метрикhttp://graphite.readthedocs.org - хранение метрикhttp://grafana.org/ - визуализацияhttp://github.com/urbanairship/tessera - визуализация

Page 7: мониторинг производительности Web приложений на python

Инструменты для сбора и анализа данных (2 из 3)

● Системные метрики и сервисы (PostgreSQL, redis, rabbit etc)https://github.com/python-diamond/Diamond

● Ошибки во время исполненияhttps://github.com/getsentry/sentry

● Детекторы аномалийhttp://github.com/etsy/oculus, https://github.com/etsy/skylinehttps://github.com/nathanielc/morgoth, https://github.com/eleme/bell.js

● Оповещенияhttps://github.com/klen/graphite-beacon

Page 8: мониторинг производительности Web приложений на python

Инструменты для сбора и анализа данных (3 из 3)

● SaaS (все в одном)http://newrelic.com/application-monitoring/pricing https://www.datadoghq.com/pricing/ (хороший free пакет)http://okmeter.io/ http://www.appdynamics.com/pricing/

● SaaS Детекторы аномалийhttps://anomaly.io/pricing/ (не пробовал, потому что дорого :)http://t.onthe.io (не пробовал, непонятно как работает)

Page 9: мониторинг производительности Web приложений на python
Page 10: мониторинг производительности Web приложений на python

ЧТО Я ПОЧУВСТВОВАЛ КОГДА СОБРАЛ ВСЕ ЭТО ВМЕСТЕ ;)

Page 11: мониторинг производительности Web приложений на python

Что такое “гистограмма распределения”1) t = time.time()

timer = time.time()-t # время ms

2)отправляем таймер на “сервер статистики” (с названием и с тегами)

3)Один раз за период (1 минута) аггрегируем ЧАСТОТУ срабатывания таймера (сколько раз было) по ПЕРИОДУ (1 минута), по “категориям значений” (<0.1s, 0.1-0.2s, 0.2-0.5s, 0.5s-1s, >1s)

4)строим график

Page 12: мониторинг производительности Web приложений на python

Хорошая производительность ;)

Page 13: мониторинг производительности Web приложений на python

Плохая производительность ;)

Page 14: мониторинг производительности Web приложений на python
Page 15: мониторинг производительности Web приложений на python

Провокационное мнение

На самом деле этих трех графиков ДОСТАТОЧНО ;)

для понимания где “тормоза” в проекте

в котором от 1 до 10 серверов

Page 16: мониторинг производительности Web приложений на python
Page 17: мониторинг производительности Web приложений на python
Page 18: мониторинг производительности Web приложений на python

Метрики PYNBA в python коде cyclone - монитор

https://gist.github.com/Slach/00c86b1341f738bc9dd5

Класс мониторинга реализован в виде MixIn, который подмешивается во все классы контроллеров

Перед началом обработки запроса Mixin создает экземпляр кастомного класса наследуемого от pynba.ScriptMonitor

После завершения, получает статус ответа и размер отосланных данныхОтсылает protobuf по UDP на PINBA сервер

Page 19: мониторинг производительности Web приложений на python

Метрики PYNBA в python коде cyclone - контроллерclass SetProfileHandler(CustomPynbaMonitoringMixin, cyclone.web.RequestHandler): @defer.inlineCallbacks def post(self): with self.pynba.timer(state='parse_request'): parsed_request = service.unpack_request(self.request)... with self.pynba.timer(state='save_profile_data'): yield profile.save_to_keyvalue(profile_data)

Page 20: мониторинг производительности Web приложений на python

Метрики PYNBA в python коде - flask - монитор

https://gist.github.com/Slach/0cfdcc99711869d1764e

Добавляется старт pynba.utils.ScriptMonitor в функции с декораторами @app.before_first_request, @app.before_request

И отсылка UDP protobuf пакета в фукнции с декораторами@app.after_request, @app.teardown_request

Page 21: мониторинг производительности Web приложений на python

Метрики PYNBA в python коде - flask - контроллер

@app.route('/test_action/', methods=['POST'])

def test_action():

with app.pynba.timer(state='flask_timer_global'): # do something with database

data = {'var': 'All OK'}

status = 200

# вложенный таймер

with app.pynba.timer(state ='flask_generate_response'): resp_string = app.render(data, 'template.html')

response = flask.Response(response=resp_string, status=status, mimetype='text/html')

return response

Page 22: мониторинг производительности Web приложений на python

Недостатки pynba + pinba

В cyclone код асинхронный, значит в python процессе одновременно существует несколько RequestHandler и соответсвенно необходимо оборачивать “библиотечный” код в контект сразу в коде контоллера, либо пробрасывать self.pynba через параметры внутрь библиотечного кода

Сложно анализировать ситуацию если есть вложенные куски кода, которые нужно померить отдельными таймерами

Page 23: мониторинг производительности Web приложений на python

Как поставить pinba1.1 + mysql5.6 в Ubuntu

Рецепт на fabric

https://gist.github.com/Slach/d61acbd153ea6d3e6c2b

Page 24: мониторинг производительности Web приложений на python

Метрики statsd в python

pip install dogstatsd-python

import statsd

self.statsd = statsd.DogStatsd()

t = time.time()# do something …

self.statsd.histogram(‘metric_name’,time.time() - t, tags={‘script’:self.request.uri’})

Page 25: мониторинг производительности Web приложений на python

Недостатки statsd + python

● 1 метрика = 1 UDP пакет (можно отложить через pipeline)

● Нет нормальной python реализации histogram через декораторы и контексты в pystatd (надо дописать ;)

● Нет глобального понятия “request” (надо делать замер глобальной метрики), brubek реализация сервера не поддерживает теги, надо включать их в название метрики

Page 26: мониторинг производительности Web приложений на python

Дополнительные замечания

● При оценке времени не смотрите в МИНИМУМ (в идеале он должен стремиться к нулю ;) или в СРЕДНЕЕ

● Смотрите «распределение по гистограмме»● мы используем 0.2, 0.5, 1.0, 2.0 sec для СКРИПТОВ ● и 0.1, 0.2, 0.5, 1.0s для ТЕГОВ● Для оценки качественных изменений, лучше смотреть перцентили (50%

и 90%)● Снижение количества обращений к серверу может такой же хорошей

оптимизацией как и уменьшение времени работы отдельного URL

Page 27: мониторинг производительности Web приложений на python

[email protected]: blooodjazman

http://github.com/Slachhttp://bitbucket.com/bloodjazman

Задавайте вопросы ;)