提交 b503e6ff 编写于 作者: P Pawel Chojnacki

Implement simple in memory cache that expires after 5 minutes

上级 53dc9e83
......@@ -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
......@@ -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
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册