【问题标题】:New Relic on AWS lambda not reading its config fileAWS lambda 上的新 Relic 未读取其配置文件
【发布时间】:2017-11-03 04:24:02
【问题描述】:

我正在使用 zappa 将 python/django wsgi 应用程序部署到 AWS API Gateway 和 Lambda。

我的环境中有所有这些:

    NEW_RELIC_CONFIG_FILE: /var/task/newrelic.ini
    NEW_RELIC_LICENSE_KEY: redacted
    NEW_RELIC_ENVIRONMENT: dev-zappa
    NEW_RELIC_STARTUP_DEBUG: "on"
    NEW_RELIC_ENABLED: "on"

我正在我的wsgi.py 中以documented 进行“手动代理启动”:

import newrelic.agent
# Will collect NEW_RELIC_CONFIG_FILE and NEW_RELIC_ENVIRONMENT from the environment
# Dear god why??!?!
# NB: Looks like this IS what makes it go
newrelic.agent.global_settings().enabled = True
newrelic.agent.initialize('/var/task/newrelic.ini', 'dev-zappa', log_file='stderr', log_level=logging.DEBBUG)

使用@newrelic.agent.wsgi_application,因为应该自动检测到 django

我添加了一个中间件来在 lambda 冻结之前关闭代理,但日志记录表明只有第一个请求被发送到 New Relic。如果没有关闭,我不会从 New Relic 代理获得任何日志记录,并且 APM 中也没有任何事件。

class NewRelicShutdownMiddleware(MiddlewareMixin):
    """Simple middleware that shutsdown the NR agent at the end of a request"""

    def process_request(self, request):
        pass
        # really wait for the agent to register with collector
        # Enabling this causes more log messages about starting data samplers, but only on the first request
        # newrelic.agent.register_application(timeout=10)

    def process_response(self, request, response):
        newrelic.agent.shutdown_agent(timeout=2.5)
        return response

    def process_exception(self, request, exception):
        pass
        newrelic.agent.shutdown_agent(timeout=2.5)

在我的newrelic.ini 中,我有以下内容,但是当我登录newrelic.agent.global_settings() 时,它包含默认的应用程序名称(确实在 APM 中创建)并且启用 = False,这导致了上面的一些 hack(环境变量,并在初始化之前编辑newrelic.agent.global_settings()

[newrelic:dev-zappa]                                                                                          
app_name = DEV APP zappa                                                                                      
monitor_mode = true                                                                                           

TL;DR - 两个问题:

  1. 如何让 New Relic 在不想读取它的 ini 文件时读取它?
  2. 如何让 New Relic 记录 AWS lambda 中所有请求的数据?

【问题讨论】:

  • 我的 newrelic-django-zappa 项目也有类似的问题
  • 您如何让 Lambda 使用您的内容创建 /var/task/newrelic.ini
  • @kichik 它在 zappa 上传的 zip 文件中。我已确认该文件存在于该路径中,并将内容读入日志。我已经确认在环境中填充了 NEW_RELIC_CONFIG_FILE 和 NEW_RELIC_ENVIRONMENT。看起来它们并没有像预期的那样被消耗。
  • 我之所以这么问,是因为我很难相信 Lambda 允许您将文件提取到根文件夹。您确定它相对于服务器上的源文件夹不存在吗?
  • 忽略我。我没有意识到 Lambda 一直在使用 /var/task

标签: python django aws-lambda newrelic


【解决方案1】:

Zappa 不使用您的 wsgi.py 文件(当前),因此不会发生挂钩。看看这个允许它的 PR:https://github.com/Miserlou/Zappa/pull/1251

【讨论】:

  • 我希望他们已经合并...我一直在等待 NR-Django-Zappa 集成工作...
  • @davesave 它适用于我的分支: pip install git+github.com/aarcro/zappa.git@master#egg=zappa 您需要稳定的流量才能将数据报告给 NR,这取决于您的 lambda 容器被冻结/解冻而不是实际上在每次请求时都会重新启动。
  • 我正在将跟踪加载到 New Relic,只需继续重新加载慢速页面几次/分钟一两分钟。
  • 我的问题中的中间件不需要让 NR 工作。事实上你不应该使用它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-15
  • 2017-04-25
  • 1970-01-01
相关资源
最近更新 更多