使用NewRelic测量Django命令持续时间

时间:2014-02-26 21:21:02

标签: django newrelic

我有一组Django命令执行一些复杂的操作,我想开始跟踪它们花费多长时间的持续时间,以便随着时间的推移监视它们的性能。

我一直在努力弄清楚如何使用newrelic来捕获持续时间。我已经尝试了从“假设”标准的django newrelic代理将神奇地捕获它,尝试将它们自己作为一个自定义事件,所有这些都取得了不同程度的成功。

这样做的最佳方式是什么,newrelic是否提供了一些方便呢?对于这种情况,文档非常缺乏。

另外,我认为这些是background_tasks - newrelic中的background_task字段用于什么?

由于

1 个答案:

答案 0 :(得分:1)

在New Relic,我们确实有一个原型,我们正在考虑对Python代理进行一些更改,这将增加对监控指定的Django管理命令的支持。我们仍在研究这些变化的一些细节,但它有可能在接下来的几个月内进入即将发布的版本之一。

在此期间,您可以做的是在代理配置文件中添加以下内容:

[newrelic:django-manage]
app_name = Python Application (Django Management Commands)
startup_timeout = 10.0

[background-task:django-manage-syncdb]
enabled = true
function = django.core.management.commands.syncdb:Command.handle_noargs
name = syncdb
group = Django

然后,您将运行Django manage.py脚本:

NEW_RELIC_CONFIG_FILE=newrelic.ini
NEW_RELIC_ENVIRONMENT=django-manage

export NEW_RELIC_CONFIG_FILE
export NEW_RELIC_ENVIRONMENT

newrelic-admin run-python manage.py syncdb

当数据报告到我们的用户界面时,它会出现在'Type - >下其他交易 - > Django'在指定应用程序的“事务”选项卡中。

enter image description here

'newrelic:django-manage'部分是一个环境部分,允许您覆盖“app_name”设置,该设置定义应在UI中向哪个应用程序报告数据。 'NEW_RELIC_ENVIRONMENT'变量表示环境部分应该用作默认'newrelic'部分的覆盖。

即使你没有覆盖'app_name'并让它继承默认'newrelic'部分的值,你仍然必须设置'startup_timeout'设置。这是必要的,因为在正常情况下,当Web应用程序处理第一个Web请求时,代理只会在后台懒惰地注册自己。在将Django管理命令作为后台任务进行跟踪时,懒惰地进行注册会导致问题。这是因为只有一个函数调用被监视,而不等待代理注册发生将导致没有捕获数据。因此,为启动超时设置非零值表示等待注册发生。

如果由于某种原因代理注册时间过长,超时将在指定时间后过期,并且管理命令仍然允许继续。无论哪种方式,等待的需要意味着实际启动管理命令会有延迟。如果管理命令需要尽快运行,应该牢记这一点。

如果必要的话,如果代理捕获的数据上传时间一直超过默认的2.5秒,也可以指定'shutdown_timeout',因此并不总是报告。

对于“后台任务”部分,它定义了应监视并报告为后台任务的特定功能。在这种情况下,我们的目标是实现Django'yncdb'命令的特定函数。