This is the central point of all declared probes. Every class needed to declare probes should include this module and declare the methods that are subject to instrumentation:
class MyClass extend Puppet::Util::Instrumentation::Instrumentable probe :mymethod def mymethod ... this is code to be instrumented ... end end
# File lib/puppet/util/instrumentation/instrumentable.rb, line 128 def self.clear_probes INSTRUMENTED_CLASSES.synchronize { INSTRUMENTED_CLASSES.clear } nil # do not leak our probes to the exterior world end
# File lib/puppet/util/instrumentation/instrumentable.rb, line 124 def self.disable_probes each_probe { |probe| probe.disable } end
# File lib/puppet/util/instrumentation/instrumentable.rb, line 135 def self.each_probe INSTRUMENTED_CLASSES.synchronize { INSTRUMENTED_CLASSES.each_key do |klass| klass.probes.each { |probe| yield probe } end } nil # do not leak our probes to the exterior world end
# File lib/puppet/util/instrumentation/instrumentable.rb, line 120 def self.enable_probes each_probe { |probe| probe.enable } end
# File lib/puppet/util/instrumentation/instrumentable.rb, line 114 def self.probe_names probe_names = [] each_probe { |probe| probe_names << "#{probe.klass}.#{probe.method}" } probe_names end
# File lib/puppet/util/instrumentation/instrumentable.rb, line 110 def self.probes @probes end
Declares a new probe It is possible to pass several options that will be later on evaluated and sent to the instrumentation layer. label:: this can either be a static symbol/string or a block. If it's a block this one will be evaluated on every call of the instrumented method and should return a string or a symbol data:: this can be a hash or a block. If it's a block this one will be evaluated on every call of the instrumented method and should return a hash.
Example:
class MyClass extend Instrumentable probe :mymethod, :data => Proc.new { |args| { :data => args[1] } }, :label => Proc.new { |args| args[0] } def mymethod(name, options) end end
# File lib/puppet/util/instrumentation/instrumentable.rb, line 103 def probe(method, options = {}) INSTRUMENTED_CLASSES.synchronize { (@probes ||= []) << Probe.new(method, self, options) INSTRUMENTED_CLASSES[self] = @probes } end