Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'lib/gitlab/cache/helpers.rb')
-rw-r--r--lib/gitlab/cache/helpers.rb75
1 files changed, 72 insertions, 3 deletions
diff --git a/lib/gitlab/cache/helpers.rb b/lib/gitlab/cache/helpers.rb
index 7b11d6bc9ff..48b6ca59367 100644
--- a/lib/gitlab/cache/helpers.rb
+++ b/lib/gitlab/cache/helpers.rb
@@ -57,9 +57,19 @@ module Gitlab
# @param expires_in [ActiveSupport::Duration, Integer] an expiry time for the cache entry
# @return [String]
def cached_object(object, presenter:, presenter_args:, context:, expires_in:)
- cache.fetch(contextual_cache_key(presenter, object, context), expires_in: expires_in) do
- Gitlab::Json.dump(presenter.represent(object, **presenter_args).as_json)
+ misses = 0
+
+ json = cache.fetch(contextual_cache_key(presenter, object, context), expires_in: expires_in) do
+ time_action(render_type: :object) do
+ misses += 1
+
+ Gitlab::Json.dump(presenter.represent(object, **presenter_args).as_json)
+ end
end
+
+ increment_cache_metric(render_type: :object, total_count: 1, miss_count: misses)
+
+ json
end
# Used for fetching or rendering multiple objects
@@ -71,10 +81,18 @@ module Gitlab
# @param expires_in [ActiveSupport::Duration, Integer] an expiry time for the cache entry
# @return [Array<String>]
def cached_collection(collection, presenter:, presenter_args:, context:, expires_in:)
+ misses = 0
+
json = fetch_multi(presenter, collection, context: context, expires_in: expires_in) do |obj|
- Gitlab::Json.dump(presenter.represent(obj, **presenter_args).as_json)
+ time_action(render_type: :collection) do
+ misses += 1
+
+ Gitlab::Json.dump(presenter.represent(obj, **presenter_args).as_json)
+ end
end
+ increment_cache_metric(render_type: :collection, total_count: collection.length, miss_count: misses)
+
json.values
end
@@ -106,6 +124,57 @@ module Gitlab
contextual_cache_key(presenter, object, context)
end
end
+
+ def increment_cache_metric(render_type:, total_count:, miss_count:)
+ return unless Feature.enabled?(:add_timing_to_certain_cache_actions)
+ return unless caller_id
+
+ metric_name = :cached_object_operations_total
+ hit_count = total_count - miss_count
+
+ current_transaction&.increment(
+ metric_name,
+ hit_count,
+ { caller_id: caller_id, render_type: render_type, cache_hit: true }
+ )
+
+ current_transaction&.increment(
+ metric_name,
+ miss_count,
+ { caller_id: caller_id, render_type: render_type, cache_hit: false }
+ )
+ end
+
+ def time_action(render_type:, &block)
+ if Feature.enabled?(:add_timing_to_certain_cache_actions)
+ real_start = Gitlab::Metrics::System.monotonic_time
+
+ presented_object = yield
+
+ real_duration_histogram(render_type).observe({}, Gitlab::Metrics::System.monotonic_time - real_start)
+
+ presented_object
+ else
+ yield
+ end
+ end
+
+ def real_duration_histogram(render_type)
+ Gitlab::Metrics.histogram(
+ :gitlab_presentable_object_cacheless_render_real_duration_seconds,
+ 'Duration of generating presentable objects to be cached in real time',
+ { caller_id: caller_id, render_type: render_type },
+ [0.1, 0.5, 1, 2]
+ )
+ end
+
+ def current_transaction
+ @current_transaction ||= ::Gitlab::Metrics::WebTransaction.current
+ end
+
+ def caller_id
+ @caller_id ||= Gitlab::ApplicationContext.current_context_attribute(:caller_id)
+ end
end
end
end