在Dotcloud上设置NewRelic环境(Python)

时间:2012-11-18 19:18:40

标签: python dotcloud newrelic

我有一个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设置为“test”,实时应用程序设置为“production”

然后我在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代理。

所以我的问题是:

有没有办法初始化新的环境?

2 个答案:

答案 0 :(得分:1)

除非他们做了一些奇怪的事情,否则你应该能够覆盖代理配置文件提供的app_name:

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

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

这仅在app_name列出单个应用程序以向其报告数据时才有效。

答案 1 :(得分: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 env cli命令
  3.   

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

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

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

    dotcloud.yml

    如果我们想要一次更新一次,我们会执行以下操作。

    $ dotcloud env set NEW_RELIC_APP_NAME='Test Application Name'
    

    要确保正确设置了env变量,可以运行以下命令。

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

    备注

    • 上面的命令正在使用新的dotCloud 0.9.x CLI,如果您使用的是旧版本,则需要升级到新版本,或者参考旧CLI http://docs.dotcloud.com/0.4/guides/environment/的文档。
    • 当您设置环境变量时,它将重新启动您的应用程序,以便它可以安装变量,从而限制您的停机时间,在一个命令中设置所有这些。