【问题标题】:Setting NewRelic environment on Dotcloud (Python)在 Dotcloud (Python) 上设置 NewRelic 环境
【发布时间】:2012-11-18 19:18:39
【问题描述】:

我有一个 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环境?

【问题讨论】:

    标签: python dotcloud newrelic


    【解决方案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 命令

    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/environment/
    • 当您设置环境变量时,它会重新启动您的应用程序以便安装这些变量,因此为了限制您的停机时间,请在一个命令中设置所有变量。

    【讨论】:

    • 谢谢肯。这将为我提供不同的应用程序名称(现在就足够了),但如果您希望能够设置其他 New Relic 特定配置(可能在测试中关闭浏览器监控或实时参数捕获),则需要不同的配置每个环境的文件。
    • @MarkUnsworth 除非我错了,否则我认为所有这些参数都可以从环境变量中设置。我认为您甚至可以通过 env 变量指定要使用的不同 ini 文件。但格雷厄姆·邓普顿最清楚。
    • 谢谢肯。我采取了为每个环境添加单独的 ini 文件的方法。能够基于 DotCloud 环境变量覆盖新的 relic 环境会很好,所以我们只需要维护 1 个配置文件。我会为此提出支持票。
    【解决方案2】:

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

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

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

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

    【讨论】:

    • 完美运行,谢谢。如果您需要使用 newrelic-admin runprogram ... 运行服务器并且无法动态设置环境变量,这也很棒。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-26
    • 2013-10-21
    • 2010-09-20
    相关资源
    最近更新 更多