Class: Gitlab::Metrics::Subscribers::RackAttack

Inherits:
ActiveSupport::Subscriber
  • Object
show all
Defined in:
lib/gitlab/metrics/subscribers/rack_attack.rb

Overview

Adds logging and metrics for all Rack Attack blocks and throttling events. Instrument the cache operations of RackAttack to use in structured logs. Two fields are exposed:

- rack_attack_redis_count: the number of redis calls triggered by RackAttack in a request.
- rack_attack_redis_duration_s: the total duration of all redis calls triggered by RackAttack in a request.

Constant Summary collapse

INSTRUMENTATION_STORE_KEY =
:rack_attack_instrumentation

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.parameter_filterObject

Rubocop requires this be public



23
24
25
# File 'lib/gitlab/metrics/subscribers/rack_attack.rb', line 23

def self.parameter_filter
  @parameter_filter ||= ActiveSupport::ParameterFilter.new(Rails.application.config.filter_parameters)
end

.payloadObject



15
16
17
18
19
20
# File 'lib/gitlab/metrics/subscribers/rack_attack.rb', line 15

def self.payload
  Gitlab::SafeRequestStore[INSTRUMENTATION_STORE_KEY] ||= {
    rack_attack_redis_count: 0,
    rack_attack_redis_duration_s: 0.0
  }
end

Instance Method Details

#blocklist(event) ⇒ Object



37
38
39
40
# File 'lib/gitlab/metrics/subscribers/rack_attack.rb', line 37

def blocklist(event)
  log_into_auth_logger(event, status: 403)
  report_metrics(event)
end

#safelist(event) ⇒ Object



27
28
29
30
# File 'lib/gitlab/metrics/subscribers/rack_attack.rb', line 27

def safelist(event)
  req = event.payload[:request]
  Gitlab::Instrumentation::Throttle.safelist = req.env['rack.attack.matched']
end

#throttle(event) ⇒ Object



32
33
34
35
# File 'lib/gitlab/metrics/subscribers/rack_attack.rb', line 32

def throttle(event)
  log_into_auth_logger(event, status: 429)
  report_metrics(event)
end

#track(event) ⇒ Object



42
43
44
45
# File 'lib/gitlab/metrics/subscribers/rack_attack.rb', line 42

def track(event)
  log_into_auth_logger(event, status: nil)
  report_metrics(event)
end