12

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

我熟悉Coda Hale 的指标,它是为 JVM 编写的,所以我想知道是否有对应的 Python(并且不使用 JVM)。

简而言之,该工具的要求列表将是:

  • 在执行时计算不同类型的指标。计数器、仪表、仪表、计时器、直方图等。这里有一个很好的列表
  • 允许通过 HTTP API 轻松访问运行时数据。(我可以自己包装 HTTP 层,但如果它已经被烘烤,那就更好了)
  • 特别是石墨或其他插件。CopperEgg会很好。或新遗物。
  • 为常用库(例如 memcached)提供检测支持。

到目前为止,我发现PyCounters完成了一些工作,但不是全部。它有点满足我的第一个项目符号(但它没有所有的度量类型,只有三个),仅此而已。

PyCounters 有更好的替代品吗?

谢谢

4

3 回答 3

6

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

缺少一些东西,即记者,但它可以做大多数其他事情。

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

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

https://github.com/usmanismail/pyformance

于 2013-02-12T21:40:56.367 回答
3

我不知道有什么东西可以做到这一点,但我确实为一个项目写了一些东西,该项目通过简单地将装饰器添加到相关函数来实现这一点。

我创建了一组装饰器,用于测量函数的运行时间、测量 DB 访问函数的时间等。

这种装饰器的一个例子是:

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 - 用于测量 DB 特定函数的运行时间以及调用次数和总计时所有数据库功能

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

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

所以,@func_dbread 在@func_dbruntime 之前运行。

总而言之,它易于定制且非常强大,您可以将其扩展为支持 3rd 方服务以及添加代码以在相关时动态打开和关闭这些计数器。据我所知,性能损失充其量是最小的。

只是关于向 CopperEgg 和其他服务等地方发送数据的通知,StatsD 使用 UDP,由于它的统计数据,您可能会丢失一些数据,但仍然可以获得有意义的见解,它不会阻止任何事情。如果您想将数据发送到像 CopperEgg 这样的 3rd 方站点,我会考虑将数据发送到本地队列,然后使用不同的流程将其推送到 CopperEgg,以便将 3rd 方服务问题与您自己的问题解耦。

就个人而言,对于此类数据,StatsD 非常棒,graphite 为您提供了所有您需要的东西,包括 90th percentile、average、max、绘图能力等,并且基本上具有您需要的大多数计数器类型。

于 2013-01-01T09:45:52.333 回答
3

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

scales - Python 跟踪服务器状态和统计数据的度量标准,允许您查看服务器正在做什么。它还可以将指标发送到 Graphite 以进行绘图或发送到文件以进行崩溃取证。

scales 的灵感来自于奇妙的度量库,尽管它绝不是一个端口。

于 2013-01-01T13:11:15.733 回答