是否有基于JVM的度量库的python版本

时间:2012-12-31 14:25:56

标签: python performance performancecounter metrics

我正在寻找python中的性能指标库。

我很熟悉Coda Hale的metrics,它是为JVM编写的,所以我想知道是否有一个等效的python(并且没有使用JVM)。

简而言之,该工具的要求清单如下:

  • 在执行时计算不同类型的指标。计数器,仪表,仪表,计时器,直方图等。有一个很好的清单here
  • 允许通过HTTP API轻松访问运行时数据。 (我可以自己包装HTTP层,但如果它已经在它中加了一个加号)
  • 特别是石墨插件或其他插件。 CopperEgg会很好。或NewRelic。
  • 在常见库中支持检测,例如memcached。

到目前为止,我发现PyCounters完成了部分工作,但并非全部工作。它有点满足我的第一个子弹(但它没有所有的度量类型,只有三个),这就是全部。

PyCounters是否有更好的替代方案?

由于

3 个答案:

答案 0 :(得分:6)

我遇到了这个库,它是python的CodaHale指标的一个端口。

有一些东西不见了,即记者,但它做了大多数其他事情。

https://github.com/omergertel/pyformance/

无耻的插件,这是我的叉子,它添加了一个托管的石墨记者。将记者添加到其他系统应该是微不足道的。

https://github.com/usmanismail/pyformance

答案 1 :(得分: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

我还为从DB读取的函数和写入数据库的函数添加了一个装饰器,这样我就可以获得代码花在等待读取数据或写入数据上的时间以及我调用的次数的图表“读取”操作和“写入”操作。

所以,总而言之,我有以下装饰器: - @func_runtime - 测量函数的运行时间 - @func_dbread - 放置执行读取的函数。增加database.reads计数器以及将时序数据发送到read_timing - @func_dbwrite - 与@func_dbread相同,但是对于写入 - @func dbruntime - 用于测量DB特定函数的运行时间以及所有DB函数的调用次数和总时序

您可以组合装饰器,它们以最接近函数的顺序运行,例如:

@func_dbruntime
@func_dbread
def some_db_read_function(a, b, c,d):
    pass

因此,@ func_dbread在@func_dbruntime之前运行。

总而言之,它易于定制且非常强大,您可以扩展它以支持第三方服务,并添加代码以在相关时动态打开和关闭这些计数器。据我所知,性能损失最小化。

只是关于向CopperEgg和其他服务等地发送数据的通知,StatsD使用UDP,因为它的统计数据可能会丢失一些数据并仍然获得有意义的见解,并且不会阻止任何内容。如果您想将数据发送到像CopperEgg这样的第三方网站,我会考虑将数据发送到本地队列,然后使用不同的流程将其推送到CopperEgg,只是为了解决您自己的第三方服务问题。

就个人而言,对于这些数据,StatsD非常棒,而且石墨为您提供了所需的所有东西,包括90%,平均值,最大值,图形能力等,并且基本上具有您需要的大多数计数器类型。

答案 2 :(得分:3)

没有机会尝试一下,但几天前我遇到过这个: https://github.com/Cue/scales

比例 - Python的指标 跟踪服务器状态和统计信息,以便您查看服务器正在执行的操作。它还可以将指标发送到Graphite进行图形化或发送到崩溃取证的文件。

scale的灵感来自梦幻般的度量库,尽管它绝不是一个端口。