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