summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYorick Peterse <yorickpeterse@gmail.com>2015-12-10 13:38:45 +0100
committerYorick Peterse <yorickpeterse@gmail.com>2015-12-17 17:25:48 +0100
commitb66a16c8384b64eabeb04f3f32017581e4711eb8 (patch)
tree4423e0a84adb85a51ab7827f470e93cbb2f45f26
parent60a6a240ea21cbfa564b9373b1c3bb57316aae46 (diff)
downloadgitlab-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.rb16
-rw-r--r--lib/gitlab/metrics/subscribers/method_call.rb4
-rw-r--r--spec/lib/gitlab/metrics/instrumentation_spec.rb6
-rw-r--r--spec/lib/gitlab/metrics/subscribers/method_call_spec.rb3
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