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

instrumented_cache_store.rb « rack_attack « gitlab « lib - gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: 8cf9082384f042c7d4f0b28f44d2011782cb1d44 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
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