Module: NewRelic::Control::Instrumentation

Included in:
NewRelic::Control
Defined in:
lib/new_relic/control/instrumentation.rb

Overview

Contains methods that relate to adding and executing files that contain instrumentation for the Ruby Agent

Instance Method Summary collapse

Instance Method Details

#add_instrumentation(pattern) ⇒ Object

Add instrumentation. Don’t call this directly. Use NewRelic::Agent#add_instrumentation. This will load the file synchronously if we’ve already loaded the default instrumentation, otherwise instrumentation files specified here will be deferred until all instrumentation is run

This happens after the agent has loaded and all dependencies are ready to be instrumented



42
43
44
45
46
47
48
# File 'lib/new_relic/control/instrumentation.rb', line 42

def add_instrumentation pattern
  if @instrumented
    load_instrumentation_files pattern
  else
    @instrumentation_files << pattern
  end
end

#install_instrumentationObject

Signals the agent that it’s time to actually load the instrumentation files. May be overridden by subclasses



52
53
54
# File 'lib/new_relic/control/instrumentation.rb', line 52

def install_instrumentation
  _install_instrumentation
end

#install_shimObject

Install stubs to the proper location so the app code will not fail if the agent is not running.



29
30
31
32
33
# File 'lib/new_relic/control/instrumentation.rb', line 29

def install_shim
  # Once we install instrumentation, you can't undo that by installing the shim.
  raise "Cannot install the Agent shim after instrumentation has already been installed!" if @instrumented
  NewRelic::Agent.agent = NewRelic::Agent::ShimAgent.instance
end

#load_instrumentation_files(pattern) ⇒ Object

Adds a list of files in Dir.glob format (e.g. ‘/app/foo/*/_instrumentation.rb’) This requires the files within a rescue block, so that any errors within instrumentation files do not affect the overall agent or application in which it runs.

Logs at debug level for each file loaded, and logs errors in file loading at error level



15
16
17
18
19
20
21
22
23
24
25
# File 'lib/new_relic/control/instrumentation.rb', line 15

def load_instrumentation_files pattern
  Dir.glob(pattern) do |file|
    begin
      log.debug "Processing instrumentation file '#{file}'"
      require file.to_s
    rescue => e
      log.error "Error loading instrumentation file '#{file}': #{e}"
      log.debug e.backtrace.join("\n")
    end
  end
end

#load_samplersObject

adds samplers to the stats engine so that they run every minute. This is dynamically recognized by any class that subclasses NewRelic::Agent::Sampler



59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
# File 'lib/new_relic/control/instrumentation.rb', line 59

def load_samplers
  agent = NewRelic::Agent.instance
  NewRelic::Agent::Sampler.sampler_classes.each do | subclass |
    begin
      log.debug "#{subclass.name} not supported on this platform." and next if not subclass.supported_on_this_platform?
      sampler = subclass.new
      if subclass.use_harvest_sampler?
        agent.stats_engine.add_harvest_sampler sampler
        log.debug "Registered #{subclass.name} for harvest time sampling"
      else
        agent.stats_engine.add_sampler sampler
        log.debug "Registered #{subclass.name} for periodic sampling"
      end
    rescue NewRelic::Agent::Sampler::Unsupported => e
      log.info "#{subclass} sampler not available: #{e}"
    rescue => e
      log.error "Error registering sampler: #{e}, #{e.backtrace.join("\n")}"
    end
  end
end