Commit 51b68eb5 authored by Thong Kuah's avatar Thong Kuah Committed by Peter Leitzen

Refactor by removing some redundant variables

target is already defined in the if clause below. There's no need to
cast name to symbol. All methods that use name variable accept string or
symbol
parent 652e84b1
---
title: Respect original visibility for instrumented methods
merge_request: 39951
author:
type: fixed
...@@ -120,9 +120,6 @@ module Gitlab ...@@ -120,9 +120,6 @@ module Gitlab
def self.instrument(type, mod, name) def self.instrument(type, mod, name)
return unless ::Gitlab::Metrics.enabled? return unless ::Gitlab::Metrics.enabled?
name = name.to_sym
target = type == :instance ? mod : mod.singleton_class
if type == :instance if type == :instance
target = mod target = mod
method_name = "##{name}" method_name = "##{name}"
...@@ -154,6 +151,8 @@ module Gitlab ...@@ -154,6 +151,8 @@ module Gitlab
'*args' '*args'
end end
method_visibility = method_visibility_for(target, name)
proxy_module.class_eval <<-EOF, __FILE__, __LINE__ + 1 proxy_module.class_eval <<-EOF, __FILE__, __LINE__ + 1
def #{name}(#{args_signature}) def #{name}(#{args_signature})
if trans = Gitlab::Metrics::Instrumentation.transaction if trans = Gitlab::Metrics::Instrumentation.transaction
...@@ -163,11 +162,23 @@ module Gitlab ...@@ -163,11 +162,23 @@ module Gitlab
super super
end end
end end
#{method_visibility} :#{name}
EOF EOF
target.prepend(proxy_module) target.prepend(proxy_module)
end end
def self.method_visibility_for(mod, name)
if mod.private_method_defined?(name)
:private
elsif mod.protected_method_defined?(name)
:protected
else
:public
end
end
private_class_method :method_visibility_for
# Small layer of indirection to make it easier to stub out the current # Small layer of indirection to make it easier to stub out the current
# transaction. # transaction.
def self.transaction def self.transaction
......
...@@ -12,6 +12,11 @@ RSpec.describe Gitlab::Metrics::Instrumentation do ...@@ -12,6 +12,11 @@ RSpec.describe Gitlab::Metrics::Instrumentation do
text text
end end
def self.wat(text = 'wat')
text
end
private_class_method :wat
class << self class << self
def buzz(text = 'buzz') def buzz(text = 'buzz')
text text
...@@ -242,6 +247,7 @@ RSpec.describe Gitlab::Metrics::Instrumentation do ...@@ -242,6 +247,7 @@ RSpec.describe Gitlab::Metrics::Instrumentation do
expect(described_class.instrumented?(@dummy.singleton_class)).to eq(true) expect(described_class.instrumented?(@dummy.singleton_class)).to eq(true)
expect(@dummy.method(:foo).source_location.first).to match(/instrumentation\.rb/) expect(@dummy.method(:foo).source_location.first).to match(/instrumentation\.rb/)
expect(@dummy.public_methods).to include(:foo)
end end
it 'instruments all protected class methods' do it 'instruments all protected class methods' do
...@@ -249,13 +255,16 @@ RSpec.describe Gitlab::Metrics::Instrumentation do ...@@ -249,13 +255,16 @@ RSpec.describe Gitlab::Metrics::Instrumentation do
expect(described_class.instrumented?(@dummy.singleton_class)).to eq(true) expect(described_class.instrumented?(@dummy.singleton_class)).to eq(true)
expect(@dummy.method(:flaky).source_location.first).to match(/instrumentation\.rb/) expect(@dummy.method(:flaky).source_location.first).to match(/instrumentation\.rb/)
expect(@dummy.protected_methods).to include(:flaky)
end end
it 'instruments all private instance methods' do it 'instruments all private class methods' do
described_class.instrument_methods(@dummy) described_class.instrument_methods(@dummy)
expect(described_class.instrumented?(@dummy.singleton_class)).to eq(true) expect(described_class.instrumented?(@dummy.singleton_class)).to eq(true)
expect(@dummy.method(:buzz).source_location.first).to match(/instrumentation\.rb/) expect(@dummy.method(:buzz).source_location.first).to match(/instrumentation\.rb/)
expect(@dummy.private_methods).to include(:buzz)
expect(@dummy.private_methods).to include(:wat)
end end
it 'only instruments methods directly defined in the module' do it 'only instruments methods directly defined in the module' do
...@@ -290,6 +299,7 @@ RSpec.describe Gitlab::Metrics::Instrumentation do ...@@ -290,6 +299,7 @@ RSpec.describe Gitlab::Metrics::Instrumentation do
expect(described_class.instrumented?(@dummy)).to eq(true) expect(described_class.instrumented?(@dummy)).to eq(true)
expect(@dummy.new.method(:bar).source_location.first).to match(/instrumentation\.rb/) expect(@dummy.new.method(:bar).source_location.first).to match(/instrumentation\.rb/)
expect(@dummy.public_instance_methods).to include(:bar)
end end
it 'instruments all protected instance methods' do it 'instruments all protected instance methods' do
...@@ -297,6 +307,7 @@ RSpec.describe Gitlab::Metrics::Instrumentation do ...@@ -297,6 +307,7 @@ RSpec.describe Gitlab::Metrics::Instrumentation do
expect(described_class.instrumented?(@dummy)).to eq(true) expect(described_class.instrumented?(@dummy)).to eq(true)
expect(@dummy.new.method(:chaf).source_location.first).to match(/instrumentation\.rb/) expect(@dummy.new.method(:chaf).source_location.first).to match(/instrumentation\.rb/)
expect(@dummy.protected_instance_methods).to include(:chaf)
end end
it 'instruments all private instance methods' do it 'instruments all private instance methods' do
...@@ -304,6 +315,7 @@ RSpec.describe Gitlab::Metrics::Instrumentation do ...@@ -304,6 +315,7 @@ RSpec.describe Gitlab::Metrics::Instrumentation do
expect(described_class.instrumented?(@dummy)).to eq(true) expect(described_class.instrumented?(@dummy)).to eq(true)
expect(@dummy.new.method(:wadus).source_location.first).to match(/instrumentation\.rb/) expect(@dummy.new.method(:wadus).source_location.first).to match(/instrumentation\.rb/)
expect(@dummy.private_instance_methods).to include(:wadus)
end end
it 'only instruments methods directly defined in the module' do it 'only instruments methods directly defined in the module' 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