Class: Gitlab::Metrics::Subscribers::ExternalHttp

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

Overview

Class for tracking the total time spent in external HTTP See more at gitlab.com/gitlab-org/labkit-ruby/-/blob/v0.14.0/lib/gitlab-labkit.rb#L18

Constant Summary collapse

DEFAULT_STATUS_CODE =
'undefined'
DETAIL_STORE =
:external_http_detail_store
COUNTER =
:external_http_count
DURATION =
:external_http_duration_s
SLOW_REQUESTS =
:external_http_slow_requests
THRESHOLD_SLOW_REQUEST_S =
5.0
MAX_SLOW_REQUESTS =
10

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.detail_storeObject



21
22
23
# File 'lib/gitlab/metrics/subscribers/external_http.rb', line 21

def self.detail_store
  ::Gitlab::SafeRequestStore[DETAIL_STORE] ||= []
end

.durationObject



25
26
27
# File 'lib/gitlab/metrics/subscribers/external_http.rb', line 25

def self.duration
  Gitlab::SafeRequestStore[DURATION].to_f
end

.payloadObject



45
46
47
48
49
50
51
# File 'lib/gitlab/metrics/subscribers/external_http.rb', line 45

def self.payload
  {
    COUNTER => request_count,
    DURATION => duration,
    SLOW_REQUESTS => top_slowest_requests
  }.compact
end

.request_countObject



29
30
31
# File 'lib/gitlab/metrics/subscribers/external_http.rb', line 29

def self.request_count
  Gitlab::SafeRequestStore[COUNTER].to_i
end

.slow_requestsObject



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

def self.slow_requests
  Gitlab::SafeRequestStore[SLOW_REQUESTS]
end

.top_slowest_requestsObject



37
38
39
40
41
42
43
# File 'lib/gitlab/metrics/subscribers/external_http.rb', line 37

def self.top_slowest_requests
  requests = slow_requests

  return unless requests.present?

  requests.sort_by { |req| req[:duration_s] }.reverse.first(MAX_SLOW_REQUESTS)
end

Instance Method Details

#request(event) ⇒ Object



53
54
55
56
57
58
# File 'lib/gitlab/metrics/subscribers/external_http.rb', line 53

def request(event)
  payload = event.payload
  add_to_detail_store(event.time, payload)
  add_to_request_store(payload)
  expose_metrics(payload)
end