Есть ли версия python для библиотеки метрик на основе JVM
Я ищу библиотеку показателей производительности в python.
Я знаком с metrics от Coda Hale, который написан для JVM, и поэтому я задаюсь вопросом, существует ли эквивалент python для что (и которое не использует JVM).
Короче говоря, список требований к инструменту будет следующим:
- Подсчитывать разные типы показателей во время выполнения. Счетчики, измерители, счетчики, таймеры, гистограммы и т.д. Там есть хороший список здесь
- Разрешить легкий доступ к данным во время выполнения через HTTP API. (Я могу обернуть слой HTTP сам, но если он уже запек в нем плюс)
- Плагины для графита в частности или другие. CopperEgg было бы неплохо. Или NewRelic.
- Запекается в инструментальной поддержке общих библиотек, таких как memcached.
До сих пор я нашел PyCounters, который выполняет некоторую работу, но не все. Это похоже на мою первую пулю (но у нее нет всех типов метрик, всего три) и все.
Есть ли лучшая альтернатива PyCounters?
Спасибо
Ответы
Ответ 1
У меня не было возможности попробовать, но я наткнулся на это несколько дней назад:
https://github.com/Cue/scales
шкалы - метрики для Python
Отслеживает состояние сервера и статистику, позволяя вам видеть, что делает ваш сервер. Он также может отправлять метрику Graphite для графического отображения или в файл для криминализации.
весы вдохновлены фантастической библиотекой показателей, хотя это никоим образом не порт.
Ответ 2
Я столкнулся с этой библиотекой, которая представляет собой порт метрик CodaHale для python.
Есть некоторые вещи, отсутствующие, т.е. журналисты, но он делает большинство других вещей.
https://github.com/omergertel/pyformance/
Бесстыдный штепсель, вот моя вилка, которая добавляет размещенного репортера графита. Должно быть тривиально добавлять репортеров в другие системы.
https://github.com/usmanismail/pyformance
Ответ 3
Я не знаю о чем-то, что делает именно это, но я кое-что написал для проекта, который делает это, просто добавляя декораторов к соответствующим функциям.
Я создал набор декораторов для измерения времени выполнения функций, измерения времени для функций доступа к БД и т.д.
Примером такого декоратора является:
def func_runtime(method):
@functools.wraps(method)
def wrapper(self, *args, **kwargs):
start_time = datetime.datetime.utcnow()
try:
class_name = type(self).__name__
method_name = method.__name__
return method(self, *args, **kwargs)
finally:
end_time = datetime.datetime.utcnow() - start_time
time_taken_ms = end_time.microseconds / 1000
if _statsd:
# Send the data to statsD, but you can do that for CopperEgg or anything else
self.stats.timing("func.runtime.%s.%s" % (class_name, method_name), time_taken_ms)
Позже вы будете использовать его следующим образом:
@func_runtime
def myfunc(a, b, c):
pass
Я также добавил декоратор для функций, которые читают из БД, и функций, которые записываются в БД, поэтому я могу получить графики того, сколько времени потрачено на ожидающий считывание данных или запись данных, а также количество раз, которое я вызывал "читать" операции и "писать".
Итак, в целом у меня были следующие декораторы:
- @func_runtime - для измерения времени выполнения функции
- @func_dbread - места для функций, которые выполняют чтение. Увеличивает счетчик database.reads, а также отправляет данные синхронизации в read_timing
- @func_dbwrite - то же, что и @func_dbread, но для записи
- @func dbruntime - используется для измерения времени выполнения конкретных функций БД, а также количества вызовов и общего времени всех функций БД.
Вы можете комбинировать декораторы, и они запускаются в порядке, ближайшем к функции, например:
@func_dbruntime
@func_dbread
def some_db_read_function(a, b, c,d):
pass
Итак, @func_dbread работает до @func_dbruntime.
В целом, он легко настраивается и ОЧЕНЬ мощный, и вы можете расширить его для поддержки сторонних сервисов, а также добавить код для динамического включения и выключения этих счетчиков, когда это необходимо. Насколько я могу судить, в лучшем случае штраф за исполнение был минимальным.
Простое уведомление о отправке данных в такие места, как CopperEgg и другие сервисы, StatD использует UDP, и поскольку его статистика позволяет потерять некоторые данные и по-прежнему получать осмысленные идеи, и это ничего не будет блокировать. Если вы хотите отправить данные на сторонние сайты, такие как CopperEgg, я бы рассмотрел отправку данных в локальную очередь, а затем нажав на другой процесс на CopperEgg, чтобы отделить сторонние сервисы от ваших собственных.
Лично для таких данных StatD велик, и графит дает вам все необходимое, включая 90-ую процентиль, среднюю, максимальную, графические способности и т.д. и в основном имеет большинство типов счетчиков, которые вам нужны.