我正在寻找python中的性能指标库。
我很熟悉Coda Hale的metrics,它是为JVM编写的,所以我想知道是否有一个等效的python(并且没有使用JVM)。
简而言之,该工具的要求清单如下:
到目前为止,我发现PyCounters完成了部分工作,但并非全部工作。它有点满足我的第一个子弹(但它没有所有的度量类型,只有三个),这就是全部。
PyCounters是否有更好的替代方案?
由于
答案 0 :(得分:6)
我遇到了这个库,它是python的CodaHale指标的一个端口。
有一些东西不见了,即记者,但它做了大多数其他事情。
https://github.com/omergertel/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的灵感来自梦幻般的度量库,尽管它绝不是一个端口。