2

由于 newrelic 注入的 javascript 在每次请求时都会发生变化,因此页面的内容会发生变化,从而每次都强制生成一个新的 etag。

我知道 Rack::Etag 中间件需要在 newrelic 中间件之前,但我就是找不到 newrelic 中间件。根据 newrelic_rpm 的文档,它说对于 rails,gem 将包含中间件,但是在运行 rake 中间件时,我没有看到任何 newrelic 中间件。

我可以自己添加中间件,但有更好的方法吗?

4

2 回答 2

9

我为 New Relic 工作。

New Relic 的中间件在运行时没有出现的原因rake middleware是它们被有条件地插入到中间件堆栈中。仅当代理配置为在当前环境中运行时才会插入这些中间件。您可以在运行时强制插入 New Relic 的中间件,以便通过在启动 rake 任务时在命令行上rake middleware设置来检查中间件堆栈。NEW_RELIC_AGENT_ENABLED=true

添加以下代码config/application.rb应确保 Rack::ETag 中间件在浏览器监控中间件注入其动态内容之前有机会计算并注入 ETag:

 config.after_initialize do
      config.middleware.delete "Rack::ETag"
      config.middleware.insert_after "NewRelic::Rack::BrowserMonitoring", "Rack::ETag"
    end

中间件注入响应的 JavaScript 代码NewRelic::Rack::BrowserMonitoring是动态的原因是它包含响应在服务器端生成所需的时间,以及(如果适用)在到达 Rails 堆栈之前排队的时间。这些时间将随每个传入的请求而变化。如果在插入动态信息之前基于散列页面内容生成 ETag,则在从缓存中提供响应时可能会使用过时的服务器端计时。您可以在此处阅读有关 New Relic 如何处理此问题的详细信息:https ://newrelic.com/docs/features/how-does-real-user-monitoring-work#cached-pages

这也是正确订购中间件的一个很好的概述:http: //verboselogging.com/2010/01/20/proper-rack-middleware-ordering

如果您需要更深入的帮助,请发送电子邮件至 support@newrelic.com 与我们联系

于 2013-08-27T23:38:26.187 回答
3

另外的选择:

  1. 在 newrelic.yml 文件中设置browser_monitoring.auto_instrument: false禁用 BrowserMonitoring 中间件的自动插入
  2. 将以下代码添加到 config/application.rb:

    config.middleware.delete "Rack::ETag"

    require 'new_relic/rack/browser_monitoring'

    config.middleware.use NewRelic::Rack::BrowserMonitoring

    config.middleware.use "Rack::ETag"

这将删除 ETag 中间件,附加 BrowserMonitoring 中间件,然后再次附加 ETag 中间件,以便它在 BrowserMonitoring 注入其动态负载之前运行。

于 2014-01-02T20:05:05.037 回答