/lib/peek/views/external_http.rb
https://gitlab.com/jacopo-beschi/gitlab-ce · Ruby · 101 lines · 81 code · 16 blank · 4 comment · 3 complexity · fd28d56fb07a571a18468bf065631ceb MD5 · raw file
- # 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