Commit 13dbd663 authored by Yorick Peterse's avatar Yorick Peterse

Allow filtering of what methods to instrument

This makes it possible to determine if a method should be instrumented
or not using a block.
parent d67e2045
...@@ -33,23 +33,38 @@ module Gitlab ...@@ -33,23 +33,38 @@ module Gitlab
# Instruments all public methods of a module. # Instruments all public methods of a module.
# #
# This method optionally takes a block that can be used to determine if a
# method should be instrumented or not. The block is passed the receiving
# module and an UnboundMethod. If the block returns a non truthy value the
# method is not instrumented.
#
# mod - The module to instrument. # mod - The module to instrument.
def self.instrument_methods(mod) def self.instrument_methods(mod)
mod.public_methods(false).each do |name| mod.public_methods(false).each do |name|
method = mod.method(name) method = mod.method(name)
instrument_method(mod, name) if method.owner == mod.singleton_class if method.owner == mod.singleton_class
if !block_given? || block_given? && yield(mod, method)
instrument_method(mod, name)
end
end
end end
end end
# Instruments all public instance methods of a module. # Instruments all public instance methods of a module.
# #
# See `instrument_methods` for more information.
#
# mod - The module to instrument. # mod - The module to instrument.
def self.instrument_instance_methods(mod) def self.instrument_instance_methods(mod)
mod.public_instance_methods(false).each do |name| mod.public_instance_methods(false).each do |name|
method = mod.instance_method(name) method = mod.instance_method(name)
instrument_instance_method(mod, name) if method.owner == mod if method.owner == mod
if !block_given? || block_given? && yield(mod, method)
instrument_instance_method(mod, name)
end
end
end end
end end
......
...@@ -132,6 +132,14 @@ describe Gitlab::Metrics::Instrumentation do ...@@ -132,6 +132,14 @@ describe Gitlab::Metrics::Instrumentation do
expect(@dummy).to_not respond_to(:_original_kittens) expect(@dummy).to_not respond_to(:_original_kittens)
end end
it 'can take a block to determine if a method should be instrumented' do
described_class.instrument_methods(@dummy) do
false
end
expect(@dummy).to_not respond_to(:_original_foo)
end
end end
describe '.instrument_instance_methods' do describe '.instrument_instance_methods' do
...@@ -157,5 +165,13 @@ describe Gitlab::Metrics::Instrumentation do ...@@ -157,5 +165,13 @@ describe Gitlab::Metrics::Instrumentation do
expect(@dummy.method_defined?(:_original_kittens)).to eq(false) expect(@dummy.method_defined?(:_original_kittens)).to eq(false)
end end
it 'can take a block to determine if a method should be instrumented' do
described_class.instrument_instance_methods(@dummy) do
false
end
expect(@dummy.method_defined?(:_original_bar)).to eq(false)
end
end end
end end
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment