summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPawel Chojnacki <pawel@chojnacki.ws>2017-12-08 19:36:30 +0100
committerPawel Chojnacki <pawel@chojnacki.ws>2017-12-12 18:38:28 +0100
commitb503e6ff423699f7556fb948051e9c180a7b89f0 (patch)
tree6d98ffe63aebc7f349a0288e15ee3f723d463617
parent53dc9e83c34b2a0ee2651046de031566f5b925d2 (diff)
downloadgitlab-ce-b503e6ff423699f7556fb948051e9c180a7b89f0.tar.gz
Implement simple in memory cache that expires after 5 minutes
-rw-r--r--lib/gitlab/metrics/method_call.rb26
-rw-r--r--spec/lib/gitlab/metrics/method_call_spec.rb30
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