Commit b503e6ff authored by Pawel Chojnacki's avatar Pawel Chojnacki

Implement simple in memory cache that expires after 5 minutes

parent 53dc9e83
...@@ -18,6 +18,24 @@ module Gitlab ...@@ -18,6 +18,24 @@ module Gitlab
end end
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 # name - The full name of the method (including namespace) such as
# `User#sign_in`. # `User#sign_in`.
# #
...@@ -45,7 +63,7 @@ module Gitlab ...@@ -45,7 +63,7 @@ module Gitlab
@cpu_time += cpu_time @cpu_time += cpu_time
@call_count += 1 @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) self.class.call_duration_histogram.observe(@transaction.labels.merge(labels), real_time / 1000.0)
end end
...@@ -70,12 +88,6 @@ module Gitlab ...@@ -70,12 +88,6 @@ module Gitlab
def above_threshold? def above_threshold?
real_time >= Metrics.method_call_threshold real_time >= Metrics.method_call_threshold
end 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 end
end end
...@@ -20,18 +20,35 @@ describe Gitlab::Metrics::MethodCall do ...@@ -20,18 +20,35 @@ describe Gitlab::Metrics::MethodCall do
context 'prometheus instrumentation is enabled' do context 'prometheus instrumentation is enabled' do
before 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 Feature.get(:prometheus_metrics_method_instrumentation).enable
end end
it 'feature check is cached for 5 minutes' do around do |example|
allow(Feature.get(:prometheus_metrics_method_instrumentation)).to receive(:enabled?).and_call_original Timecop.freeze do
allow(Rails.cache).to receive(:fetch).and_call_original example.run
end
end
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' } method_call.measure { 'foo' }
end
Timecop.travel(Time.now + 5.minutes) do
method_call.measure { 'foo' } method_call.measure { 'foo' }
end
expect(Feature.get(:prometheus_metrics_method_instrumentation)).to have_received(:enabled?).twice 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 end
it 'observes the performance of the supplied block' do it 'observes the performance of the supplied block' do
...@@ -45,6 +62,7 @@ describe Gitlab::Metrics::MethodCall do ...@@ -45,6 +62,7 @@ describe Gitlab::Metrics::MethodCall do
context 'prometheus instrumentation is disabled' do context 'prometheus instrumentation is disabled' do
before do before do
described_class.call_measurement_enabled_cache_expire
Feature.get(:prometheus_metrics_method_instrumentation).disable Feature.get(:prometheus_metrics_method_instrumentation).disable
end end
......
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