exception_notification 4.2.0 → 4.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (134) hide show
  1. checksums.yaml +5 -5
  2. data/Appraisals +4 -3
  3. data/CHANGELOG.rdoc +57 -1
  4. data/CONTRIBUTING.md +21 -2
  5. data/Gemfile +3 -1
  6. data/README.md +106 -789
  7. data/Rakefile +4 -2
  8. data/docs/notifiers/campfire.md +50 -0
  9. data/docs/notifiers/custom.md +42 -0
  10. data/docs/notifiers/datadog.md +51 -0
  11. data/docs/notifiers/email.md +195 -0
  12. data/docs/notifiers/google_chat.md +31 -0
  13. data/docs/notifiers/hipchat.md +66 -0
  14. data/docs/notifiers/irc.md +97 -0
  15. data/docs/notifiers/mattermost.md +115 -0
  16. data/docs/notifiers/slack.md +161 -0
  17. data/docs/notifiers/sns.md +37 -0
  18. data/docs/notifiers/teams.md +54 -0
  19. data/docs/notifiers/webhook.md +60 -0
  20. data/examples/sample_app.rb +56 -0
  21. data/examples/sinatra/Gemfile +8 -6
  22. data/examples/sinatra/config.ru +3 -1
  23. data/examples/sinatra/sinatra_app.rb +19 -11
  24. data/exception_notification.gemspec +30 -23
  25. data/gemfiles/rails4_0.gemfile +1 -2
  26. data/gemfiles/rails4_1.gemfile +1 -2
  27. data/gemfiles/rails4_2.gemfile +1 -2
  28. data/gemfiles/rails5_0.gemfile +1 -2
  29. data/gemfiles/rails5_1.gemfile +7 -0
  30. data/gemfiles/rails5_2.gemfile +7 -0
  31. data/gemfiles/rails6_0.gemfile +7 -0
  32. data/lib/exception_notification.rb +3 -0
  33. data/lib/exception_notification/rack.rb +34 -27
  34. data/lib/exception_notification/rails.rb +3 -0
  35. data/lib/exception_notification/resque.rb +10 -10
  36. data/lib/exception_notification/sidekiq.rb +10 -12
  37. data/lib/exception_notification/version.rb +5 -0
  38. data/lib/exception_notifier.rb +79 -11
  39. data/lib/exception_notifier/base_notifier.rb +10 -5
  40. data/lib/exception_notifier/campfire_notifier.rb +14 -9
  41. data/lib/exception_notifier/datadog_notifier.rb +156 -0
  42. data/lib/exception_notifier/email_notifier.rb +78 -87
  43. data/lib/exception_notifier/google_chat_notifier.rb +44 -0
  44. data/lib/exception_notifier/hipchat_notifier.rb +16 -10
  45. data/lib/exception_notifier/irc_notifier.rb +38 -31
  46. data/lib/exception_notifier/mattermost_notifier.rb +54 -131
  47. data/lib/exception_notifier/modules/backtrace_cleaner.rb +2 -2
  48. data/lib/exception_notifier/modules/error_grouping.rb +87 -0
  49. data/lib/exception_notifier/modules/formatter.rb +121 -0
  50. data/lib/exception_notifier/notifier.rb +9 -6
  51. data/lib/exception_notifier/slack_notifier.rb +75 -32
  52. data/lib/exception_notifier/sns_notifier.rb +86 -0
  53. data/lib/exception_notifier/teams_notifier.rb +200 -0
  54. data/lib/exception_notifier/views/exception_notifier/_backtrace.html.erb +1 -1
  55. data/lib/exception_notifier/views/exception_notifier/_environment.text.erb +1 -1
  56. data/lib/exception_notifier/views/exception_notifier/_request.text.erb +1 -1
  57. data/lib/exception_notifier/views/exception_notifier/background_exception_notification.text.erb +9 -9
  58. data/lib/exception_notifier/views/exception_notifier/exception_notification.html.erb +2 -4
  59. data/lib/exception_notifier/views/exception_notifier/exception_notification.text.erb +2 -2
  60. data/lib/exception_notifier/webhook_notifier.rb +19 -16
  61. data/lib/generators/exception_notification/install_generator.rb +11 -5
  62. data/lib/generators/exception_notification/templates/{exception_notification.rb → exception_notification.rb.erb} +14 -12
  63. data/test/exception_notification/rack_test.rb +90 -4
  64. data/test/exception_notification/resque_test.rb +54 -0
  65. data/test/exception_notifier/campfire_notifier_test.rb +66 -39
  66. data/test/exception_notifier/datadog_notifier_test.rb +153 -0
  67. data/test/exception_notifier/email_notifier_test.rb +301 -145
  68. data/test/exception_notifier/google_chat_notifier_test.rb +185 -0
  69. data/test/exception_notifier/hipchat_notifier_test.rb +112 -65
  70. data/test/exception_notifier/irc_notifier_test.rb +48 -30
  71. data/test/exception_notifier/mattermost_notifier_test.rb +218 -55
  72. data/test/exception_notifier/modules/error_grouping_test.rb +167 -0
  73. data/test/exception_notifier/modules/formatter_test.rb +152 -0
  74. data/test/exception_notifier/sidekiq_test.rb +9 -6
  75. data/test/exception_notifier/slack_notifier_test.rb +109 -59
  76. data/test/exception_notifier/sns_notifier_test.rb +123 -0
  77. data/test/exception_notifier/teams_notifier_test.rb +92 -0
  78. data/test/exception_notifier/webhook_notifier_test.rb +68 -38
  79. data/test/exception_notifier_test.rb +220 -37
  80. data/test/support/exception_notifier_helper.rb +14 -0
  81. data/test/{dummy/app → support}/views/exception_notifier/_new_bkg_section.html.erb +0 -0
  82. data/test/{dummy/app → support}/views/exception_notifier/_new_bkg_section.text.erb +0 -0
  83. data/test/{dummy/app → support}/views/exception_notifier/_new_section.html.erb +0 -0
  84. data/test/{dummy/app → support}/views/exception_notifier/_new_section.text.erb +0 -0
  85. data/test/test_helper.rb +14 -13
  86. metadata +154 -162
  87. data/test/dummy/.gitignore +0 -4
  88. data/test/dummy/Rakefile +0 -7
  89. data/test/dummy/app/controllers/application_controller.rb +0 -3
  90. data/test/dummy/app/controllers/posts_controller.rb +0 -30
  91. data/test/dummy/app/helpers/application_helper.rb +0 -2
  92. data/test/dummy/app/helpers/posts_helper.rb +0 -2
  93. data/test/dummy/app/models/post.rb +0 -2
  94. data/test/dummy/app/views/layouts/application.html.erb +0 -14
  95. data/test/dummy/app/views/posts/_form.html.erb +0 -0
  96. data/test/dummy/app/views/posts/new.html.erb +0 -0
  97. data/test/dummy/app/views/posts/show.html.erb +0 -0
  98. data/test/dummy/config.ru +0 -4
  99. data/test/dummy/config/application.rb +0 -42
  100. data/test/dummy/config/boot.rb +0 -6
  101. data/test/dummy/config/database.yml +0 -22
  102. data/test/dummy/config/environment.rb +0 -17
  103. data/test/dummy/config/environments/development.rb +0 -25
  104. data/test/dummy/config/environments/production.rb +0 -50
  105. data/test/dummy/config/environments/test.rb +0 -38
  106. data/test/dummy/config/initializers/backtrace_silencers.rb +0 -7
  107. data/test/dummy/config/initializers/inflections.rb +0 -10
  108. data/test/dummy/config/initializers/mime_types.rb +0 -5
  109. data/test/dummy/config/initializers/secret_token.rb +0 -8
  110. data/test/dummy/config/initializers/session_store.rb +0 -8
  111. data/test/dummy/config/locales/en.yml +0 -5
  112. data/test/dummy/config/routes.rb +0 -3
  113. data/test/dummy/db/migrate/20110729022608_create_posts.rb +0 -15
  114. data/test/dummy/db/schema.rb +0 -24
  115. data/test/dummy/db/seeds.rb +0 -7
  116. data/test/dummy/lib/tasks/.gitkeep +0 -0
  117. data/test/dummy/public/404.html +0 -26
  118. data/test/dummy/public/422.html +0 -26
  119. data/test/dummy/public/500.html +0 -26
  120. data/test/dummy/public/favicon.ico +0 -0
  121. data/test/dummy/public/images/rails.png +0 -0
  122. data/test/dummy/public/index.html +0 -239
  123. data/test/dummy/public/javascripts/application.js +0 -2
  124. data/test/dummy/public/javascripts/controls.js +0 -965
  125. data/test/dummy/public/javascripts/dragdrop.js +0 -974
  126. data/test/dummy/public/javascripts/effects.js +0 -1123
  127. data/test/dummy/public/javascripts/prototype.js +0 -6001
  128. data/test/dummy/public/javascripts/rails.js +0 -191
  129. data/test/dummy/public/robots.txt +0 -5
  130. data/test/dummy/public/stylesheets/.gitkeep +0 -0
  131. data/test/dummy/public/stylesheets/scaffold.css +0 -56
  132. data/test/dummy/script/rails +0 -6
  133. data/test/dummy/test/functional/posts_controller_test.rb +0 -218
  134. data/test/dummy/test/test_helper.rb +0 -7
