Module: Errorkit

Defined in:
lib/errorkit.rb,
lib/errorkit/config.rb,
lib/errorkit/engine.rb,
lib/errorkit/sidekiq.rb,
lib/errorkit/version.rb,
lib/errorkit/errors_mailer.rb,
lib/errorkit/ignorable_error.rb,
lib/errorkit/errors_controller.rb,
lib/generators/errorkit/install_generator.rb

Defined Under Namespace

Classes: Config, Engine, ErrorsController, ErrorsMailer, IgnorableError, InstallGenerator, Sidekiq

Constant Summary collapse

VERSION =
"0.2.0"

Class Method Summary collapse

Class Method Details

.application_versionObject



81
82
83
# File 'lib/errorkit.rb', line 81

def self.application_version
  @version ||= `cd #{Rails.root.to_s} && git rev-parse HEAD`.chomp rescue nil
end

.background_error(worker, payload, queue, exception) ⇒ Object



51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
# File 'lib/errorkit.rb', line 51

def self.background_error(worker, payload, queue, exception)
  unless config.errors_class.nil? || config.ignore_exception?(exception)
    begin
      error = config.errors_class.create(
        server: server,
        environment: environment,
        version: application_version,
        exception: exception.class.to_s,
        message: exception.message,
        backtrace: clean_backtrace(exception),
        worker: worker.class.to_s,
        queue: queue.to_s,
        payload: payload.to_json
      )
      send_notification(error)
      error
    rescue Errorkit::IgnorableError
      # noop
    end
  end
end

.clean_backtrace(exception) ⇒ Object



103
104
105
106
107
108
# File 'lib/errorkit.rb', line 103

def self.clean_backtrace(exception)
  backtrace = Rails.backtrace_cleaner.send(:filter, exception.backtrace) if defined?(Rails) && Rails.respond_to?(:backtrace_cleaner)
  backtrace ||= exception.backtrace
  backtrace ||= []
  backtrace.join("\n")
end

.configObject



20
21
22
# File 'lib/errorkit.rb', line 20

def self.config
  @config ||= Errorkit::Config.new
end

.configure(&block) ⇒ Object



10
11
12
13
14
15
16
17
18
# File 'lib/errorkit.rb', line 10

def self.configure(&block)
  config.instance_eval(&block)

  if defined?(Rails)
    Rails.application.config.exceptions_app = lambda do |env|
      Errorkit.server_error(env)
    end
  end
end

.environmentObject



73
74
75
# File 'lib/errorkit.rb', line 73

def self.environment
  Rails.env.to_s if defined?(Rails)
end

.filtered_parameters(request) ⇒ Object



85
86
87
# File 'lib/errorkit.rb', line 85

def self.filtered_parameters(request)
  request.filtered_parameters
end

.filtered_session(request) ⇒ Object



89
90
91
92
93
94
95
96
97
98
99
100
101
# File 'lib/errorkit.rb', line 89

def self.filtered_session(request)
  begin
    require 'action_dispatch/http/parameter_filter'
  rescue LoadError
    return {}
  end
  session = request.session.dup
  session.delete(:session_id)
  session.delete(:_csrf_token)
  param_filter = request.env.fetch("action_dispatch.parameter_filter")
  param_filter = ActionDispatch::Http::ParameterFilter.new(param_filter)
  param_filter.filter(session.to_hash)
end

.send_notification(error) ⇒ Object



110
111
112
113
114
115
# File 'lib/errorkit.rb', line 110

def self.send_notification(error)
  return if config.mailer_recipients.blank? || config.mailer_sender.blank?

  # TODO, throttle
  config.errors_mailer.error_notification(error.id).deliver
end

.serverObject



77
78
79
# File 'lib/errorkit.rb', line 77

def self.server
  @server ||= `hostname`.chomp rescue nil
end

.server_error(env) ⇒ Object



24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
# File 'lib/errorkit.rb', line 24

def self.server_error(env)
  exception = env['action_dispatch.exception']
  unless config.errors_class.nil? || config.ignore_exception?(exception) || config.ignore_agent?(env['HTTP_USER_AGENT'])
    begin
      request = ActionDispatch::Request.new(env)
      error = config.errors_class.create(
        server: server,
        environment: environment,
        version: application_version,
        exception: exception.class.to_s,
        message: exception.message,
        backtrace: clean_backtrace(exception),
        params: filtered_parameters(request).to_json,
        session: filtered_session(request).to_json,
        remote_ip: request.remote_ip.to_s,
        controller: (env['action_controller.instance'].controller_name rescue nil),
        action: (env['action_controller.instance'].action_name rescue nil))

      env['errorkit.notified'] = send_notification(error)
      env['errorkit.error'] = error
    rescue Errorkit::IgnorableError
      # noop
    end
  end
  config.errors_controller.action(:show).call(env)
end