class Faraday::LogfmtLogger::Middleware

Constants

DEFAULT_OPTIONS

Public Class Methods

new(app, logger = nil, options = {}) { |self| ... } click to toggle source
Calls superclass method
# File lib/faraday/logfmt_logger/middleware.rb, line 12
def initialize(app, logger = nil, options = {})
  super(app)
  @logger = logger || begin
    require "logger"
    ::Logger.new(STDOUT)
  end

  @filter = []
  @options = DEFAULT_OPTIONS.merge(options)
  yield self if block_given?
end

Public Instance Methods

call(env) click to toggle source
Calls superclass method
# File lib/faraday/logfmt_logger/middleware.rb, line 26
def call(env)
  info("request") do
    log_entry = {
      "source": "upstream-request",
      "method": env.method.upcase,
      "url": apply_filters(env.url.to_s),
      "request_id": request_id,
    }.merge(app_metadata)

    Twingly::StringUtilities.logfmt(log_entry)
  end
  debug_log_request(env)
  super
end
filter(filter_word, filter_replacement) click to toggle source

rubocop:disable all

# File lib/faraday/logfmt_logger/middleware.rb, line 58
def filter(filter_word, filter_replacement)
  @filter.push([ filter_word, filter_replacement ])
end
on_complete(env) click to toggle source
# File lib/faraday/logfmt_logger/middleware.rb, line 41
def on_complete(env)
  info("response") do
    log_entry = {
      "source": "upstream-response",
      "status": env.status,
      "request_id": request_id,
    }.merge(app_metadata)

    Twingly::StringUtilities.logfmt(log_entry)
  end
  debug_log_response(env)
end

Private Instance Methods

app_metadata() click to toggle source
# File lib/faraday/logfmt_logger/middleware.rb, line 69
def app_metadata
  {
    "release": Twingly::HTTP::Heroku.release_version,
  }
end
apply_filters(output) click to toggle source
# File lib/faraday/logfmt_logger/middleware.rb, line 117
def apply_filters(output)
  @filter.each do |pattern, replacement|
    output = output.to_s.gsub(pattern, replacement)
  end
  output
end
debug_log_request(env) click to toggle source

rubocop:disable all

# File lib/faraday/logfmt_logger/middleware.rb, line 76
def debug_log_request(env)
  debug('request') { apply_filters( dump_headers env.request_headers ) } if log_headers?(:request)
  debug('request') { apply_filters( dump_body(env[:body]) ) } if env[:body] && log_body?(:request)
end
debug_log_response(env) click to toggle source
# File lib/faraday/logfmt_logger/middleware.rb, line 81
def debug_log_response(env)
  debug('response') { apply_filters( dump_headers env.response_headers ) } if log_headers?(:response)
  debug('response') { apply_filters( dump_body env[:body] ) } if env[:body] && log_body?(:response)
end
dump_body(body) click to toggle source
# File lib/faraday/logfmt_logger/middleware.rb, line 90
def dump_body(body)
  if body.respond_to?(:to_str)
    body.to_str
  else
    pretty_inspect(body)
  end
end
dump_headers(headers) click to toggle source
# File lib/faraday/logfmt_logger/middleware.rb, line 86
def dump_headers(headers)
  headers.map { |k, v| "#{k}: #{v.inspect}" }.join("\n")
end
log_body?(type) click to toggle source
# File lib/faraday/logfmt_logger/middleware.rb, line 110
def log_body?(type)
  case @options[:bodies]
  when Hash then @options[:bodies][type]
  else @options[:bodies]
  end
end
log_headers?(type) click to toggle source
# File lib/faraday/logfmt_logger/middleware.rb, line 103
def log_headers?(type)
  case @options[:headers]
  when Hash then @options[:headers][type]
  else @options[:headers]
  end
end
pretty_inspect(body) click to toggle source
# File lib/faraday/logfmt_logger/middleware.rb, line 98
def pretty_inspect(body)
  require 'pp' unless body.respond_to?(:pretty_inspect)
  body.pretty_inspect
end
request_id() click to toggle source

rubocop:enable all

# File lib/faraday/logfmt_logger/middleware.rb, line 65
def request_id
  @options[:request_id]
end