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.
Calls superclass method
NewRelic::Control::Frameworks::Ruby#root
# 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
Calls superclass method
NewRelic::Control::Instrumentation#install_shim
# 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