代码之家  ›  专栏  ›  技术社区  ›  dhakadamit

新遗迹导致在每个请求中生成新的etag

  •  2
  • dhakadamit  · 技术社区  · 11 年前

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

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

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

    2 回复  |  直到 11 年前
        1
  •  9
  •   Community CDub    11 年前

    我为新遗迹工作。

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

    将以下代码添加到 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

        2
  •  3
  •   lauradiane    11 年前

    另一种选择:

    1. 设置 browser_monitoring.auto_instrument: false 在newrelic.yml文件中禁用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中间件以使其在Browser Monitoring注入其动态负载之前运行。