跳转到主要内容

将Python代码的性能指标发送到Statsd

项目描述

perfmetrics

perfmetrics包提供了一种简单的方法,可以将软件性能指标添加到Python库和应用程序中。使用perfmetrics来找到生产应用程序中的真正瓶颈。

perfmetrics 包是 Etsy 的 Statsd 守护进程的客户端,而 Statsd 守护进程本身又是 Graphite(特别是 Carbon 守护进程)的客户端。因为 perfmetrics 包向 Statsd 发送 UDP 数据包,所以它不会给应用程序带来 I/O 延迟,CPU 负载也很小。它可以在线程(同步)或事件驱动(异步)软件中同等良好地工作。

完整文档托管在 https://perfmetrics.readthedocs.io

Latest release Supported Python versions CI Build Status Code Coverage Documentation Status

使用方法

使用 @metric@metricmethod 装饰器来包装应该向 Statsd 发送计时和调用统计信息的函数和方法。将装饰器添加到任何可能成为瓶颈的函数或方法中,包括库函数。

示例

from perfmetrics import metric
from perfmetrics import metricmethod

@metric
def myfunction():
    """Do something that might be expensive"""

class MyClass(object):
    @metricmethod
    def mymethod(self):
        """Do some other possibly expensive thing"""

接下来,告诉 perfmetrics 如何连接到 Statsd。(在此之前,装饰器没有任何效果。)理想情况下,您的应用程序应该在启动时从配置文件中读取 Statsd URI,或者您应该设置 STATSD_URI 环境变量。下面的示例使用硬编码的 URI

from perfmetrics import set_statsd_client
set_statsd_client('statsd://localhost:8125')

for i in xrange(1000):
    myfunction()
    MyClass().mymethod()

如果运行此代码,它将在端口 8125 上发送 2000 个 UDP 数据包。然而,除非您已经安装了 Graphite 和 Statsd,否则所有这些数据包都将被忽略并丢弃。丢弃是好事:您不希望您的生产应用程序因为性能监控系统停止或未正常工作而失败或变慢。

安装 Graphite 和 Statsd 来接收和绘制指标。一个很好的安装方法是 github 上的 graphite_buildout 示例,该示例在不具有 root 权限的情况下安装 Graphite 和 Statsd。

Pyramid 和 WSGI

如果您有一个 Pyramid 应用程序,您可以通过在配置中包含 perfmetrics 来为每个请求设置 statsd_uri

config = Configuration(...)
config.include('perfmetrics')

还添加一个 statsd_uri 设置,例如 statsd://localhost:8125。一旦配置,perfmetrics tween 将为每个请求的持续时间设置一个 Statsd 客户端。这对于您在一个 Python 解释器中运行多个应用程序并且希望每个应用程序有不同的 statsd_uri 特别有用。

对于 WSGI 应用程序也存在类似的功能。将应用程序添加到您的 Paste Deploy 管道中

[statsd]
use = egg:perfmetrics#statsd
statsd_uri = statsd://localhost:8125

[pipeline:main]
pipeline =
    statsd
    egg:myapp#myentrypoint

线程

虽然大多数程序从任何线程向单个全局 Statsd 服务器发送指标,但一些程序需要为每个线程使用不同的 Statsd 服务器。如果您只需要一个全局 Statsd 服务器,则在应用程序启动时使用 set_statsd_client 函数。如果您需要为每个线程使用不同的 Statsd 服务器,则在每个线程中使用 statsd_client_stack 对象。使用 pushpopclear 方法。

Graphite 小贴士

Graphite 将每个指标存储为具有多个分辨率的时序。sample graphite_buildout 存储 48 小时内的 10 秒分辨率、31 天内的 1 小时分辨率和 5 年内的 1 天分辨率。要从细粒度值生成粗粒度值,Graphite 将为每个时间间隔计算平均值(平均值)。

因为Graphite隐式计算平均值,所以在Graphite中将计数器视为“每秒点击次数”值是最合理的方式。这样,无论图表使用哪种分辨率级别,都能产生正确的结果。

然而,将计数器视为每秒点击次数也有不利的后果。如果某些指标在一秒内看到1000次点击峰值,然后至少9秒为0,那么该指标的Graphite图表将显示100次峰值,而不是1000次,因为Graphite每10秒接收一次指标,而峰值在Graphite看来像是10秒内的每秒100次点击。

