0

我有一个 Python 应用程序,它使用 dotcloud.yml 文件中的新 New Relic 配置变量设置,效果很好。

但是,我想将沙盒实例作为测试/暂存环境运行,因此我希望能够设置 newrelic 代理的环境,以便它使用 ini 配置的不同配置部分。我的 dotcloud.yml 设置如下:

www:
    type: python
    config:
        python_version: 'v2.7'
        enable_newrelic: True
    environment:
        NEW_RELIC_LICENSE_KEY: *****************************************
        NEW_RELIC_APP_NAME: Application Name
        NEW_RELIC_LOG: /var/log/supervisor/newrelic.log
        NEW_RELIC_LOG_LEVEL: info
        NEW_RELIC_CONFIG_FILE: /home/dotcloud/current/newrelic.ini 

我有自定义环境变量,因此 sanbox 设置为“测试”,实时应用程序设置为“生产”

然后我在我的 uswsgi.py 中调用以下内容

NEWRELIC_CONFIG = os.environ.get('NEW_RELIC_CONFIG_FILE')
ENVIRONMENT = os.environ.get('MY_ENVIRONMENT', 'test')

newrelic.agent.initialize(NEWRELIC_CONFIG, ENVIRONMENT)

但是,dotcloud 实例已经启用了 newrelic,因为我在 uwsgi.log 文件中得到了这个:

Sun Nov 18 18:50:12 2012 - unable to load app 0 (mountpoint='') (callable not found or import error)
Traceback (most recent call last):
  File "/home/dotcloud/current/wsgi.py", line 15, in <module>
    newrelic.agent.initialize(NEWRELIC_CONFIG, ENVIRONMENT)
  File "/opt/ve/2.7/local/lib/python2.7/site-packages/newrelic-1.8.0.13/newrelic/config.py", line 1414, in initialize
    log_file, log_level)
  File "/opt/ve/2.7/local/lib/python2.7/site-packages/newrelic-1.8.0.13/newrelic/config.py", line 340, in _load_configuration
    'environment "%s".' % (_config_file, _environment))
newrelic.api.exceptions.ConfigurationError: Configuration has already been done against differing configuration file or environment. Prior configuration file used was "/home/dotcloud/current/newrelic.ini" and environment "None".

因此,似乎在调用 uwsgi.py 之前正在初始化 newrelic 代理。

所以我的问题是:

有没有办法初始化 newrelic 环境?

4

2 回答 2

1

除非他们做一些奇怪的事情,否则您应该能够通过执行以下操作覆盖代理配置文件提供的 app_name:

import newrelic.agent
newrelic.agent.global_settings().app_name = 'Test Application Name'

不要第二次调用 newrelic.agent.initialize() 。

仅当 app_name 列出要向其报告数据的单个应用程序时,这才有效。

于 2012-11-18T21:36:40.590 回答
1

在不更改任何代码的情况下,最简单的方法是执行以下操作。

在 dotCloud 上创建一个新的沙盒应用程序(有关在沙盒模式下创建应用程序的更多信息,请参阅http://docs.dotcloud.com/0.9/guides/flavors/ )

$ dotcloud create -f sandbox  <app_name>

将您的代码部署到新的沙盒应用程序。

$ dotcloud push

现在,您应该在实时应用程序和沙盒应用程序中运行相同的代码。但是因为您想更改沙盒应用程序的一些 ENV 变量,所以您需要多做一步。

根据此页面http://docs.dotcloud.com/0.9/guides/environment/#adding-environment-variables有两种不同的方式添加 ENV 变量。

  1. 使用dotcloud.yml' 环境部分。
  2. 使用dotcloud envcli 命令

dotcloud.yml 允许您为每个服务定义不同的环境变量,而 dotcloud env 为整个应用程序设置环境变量。此外,使用 dotcloud env 设置的环境变量取代了 dotcloud.yml 中定义的环境变量。

这意味着如果我们想为我们的沙盒应用程序设置不同的值,我们只需要运行一个dotcloud env命令来在沙盒应用程序上设置这些变量,这将覆盖您的dotcloud.yml

如果我们只想更改变量,我们将运行此命令。

$ dotcloud env set NEW_RELIC_APP_NAME='Test Application Name'

如果我们想一次更新一个以上,我们将执行以下操作。

$ dotcloud env set \
'NEW_RELIC_APP_NAME="Test Application Name"' \
'NEW_RELIC_LOG_LEVEL=debug'

为确保您的环境变量设置正确,您可以运行以下命令。

$ dotcloud env list

笔记

  • 上面的命令使用的是新的 dotCloud 0.9.x CLI,如果你使用的是旧的,你需要升级到新的,或者参考旧 CLI 的文档http://docs.dotcloud。 com/0.4/guides/环境/
  • 当您设置环境变量时,它将重新启动您的应用程序以便它可以安装变量,因此为了限制您的停机时间,请在一个命令中设置所有这些变量。
于 2012-11-19T13:57:07.083 回答