Class: NewRelic::Control::Frameworks::Rails

Inherits:
Ruby show all
Defined in:
lib/new_relic/control/frameworks/rails.rb

Overview

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

Direct Known Subclasses

Rails3

Instance Attribute Summary

Attributes included from InstanceMethods

#local_env

Instance Method Summary collapse

Methods inherited from NewRelic::Control

#rails_32_deprecation

Methods included from ClassMethods

#instance, #load_framework_class, #load_test_framework, #local_env, #new_instance, #newrelic_root, #reset

Methods included from InstanceMethods

#[], #app, #configure_agent, #determine_env, #dispatcher, #framework, #handle_invalid_security_settings, #init_plugin, #newrelic_root, #security_settings_valid?, #settings, #start_agent

Methods included from Instrumentation

#add_instrumentation, #install_instrumentation, #load_instrumentation_files

Methods included from ServerMethods

#api_server, #server, #server_from_host

Instance Method Details

#envObject



13
14
15
# File 'lib/new_relic/control/frameworks/rails.rb', line 13

def env
  @env ||= (ENV['NEW_RELIC_ENV'] || RAILS_ENV.dup)
end

#init_config(options = {}) ⇒ Object

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.



45
46
47
48
49
50
51
52
53
54
# File 'lib/new_relic/control/frameworks/rails.rb', line 45

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) ⇒ Object



81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
# File 'lib/new_relic/control/frameworks/rails.rb', line 81

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) ⇒ Object



98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
# File 'lib/new_relic/control/frameworks/rails.rb', line 98

def install_browser_monitoring(config)
  @install_lock.synchronize do
    return if defined?(@browser_monitoring_installed) && @browser_monitoring_installed

    @browser_monitoring_installed = true
    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_hooksObject



67
68
69
70
71
72
73
74
75
76
77
78
79
# File 'lib/new_relic/control/frameworks/rails.rb', line 67

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_detectionObject



56
57
58
59
60
61
62
63
64
65
# File 'lib/new_relic/control/frameworks/rails.rb', line 56

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

#rails_configObject



34
35
36
37
38
39
40
# File 'lib/new_relic/control/frameworks/rails.rb', line 34

def rails_config
  if defined?(::Rails) && ::Rails.respond_to?(:configuration)
    ::Rails.configuration
  else
    @config
  end
end

#rails_rootObject



30
31
32
# File 'lib/new_relic/control/frameworks/rails.rb', line 30

def rails_root
  RAILS_ROOT if defined?(RAILS_ROOT)
end

#rails_versionObject



115
116
117
# File 'lib/new_relic/control/frameworks/rails.rb', line 115

def rails_version
  @rails_version ||= Gem::Version.new(::Rails::VERSION::STRING)
end

#rootObject

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.



21
22
23
24
25
26
27
28
# File 'lib/new_relic/control/frameworks/rails.rb', line 21

def root
  root = rails_root.to_s
  if !root.empty?
    root
  else
    super
  end
end