如果您希望图表显示1000次点击而不是每秒100次点击,请使用Graphite hitcount() 函数,并使用10秒或更长的分辨率。hitcount函数将每秒值转换为近似原始点击次数。请确保提供足够大的分辨率值,以便在结果图表上至少表示一个像素宽度,否则Graphite将计算点击次数的平均值并产生令人困惑的图表。

通常,将Graphite中的空值视为零是有意义的,尽管这不是默认设置;默认情况下,Graphite对空值不进行绘制。您可以针对每个图表启用该选项。

变更

4.1.0 (2024-06-11)

  • 增加对Python 3.13的支持。

  • 停止对Python 3.7的支持。

  • 停止对Manylinux 2010 wheels的支持。

4.0.0 (2023-06-22)

  • 停止对过时的Python版本的支持,包括Python 2.7和3.6。

  • 增加对Python 3.12的支持。

3.3.0 (2022-09-25)

  • 停止意外构建具有不安全数学优化的manylinux wheels。

  • 增加对Python 3.11的支持。

注意:这将是最后一个支持旧版Python(如2.7和3.6)的主要版本。一些此类旧版本可能没有为该版本发布二进制wheels。

3.2.0.post0 (2021-09-28)

  • 为3.9和3.10添加Windows wheels。

3.2.0 (2021-09-28)

  • 增加对Python 3.10的支持。

  • 停止对Python 3.5的支持。

  • 添加aarch64二进制wheels。

3.1.0 (2021-02-04)

  • 增加对Python 3.8和3.9的支持。

  • 从Travis CI迁移到GitHub Actions。

  • 支持PyHamcrest 1.10及更高版本。见问题26

  • 用于测试的FakeStatsDClient现在始终为真,无论是否已看到任何观测值,就像正常客户端一样。见问题

  • 增加对StatsD集合的支持,这是唯一事件的计数器。见PR 30

3.0.0 (2019-09-03)

  • 停止对EOL Python 2.6、3.2、3.3和3.4的支持。

  • 增加对Python 3.5、3.6和3.7的支持。

  • 使用Cython编译性能敏感的部分,从而提高10-30%的速度。见https://github.com/zodb/perfmetrics/issues/17

  • 注意:指标名称必须强制为本地字符串(由于Cython编译的结果);它们始终必须只使用ASCII字符,但以前在Python 2中允许使用Unicode。通常在用作装饰器时自动如此。在Python 2中使用from __future__ import unicode_literals可以在手动构造Metric对象时引起问题(引发TypeError)。一种快速解决方案是在导入perfmetrics之前设置环境变量PERFMETRICS_PURE_PYTHON

  • 使装饰函数和方法在运行时而不是编译时可配置。见https://github.com/zodb/perfmetrics/issues/11

  • perfmetrics.testing中包含对使用perfmetrics进行配置的应用程序的测试支持。这之前作为nti.fakestatsd外部发布。见https://github.com/zodb/perfmetrics/issues/9

  • 当导入 perfmetrics 时读取环境变量 PERFMETRICS_DISABLE_DECORATOR,如果已设置,则使装饰器 @metric@metricmethod@Metric(...)@MetricMod(...) 返回未更改的函数。这有助于某些类型的内省测试。请参阅 https://github.com/zodb/perfmetrics/issues/15

2.0 (2013-12-10)

  • 添加了 @MetricMod 装饰器,可以更改给定上下文中的指标名称。例如,@MetricMod('xyz.%s') 添加了前缀。

  • 移除了“量表后缀”功能。这没有必要令人困惑。

  • @metric@metricmethod@Metric 生成的计时指标默认具有“ .t”后缀,以避免命名冲突。

1.0 (2012-10-09)

  • 添加了用于测量请求时间和计数的统计信息 'perfmetrics.tween' 和 'perfmetrics.wsgi'。

0.9.5 (2012-09-22)

  • 添加了可选的 Pyramid tween 和类似的 WSGI 过滤器应用程序,为每个请求设置 Statsd 客户端。

0.9.4 (2012-09-08)

  • 优化了降低采样率的使用。

0.9.3 (2012-09-08)

  • 支持环境变量 STATSD_URI

0.9.2 (2012-09-01)

  • Metric 现在可以用作装饰器或上下文管理器。

  • 将 StatsdClient 的签名修改得更像 James Socol 的 StatsClient。

0.9.1 (2012-09-01)

  • 修复了包元数据。

0.9 (2012-08-31)

  • 初始发布。

