diff options
author | Yorick Peterse <yorickpeterse@gmail.com> | 2015-12-10 13:38:45 +0100 |
---|---|---|
committer | Yorick Peterse <yorickpeterse@gmail.com> | 2015-12-17 17:25:48 +0100 |
commit | b66a16c8384b64eabeb04f3f32017581e4711eb8 (patch) | |
tree | 4423e0a84adb85a51ab7827f470e93cbb2f45f26 | |
parent | 60a6a240ea21cbfa564b9373b1c3bb57316aae46 (diff) | |
download | gitlab-ce-b66a16c8384b64eabeb04f3f32017581e4711eb8.tar.gz |
Use string evaluation for method instrumentation
This is faster than using define_method since we don't have to keep
block bindings around.
-rw-r--r-- | lib/gitlab/metrics/instrumentation.rb | 16 | ||||
-rw-r--r-- | lib/gitlab/metrics/subscribers/method_call.rb | 4 | ||||
-rw-r--r-- | spec/lib/gitlab/metrics/instrumentation_spec.rb | 6 | ||||
-rw-r--r-- | spec/lib/gitlab/metrics/subscribers/method_call_spec.rb | 3 |
4 files changed, 16 insertions, 13 deletions
diff --git a/lib/gitlab/metrics/instrumentation.rb b/lib/gitlab/metrics/instrumentation.rb index 1c2f84fb09a..982e35adfc9 100644 --- a/lib/gitlab/metrics/instrumentation.rb +++ b/lib/gitlab/metrics/instrumentation.rb @@ -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 diff --git a/lib/gitlab/metrics/subscribers/method_call.rb b/lib/gitlab/metrics/subscribers/method_call.rb index 1606134b7e5..0094ed0dc6a 100644 --- a/lib/gitlab/metrics/subscribers/method_call.rb +++ b/lib/gitlab/metrics/subscribers/method_call.rb @@ -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 diff --git a/spec/lib/gitlab/metrics/instrumentation_spec.rb b/spec/lib/gitlab/metrics/instrumentation_spec.rb index eb31c9e52cd..3e7e9869e30 100644 --- a/spec/lib/gitlab/metrics/instrumentation_spec.rb +++ b/spec/lib/gitlab/metrics/instrumentation_spec.rb @@ -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 diff --git a/spec/lib/gitlab/metrics/subscribers/method_call_spec.rb b/spec/lib/gitlab/metrics/subscribers/method_call_spec.rb index 65de95d6d1e..5c76eb3ba50 100644 --- a/spec/lib/gitlab/metrics/subscribers/method_call_spec.rb +++ b/spec/lib/gitlab/metrics/subscribers/method_call_spec.rb @@ -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 |