Есть ли версия 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-ую процентиль, среднюю, максимальную, графические способности и т.д. и в основном имеет большинство типов счетчиков, которые вам нужны.