项目详情


下载文件

下载适用于您平台的应用程序。如果您不确定选择哪个,请了解更多关于 安装包 的信息。

源分发

perfmetrics-4.1.0.tar.gz (141.9 kB 查看散列)

上传时间

构建的分发

perfmetrics-4.1.0-cp313-cp313-musllinux_1_1_x86_64.whl (441.9 kB 查看散列)

上传时间 CPython 3.13 musllinux: musl 1.1+ x86-64

perfmetrics-4.1.0-cp313-cp313-musllinux_1_1_aarch64.whl (436.9 kB 查看散列)

上传时间 CPython 3.13 musllinux: musl 1.1+ ARM64

perfmetrics-4.1.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl (451.3 kB 查看散列)

上传时间 CPython 3.13 manylinux: glibc 2.17+ s390x

perfmetrics-4.1.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl (448.6 kB 查看散列)

上传于 CPython 3.13 manylinux: glibc 2.17+ ppc64le

perfmetrics-4.1.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (439.4 kB 查看哈希)

上传于 CPython 3.13 manylinux: glibc 2.17+ ARM64

perfmetrics-4.1.0-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (444.3 kB 查看哈希)

上传于 CPython 3.13 manylinux: glibc 2.17+ x86-64 manylinux: glibc 2.5+ x86-64

perfmetrics-4.1.0-cp313-cp313-macosx_10_9_universal2.whl (232.9 kB 查看哈希)

上传于 CPython 3.13 macOS 10.9+ universal2 (ARM64, x86-64)

perfmetrics-4.1.0-cp312-cp312-win_amd64.whl (177.7 kB 查看哈希)

上传于 CPython 3.12 Windows x86-64

perfmetrics-4.1.0-cp312-cp312-musllinux_1_1_x86_64.whl (448.0 kB 查看哈希)

上传于 CPython 3.12 musllinux: musl 1.1+ x86-64

perfmetrics-4.1.0-cp312-cp312-musllinux_1_1_aarch64.whl (443.0 kB 查看哈希)

上传于 CPython 3.12 musllinux: musl 1.1+ ARM64

perfmetrics-4.1.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl (454.3 kB 查看哈希)

上传于 CPython 3.12 manylinux: glibc 2.17+ s390x

perfmetrics-4.1.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl (451.7 kB 查看哈希)

上传于 CPython 3.12 manylinux: glibc 2.17+ ppc64le

perfmetrics-4.1.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (442.8 kB 查看哈希)

上传于 CPython 3.12 manylinux: glibc 2.17+ ARM64

perfmetrics-4.1.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (448.2 kB 查看哈希值)

上传时间: CPython 3.12 manylinux: glibc 2.17+ x86-64 manylinux: glibc 2.5+ x86-64

perfmetrics-4.1.0-cp312-cp312-macosx_10_9_universal2.whl (234.2 kB 查看哈希值)

上传时间: CPython 3.12 macOS 10.9+ universal2 (ARM64, x86-64)

perfmetrics-4.1.0-cp311-cp311-win_amd64.whl (176.7 kB 查看哈希值)

上传时间: CPython 3.11 Windows x86-64

perfmetrics-4.1.0-cp311-cp311-musllinux_1_1_x86_64.whl (437.7 kB 查看哈希值)

上传时间: CPython 3.11 musllinux: musl 1.1+ x86-64

perfmetrics-4.1.0-cp311-cp311-musllinux_1_1_aarch64.whl (436.1 kB 查看哈希值)

上传时间: CPython 3.11 musllinux: musl 1.1+ ARM64

perfmetrics-4.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (436.4 kB 查看哈希值)

上传时间: CPython 3.11 manylinux: glibc 2.17+ x86-64

perfmetrics-4.1.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl (447.7 kB 查看哈希值)

上传时间: CPython 3.11 manylinux: glibc 2.17+ s390x

perfmetrics-4.1.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl (452.2 kB 查看哈希值)

上传时间: CPython 3.11 manylinux: glibc 2.17+ ppc64le

perfmetrics-4.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (435.3 kB 查看哈希值)

上传时间: CPython 3.11 manylinux: glibc 2.17+ ARM64

perfmetrics-4.1.0-cp311-cp311-macosx_10_9_universal2.whl (232.1 kB 查看哈希值)

上传时间: CPython 3.11 macOS 10.9+ universal2 (ARM64, x86-64)

