exception_notification 3.0.1 → 4.4.0
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.
- checksums.yaml +7 -0
- data/Appraisals +7 -0
- data/CHANGELOG.rdoc +129 -1
- data/CODE_OF_CONDUCT.md +22 -0
- data/CONTRIBUTING.md +29 -1
- data/Gemfile +1 -1
- data/MIT-LICENSE +23 -0
- data/README.md +168 -222
- data/Rakefile +5 -11
- data/docs/notifiers/campfire.md +50 -0
- data/docs/notifiers/custom.md +42 -0
- data/docs/notifiers/datadog.md +51 -0
- data/docs/notifiers/email.md +195 -0
- data/docs/notifiers/google_chat.md +31 -0
- data/docs/notifiers/hipchat.md +66 -0
- data/docs/notifiers/irc.md +97 -0
- data/docs/notifiers/mattermost.md +115 -0
- data/docs/notifiers/slack.md +161 -0
- data/docs/notifiers/sns.md +37 -0
- data/docs/notifiers/teams.md +54 -0
- data/docs/notifiers/webhook.md +60 -0
- data/examples/sample_app.rb +54 -0
- data/examples/sinatra/Gemfile +8 -0
- data/examples/sinatra/Gemfile.lock +95 -0
- data/examples/sinatra/Procfile +2 -0
- data/examples/sinatra/README.md +11 -0
- data/examples/sinatra/config.ru +3 -0
- data/examples/sinatra/sinatra_app.rb +36 -0
- data/exception_notification.gemspec +32 -11
- data/gemfiles/rails4_0.gemfile +7 -0
- data/gemfiles/rails4_1.gemfile +7 -0
- data/gemfiles/rails4_2.gemfile +7 -0
- data/gemfiles/rails5_0.gemfile +7 -0
- data/gemfiles/rails5_1.gemfile +7 -0
- data/gemfiles/rails5_2.gemfile +7 -0
- data/gemfiles/rails6_0.gemfile +7 -0
- data/lib/exception_notification.rb +11 -0
- data/lib/exception_notification/rack.rb +55 -0
- data/lib/exception_notification/rails.rb +9 -0
- data/lib/exception_notification/resque.rb +22 -0
- data/lib/exception_notification/sidekiq.rb +27 -0
- data/lib/exception_notification/version.rb +3 -0
- data/lib/exception_notifier.rb +137 -61
- data/lib/exception_notifier/base_notifier.rb +24 -0
- data/lib/exception_notifier/campfire_notifier.rb +16 -11
- data/lib/exception_notifier/datadog_notifier.rb +153 -0
- data/lib/exception_notifier/email_notifier.rb +196 -0
- data/lib/exception_notifier/google_chat_notifier.rb +42 -0
- data/lib/exception_notifier/hipchat_notifier.rb +49 -0
- data/lib/exception_notifier/irc_notifier.rb +57 -0
- data/lib/exception_notifier/mattermost_notifier.rb +72 -0
- data/lib/exception_notifier/modules/backtrace_cleaner.rb +11 -0
- data/lib/exception_notifier/modules/error_grouping.rb +77 -0
- data/lib/exception_notifier/modules/formatter.rb +118 -0
- data/lib/exception_notifier/notifier.rb +9 -179
- data/lib/exception_notifier/slack_notifier.rb +111 -0
- data/lib/exception_notifier/sns_notifier.rb +85 -0
- data/lib/exception_notifier/teams_notifier.rb +193 -0
- data/lib/exception_notifier/views/exception_notifier/_backtrace.html.erb +3 -1
- data/lib/exception_notifier/views/exception_notifier/_data.html.erb +6 -1
- data/lib/exception_notifier/views/exception_notifier/_environment.html.erb +8 -6
- data/lib/exception_notifier/views/exception_notifier/_environment.text.erb +1 -4
- data/lib/exception_notifier/views/exception_notifier/_request.html.erb +36 -5
- data/lib/exception_notifier/views/exception_notifier/_request.text.erb +10 -5
- data/lib/exception_notifier/views/exception_notifier/_session.html.erb +10 -2
- data/lib/exception_notifier/views/exception_notifier/_session.text.erb +2 -2
- data/lib/exception_notifier/views/exception_notifier/_title.html.erb +3 -3
- data/lib/exception_notifier/views/exception_notifier/background_exception_notification.html.erb +38 -11
- data/lib/exception_notifier/views/exception_notifier/background_exception_notification.text.erb +10 -11
- data/lib/exception_notifier/views/exception_notifier/exception_notification.html.erb +38 -22
- data/lib/exception_notifier/views/exception_notifier/exception_notification.text.erb +2 -3
- data/lib/exception_notifier/webhook_notifier.rb +51 -0
- data/lib/generators/exception_notification/install_generator.rb +15 -0
- data/lib/generators/exception_notification/templates/exception_notification.rb.erb +55 -0
- data/test/exception_notification/rack_test.rb +60 -0
- data/test/exception_notification/resque_test.rb +52 -0
- data/test/exception_notifier/campfire_notifier_test.rb +120 -0
- data/test/exception_notifier/datadog_notifier_test.rb +151 -0
- data/test/exception_notifier/email_notifier_test.rb +351 -0
- data/test/exception_notifier/google_chat_notifier_test.rb +181 -0
- data/test/exception_notifier/hipchat_notifier_test.rb +218 -0
- data/test/exception_notifier/irc_notifier_test.rb +137 -0
- data/test/exception_notifier/mattermost_notifier_test.rb +202 -0
- data/test/exception_notifier/modules/error_grouping_test.rb +165 -0
- data/test/exception_notifier/modules/formatter_test.rb +150 -0
- data/test/exception_notifier/sidekiq_test.rb +38 -0
- data/test/exception_notifier/slack_notifier_test.rb +227 -0
- data/test/exception_notifier/sns_notifier_test.rb +121 -0
- data/test/exception_notifier/teams_notifier_test.rb +90 -0
- data/test/exception_notifier/webhook_notifier_test.rb +96 -0
- data/test/exception_notifier_test.rb +182 -0
- data/test/{dummy/app → support}/views/exception_notifier/_new_bkg_section.html.erb +0 -0
- data/test/{dummy/app → support}/views/exception_notifier/_new_bkg_section.text.erb +0 -0
- data/test/{dummy/app → support}/views/exception_notifier/_new_section.html.erb +0 -0
- data/test/{dummy/app → support}/views/exception_notifier/_new_section.text.erb +0 -0
- data/test/test_helper.rb +12 -8
- metadata +333 -164
- data/.gemtest +0 -0
- data/Gemfile.lock +0 -122
- data/test/background_exception_notification_test.rb +0 -82
- data/test/campfire_test.rb +0 -53
- data/test/dummy/.gitignore +0 -4
- data/test/dummy/Gemfile +0 -33
- data/test/dummy/Gemfile.lock +0 -118
- data/test/dummy/Rakefile +0 -7
- data/test/dummy/app/controllers/application_controller.rb +0 -3
- data/test/dummy/app/controllers/posts_controller.rb +0 -30
- data/test/dummy/app/helpers/application_helper.rb +0 -2
- data/test/dummy/app/helpers/posts_helper.rb +0 -2
- data/test/dummy/app/models/post.rb +0 -2
- data/test/dummy/app/views/layouts/application.html.erb +0 -14
- data/test/dummy/app/views/posts/_form.html.erb +0 -0
- data/test/dummy/app/views/posts/new.html.erb +0 -0
- data/test/dummy/app/views/posts/show.html.erb +0 -0
- data/test/dummy/config.ru +0 -4
- data/test/dummy/config/application.rb +0 -42
- data/test/dummy/config/boot.rb +0 -6
- data/test/dummy/config/database.yml +0 -22
- data/test/dummy/config/environment.rb +0 -13
- data/test/dummy/config/environments/development.rb +0 -24
- data/test/dummy/config/environments/production.rb +0 -49
- data/test/dummy/config/environments/test.rb +0 -35
- data/test/dummy/config/initializers/backtrace_silencers.rb +0 -7
- data/test/dummy/config/initializers/inflections.rb +0 -10
- data/test/dummy/config/initializers/mime_types.rb +0 -5
- data/test/dummy/config/initializers/secret_token.rb +0 -7
- data/test/dummy/config/initializers/session_store.rb +0 -8
- data/test/dummy/config/locales/en.yml +0 -5
- data/test/dummy/config/routes.rb +0 -3
- data/test/dummy/db/migrate/20110729022608_create_posts.rb +0 -15
- data/test/dummy/db/schema.rb +0 -24
- data/test/dummy/db/seeds.rb +0 -7
- data/test/dummy/lib/tasks/.gitkeep +0 -0
- data/test/dummy/public/404.html +0 -26
- data/test/dummy/public/422.html +0 -26
- data/test/dummy/public/500.html +0 -26
- data/test/dummy/public/favicon.ico +0 -0
- data/test/dummy/public/images/rails.png +0 -0
- data/test/dummy/public/index.html +0 -239
- data/test/dummy/public/javascripts/application.js +0 -2
- data/test/dummy/public/javascripts/controls.js +0 -965
- data/test/dummy/public/javascripts/dragdrop.js +0 -974
- data/test/dummy/public/javascripts/effects.js +0 -1123
- data/test/dummy/public/javascripts/prototype.js +0 -6001
- data/test/dummy/public/javascripts/rails.js +0 -191
- data/test/dummy/public/robots.txt +0 -5
- data/test/dummy/public/stylesheets/.gitkeep +0 -0
- data/test/dummy/public/stylesheets/scaffold.css +0 -56
- data/test/dummy/script/rails +0 -6
- data/test/dummy/test/fixtures/posts.yml +0 -11
- data/test/dummy/test/functional/posts_controller_test.rb +0 -239
- data/test/dummy/test/test_helper.rb +0 -13
- data/test/exception_notification_test.rb +0 -73
|
@@ -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,54 @@
|
|
|
1
|
+
# -------------------------------------------
|
|
2
|
+
# To run the application: ruby examples/sample_app.rb
|
|
3
|
+
# -------------------------------------------
|
|
4
|
+
|
|
5
|
+
require 'bundler/inline'
|
|
6
|
+
|
|
7
|
+
gemfile do
|
|
8
|
+
source 'https://rubygems.org'
|
|
9
|
+
|
|
10
|
+
gem 'rails', '5.0.0'
|
|
11
|
+
gem 'exception_notification', '4.3.0'
|
|
12
|
+
gem 'httparty', '0.15.7'
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
class SampleApp < Rails::Application
|
|
16
|
+
config.middleware.use ExceptionNotification::Rack,
|
|
17
|
+
webhook: {
|
|
18
|
+
url: 'http://example.com'
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
config.secret_key_base = 'my secret key base'
|
|
22
|
+
|
|
23
|
+
Rails.logger = Logger.new($stdout)
|
|
24
|
+
|
|
25
|
+
routes.draw do
|
|
26
|
+
get '/', to: 'exceptions#index'
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
require 'action_controller/railtie'
|
|
31
|
+
|
|
32
|
+
class ExceptionsController < ActionController::Base
|
|
33
|
+
def index
|
|
34
|
+
raise 'Sample exception raised, you should receive a notification!'
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
require 'minitest/autorun'
|
|
39
|
+
|
|
40
|
+
class Test < Minitest::Test
|
|
41
|
+
include Rack::Test::Methods
|
|
42
|
+
|
|
43
|
+
def test_raise_exception
|
|
44
|
+
get '/'
|
|
45
|
+
|
|
46
|
+
assert last_response.server_error?
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
private
|
|
50
|
+
|
|
51
|
+
def app
|
|
52
|
+
Rails.application
|
|
53
|
+
end
|
|
54
|
+
end
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
PATH
|
|
2
|
+
remote: ../../
|
|
3
|
+
specs:
|
|
4
|
+
exception_notification (3.0.1)
|
|
5
|
+
actionmailer (>= 3.0.4)
|
|
6
|
+
activesupport (>= 3.0.4)
|
|
7
|
+
|
|
8
|
+
GEM
|
|
9
|
+
remote: https://rubygems.org/
|
|
10
|
+
specs:
|
|
11
|
+
actionmailer (3.2.13)
|
|
12
|
+
actionpack (= 3.2.13)
|
|
13
|
+
mail (~> 2.5.3)
|
|
14
|
+
actionpack (3.2.13)
|
|
15
|
+
activemodel (= 3.2.13)
|
|
16
|
+
activesupport (= 3.2.13)
|
|
17
|
+
builder (~> 3.0.0)
|
|
18
|
+
erubis (~> 2.7.0)
|
|
19
|
+
journey (~> 1.0.4)
|
|
20
|
+
rack (~> 1.4.5)
|
|
21
|
+
rack-cache (~> 1.2)
|
|
22
|
+
rack-test (~> 0.6.1)
|
|
23
|
+
sprockets (~> 2.2.1)
|
|
24
|
+
activemodel (3.2.13)
|
|
25
|
+
activesupport (= 3.2.13)
|
|
26
|
+
builder (~> 3.0.0)
|
|
27
|
+
activesupport (3.2.13)
|
|
28
|
+
i18n (= 0.6.1)
|
|
29
|
+
multi_json (~> 1.0)
|
|
30
|
+
builder (3.0.4)
|
|
31
|
+
daemons (1.1.9)
|
|
32
|
+
erubis (2.7.0)
|
|
33
|
+
eventmachine (1.0.3)
|
|
34
|
+
foreman (0.61.0)
|
|
35
|
+
thor (>= 0.13.6)
|
|
36
|
+
haml (4.0.2)
|
|
37
|
+
tilt
|
|
38
|
+
hike (1.2.1)
|
|
39
|
+
i18n (0.6.1)
|
|
40
|
+
journey (1.0.4)
|
|
41
|
+
mail (2.5.3)
|
|
42
|
+
i18n (>= 0.4.0)
|
|
43
|
+
mime-types (~> 1.16)
|
|
44
|
+
treetop (~> 1.4.8)
|
|
45
|
+
mailcatcher (0.5.11)
|
|
46
|
+
activesupport (~> 3.0)
|
|
47
|
+
eventmachine (~> 1.0.0)
|
|
48
|
+
haml (>= 3.1, < 5)
|
|
49
|
+
mail (~> 2.3)
|
|
50
|
+
sinatra (~> 1.2)
|
|
51
|
+
skinny (~> 0.2.3)
|
|
52
|
+
sqlite3 (~> 1.3)
|
|
53
|
+
thin (~> 1.5.0)
|
|
54
|
+
mime-types (1.22)
|
|
55
|
+
multi_json (1.7.2)
|
|
56
|
+
polyglot (0.3.3)
|
|
57
|
+
rack (1.4.5)
|
|
58
|
+
rack-cache (1.2)
|
|
59
|
+
rack (>= 0.4)
|
|
60
|
+
rack-protection (1.5.0)
|
|
61
|
+
rack
|
|
62
|
+
rack-test (0.6.2)
|
|
63
|
+
rack (>= 1.0)
|
|
64
|
+
sinatra (1.3.6)
|
|
65
|
+
rack (~> 1.4)
|
|
66
|
+
rack-protection (~> 1.3)
|
|
67
|
+
tilt (~> 1.3, >= 1.3.3)
|
|
68
|
+
skinny (0.2.3)
|
|
69
|
+
eventmachine (~> 1.0.0)
|
|
70
|
+
thin (~> 1.5.0)
|
|
71
|
+
sprockets (2.2.2)
|
|
72
|
+
hike (~> 1.2)
|
|
73
|
+
multi_json (~> 1.0)
|
|
74
|
+
rack (~> 1.0)
|
|
75
|
+
tilt (~> 1.1, != 1.3.0)
|
|
76
|
+
sqlite3 (1.3.7)
|
|
77
|
+
thin (1.5.1)
|
|
78
|
+
daemons (>= 1.0.9)
|
|
79
|
+
eventmachine (>= 0.12.6)
|
|
80
|
+
rack (>= 1.0.0)
|
|
81
|
+
thor (0.18.1)
|
|
82
|
+
tilt (1.3.6)
|
|
83
|
+
treetop (1.4.12)
|
|
84
|
+
polyglot
|
|
85
|
+
polyglot (>= 0.3.1)
|
|
86
|
+
|
|
87
|
+
PLATFORMS
|
|
88
|
+
ruby
|
|
89
|
+
|
|
90
|
+
DEPENDENCIES
|
|
91
|
+
exception_notification!
|
|
92
|
+
foreman
|
|
93
|
+
mailcatcher
|
|
94
|
+
sinatra (~> 1.3.5)
|
|
95
|
+
thin (~> 1.5.1)
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
# Using Exception Notification with Sinatra
|
|
2
|
+
|
|
3
|
+
## Quick start
|
|
4
|
+
|
|
5
|
+
git clone git@github.com:smartinez87/exception_notification.git
|
|
6
|
+
cd exception_notification/examples/sinatra
|
|
7
|
+
bundle install
|
|
8
|
+
bundle exec foreman start
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
The last command starts two services, a smtp server and the sinatra app itself. Thus, visit [http://localhost:1080/](http://localhost:1080/) to check the emails sent and, in a separated tab, visit [http://localhost:3000](http://localhost:3000) and cause some errors. For more info, use the [source](https://github.com/smartinez87/exception_notification/blob/master/examples/sinatra/sinatra_app.rb) Luke.
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
require 'rubygems'
|
|
2
|
+
require 'bundler/setup'
|
|
3
|
+
require 'sinatra/base'
|
|
4
|
+
require 'exception_notification'
|
|
5
|
+
|
|
6
|
+
class SinatraApp < Sinatra::Base
|
|
7
|
+
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
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
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: {
|
|
17
|
+
address: 'localhost',
|
|
18
|
+
port: 1025
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
get '/' do
|
|
23
|
+
raise StandardError, "ERROR: #{params[:error]}" unless params[:error].blank?
|
|
24
|
+
|
|
25
|
+
'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> !'
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
get '/background_notification' do
|
|
29
|
+
begin
|
|
30
|
+
1 / 0
|
|
31
|
+
rescue StandardError => e
|
|
32
|
+
ExceptionNotifier.notify_exception(e, data: { msg: 'Cannot divide by zero!' })
|
|
33
|
+
end
|
|
34
|
+
'Check email at <a href="http://localhost:1080">mailcatcher</a>.'
|
|
35
|
+
end
|
|
36
|
+
end
|
|
@@ -1,20 +1,41 @@
|
|
|
1
|
+
require File.expand_path('../lib/exception_notification/version', __FILE__)
|
|
2
|
+
|
|
1
3
|
Gem::Specification.new do |s|
|
|
2
4
|
s.name = 'exception_notification'
|
|
3
|
-
s.version =
|
|
4
|
-
s.authors = [
|
|
5
|
-
s.date =
|
|
6
|
-
s.summary =
|
|
7
|
-
s.homepage =
|
|
8
|
-
s.email =
|
|
5
|
+
s.version = ExceptionNotification::VERSION
|
|
6
|
+
s.authors = ['Jamis Buck', 'Josh Peek']
|
|
7
|
+
s.date = '2019-08-16'
|
|
8
|
+
s.summary = 'Exception notification for Rails apps'
|
|
9
|
+
s.homepage = 'https://smartinez87.github.io/exception_notification/'
|
|
10
|
+
s.email = 'smartinez87@gmail.com'
|
|
11
|
+
s.license = 'MIT'
|
|
12
|
+
|
|
13
|
+
s.required_ruby_version = '>= 2.0'
|
|
14
|
+
s.required_rubygems_version = '>= 1.8.11'
|
|
9
15
|
|
|
10
16
|
s.files = `git ls-files`.split("\n")
|
|
17
|
+
s.files -= `git ls-files -- .??*`.split("\n")
|
|
11
18
|
s.test_files = `git ls-files -- test`.split("\n")
|
|
12
19
|
s.require_path = 'lib'
|
|
13
20
|
|
|
14
|
-
s.add_dependency(
|
|
21
|
+
s.add_dependency('actionmailer', '>= 4.0', '< 7')
|
|
22
|
+
s.add_dependency('activesupport', '>= 4.0', '< 7')
|
|
15
23
|
|
|
16
|
-
s.add_development_dependency
|
|
17
|
-
s.add_development_dependency
|
|
18
|
-
s.add_development_dependency
|
|
19
|
-
s.add_development_dependency
|
|
24
|
+
s.add_development_dependency 'appraisal', '~> 2.2.0'
|
|
25
|
+
s.add_development_dependency 'aws-sdk-sns', '~> 1'
|
|
26
|
+
s.add_development_dependency 'carrier-pigeon', '>= 0.7.0'
|
|
27
|
+
s.add_development_dependency 'coveralls', '~> 0.8.2'
|
|
28
|
+
s.add_development_dependency 'dogapi', '>= 1.23.0'
|
|
29
|
+
s.add_development_dependency 'hipchat', '>= 1.0.0'
|
|
30
|
+
s.add_development_dependency 'httparty', '~> 0.10.2'
|
|
31
|
+
s.add_development_dependency 'mock_redis', '~> 0.18.0'
|
|
32
|
+
s.add_development_dependency 'mocha', '>= 0.13.0'
|
|
33
|
+
s.add_development_dependency 'rails', '>= 4.0', '< 7'
|
|
34
|
+
s.add_development_dependency 'resque', '~> 1.8.0'
|
|
35
|
+
s.add_development_dependency 'rubocop', '0.50.0'
|
|
36
|
+
# Sidekiq 3.2.2 does not support Ruby 1.9.
|
|
37
|
+
s.add_development_dependency 'sidekiq', '~> 3.0.0', '< 3.2.2'
|
|
38
|
+
s.add_development_dependency 'slack-notifier', '>= 1.0.0'
|
|
39
|
+
s.add_development_dependency 'timecop', '~>0.9.0'
|
|
40
|
+
s.add_development_dependency 'tinder', '~> 1.8'
|
|
20
41
|
end
|
|
@@ -1 +1,12 @@
|
|
|
1
1
|
require 'exception_notifier'
|
|
2
|
+
require 'exception_notification/rack'
|
|
3
|
+
require 'exception_notification/version'
|
|
4
|
+
|
|
5
|
+
module ExceptionNotification
|
|
6
|
+
# Alternative way to setup ExceptionNotification.
|
|
7
|
+
# Run 'rails generate exception_notification:install' to create
|
|
8
|
+
# a fresh initializer with all configuration values.
|
|
9
|
+
def self.configure
|
|
10
|
+
yield ExceptionNotifier
|
|
11
|
+
end
|
|
12
|
+
end
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
module ExceptionNotification
|
|
2
|
+
class Rack
|
|
3
|
+
class CascadePassException < RuntimeError; end
|
|
4
|
+
|
|
5
|
+
def initialize(app, options = {})
|
|
6
|
+
@app = app
|
|
7
|
+
|
|
8
|
+
ExceptionNotifier.ignored_exceptions = options.delete(:ignore_exceptions) if options.key?(:ignore_exceptions)
|
|
9
|
+
ExceptionNotifier.error_grouping = options.delete(:error_grouping) if options.key?(:error_grouping)
|
|
10
|
+
ExceptionNotifier.error_grouping_period = options.delete(:error_grouping_period) if options.key?(:error_grouping_period)
|
|
11
|
+
ExceptionNotifier.notification_trigger = options.delete(:notification_trigger) if options.key?(:notification_trigger)
|
|
12
|
+
|
|
13
|
+
if options.key?(:error_grouping_cache)
|
|
14
|
+
ExceptionNotifier.error_grouping_cache = options.delete(:error_grouping_cache)
|
|
15
|
+
elsif defined?(Rails) && Rails.respond_to?(:cache)
|
|
16
|
+
ExceptionNotifier.error_grouping_cache = Rails.cache
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
if options.key?(:ignore_if)
|
|
20
|
+
rack_ignore = options.delete(:ignore_if)
|
|
21
|
+
ExceptionNotifier.ignore_if do |exception, opts|
|
|
22
|
+
opts.key?(:env) && rack_ignore.call(opts[:env], exception)
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
ExceptionNotifier.ignore_crawlers(options.delete(:ignore_crawlers)) if options.key?(:ignore_crawlers)
|
|
27
|
+
|
|
28
|
+
@ignore_cascade_pass = options.delete(:ignore_cascade_pass) { true }
|
|
29
|
+
|
|
30
|
+
options.each do |notifier_name, opts|
|
|
31
|
+
ExceptionNotifier.register_exception_notifier(notifier_name, opts)
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def call(env)
|
|
36
|
+
_, headers, = response = @app.call(env)
|
|
37
|
+
|
|
38
|
+
if !@ignore_cascade_pass && headers['X-Cascade'] == 'pass'
|
|
39
|
+
msg = "This exception means that the preceding Rack middleware set the 'X-Cascade' header to 'pass' -- in " \
|
|
40
|
+
'Rails, this often means that the route was not found (404 error).'
|
|
41
|
+
raise CascadePassException, msg
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
response
|
|
45
|
+
rescue Exception => exception
|
|
46
|
+
if ExceptionNotifier.notify_exception(exception, env: env)
|
|
47
|
+
env['exception_notifier.delivered'] = true
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
raise exception unless exception.is_a?(CascadePassException)
|
|
51
|
+
|
|
52
|
+
response
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
end
|