@@ -0,0 +1,60 @@
1
+ ### WebHook notifier
2
+
3
+ This notifier ships notifications over the HTTP protocol.
4
+
5
+ #### Usage
6
+
7
+ Just add the [HTTParty](https://github.com/jnunemaker/httparty) gem to your `Gemfile`:
8
+
9
+ ```ruby
10
+ gem 'httparty'
11
+ ```
12
+
13
+ To configure it, you need to set the `url` option, like this:
14
+
15
+ ```ruby
16
+ Rails.application.config.middleware.use ExceptionNotification::Rack,
17
+ email: {
18
+ email_prefix: '[PREFIX] ',
19
+ sender_address: %{"notifier" <notifier@example.com>},
20
+ exception_recipients: %w{exceptions@example.com}
21
+ },
22
+ webhook: {
23
+ url: 'http://domain.com:5555/hubot/path'
24
+ }
25
+ ```
26
+
27
+ By default, the WebhookNotifier will call the URLs using the POST method. But, you can change this using the `http_method` option.
28
+
29
+ ```ruby
30
+ Rails.application.config.middleware.use ExceptionNotification::Rack,
31
+ email: {
32
+ email_prefix: '[PREFIX] ',
33
+ sender_address: %{"notifier" <notifier@example.com>},
34
+ exception_recipients: %w{exceptions@example.com}
35
+ },
36
+ webhook: {
37
+ url: 'http://domain.com:5555/hubot/path',
38
+ http_method: :get
39
+ }
40
+ ```
41
+
42
+ Besides the `url` and `http_method` options, all the other options are passed directly to HTTParty. Thus, if the HTTP server requires authentication, you can include the following options:
43
+
44
+ ```ruby
45
+ Rails.application.config.middleware.use ExceptionNotification::Rack,
46
+ email: {
47
+ email_prefix: '[PREFIX] ',
48
+ sender_address: %{"notifier" <notifier@example.com>},
49
+ exception_recipients: %w{exceptions@example.com}
50
+ },
51
+ webhook: {
52
+ url: 'http://domain.com:5555/hubot/path',
53
+ basic_auth: {
54
+ username: 'alice',
55
+ password: 'password'
56
+ }
57
+ }
58
+ ```
59
+
60
+ For more HTTParty options, check out the [documentation](https://github.com/jnunemaker/httparty).
@@ -0,0 +1,56 @@
1
+ # frozen_string_literal: true
2
+
3
+ # -------------------------------------------
4
+ # To run the application: ruby examples/sample_app.rb
5
+ # -------------------------------------------
6
+
7
+ require 'bundler/inline'
8
+
9
+ gemfile do
10
+ source 'https://rubygems.org'
11
+
12
+ gem 'rails', '5.0.0'
13
+ gem 'exception_notification', '4.3.0'
14
+ gem 'httparty', '0.15.7'
15
+ end
16
+
17
+ class SampleApp < Rails::Application
18
+ config.middleware.use ExceptionNotification::Rack,
19
+ webhook: {
20
+ url: 'http://example.com'
21
+ }
22
+
23
+ config.secret_key_base = 'my secret key base'
24
+
25
+ Rails.logger = Logger.new($stdout)
26
+
27
+ routes.draw do
28
+ get '/', to: 'exceptions#index'
29
+ end
30
+ end
31
+
32
+ require 'action_controller/railtie'
33
+
34
+ class ExceptionsController < ActionController::Base
35
+ def index
36
+ raise 'Sample exception raised, you should receive a notification!'
37
+ end
38
+ end
39
+
40
+ require 'minitest/autorun'
41
+
42
+ class Test < Minitest::Test
43
+ include Rack::Test::Methods
44
+
45
+ def test_raise_exception
46
+ get '/'
47
+
48
+ assert last_response.server_error?
49
+ end
50
+
51
+ private
52
+
53
+ def app
54
+ Rails.application
55
+ end
56
+ end
@@ -1,8 +1,10 @@
1
- source "https://rubygems.org"
1
+ # frozen_string_literal: true
2
2
 
3
- gem "exception_notification", path: "../../"
3
+ source 'https://rubygems.org'
4
4
 
5
- gem "thin", "~> 1.5.1"
6
- gem "sinatra", "~> 1.3.5"
7
- gem "foreman"
8
- gem "mailcatcher"
5
+ gem 'exception_notification', path: '../../'
6
+
7
+ gem 'foreman'
8
+ gem 'mailcatcher'
9
+ gem 'sinatra', '~> 1.3.5'
10
+ gem 'thin', '~> 1.5.1'
@@ -1,3 +1,5 @@
1
- require ::File.expand_path('../sinatra_app', __FILE__)
1
+ # frozen_string_literal: true
2
+
3
+ require ::File.expand_path('../sinatra_app', __FILE__)
2
4
 
3
5
  run SinatraApp
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'rubygems'
2
4
  require 'bundler/setup'
3
5
  require 'sinatra/base'
@@ -5,27 +7,33 @@ require 'exception_notification'
5
7
 
6
8
  class SinatraApp < Sinatra::Base
7
9
  use Rack::Config do |env|
8
- env["action_dispatch.parameter_filter"] = [:password] # This is highly recommended. It will prevent the ExceptionNotification email from including your users' passwords
10
+ # This is highly recommended. It will prevent the ExceptionNotification email from including your users' passwords
11
+ env['action_dispatch.parameter_filter'] = [:password]
9
12
  end
10
13
 
11
14
  use ExceptionNotification::Rack,
12
- :email => {
13
- :email_prefix => "[Example] ",
14
- :sender_address => %{"notifier" <notifier@example.com>},
15
- :exception_recipients => %w{exceptions@example.com},
16
- :smtp_settings => { :address => "localhost", :port => 1025 }
17
- }
15
+ email: {
16
+ email_prefix: '[Example] ',
17
+ sender_address: %("notifier" <notifier@example.com>),
18
+ exception_recipients: %w[exceptions@example.com],
19
+ smtp_settings: {
20
+ address: 'localhost',
21
+ port: 1025
22
+ }
23
+ }
18
24
 
19
25
  get '/' do
20
26
  raise StandardError, "ERROR: #{params[:error]}" unless params[:error].blank?
21
- 'Everything is fine! Now, lets break things clicking <a href="/?error=ops"> here </a>. Dont forget to see the emails at <a href="http://localhost:1080">mailcatcher</a> !'
27
+
28
+ 'Everything is fine! Now, lets break things clicking <a href="/?error=ops"> here </a>.' \
29
+ 'Dont forget to see the emails at <a href="http://localhost:1080">mailcatcher</a> !'
22
30
  end
23
31
 
24
32
  get '/background_notification' do
25
33
  begin
26
- 1/0
27
- rescue Exception => e
28
- ExceptionNotifier.notify_exception(e, :data => {:msg => "Cannot divide by zero!"})
34
+ 1 / 0
35
+ rescue StandardError => e
36
+ ExceptionNotifier.notify_exception(e, data: { msg: 'Cannot divide by zero!' })
29
37
  end
30
38
  'Check email at <a href="http://localhost:1080">mailcatcher</a>.'
31
39
  end
@@ -1,14 +1,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ require File.expand_path('lib/exception_notification/version', __dir__)
4
+
1
5
  Gem::Specification.new do |s|
2
6
  s.name = 'exception_notification'
3
- s.version = '4.2.0'
4
- s.authors = ["Jamis Buck", "Josh Peek"]
5
- s.date = %q{2016-07-12}
6
- s.summary = "Exception notification for Rails apps"
7
- s.homepage = "https://smartinez87.github.io/exception_notification/"
8
- s.email = "smartinez87@gmail.com"
9
- s.license = "MIT"
7
+ s.version = ExceptionNotification::VERSION
8
+ s.authors = ['Jamis Buck', 'Josh Peek']
9
+ s.date = '2020-06-23'
10
+ s.summary = 'Exception notification for Rails apps'
11
+ s.homepage = 'https://smartinez87.github.io/exception_notification/'
12
+ s.email = 'smartinez87@gmail.com'
13
+ s.license = 'MIT'
10
14
 
11
- s.required_ruby_version = '>= 2.0'
15
+ s.required_ruby_version = '>= 2.3'
12
16
  s.required_rubygems_version = '>= 1.8.11'
13
17
 
14
18
  s.files = `git ls-files`.split("\n")
@@ -16,20 +20,23 @@ Gem::Specification.new do |s|
16
20
  s.test_files = `git ls-files -- test`.split("\n")
17
21
  s.require_path = 'lib'
18
22
 
19
- s.add_dependency("actionmailer", ">= 4.0", "< 6")
20
- s.add_dependency("activesupport", ">= 4.0", "< 6")
23
+ s.add_dependency('actionmailer', '>= 4.0', '< 7')
24
+ s.add_dependency('activesupport', '>= 4.0', '< 7')
21
25
 
22
- s.add_development_dependency "rails", ">= 4.0", "< 6"
23
- s.add_development_dependency "resque", "~> 1.2.0"
24
- # Sidekiq 3.2.2 does not support Ruby 1.9.
25
- s.add_development_dependency "sidekiq", "~> 3.0.0", "< 3.2.2"
26
- s.add_development_dependency "tinder", "~> 1.8"
27
- s.add_development_dependency "httparty", "~> 0.10.2"
28
- s.add_development_dependency "mocha", ">= 0.13.0"
29
- s.add_development_dependency "sqlite3", ">= 1.3.4"
30
- s.add_development_dependency "coveralls", "~> 0.8.2"
31
- s.add_development_dependency "appraisal", "~> 2.0.0"
32
- s.add_development_dependency "hipchat", ">= 1.0.0"
33
- s.add_development_dependency "carrier-pigeon", ">= 0.7.0"
34
- s.add_development_dependency "slack-notifier", ">= 1.0.0"
26
+ s.add_development_dependency 'appraisal', '~> 2.2.0'
27
+ s.add_development_dependency 'aws-sdk-sns', '~> 1'
28
+ s.add_development_dependency 'carrier-pigeon', '>= 0.7.0'
29
+ s.add_development_dependency 'coveralls', '~> 0.8.2'
30
+ s.add_development_dependency 'dogapi', '>= 1.23.0'
31
+ s.add_development_dependency 'hipchat', '>= 1.0.0'
32
+ s.add_development_dependency 'httparty', '~> 0.10.2'
33
+ s.add_development_dependency 'mocha', '>= 0.13.0'
34
+ s.add_development_dependency 'mock_redis', '~> 0.19.0'
35
+ s.add_development_dependency 'rails', '>= 4.0', '< 7'
36
+ s.add_development_dependency 'resque', '~> 1.8.0'
37
+ s.add_development_dependency 'rubocop', '0.78.0'
38
+ s.add_development_dependency 'sidekiq', '>= 5.0.4'
39
+ s.add_development_dependency 'slack-notifier', '>= 1.0.0'
40
+ s.add_development_dependency 'timecop', '~> 0.9.0'
41
+ s.add_development_dependency 'tinder', '~> 1.8'
35
42
  end
@@ -3,6 +3,5 @@
3
3
  source "https://rubygems.org"
4
4
 
5
5
  gem "rails", "~> 4.0.5"
6
- gem "sqlite3"
7
6
 
8
- gemspec :path => "../"
7
+ gemspec path: "../"
@@ -3,6 +3,5 @@
3
3
  source "https://rubygems.org"
4
4
 
5
5
  gem "rails", "~> 4.1.1"
6
- gem "sqlite3"
7
6
 
8
- gemspec :path => "../"
7
+ gemspec path: "../"
@@ -3,6 +3,5 @@
3
3
  source "https://rubygems.org"
4
4
 
5
5
  gem "rails", "~> 4.2.0"
6
- gem "sqlite3"
7
6
 
8
- gemspec :path => "../"
7
+ gemspec path: "../"
@@ -3,6 +3,5 @@
3
3
  source "https://rubygems.org"
4
4
 
5
5
  gem "rails", "~> 5.0.0"
6
- gem "sqlite3"
7
6
 
8
- gemspec :path => "../"
7
+ gemspec path: "../"
@@ -0,0 +1,7 @@
1
+ # This file was generated by Appraisal
2
+
3
+ source "https://rubygems.org"
4
+
5
+ gem "rails", "~> 5.1.0"
6
+
7
+ gemspec path: "../"
@@ -0,0 +1,7 @@
1
+ # This file was generated by Appraisal
2
+
3
+ source "https://rubygems.org"
4
+
5
+ gem "rails", "~> 5.2.0"
6
+
7
+ gemspec path: "../"
@@ -0,0 +1,7 @@
1
+ # This file was generated by Appraisal
2
+
3
+ source "https://rubygems.org"
4
+
5
+ gem "rails", "~> 6.0.0"
6
+
7
+ gemspec path: "../"
@@ -1,5 +1,8 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'exception_notifier'
2
4
  require 'exception_notification/rack'
5
+ require 'exception_notification/version'
3
6
 
4
7
  module ExceptionNotification
5
8
  # Alternative way to setup ExceptionNotification.
@@ -1,59 +1,66 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module ExceptionNotification
2
4
  class Rack
3
- class CascadePassException < Exception; end
5
+ class CascadePassException < RuntimeError; end
4
6
 
5
7
  def initialize(app, options = {})
6
8
  @app = app
7
9
 
8
- ExceptionNotifier.ignored_exceptions = options.delete(:ignore_exceptions) if options.key?(:ignore_exceptions)
10
+ ExceptionNotifier.tap do |en|
11
+ en.ignored_exceptions = options.delete(:ignore_exceptions) if options.key?(:ignore_exceptions)
12
+ en.error_grouping = options.delete(:error_grouping) if options.key?(:error_grouping)
13
+ en.error_grouping_period = options.delete(:error_grouping_period) if options.key?(:error_grouping_period)
14
+ en.notification_trigger = options.delete(:notification_trigger) if options.key?(:notification_trigger)
15
+
16
+ if options.key?(:error_grouping_cache)
17
+ en.error_grouping_cache = options.delete(:error_grouping_cache)
18
+ elsif defined?(Rails) && Rails.respond_to?(:cache)
19
+ en.error_grouping_cache = Rails.cache
20
+ end
21
+ end
9
22
 
10
23
  if options.key?(:ignore_if)
11
24
  rack_ignore = options.delete(:ignore_if)
12
- ExceptionNotifier.ignore_if do |exception, options|
13
- options.key?(:env) && rack_ignore.call(options[:env], exception)
25
+ ExceptionNotifier.ignore_if do |exception, opts|
26
+ opts.key?(:env) && rack_ignore.call(opts[:env], exception)
14
27
  end
15
28
  end
16
29
 
17
- if options.key?(:ignore_crawlers)
18
- ignore_crawlers = options.delete(:ignore_crawlers)
19
- ExceptionNotifier.ignore_if do |exception, options|
20
- options.key?(:env) && from_crawler(options[:env], ignore_crawlers)
30
+ if options.key?(:ignore_notifier_if)
31
+ rack_ignore_by_notifier = options.delete(:ignore_notifier_if)
32
+ rack_ignore_by_notifier.each do |notifier, proc|
33
+ ExceptionNotifier.ignore_notifier_if(notifier) do |exception, opts|
34
+ opts.key?(:env) && proc.call(opts[:env], exception)
35
+ end
21
36
  end
22
37
  end
23
38
 
39
+ ExceptionNotifier.ignore_crawlers(options.delete(:ignore_crawlers)) if options.key?(:ignore_crawlers)
40
+
24
41
  @ignore_cascade_pass = options.delete(:ignore_cascade_pass) { true }
25
42
 
26
- options.each do |notifier_name, options|
27
- ExceptionNotifier.register_exception_notifier(notifier_name, options)
43
+ options.each do |notifier_name, opts|
44
+ ExceptionNotifier.register_exception_notifier(notifier_name, opts)
28
45
  end
29
46
  end
30
47
 
31
48
  def call(env)
32
- _, headers, _ = response = @app.call(env)
49
+ _, headers, = response = @app.call(env)
33
50
 
34
51
  if !@ignore_cascade_pass && headers['X-Cascade'] == 'pass'
35
- msg = "This exception means that the preceding Rack middleware set the 'X-Cascade' header to 'pass' -- in " <<
36
- "Rails, this often means that the route was not found (404 error)."
52
+ msg = "This exception means that the preceding Rack middleware set the 'X-Cascade' header to 'pass' -- in " \
53
+ 'Rails, this often means that the route was not found (404 error).'
37
54
  raise CascadePassException, msg
38
55
  end
39
56
 
40
57
  response
41
- rescue Exception => exception
42
- if ExceptionNotifier.notify_exception(exception, :env => env)
43
- env['exception_notifier.delivered'] = true
44
- end
58
+ rescue Exception => e
59
+ env['exception_notifier.delivered'] = true if ExceptionNotifier.notify_exception(e, env: env)
45
60
 
46
- raise exception unless exception.is_a?(CascadePassException)
47
- response
48
- end
49
-
50
- private
61
+ raise e unless e.is_a?(CascadePassException)
51
62
 
52
- def from_crawler(env, ignored_crawlers)
53
- agent = env['HTTP_USER_AGENT']
54
- Array(ignored_crawlers).any? do |crawler|
55
- agent =~ Regexp.new(crawler)
56
- end
63
+ response
57
64
  end
58
65
  end
59
66
  end
@@ -1,7 +1,10 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module ExceptionNotification
2
4
  class Engine < ::Rails::Engine
3
5
  config.exception_notification = ExceptionNotifier
4
6
  config.exception_notification.logger = Rails.logger
7
+ config.exception_notification.error_grouping_cache = Rails.cache
5
8
 
6
9
  config.app_middleware.use ExceptionNotification::Rack
7
10
  end
@@ -1,24 +1,24 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'resque/failure/base'
2
4
 
3
5
  module ExceptionNotification
4
6
  class Resque < Resque::Failure::Base
5
-
6
7
  def self.count
7
- Stat[:failed]
8
+ ::Resque::Stat[:failed]
8
9
  end
9
10
 
10
11
  def save
11
12
  data = {
12
- :failed_at => Time.now.to_s,
13
- :queue => queue,
14
- :worker => worker.to_s,
15
- :payload => payload,
16
- :error_class => exception.class.name,
17
- :error_message => exception.message
13
+ error_class: exception.class.name,
14
+ error_message: exception.message,
15
+ failed_at: Time.now.to_s,
16
+ payload: payload,
17
+ queue: queue,
18
+ worker: worker.to_s
18
19
  }
19
20
 
20
- ExceptionNotifier.notify_exception(exception, :data => { :resque => data })
21
+ ExceptionNotifier.notify_exception(exception, data: { resque: data })
21
22
  end
22
-
23
23
  end
24
24
  end