Class: ScoutApm::Instruments::MiddlewareSummary::MiddlewareSummaryWrapper

Inherits:
Object
  • Object
show all
Defined in:
lib/scout_apm/instruments/middleware_summary.rb

Instance Method Summary collapse

Constructor Details

#initialize(app) ⇒ MiddlewareSummaryWrapper

Returns a new instance of MiddlewareSummaryWrapper.



50
51
52
# File 'lib/scout_apm/instruments/middleware_summary.rb', line 50

def initialize(app)
  @app = app
end

Dynamic Method Handling

This class handles dynamic methods through the method_missing method

#method_missing(sym, *arguments, &block) ⇒ Object

Some code (found in resque_web initially) attempts to call methods directly on ‘MyApplication.app`, which is the middleware stack. If it hits our middleware instead of the object at the root of the app that it expected, then a method it expects will not be there, and an error thrown.

Specifically, resque_web assumes ‘ResqueWeb::Engine.app.url_helpers` is a method call on rails router for its own Engine, when in fact, we’ve added a middleware before it.

So method_missing just proxies anything to the nested @app object

While method_missing is not very performant, this is only here to handle edge-cases in other code, and should not be regularly called



77
78
79
80
81
82
83
# File 'lib/scout_apm/instruments/middleware_summary.rb', line 77

def method_missing(sym, *arguments, &block)
  if @app.respond_to?(sym)
    @app.send(sym, *arguments, &block)
  else
    super
  end
end

Instance Method Details

#call(env) ⇒ Object



54
55
56
57
58
59
60
61
# File 'lib/scout_apm/instruments/middleware_summary.rb', line 54

def call(env)
  req = ScoutApm::RequestManager.lookup
  layer = ScoutApm::Layer.new("Middleware", "Summary")
  req.start_layer(layer)
  @app.call(env)
ensure
  req.stop_layer
end

#respond_to?(sym, include_private = false) ⇒ Boolean

Returns:

  • (Boolean)


85
86
87
88
89
90
91
# File 'lib/scout_apm/instruments/middleware_summary.rb', line 85

def respond_to?(sym, include_private = false)
  if @app.respond_to?(sym, include_private)
    true
  else
    super
  end
end