diff options
author | Pawel Chojnacki <pawel@chojnacki.ws> | 2017-12-08 19:36:30 +0100 |
---|---|---|
committer | Pawel Chojnacki <pawel@chojnacki.ws> | 2017-12-12 18:38:28 +0100 |
commit | b503e6ff423699f7556fb948051e9c180a7b89f0 (patch) | |
tree | 6d98ffe63aebc7f349a0288e15ee3f723d463617 | |
parent | 53dc9e83c34b2a0ee2651046de031566f5b925d2 (diff) | |
download | gitlab-ce-b503e6ff423699f7556fb948051e9c180a7b89f0.tar.gz |
Implement simple in memory cache that expires after 5 minutes
-rw-r--r-- | lib/gitlab/metrics/method_call.rb | 26 | ||||
-rw-r--r-- | spec/lib/gitlab/metrics/method_call_spec.rb | 30 |
2 files changed, 43 insertions, 13 deletions
diff --git a/lib/gitlab/metrics/method_call.rb b/lib/gitlab/metrics/method_call.rb index ab7e7a06a77..744c489d46e 100644 --- a/lib/gitlab/metrics/method_call.rb +++ b/lib/gitlab/metrics/method_call.rb @@ -18,6 +18,24 @@ module Gitlab end end + def self.call_measurement_enabled? + return @call_measurement_enabled unless call_measurement_enabled_cache_expired? + MUTEX.synchronize do + return @call_measurement_enabled unless call_measurement_enabled_cache_expired? + @call_measurement_enabled_cache_expires_at = Time.now + 5.minutes + @call_measurement_enabled = Feature.get(:prometheus_metrics_method_instrumentation).enabled? + end + end + + def self.call_measurement_enabled_cache_expired? + @call_measurement_enabled.nil? || @call_measurement_enabled_cache_expires_at.nil? || @call_measurement_enabled_cache_expires_at < Time.now + end + + def self.call_measurement_enabled_cache_expire + @call_measurement_enabled = nil + @call_measurement_enabled_cache_expires_at = nil + end + # name - The full name of the method (including namespace) such as # `User#sign_in`. # @@ -45,7 +63,7 @@ module Gitlab @cpu_time += cpu_time @call_count += 1 - if call_measurement_enabled? && above_threshold? + if self.class.call_measurement_enabled? && above_threshold? self.class.call_duration_histogram.observe(@transaction.labels.merge(labels), real_time / 1000.0) end @@ -70,12 +88,6 @@ module Gitlab def above_threshold? real_time >= Metrics.method_call_threshold end - - def call_measurement_enabled? - Rails.cache.fetch(:prometheus_metrics_method_instrumentation_enabled, expires_in: 5.minutes) do - Feature.get(:prometheus_metrics_method_instrumentation).enabled? - end - end end end end diff --git a/spec/lib/gitlab/metrics/method_call_spec.rb b/spec/lib/gitlab/metrics/method_call_spec.rb index df4c5167497..f514fdd70ed 100644 --- a/spec/lib/gitlab/metrics/method_call_spec.rb +++ b/spec/lib/gitlab/metrics/method_call_spec.rb @@ -20,18 +20,35 @@ describe Gitlab::Metrics::MethodCall do context 'prometheus instrumentation is enabled' do before do + allow(Feature.get(:prometheus_metrics_method_instrumentation)).to receive(:enabled?).and_call_original + described_class.call_measurement_enabled_cache_expire Feature.get(:prometheus_metrics_method_instrumentation).enable end - it 'feature check is cached for 5 minutes' do - allow(Feature.get(:prometheus_metrics_method_instrumentation)).to receive(:enabled?).and_call_original - allow(Rails.cache).to receive(:fetch).and_call_original + around do |example| + Timecop.freeze do + example.run + end + end - method_call.measure { 'foo' } - method_call.measure { 'foo' } + it 'caches subsequent invocations of feature check' do + 10.times do + method_call.measure { 'foo' } + end + + expect(Feature.get(:prometheus_metrics_method_instrumentation)).to have_received(:enabled?).once + end + + it 'expires feature check cache after 5 minutes' do + 10.times do + method_call.measure { 'foo' } + end + + Timecop.travel(Time.now + 5.minutes) do + method_call.measure { 'foo' } + end expect(Feature.get(:prometheus_metrics_method_instrumentation)).to have_received(:enabled?).twice - expect(Rails.cache).to have_received(:fetch).with(:prometheus_metrics_method_instrumentation_enabled, expires_in: 5.minutes).twice end it 'observes the performance of the supplied block' do @@ -45,6 +62,7 @@ describe Gitlab::Metrics::MethodCall do context 'prometheus instrumentation is disabled' do before do + described_class.call_measurement_enabled_cache_expire Feature.get(:prometheus_metrics_method_instrumentation).disable end |