class Epilog::Rails::ActionControllerSubscriber

Constants

RAILS_PARAMS

Public Instance Methods

halted_callback(event) click to toggle source
# File lib/epilog/rails/action_controller_subscriber.rb, line 41
def halted_callback(event)
  info do
    basic_message(event, 'Filter chain halted as ' \
      "#{event.payload[:filter].inspect} rendered or redirected")
  end
end
process_action(*) click to toggle source
# File lib/epilog/rails/action_controller_subscriber.rb, line 26
def process_action(*)
end
process_request(event) click to toggle source
# File lib/epilog/rails/action_controller_subscriber.rb, line 18
def process_request(event)
  log_end(event)
  pop_context
end
redirect_to(event) click to toggle source
# File lib/epilog/rails/action_controller_subscriber.rb, line 37
def redirect_to(event)
  info { basic_message(event, "Redirect > #{event.payload[:location]}") }
end
request_received(event) click to toggle source
# File lib/epilog/rails/action_controller_subscriber.rb, line 9
def request_received(event)
  push_context(
    { request: short_request_hash(event) }
    .merge(event.payload[:context])
  )

  log_start(event) if config.double_request_logs
end
send_data(event) click to toggle source
# File lib/epilog/rails/action_controller_subscriber.rb, line 29
def send_data(event)
  info { basic_message(event, "Sent data #{event.payload[:filename]}") }
end
send_file(event) click to toggle source
# File lib/epilog/rails/action_controller_subscriber.rb, line 33
def send_file(event)
  info { basic_message(event, "Sent file #{event.payload[:path]}") }
end
start_processing(*) click to toggle source
# File lib/epilog/rails/action_controller_subscriber.rb, line 23
def start_processing(*)
end
unpermitted_parameters(event) click to toggle source
# File lib/epilog/rails/action_controller_subscriber.rb, line 48
def unpermitted_parameters(event)
  debug do
    basic_message(event, 'Unpermitted parameters: ' \
      "#{event.payload[:keys].join(', ')}")
  end
end

Private Instance Methods

basic_message(event, message) click to toggle source
# File lib/epilog/rails/action_controller_subscriber.rb, line 160
def basic_message(event, message)
  {
    message: message,
    metrics: process_metrics(duration: event.duration)
  }
end
log_end(event) click to toggle source
# File lib/epilog/rails/action_controller_subscriber.rb, line 82
def log_end(event) # rubocop:disable MethodLength
  request = if config.double_request_logs
    short_request_hash(event)
  else
    request_hash(event)
  end

  info do
    {
      message: response_string(event),
      request: request,
      response: response_hash(event),
      metrics: process_metrics(event.payload[:metrics]
        .merge(request_runtime: event.duration.round(2)))
    }
  end
end
log_start(event) click to toggle source
# File lib/epilog/rails/action_controller_subscriber.rb, line 73
def log_start(event)
  info do
    {
      message: "#{request_string(event)} started",
      request: request_hash(event)
    }
  end
end
normalize_status(event) click to toggle source
# File lib/epilog/rails/action_controller_subscriber.rb, line 150
def normalize_status(event)
  payload = event.payload
  status = payload[:response].status
  if status.nil? && payload[:exception].present?
    status = ActionDispatch::ExceptionWrapper
      .status_code_for_exception(payload[:exception].first)
  end
  status
end
process_metrics(metrics) click to toggle source
# File lib/epilog/rails/action_controller_subscriber.rb, line 167
def process_metrics(metrics)
  metrics.each_with_object({}) do |(key, value), obj|
    next if value.nil?

    obj[key] = value.round(2) if value.is_a?(Numeric)
  end
end
rails_params() click to toggle source
# File lib/epilog/rails/action_controller_subscriber.rb, line 175
def rails_params
  @rails_params ||= RAILS_PARAMS + RAILS_PARAMS.map(&:to_s)
end
request_hash(event) click to toggle source
# File lib/epilog/rails/action_controller_subscriber.rb, line 100
def request_hash(event) # rubocop:disable AbcSize, MethodLength
  request = event.payload[:request]
  param_filter = request.send(:parameter_filter)

  {
    id: request.uuid,
    ip: request.remote_ip,
    host: request.host,
    protocol: request.protocol.to_s.gsub('://', ''),
    method: request.request_method,
    port: request.port,
    path: request.path,
    query: param_filter.filter(request.query_parameters),
    cookies: param_filter.filter(request.cookies),
    headers: param_filter.filter(
      request.headers.to_h.keep_if do |key, _value|
        key =~ ActionDispatch::Http::Headers::HTTP_HEADER
      end
    ),
    params: request.filtered_parameters.except(*rails_params),
    format: request.format.try(:ref),
    controller: event.payload[:controller],
    action: event.payload[:action]
  }
end
request_string(event) click to toggle source
# File lib/epilog/rails/action_controller_subscriber.rb, line 135
def request_string(event)
  request = event.payload[:request]
  "#{request.request_method} #{request.path}"
end
response_hash(event) click to toggle source
# File lib/epilog/rails/action_controller_subscriber.rb, line 140
def response_hash(event)
  { status: normalize_status(event) }
end
response_string(event) click to toggle source
# File lib/epilog/rails/action_controller_subscriber.rb, line 144
def response_string(event)
  status = normalize_status(event)
  status_string = Rack::Utils::HTTP_STATUS_CODES[status]
  "#{request_string(event)} > #{status} #{status_string}"
end
short_request_hash(event) click to toggle source
# File lib/epilog/rails/action_controller_subscriber.rb, line 126
def short_request_hash(event)
  request = event.payload[:request]
  {
    id: request.uuid,
    method: request.method,
    path: request.path
  }
end