class PrometheusAggregator::FaradayMiddleware

Public Class Methods

new(app, options = {}) click to toggle source
Calls superclass method
# File lib/prometheus_aggregator/faraday_middleware.rb, line 8
def initialize(app, options = {})
  super(app)
  @client = options[:client]
  raise ArgumentError, ":client option is required" unless @client
end

Public Instance Methods

call(request_env) click to toggle source
# File lib/prometheus_aggregator/faraday_middleware.rb, line 14
def call(request_env)
  start_time = Time.now
  @app.call(request_env).on_complete do |response_env|
    duration = Time.now - start_time
    status_code = response_env[:status].to_s

    begin
      @client.counter(
        name: "http_client_requests_total",
        help: "The total number of HTTP requests sent by the client",
        value: 1,
        labels: labels(response_env).merge(code: status_code)
      )

      @client.histogram(
        name: "http_client_request_duration_seconds",
        help: "The HTTP response duration",
        value: duration,
        labels: labels(response_env)
      )
    rescue => err # rubocop:disable Style/RescueStandardError
      # Let's be ultra defensive. Metrics should never break the app.
      PrometheusAggregator.logger.error("FaradayMiddleware: #{err}")
    end
  end
end

Private Instance Methods

labels(response_env) click to toggle source
# File lib/prometheus_aggregator/faraday_middleware.rb, line 43
def labels(response_env)
  {
    method: response_env[:method].to_s,
    host: response_env[:url].host
  }
end