module NewRelic::Agent::Instrumentation::RackHelpers

Attributes

_nr_deferred_detection_ran[RW]

Public Class Methods

check_for_late_instrumentation(app) click to toggle source
# File lib/new_relic/agent/instrumentation/rack.rb, line 80
def self.check_for_late_instrumentation(app)
  return if @checked_for_late_instrumentation
  @checked_for_late_instrumentation = true
  if middleware_instrumentation_enabled?
    if ::NewRelic::Agent::Instrumentation::MiddlewareProxy.needs_wrapping?(app)
      ::NewRelic::Agent.logger.info("We weren't able to instrument all of your Rack middlewares.",
                                    "To correct this, ensure you 'require \"newrelic_rpm\"' before setting up your middleware stack.")
    end
  end
end
instrument_builder(builder_class) click to toggle source
# File lib/new_relic/agent/instrumentation/rack.rb, line 91
def self.instrument_builder builder_class
  ::NewRelic::Agent.logger.info "Installing deferred #{builder_class} instrumentation"

  builder_class.class_eval do
    class << self
      attr_accessor :_nr_deferred_detection_ran
    end
    self._nr_deferred_detection_ran = false

    include ::NewRelic::Agent::Instrumentation::RackBuilder

    alias_method :to_app_without_newrelic, :to_app
    alias_method :to_app, :to_app_with_newrelic_deferred_dependency_detection

    if ::NewRelic::Agent::Instrumentation::RackHelpers.middleware_instrumentation_enabled?
      ::NewRelic::Agent.logger.info "Installing #{builder_class} middleware instrumentation"
      alias_method :run_without_newrelic, :run
      alias_method :run, :run_with_newrelic

      alias_method :use_without_newrelic, :use
      alias_method :use, :use_with_newrelic
    end
  end

  def self.instrument_url_map url_map_class
    url_map_class.class_eval do
      alias_method :initialize_without_newrelic, :initialize

      def initialize(map = {})
        traced_map = ::NewRelic::Agent::Instrumentation::RackURLMap.generate_traced_map(map)
        initialize_without_newrelic(traced_map)
      end
    end
  end
end
instrument_url_map(url_map_class) click to toggle source
# File lib/new_relic/agent/instrumentation/rack.rb, line 115
def self.instrument_url_map url_map_class
  url_map_class.class_eval do
    alias_method :initialize_without_newrelic, :initialize

    def initialize(map = {})
      traced_map = ::NewRelic::Agent::Instrumentation::RackURLMap.generate_traced_map(map)
      initialize_without_newrelic(traced_map)
    end
  end
end
middleware_instrumentation_enabled?() click to toggle source
# File lib/new_relic/agent/instrumentation/rack.rb, line 76
def self.middleware_instrumentation_enabled?
  version_supported? && !::NewRelic::Agent.config[:disable_middleware_instrumentation]
end
new(map = {}) click to toggle source
# File lib/new_relic/agent/instrumentation/rack.rb, line 119
def initialize(map = {})
  traced_map = ::NewRelic::Agent::Instrumentation::RackURLMap.generate_traced_map(map)
  initialize_without_newrelic(traced_map)
end
puma_rack_version_supported?() click to toggle source
# File lib/new_relic/agent/instrumentation/rack.rb, line 68
def self.puma_rack_version_supported?
  return false unless defined? ::Puma::Const::PUMA_VERSION

  version = ::NewRelic::VersionNumber.new(::Puma::Const::PUMA_VERSION)
  min_version = ::NewRelic::VersionNumber.new('2.12.0')
  version >= min_version
end
rack_version_supported?() click to toggle source
# File lib/new_relic/agent/instrumentation/rack.rb, line 60
def self.rack_version_supported?
  return false unless defined? ::Rack

  version = ::NewRelic::VersionNumber.new(::Rack.release)
  min_version = ::NewRelic::VersionNumber.new('1.1.0')
  version >= min_version
end
version_supported?() click to toggle source
# File lib/new_relic/agent/instrumentation/rack.rb, line 56
def self.version_supported?
  rack_version_supported? || puma_rack_version_supported?
end