由于 newrelic 注入的 javascript 在每次请求时都会发生变化,因此页面的内容会发生变化,从而每次都强制生成一个新的 etag。
我知道 Rack::Etag 中间件需要在 newrelic 中间件之前,但我就是找不到 newrelic 中间件。根据 newrelic_rpm 的文档,它说对于 rails,gem 将包含中间件,但是在运行 rake 中间件时,我没有看到任何 newrelic 中间件。
我可以自己添加中间件,但有更好的方法吗?
由于 newrelic 注入的 javascript 在每次请求时都会发生变化,因此页面的内容会发生变化,从而每次都强制生成一个新的 etag。
我知道 Rack::Etag 中间件需要在 newrelic 中间件之前,但我就是找不到 newrelic 中间件。根据 newrelic_rpm 的文档,它说对于 rails,gem 将包含中间件,但是在运行 rake 中间件时,我没有看到任何 newrelic 中间件。
我可以自己添加中间件,但有更好的方法吗?
我为 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 与我们联系
另外的选择:
browser_monitoring.auto_instrument: false
禁用 BrowserMonitoring 中间件的自动插入将以下代码添加到 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 注入其动态负载之前运行。