是否有一种生产安全的方法来测量使用 Python 在生产中花费的时间?

Posted

技术标签:

【中文标题】是否有一种生产安全的方法来测量使用 Python 在生产中花费的时间?【英文标题】:Is there a production-safe way to measure time spent in Production w/Python? 【发布时间】:2010-11-11 17:56:34 【问题描述】:

我希望能够检测 Python 应用程序以便我知道:

页面生成时间。 花费在外部请求(mysql、api 调用)上的时间百分比。 mysql 查询的数量,MySQL 查询的数量。

我想要这些来自生产的数据(不是离线分析)——因为在不同地方花费的时间在负载下会有所不同。

php 中,我可以使用 XHProf 或 instrumentation-for-php 来做到这一点。在 Ruby on Rails/.NET/Java 中,我可以使用 New Relic 做到这一点。

有没有推荐给 Python 或 django 这样的包?

【问题讨论】:

【参考方案1】:

是的,完全有可能。例如。在 URL 中使用一些魔法开关,例如“?profile-me”,它会触发 Django 中间件中的分析。

Internet 上有许多 sn-ps,例如:http://djangosnippets.org/snippets/70/ 或类似的模块:http://code.google.com/p/django-profiling/ - 但我没有使用过任何一个,所以我不能推荐任何东西。

无论如何,他们采用的方法与我所做的类似 - 即在包装您的视图的中间件中使用 Python Hotshot 分析器模块。对于 MySQL 部分,您可以使用 connection.queries form Django。

Hotshot 的好处是可以使用 Kcachegrind 浏览它的输出,如下所示:http://www.rkblog.rk.edu.pl/w/p/django-profiling-hotshot-and-kcachegrind/

【讨论】:

我跟随 django-profiling 到 django-logging 项目 - 不再维护 :( 我想要低影响日志 - 我想自动记录大部分请求 - 而不仅仅是我自己的带有 URL 开关的流量。 connection.queries 不会工作,除非 DEBUG = True,这不应该在生产环境中完成,因为它将每个查询(以及相关的计时/堆栈跟踪等)存储在内存中。【参考方案2】:

New Relic 现在有一个 Python 包,包括 Django 到 mod_wsgi。

https://support.newrelic.com/help/kb/python

【讨论】:

【参考方案3】:

django-prometheus 是处理生产工作负载的好选择,尤其是在 Kubernetes 这样的容器环境中。开箱即用,它具有用于跟踪请求延迟和计数(通过视图方法)以及数据库和缓存访问时间的中间件。对于跟踪实际执行的查询来说,这不是一个好的解决方案,但这就是像ELK 这样的日志记录解决方案将发挥作用的地方。如果有帮助,我已经写了一篇文章,其中介绍了 how to add custom metrics to a Django application。

【讨论】:

以上是关于是否有一种生产安全的方法来测量使用 Python 在生产中花费的时间?的主要内容,如果未能解决你的问题,请参考以下文章

是否有一种特定的方法来处理循环python中的错误

我如何测量python中对象的内存使用情况?

有一种方法可以分析 cad 模型文件(每个示例 .stl)以获取他的测量值?

在 Python 中,是不是有一种方便的方法来重载 C++ 中的方法? [复制]

是否有一种可移植的方式来获取 Python 中的当前用户名?

是否有一种标准化的方法可以在 Python 中交换两个变量?