class NewRelic::Control::Frameworks::Rails

Control subclass instantiated when Rails is detected. Contains Rails specific configuration, instrumentation, environment values, etc.

Constants

BROWSER_MONITORING_INSTALLED_SINGLETON
BROWSER_MONITORING_INSTALLED_VARIABLE

Public Instance Methods

browser_agent_already_installed?() click to toggle source
# File lib/new_relic/control/frameworks/rails.rb, line 118
def browser_agent_already_installed?
  BROWSER_MONITORING_INSTALLED_SINGLETON.instance_variable_defined?(BROWSER_MONITORING_INSTALLED_VARIABLE) &&
    BROWSER_MONITORING_INSTALLED_SINGLETON.instance_variable_get(BROWSER_MONITORING_INSTALLED_VARIABLE)
end
env() click to toggle source
# File lib/new_relic/control/frameworks/rails.rb, line 16
def env
  @env ||= (ENV['NEW_RELIC_ENV'] || RAILS_ENV.dup)
end
init_config(options = {}) click to toggle source

In versions of Rails prior to 2.0, the rails config was only available to the init.rb, so it had to be passed on from there. This is a best effort to find a config and use that.

# File lib/new_relic/control/frameworks/rails.rb, line 48
def init_config(options = {})
  @config = options[:config]
  install_dependency_detection
  install_browser_monitoring_and_agent_hooks
rescue => e
  ::NewRelic::Agent.logger.error('Failure during init_config for Rails. Is Rails required in a non-Rails ' \
                                 'app? Set NEW_RELIC_FRAMEWORK=ruby to avoid this message. The Ruby agent ' \
                                 'will continue running, but Rails-specific features may be missing. ' \
                                 "#{e.class} - #{e.message}")
end
install_agent_hooks(config) click to toggle source
# File lib/new_relic/control/frameworks/rails.rb, line 84
def install_agent_hooks(config)
  return if defined?(@agent_hooks_installed) && @agent_hooks_installed

  @agent_hooks_installed = true
  return if config.nil? || !config.respond_to?(:middleware)

  begin
    require 'new_relic/rack/agent_hooks'
    return unless NewRelic::Rack::AgentHooks.needed?

    config.middleware.use(NewRelic::Rack::AgentHooks)
    ::NewRelic::Agent.logger.debug('Installed New Relic agent hooks middleware')
  rescue => e
    ::NewRelic::Agent.logger.warn('Error installing New Relic agent hooks middleware', e)
  end
end
install_browser_monitoring(config) click to toggle source
# File lib/new_relic/control/frameworks/rails.rb, line 101
def install_browser_monitoring(config)
  @install_lock.synchronize do
    return if browser_agent_already_installed?

    mark_browser_agent_as_installed
    return if config.nil? || !config.respond_to?(:middleware) || !Agent.config[:'browser_monitoring.auto_instrument']

    begin
      require 'new_relic/rack/browser_monitoring'
      config.middleware.use(NewRelic::Rack::BrowserMonitoring)
      ::NewRelic::Agent.logger.debug('Installed New Relic Browser Monitoring middleware')
    rescue => e
      ::NewRelic::Agent.logger.warn('Error installing New Relic Browser Monitoring middleware', e)
    end
  end
end
install_browser_monitoring_and_agent_hooks() click to toggle source
# File lib/new_relic/control/frameworks/rails.rb, line 70
def install_browser_monitoring_and_agent_hooks
  return unless rails_config

  if !Agent.config[:agent_enabled]
    # Might not be running if it does not think mongrel, thin,
    # passenger, etc. is running, if it thinks it's a rake task, or
    # if the agent_enabled is false.
    ::NewRelic::Agent.logger.info('New Relic agent not running. Skipping browser monitoring and agent hooks.')
  else
    install_browser_monitoring(rails_config)
    install_agent_hooks(rails_config)
  end
end
install_dependency_detection() click to toggle source
# File lib/new_relic/control/frameworks/rails.rb, line 59
def install_dependency_detection
  return unless rails_config && ::Rails.configuration.respond_to?(:after_initialize)

  rails_config.after_initialize do
    # This will insure we load all the instrumentation as late as
    # possible. If the agent is not enabled, it will load a limited
    # amount of instrumentation.
    DependencyDetection.detect!
  end
end
mark_browser_agent_as_installed() click to toggle source
# File lib/new_relic/control/frameworks/rails.rb, line 123
def mark_browser_agent_as_installed
  BROWSER_MONITORING_INSTALLED_SINGLETON.instance_variable_set(BROWSER_MONITORING_INSTALLED_VARIABLE, true)
end
rails_config() click to toggle source
# File lib/new_relic/control/frameworks/rails.rb, line 37
def rails_config
  if defined?(::Rails) && ::Rails.respond_to?(:configuration)
    ::Rails.configuration
  else
    @config
  end
end
rails_root() click to toggle source
# File lib/new_relic/control/frameworks/rails.rb, line 33
def rails_root
  RAILS_ROOT if defined?(RAILS_ROOT)
end
rails_version() click to toggle source
# File lib/new_relic/control/frameworks/rails.rb, line 127
def rails_version
  @rails_version ||= Gem::Version.new(::Rails::VERSION::STRING)
end
root() click to toggle source

Rails can return an empty string from this method, causing the agent not to start even when it is properly in a rails 3 application, so we test the value to make sure it actually has contents, and bail to the parent class if it is empty.

# File lib/new_relic/control/frameworks/rails.rb, line 24
def root
  root = rails_root.to_s
  if !root.empty?
    root
  else
    super
  end
end

Protected Instance Methods

install_shim() click to toggle source
# File lib/new_relic/control/frameworks/rails.rb, line 137
def install_shim
  super
  require 'new_relic/agent/instrumentation/controller_instrumentation'
  if ActiveSupport.respond_to?(:on_load) # rails 3+
    ActiveSupport.on_load(:action_controller) { include NewRelic::Agent::Instrumentation::ControllerInstrumentation::Shim }
  else
    ActionController::Base.class_eval { include NewRelic::Agent::Instrumentation::ControllerInstrumentation::Shim }
  end
end
rails_vendor_root() click to toggle source
# File lib/new_relic/control/frameworks/rails.rb, line 133
def rails_vendor_root
  File.join(root, 'vendor', 'rails')
end