class Stasher::LogSubscriber

Public Instance Methods

process_action(ev) click to toggle source
# File lib/stasher/log_subscriber.rb, line 16
def process_action(ev)
  payload = ev.payload

  data      = extract_request(payload)
  data.merge! extract_status(payload)
  data.merge! runtimes(ev)
  data.merge! extract_exception(payload)
  data.merge! extract_current_scope

  log_event 'response', data do |event|
    event.tags << 'exception' if payload[:exception]
  end

  # Clear the scope at the end of the request
  Stasher::CurrentScope.clear!
end
redirect_to(ev) click to toggle source
# File lib/stasher/log_subscriber.rb, line 47
def redirect_to(ev)
  Stasher::CurrentScope.fields[:location] = ev.payload[:location]
end
sql(ev) click to toggle source
# File lib/stasher/log_subscriber.rb, line 33
def sql(ev)
  payload = ev.payload

  return if 'SCHEMA' == payload[:name]
  return if payload[:name].blank?
  return if payload[:name] =~ /ActiveRecord::SessionStore/

  data      = extract_sql(payload)
  data.merge! runtimes(ev)
  data.merge! extract_current_scope

  log_event 'sql', data
end
start_processing(ev) click to toggle source
# File lib/stasher/log_subscriber.rb, line 6
def start_processing(ev)
  # Initialize the scope at the start of the request
  payload = ev.payload

  data      = extract_request(payload)
  data.merge! extract_current_scope

  log_event 'request', data
end

Private Instance Methods

extract_current_scope() click to toggle source
# File lib/stasher/log_subscriber.rb, line 113
def extract_current_scope
  CurrentScope.fields
end
extract_exception(payload) click to toggle source

Monkey patching to enable exception logging

# File lib/stasher/log_subscriber.rb, line 118
def extract_exception(payload)
  if payload[:exception]
    exception, message = payload[:exception]

    Stasher.format_exception(exception, message, $!.backtrace.join("\n"))
  else
    {}
  end
end
extract_format(payload) click to toggle source
# File lib/stasher/log_subscriber.rb, line 86
def extract_format(payload)
  if ::ActionPack::VERSION::MAJOR == 3 && ::ActionPack::VERSION::MINOR == 0
    payload[:formats].first
  else
    payload[:format]
  end
end
extract_parms(payload) click to toggle source
# File lib/stasher/log_subscriber.rb, line 78
def extract_parms(payload)
  payload[:params].except(*ActionController::LogSubscriber::INTERNAL_PARAMS) if payload.include?(:params)
end
extract_path(payload) click to toggle source
# File lib/stasher/log_subscriber.rb, line 82
def extract_path(payload)
  payload[:path].split("?").first
end
extract_request(payload) click to toggle source
# File lib/stasher/log_subscriber.rb, line 66
def extract_request(payload)
  {
    :method => payload[:method],
    :ip => payload[:ip],
    :params => extract_parms(payload),
    :path => extract_path(payload),
    :format => extract_format(payload),
    :controller => payload[:params]['controller'],
    :action => payload[:params]['action']
  }
end
extract_sql(payload) click to toggle source
# File lib/stasher/log_subscriber.rb, line 59
def extract_sql(payload)
  {
    :name => payload[:name],
    :sql => payload[:sql].squeeze(' '),
  }
end
extract_status(payload) click to toggle source
# File lib/stasher/log_subscriber.rb, line 94
def extract_status(payload)
  if payload[:status]
    { :status => payload[:status].to_i }
  else
    { :status => 0 }
  end
end
log_event(type, data) { |event| ... } click to toggle source
# File lib/stasher/log_subscriber.rb, line 53
def log_event(type, data)
  event = LogStash::Event.new('@fields' => data, '@tags' => [type], '@source' => Stasher.source)
  yield(event) if block_given?
  Stasher.logger << event.to_json + "\n"
end
runtimes(event) click to toggle source
# File lib/stasher/log_subscriber.rb, line 102
def runtimes(event)
  {
    :duration => event.duration,
    :view => event.payload[:view_runtime],
    :db => event.payload[:db_runtime]
  }.inject({}) do |runtimes, (name, runtime)|
    runtimes[name] = runtime.to_f.round(2) if runtime
    runtimes
  end
end