NewRelic::Rack 中间件未公开 Sinatra::Base 设置

NewRelic::Rack middleware not exposing Sinatra::Base settings

我有一个模块化的 Sinatra 应用程序,我在其中使用

run Rack::URLMap

添加各种服务,其中每个服务是一个Sinatra::Base

我在其中一个使用 settings 方法的服务中添加了一个中间件。 NewRelic 机架中间件似乎没有公开此方法。

class MyService < Sinatra::Base
  configure do
    set :optional_auth, [
      { method: :get, path: ''},
      { method: :get, path: '/:id'},
      { method: :get, path: '/:id/attachments'},
      { method: :get, path: '/:id/comments'}
    ]
    mime_type :json, 'application/json'
    use Rack::PostBodyContentTypeParser
    use MyMiddleware
  end

  get '/' ....

在本地,一切正常,但是,部署时,似乎在 NewRelic::Rack 之后添加了 MyMiddleware,因此当调用中间件时,@app 不再是 MyService,它是 NewRelic::Rack 没有公开的 settings 方法。

有没有其他人遇到过这种情况?我是 运行 bundle exec puma

的应用程序

我可以通过更新我的中间件来解决这个问题

    def initialize app, &block
      @app = app
      @block = block
    end

    def call env
      @block.call(env)
      do_something(env[:my_middleware_option])
      ...
      @app.call(env)
    end

并使用

初始化我的中间件
    use MyMiddleware do |env|
      env[:my_middleware_option] = "any data type"
    end