Commit b66a16c8 authored by Yorick Peterse's avatar Yorick Peterse

Use string evaluation for method instrumentation

This is faster than using define_method since we don't have to keep
block bindings around.
parent 60a6a240
...@@ -31,16 +31,18 @@ module Gitlab ...@@ -31,16 +31,18 @@ module Gitlab
alias_name = "_original_#{name}" alias_name = "_original_#{name}"
target = type == :instance ? mod : mod.singleton_class target = type == :instance ? mod : mod.singleton_class
target.class_eval do target.class_eval <<-EOF, __FILE__, __LINE__ + 1
alias_method(alias_name, name) alias_method :#{alias_name}, :#{name}
define_method(name) do |*args, &block| def #{name}(*args, &block)
ActiveSupport::Notifications. ActiveSupport::Notifications
instrument("#{type}_method.method_call", module: mod, name: name) do .instrument("#{type}_method.method_call",
__send__(alias_name, *args, &block) module: #{mod.name.inspect},
end name: #{name.inspect}) do
#{alias_name}(*args, &block)
end end
end end
EOF
end end
end end
end end
......
...@@ -10,7 +10,7 @@ module Gitlab ...@@ -10,7 +10,7 @@ module Gitlab
def instance_method(event) def instance_method(event)
return unless current_transaction return unless current_transaction
label = "#{event.payload[:module].name}##{event.payload[:name]}" label = "#{event.payload[:module]}##{event.payload[:name]}"
add_metric(label, event.duration) add_metric(label, event.duration)
end end
...@@ -18,7 +18,7 @@ module Gitlab ...@@ -18,7 +18,7 @@ module Gitlab
def class_method(event) def class_method(event)
return unless current_transaction return unless current_transaction
label = "#{event.payload[:module].name}.#{event.payload[:name]}" label = "#{event.payload[:module]}.#{event.payload[:name]}"
add_metric(label, event.duration) add_metric(label, event.duration)
end end
......
...@@ -11,6 +11,8 @@ describe Gitlab::Metrics::Instrumentation do ...@@ -11,6 +11,8 @@ describe Gitlab::Metrics::Instrumentation do
text text
end end
end end
allow(@dummy).to receive(:name).and_return('Dummy')
end end
describe '.instrument_method' do describe '.instrument_method' do
...@@ -31,7 +33,7 @@ describe Gitlab::Metrics::Instrumentation do ...@@ -31,7 +33,7 @@ describe Gitlab::Metrics::Instrumentation do
it 'fires an ActiveSupport notification upon calling the method' do it 'fires an ActiveSupport notification upon calling the method' do
expect(ActiveSupport::Notifications).to receive(:instrument). expect(ActiveSupport::Notifications).to receive(:instrument).
with('class_method.method_call', module: @dummy, name: :foo) with('class_method.method_call', module: 'Dummy', name: :foo)
@dummy.foo @dummy.foo
end end
...@@ -69,7 +71,7 @@ describe Gitlab::Metrics::Instrumentation do ...@@ -69,7 +71,7 @@ describe Gitlab::Metrics::Instrumentation do
it 'fires an ActiveSupport notification upon calling the method' do it 'fires an ActiveSupport notification upon calling the method' do
expect(ActiveSupport::Notifications).to receive(:instrument). expect(ActiveSupport::Notifications).to receive(:instrument).
with('instance_method.method_call', module: @dummy, name: :bar) with('instance_method.method_call', module: 'Dummy', name: :bar)
@dummy.new.bar @dummy.new.bar
end end
......
...@@ -6,8 +6,7 @@ describe Gitlab::Metrics::Subscribers::MethodCall do ...@@ -6,8 +6,7 @@ describe Gitlab::Metrics::Subscribers::MethodCall do
let(:subscriber) { described_class.new } let(:subscriber) { described_class.new }
let(:event) do let(:event) do
double(:event, duration: 0.2, double(:event, duration: 0.2, payload: { module: 'Foo', name: :foo })
payload: { module: double(:mod, name: 'Foo'), name: :foo })
end end
before do before do
......
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