Class: Gitlab::RequestContext

Inherits:
Object
  • Object
show all
Includes:
Utils::StrongMemoize, Singleton
Defined in:
lib/gitlab/request_context.rb

Constant Summary collapse

RequestDeadlineExceeded =
Class.new(StandardError)

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Instance Attribute Details

#client_ipObject

Returns the value of attribute client_ip.



10
11
12
# File 'lib/gitlab/request_context.rb', line 10

def client_ip
  @client_ip
end

#request_start_timeObject

Returns the value of attribute request_start_time.



10
11
12
# File 'lib/gitlab/request_context.rb', line 10

def request_start_time
  @request_start_time
end

#spam_paramsObject

Returns the value of attribute spam_params.



10
11
12
# File 'lib/gitlab/request_context.rb', line 10

def spam_params
  @spam_params
end

#start_thread_cpu_timeObject

Returns the value of attribute start_thread_cpu_time.



10
11
12
# File 'lib/gitlab/request_context.rb', line 10

def start_thread_cpu_time
  @start_thread_cpu_time
end

#thread_memory_allocationsObject

Returns the value of attribute thread_memory_allocations.



10
11
12
# File 'lib/gitlab/request_context.rb', line 10

def thread_memory_allocations
  @thread_memory_allocations
end

Class Method Details

.instanceObject



13
14
15
# File 'lib/gitlab/request_context.rb', line 13

def instance
  Gitlab::SafeRequestStore[:request_context] ||= new
end

.start_request_context(request:) ⇒ Object



17
18
19
20
21
22
23
24
25
26
# File 'lib/gitlab/request_context.rb', line 17

def start_request_context(request:)
  # We need to use Rack::Request to be consistent with Rails due to a Rails bug described in
  # https://gitlab.com/gitlab-org/gitlab-foss/issues/58573#note_149799010
  # Hosts behind a load balancer will only see 127.0.0.1 for the load balancer's IP.
  rack_req = Rack::Request.new(request.env)
  instance.client_ip = rack_req.ip

  instance.spam_params = ::Spam::SpamParams.new_from_request(request: request)
  instance.request_start_time = Gitlab::Metrics::System.real_time
end

.start_thread_contextObject



28
29
30
31
# File 'lib/gitlab/request_context.rb', line 28

def start_thread_context
  instance.start_thread_cpu_time = Gitlab::Metrics::System.thread_cpu_time
  instance.thread_memory_allocations = Gitlab::Memory::Instrumentation.start_thread_memory_allocations
end

Instance Method Details

#ensure_deadline_not_exceeded!Object



42
43
44
45
46
47
48
49
# File 'lib/gitlab/request_context.rb', line 42

def ensure_deadline_not_exceeded!
  return unless enabled?
  return unless request_deadline
  return if Gitlab::Metrics::System.real_time < request_deadline

  raise RequestDeadlineExceeded,
        "Request takes longer than #{max_request_duration_seconds} seconds"
end

#request_deadlineObject



34
35
36
37
38
39
40
# File 'lib/gitlab/request_context.rb', line 34

def request_deadline
  strong_memoize(:request_deadline) do
    next unless request_start_time

    request_start_time + max_request_duration_seconds
  end
end