Newrelic导致在每个请求上生成更新的etags

时间:2013-08-26 21:36:31

标签: ruby-on-rails rack middleware newrelic etag

由于newrelic注入的javascript会因每次请求而发生变化,因此页面内容会发生变化,从而迫使每次都生成新的etag。

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

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

2 个答案:

答案 0 :(得分:9)

我为New Relic工作。

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

NewRelic::Rack::BrowserMonitoring中间件注入响应的JavaScript代码是动态的原因是它包含响应在服务器端生成多长时间的时间,以及(如果适用)排队多长时间在到达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与我们联系。

答案 1 :(得分: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"

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