diff options
Diffstat (limited to 'lib/peek/views/external_http.rb')
-rw-r--r-- | lib/peek/views/external_http.rb | 101 |
1 files changed, 101 insertions, 0 deletions
diff --git a/lib/peek/views/external_http.rb b/lib/peek/views/external_http.rb new file mode 100644 index 00000000000..b925e3db7b6 --- /dev/null +++ b/lib/peek/views/external_http.rb @@ -0,0 +1,101 @@ +# frozen_string_literal: true + +module Peek + module Views + class ExternalHttp < DetailedView + DEFAULT_THRESHOLDS = { + calls: 10, + duration: 1000, + individual_call: 100 + }.freeze + + THRESHOLDS = { + production: { + calls: 10, + duration: 1000, + individual_call: 100 + } + }.freeze + + def key + 'external-http' + end + + def results + super.merge(calls: calls) + end + + def self.thresholds + @thresholds ||= THRESHOLDS.fetch(Rails.env.to_sym, DEFAULT_THRESHOLDS) + end + + def format_call_details(call) + full_path = generate_path(call) + super.merge( + label: "#{call[:method]} #{full_path}", + code: code(call), + proxy: proxy(call), + error: error(call) + ) + end + + private + + def duration + ::Gitlab::Metrics::Subscribers::ExternalHttp.duration * 1000 + end + + def calls + ::Gitlab::Metrics::Subscribers::ExternalHttp.request_count + end + + def call_details + ::Gitlab::Metrics::Subscribers::ExternalHttp.detail_store + end + + def proxy(call) + if call[:proxy_host].present? + "Proxied via #{call[:proxy_host]}:#{call[:proxy_port]}" + else + nil + end + end + + def code(call) + if call[:code].present? + "Response status: #{call[:code]}" + else + nil + end + end + + def error(call) + if call[:exception_object].present? + "Exception: #{call[:exception_object]}" + else + nil + end + end + + def generate_path(call) + uri = URI("") + uri.scheme = call[:scheme] + # The host can be a domain, IPv4 or IPv6. + # Ruby handle IPv6 for us at + # https://github.com/ruby/ruby/blob/v2_6_0/lib/uri/generic.rb#L662 + uri.hostname = call[:host] + uri.port = call[:port] + uri.path = call[:path] + uri.query = generate_query(call[:query]) + + uri.to_s + rescue StandardError + 'unknown' + end + + def generate_query(query_string) + query_string.is_a?(Hash) ? query_string.to_query : query_string.to_s + end + end + end +end |