perfmetrics-4.1.0-cp310-cp310-win_amd64.whl (176.5 kB 查看哈希值)

上传时间 CPython 3.10 Windows x86-64

perfmetrics-4.1.0-cp310-cp310-musllinux_1_1_x86_64.whl (416.3 kB 查看哈希值)

上传时间 CPython 3.10 musllinux: musl 1.1+ x86-64

perfmetrics-4.1.0-cp310-cp310-musllinux_1_1_aarch64.whl (414.1 kB 查看哈希值)

上传时间 CPython 3.10 musllinux: musl 1.1+ ARM64

perfmetrics-4.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (409.4 kB 查看哈希值)

上传时间 CPython 3.10 manylinux: glibc 2.17+ x86-64

perfmetrics-4.1.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl (419.4 kB 查看哈希值)

上传时间 CPython 3.10 manylinux: glibc 2.17+ s390x

perfmetrics-4.1.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl (425.8 kB 查看哈希值)

上传时间 CPython 3.10 manylinux: glibc 2.17+ ppc64le

perfmetrics-4.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (406.8 kB 查看哈希值)

上传时间 CPython 3.10 manylinux: glibc 2.17+ ARM64

perfmetrics-4.1.0-cp310-cp310-macosx_10_9_universal2.whl (232.0 kB 查看哈希值)

上传时间 CPython 3.10 macOS 10.9+ universal2 (ARM64, x86-64)

perfmetrics-4.1.0-cp39-cp39-win_amd64.whl (176.2 kB 查看哈希值)

上传时间 CPython 3.9 Windows x86-64

perfmetrics-4.1.0-cp39-cp39-win32.whl (170.8 kB 查看哈希值)

上传于 CPython 3.9 Windows x86

perfmetrics-4.1.0-cp39-cp39-musllinux_1_1_x86_64.whl (416.5 kB 查看哈希值)

上传于 CPython 3.9 musllinux: musl 1.1+ x86-64

perfmetrics-4.1.0-cp39-cp39-musllinux_1_1_aarch64.whl (414.3 kB 查看哈希值)

上传于 CPython 3.9 musllinux: musl 1.1+ ARM64

perfmetrics-4.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (410.3 kB 查看哈希值)

上传于 CPython 3.9 manylinux: glibc 2.17+ x86-64

perfmetrics-4.1.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl (420.7 kB 查看哈希值)

上传于 CPython 3.9 manylinux: glibc 2.17+ s390x

perfmetrics-4.1.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl (427.3 kB 查看哈希值)

上传于 CPython 3.9 manylinux: glibc 2.17+ ppc64le

perfmetrics-4.1.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (407.6 kB 查看哈希值)

上传于 CPython 3.9 manylinux: glibc 2.17+ ARM64

perfmetrics-4.1.0-cp38-cp38-win_amd64.whl (176.3 kB 查看哈希值)

上传于 CPython 3.8 Windows x86-64

perfmetrics-4.1.0-cp38-cp38-win32.whl (170.8 kB 查看哈希值)

上传于 CPython 3.8 Windows x86

perfmetrics-4.1.0-cp38-cp38-musllinux_1_1_x86_64.whl (429.8 kB 查看哈希值)

上传于 CPython 3.8 musllinux: musl 1.1+ x86-64

perfmetrics-4.1.0-cp38-cp38-musllinux_1_1_aarch64.whl (428.0 kB 查看哈希值)

上传于 CPython 3.8 musllinux: musl 1.1+ ARM64

perfmetrics-4.1.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (416.1 kB 查看哈希值)

上传于 CPython 3.8 manylinux: glibc 2.17+ x86-64

perfmetrics-4.1.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl (427.5 kB 查看哈希值)

上传于 CPython 3.8 manylinux: glibc 2.17+ s390x

perfmetrics-4.1.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl (431.8 kB 查看哈希值)

上传于 CPython 3.8 manylinux: glibc 2.17+ ppc64le

perfmetrics-4.1.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (413.3 kB 查看哈希值)

上传于 CPython 3.8 manylinux: glibc 2.17+ ARM64

perfmetrics-4.1.0-cp37-cp37m-win_amd64.whl (175.9 kB 查看哈希值)

上传于 CPython 3.7m Windows x86-64

perfmetrics-4.1.0-cp37-cp37m-win32.whl (170.1 kB 查看哈希值)

上传于 CPython 3.7m Windows x86

支持者: