Commit a93a32a2 authored by Yorick Peterse's avatar Yorick Peterse

Support for instrumenting class hierarchies

This will be used to (for example) instrument all ActiveRecord models.
parent a41287d8
...@@ -31,6 +31,29 @@ module Gitlab ...@@ -31,6 +31,29 @@ module Gitlab
instrument(:instance, mod, name) instrument(:instance, mod, name)
end end
# Recursively instruments all subclasses of the given root module.
#
# This can be used to for example instrument all ActiveRecord models (as
# these all inherit from ActiveRecord::Base).
#
# This method can optionally take a block to pass to `instrument_methods`
# and `instrument_instance_methods`.
#
# root - The root module for which to instrument subclasses. The root
# module itself is not instrumented.
def self.instrument_class_hierarchy(root, &block)
visit = root.subclasses
until visit.empty?
klass = visit.pop
instrument_methods(klass, &block)
instrument_instance_methods(klass, &block)
klass.subclasses.each { |c| visit << c }
end
end
# 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 # This method optionally takes a block that can be used to determine if a
......
...@@ -133,6 +133,39 @@ describe Gitlab::Metrics::Instrumentation do ...@@ -133,6 +133,39 @@ describe Gitlab::Metrics::Instrumentation do
end end
end end
describe '.instrument_class_hierarchy' do
before do
allow(Gitlab::Metrics).to receive(:enabled?).and_return(true)
@child1 = Class.new(@dummy) do
def self.child1_foo; end
def child1_bar; end
end
@child2 = Class.new(@child1) do
def self.child2_foo; end
def child2_bar; end
end
end
it 'recursively instruments a class hierarchy' do
described_class.instrument_class_hierarchy(@dummy)
expect(@child1).to respond_to(:_original_child1_foo)
expect(@child2).to respond_to(:_original_child2_foo)
expect(@child1.method_defined?(:_original_child1_bar)).to eq(true)
expect(@child2.method_defined?(:_original_child2_bar)).to eq(true)
end
it 'does not instrument the root module' do
described_class.instrument_class_hierarchy(@dummy)
expect(@dummy).to_not respond_to(:_original_foo)
expect(@dummy.method_defined?(:_original_bar)).to eq(false)
end
end
describe '.instrument_methods' do describe '.instrument_methods' do
before do before do
allow(Gitlab::Metrics).to receive(:enabled?).and_return(true) allow(Gitlab::Metrics).to receive(:enabled?).and_return(true)
......
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