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:
authorGitLab Bot <gitlab-bot@gitlab.com>2021-02-01 15:09:03 +0300
committerGitLab Bot <gitlab-bot@gitlab.com>2021-02-01 15:09:03 +0300
commit9ecdb93f4e7e85ffc1e7a768780bb1279827a6aa (patch)
tree72d2a0acf03c3f1ef0459e4e31d81d2127b02b54 /lib/gitlab/rack_attack
parent6e495b4e91a964aba7a159f95a1b1f48fcf9668c (diff)
Add latest changes from gitlab-org/gitlab@master
Diffstat (limited to 'lib/gitlab/rack_attack')
-rw-r--r--lib/gitlab/rack_attack/instrumented_cache_store.rb32
1 files changed, 32 insertions, 0 deletions
diff --git a/lib/gitlab/rack_attack/instrumented_cache_store.rb b/lib/gitlab/rack_attack/instrumented_cache_store.rb
new file mode 100644
index 00000000000..8cf9082384f
--- /dev/null
+++ b/lib/gitlab/rack_attack/instrumented_cache_store.rb
@@ -0,0 +1,32 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module RackAttack
+ # This class is a proxy for all Redis calls made by RackAttack. All the
+ # calls are instrumented, then redirected to ::Rails.cache. This class
+ # instruments the standard interfaces of ActiveRecord::Cache defined in
+ # https://github.com/rails/rails/blob/v6.0.3.1/activesupport/lib/active_support/cache.rb#L315
+ #
+ # For more information, please see
+ # https://gitlab.com/gitlab-com/gl-infra/scalability/-/issues/751
+ class InstrumentedCacheStore
+ NOTIFICATION_CHANNEL = 'redis.rack_attack'
+
+ delegate :silence!, :mute, to: :@upstream_store
+
+ def initialize(upstream_store: ::Rails.cache, notifier: ActiveSupport::Notifications)
+ @upstream_store = upstream_store
+ @notifier = notifier
+ end
+
+ [:fetch, :read, :read_multi, :write_multi, :fetch_multi, :write, :delete,
+ :exist?, :delete_matched, :increment, :decrement, :cleanup, :clear].each do |interface|
+ define_method interface do |*args, **k_args, &block|
+ @notifier.instrument(NOTIFICATION_CHANNEL, operation: interface) do
+ @upstream_store.public_send(interface, *args, **k_args, &block) # rubocop:disable GitlabSecurity/PublicSend
+ end
+ end
+ end
+ end
+ end
+end