bugsnag 5.5.0 → 6.0.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.
Files changed (67) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +33 -11
  3. data/CHANGELOG.md +23 -0
  4. data/Gemfile +20 -0
  5. data/Rakefile +19 -12
  6. data/UPGRADING.md +58 -0
  7. data/VERSION +1 -1
  8. data/bugsnag.gemspec +0 -9
  9. data/lib/bugsnag.rb +64 -86
  10. data/lib/bugsnag/configuration.rb +42 -26
  11. data/lib/bugsnag/delivery.rb +9 -0
  12. data/lib/bugsnag/delivery/synchronous.rb +3 -5
  13. data/lib/bugsnag/delivery/thread_queue.rb +4 -2
  14. data/lib/bugsnag/helpers.rb +5 -16
  15. data/lib/bugsnag/{delayed_job.rb → integrations/delayed_job.rb} +15 -7
  16. data/lib/bugsnag/{mailman.rb → integrations/mailman.rb} +13 -11
  17. data/lib/bugsnag/{que.rb → integrations/que.rb} +11 -11
  18. data/lib/bugsnag/{rack.rb → integrations/rack.rb} +22 -23
  19. data/lib/bugsnag/{rails → integrations/rails}/active_record_rescue.rb +9 -7
  20. data/lib/bugsnag/{rails → integrations/rails}/controller_methods.rb +0 -9
  21. data/lib/bugsnag/{railtie.rb → integrations/railtie.rb} +24 -21
  22. data/lib/bugsnag/{rake.rb → integrations/rake.rb} +12 -9
  23. data/lib/bugsnag/{resque.rb → integrations/resque.rb} +12 -9
  24. data/lib/bugsnag/integrations/shoryuken.rb +49 -0
  25. data/lib/bugsnag/{sidekiq.rb → integrations/sidekiq.rb} +13 -9
  26. data/lib/bugsnag/middleware/callbacks.rb +4 -8
  27. data/lib/bugsnag/middleware/classify_error.rb +7 -13
  28. data/lib/bugsnag/middleware/clearance_user.rb +8 -8
  29. data/lib/bugsnag/middleware/exception_meta_data.rb +34 -0
  30. data/lib/bugsnag/middleware/ignore_error_class.rb +21 -0
  31. data/lib/bugsnag/middleware/mailman.rb +4 -4
  32. data/lib/bugsnag/middleware/rack_request.rb +13 -13
  33. data/lib/bugsnag/middleware/rails3_request.rb +10 -10
  34. data/lib/bugsnag/middleware/rake.rb +5 -5
  35. data/lib/bugsnag/middleware/sidekiq.rb +5 -5
  36. data/lib/bugsnag/middleware/suggestion_data.rb +30 -0
  37. data/lib/bugsnag/middleware/warden_user.rb +6 -6
  38. data/lib/bugsnag/middleware_stack.rb +5 -5
  39. data/lib/bugsnag/report.rb +187 -0
  40. data/lib/bugsnag/stacktrace.rb +113 -0
  41. data/lib/bugsnag/tasks/bugsnag.rake +2 -70
  42. data/spec/cleaner_spec.rb +6 -0
  43. data/spec/configuration_spec.rb +1 -1
  44. data/spec/fixtures/middleware/internal_info_setter.rb +3 -3
  45. data/spec/fixtures/middleware/public_info_setter.rb +3 -3
  46. data/spec/fixtures/tasks/Rakefile +2 -3
  47. data/spec/integration_spec.rb +5 -20
  48. data/spec/{delayed_job_spec.rb → integrations/delayed_job_spec.rb} +0 -0
  49. data/spec/integrations/sidekiq_spec.rb +34 -0
  50. data/spec/middleware_spec.rb +108 -35
  51. data/spec/rack_spec.rb +1 -1
  52. data/spec/{notification_spec.rb → report_spec.rb} +226 -209
  53. data/spec/spec_helper.rb +18 -0
  54. data/spec/{code_spec.rb → stacktrace_spec.rb} +1 -1
  55. metadata +23 -139
  56. data/.document +0 -5
  57. data/lib/bugsnag/capistrano.rb +0 -7
  58. data/lib/bugsnag/capistrano2.rb +0 -32
  59. data/lib/bugsnag/delay/resque.rb +0 -21
  60. data/lib/bugsnag/deploy.rb +0 -35
  61. data/lib/bugsnag/middleware/rails2_request.rb +0 -52
  62. data/lib/bugsnag/notification.rb +0 -506
  63. data/lib/bugsnag/rails.rb +0 -70
  64. data/lib/bugsnag/rails/action_controller_rescue.rb +0 -74
  65. data/lib/bugsnag/shoryuken.rb +0 -41
  66. data/lib/bugsnag/tasks/bugsnag.cap +0 -48
  67. data/rails/init.rb +0 -7
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: f984eec70917a0c4be84872ebe37ddafe29a6b90
4
- data.tar.gz: ae64caceca203ed92c2bf2a45dc11a87eb21f665
3
+ metadata.gz: bdb80b010ab8da05acfddaa542a8b7cbff4be599
4
+ data.tar.gz: 7fa7188b650b1ebc07e074f4d6f2f1a365105033
5
5
  SHA512:
6
- metadata.gz: 61fb130e43e7bda70b320c3c4094961732d63597da430ac70a692f2065f04026d046bf67c15402e642ab9dc531491173a76f8b13e80ca3f05af175eabb7dbf9d
7
- data.tar.gz: 6a46b86c0218851ee2c213246bfb5122d70bc1d274c70e21fefdcc50bfed0fd092851bef5f74ba32c870148184b4e352d57c1f10869126f376dfcfe4b21ad824
6
+ metadata.gz: 9f19d8a8b92a80747fb160ca3d55c5b19c35aefe8c9293eff1843668a76e90965b37a643e90ebc912b4e1e621411d0968241e024d01b490b5a1d0484621a2b2f
7
+ data.tar.gz: 2b46521a1dbe916993b13f546992533ef2ab0422cf45a27ea6a30c1c13f8ba01c0a42c2e2486ac655eccff531443452a00fe765e51fea039346d205803da9373
@@ -1,16 +1,38 @@
1
1
  sudo: false
2
2
  language: ruby
3
- cache: bundler
4
- rvm:
5
- - 2.3.0
6
- - 2.2.4
7
- - 2.1.8
8
- - 2.0.0
9
- - 1.9.3
10
- - jruby-19mode
11
3
 
12
4
  before_install:
13
- - gem install bundler -v 1.12
14
- - gem update --system
15
- - bundle --version
5
+ - gem update --system 2.6.14
16
6
  - gem --version
7
+ - gem install bundler -v 1.12
8
+ - bundle _1.12.0_ --version
9
+
10
+ install:
11
+ - bundle _1.12.0_ install --with "$GEMSETS" --binstubs
12
+
13
+ script:
14
+ - bundle exec ./bin/rake spec
15
+
16
+ jobs:
17
+ include:
18
+ - stage: test
19
+ env: GEMSETS=test
20
+ rvm: jruby-19mode
21
+ - stage: test
22
+ env: GEMSETS=test
23
+ rvm: 1.9.3
24
+ - stage: test
25
+ env: GEMSETS=test
26
+ rvm: 2.0.0
27
+ - stage: test
28
+ env: GEMSETS=test
29
+ rvm: 2.1.10
30
+ - stage: test
31
+ env: GEMSETS="test sidekiq"
32
+ rvm: 2.2.4
33
+ - stage: test
34
+ env: GEMSETS="test sidekiq coverage"
35
+ rvm: 2.3.0
36
+ - stage: test
37
+ env: GEMSETS="test sidekiq"
38
+ rvm: 2.4.1
@@ -1,6 +1,29 @@
1
1
  Changelog
2
2
  =========
3
3
 
4
+ ## 6.0.0 (09 Nov 2017)
5
+
6
+ This notifier has been extensively re-written to make it easier to add new integrations and maintain in the future. This has led to several changes that are not backwards compatible. Please refer to the [upgrading guide](https://github.com/bugsnag/bugsnag-ruby/blob/master/UPGRADING.md) for more information.
7
+
8
+ ### Enhancements
9
+
10
+ * General notifier re-write
11
+ | [#320](https://github.com/bugsnag/bugsnag-ruby/pull/320)
12
+ | [#378](https://github.com/bugsnag/bugsnag-ruby/pull/378)
13
+ | [#368](https://github.com/bugsnag/bugsnag-ruby/pull/368)
14
+ | [#381](https://github.com/bugsnag/bugsnag-ruby/pull/381)
15
+ | [#385](https://github.com/bugsnag/bugsnag-ruby/pull/385)
16
+ | [#386](https://github.com/bugsnag/bugsnag-ruby/pull/386)
17
+
18
+ * Added Upgrade guide
19
+ | [#370](https://github.com/bugsnag/bugsnag-ruby/pull/370)
20
+
21
+ * Did-you-mean suggestions middleware
22
+ | [#372](https://github.com/bugsnag/bugsnag-ruby/pull/372)
23
+
24
+ * Updated examples
25
+ | [#374](https://github.com/bugsnag/bugsnag-ruby/pull/374)
26
+
4
27
  ## 5.5.0 (09 Nov 2017)
5
28
 
6
29
  ### Enhancements
data/Gemfile CHANGED
@@ -1,2 +1,22 @@
1
1
  source "https://rubygems.org"
2
+
3
+ group :test, optional: true do
4
+ gem 'rake', '~> 10.1.1'
5
+ gem 'rspec'
6
+ gem 'rdoc'
7
+ gem 'pry'
8
+ gem 'addressable', '~> 2.3.8'
9
+ gem 'delayed_job' if RUBY_VERSION >= '2.2.2'
10
+ gem 'webmock', RUBY_VERSION <= '1.9.3' ? '2.3.2': '>2.3.2'
11
+ end
12
+
13
+ group :coverage, optional: true do
14
+ gem 'simplecov'
15
+ gem 'coveralls'
16
+ end
17
+
18
+ group :sidekiq, optional: true do
19
+ gem 'sidekiq', '~> 5.0.4'
20
+ end
21
+
2
22
  gemspec
data/Rakefile CHANGED
@@ -1,16 +1,5 @@
1
1
  # encoding: utf-8
2
2
 
3
- require 'rubygems'
4
- require 'bundler'
5
- require 'bundler/gem_tasks'
6
- begin
7
- Bundler.setup(:default, :development)
8
- rescue Bundler::BundlerError => e
9
- $stderr.puts e.message
10
- $stderr.puts "Run `bundle install` to install missing gems"
11
- exit e.status_code
12
- end
13
-
14
3
  require 'rdoc/task'
15
4
  RDoc::Task.new do |rdoc|
16
5
  version = File.exist?('VERSION') ? File.read('VERSION') : ""
@@ -24,6 +13,24 @@ end
24
13
  # RSpec tasks
25
14
  require 'rspec/core'
26
15
  require "rspec/core/rake_task"
27
- RSpec::Core::RakeTask.new(:spec)
16
+ RSpec::Core::RakeTask.new(:spec) do |task|
17
+ integration_exclusions = []
18
+ begin
19
+ require 'sidekiq/testing'
20
+ rescue LoadError
21
+ puts "Skipping sidekiq tests, missing dependencies"
22
+ integration_exclusions << 'sidekiq'
23
+ end
24
+ begin
25
+ require 'delayed_job'
26
+ rescue LoadError
27
+ puts "Skipping delayed_job tests, missing dependencies"
28
+ integration_exclusions << 'delayed_job'
29
+ end
30
+ if integration_exclusions.length > 0
31
+ pattern = integration_exclusions.join(',')
32
+ task.rspec_opts = " --exclude-pattern **/integrations/{#{pattern}}_spec.rb"
33
+ end
34
+ end
28
35
 
29
36
  task :default => :spec
@@ -0,0 +1,58 @@
1
+ # Upgrade Guide
2
+
3
+ ## 5.x to 6.x
4
+
5
+ _Our Ruby library has gone through some major improvements and there are a few
6
+ changes required to use the new integrations_
7
+
8
+ #### Capistrano and deploys
9
+
10
+ Support for notifying Bugsnag of deployments has been separated into a separate
11
+ gem named `bugsnag-capistrano`. See the [integration
12
+ guide](https://docs.bugsnag.com/platforms/ruby/capistrano) for more information.
13
+
14
+
15
+ #### Configuration
16
+
17
+ * `Configuration.use_ssl` has been removed. Include the preferred protocol in `Configuration.endpoint` instead.
18
+ ```diff
19
+ Bugsnag.configure do |config|
20
+ - config.use_ssl = true
21
+ - config.endpoint = 'myserver.example.com'
22
+ + config.endpoint = 'https://myserver.example.com'
23
+ end
24
+ ```
25
+ * `Configuration.ignore_classes` now no longer accepts strings. Use classes directly instead.
26
+ * `Configuration.delay_with_resque` has been removed
27
+ * `Configuration.vendor_paths` has been removed
28
+ * `Configuration.params_filters` has been renamed to `Configuration.meta_data_filters` to be clearer
29
+ * `Configuration.proxy_host` will now default to `ENV['http_proxy']` if set. It can still be manually set.
30
+
31
+ #### Notifying
32
+
33
+ * `notify` now only supports block syntax. Replace usage of the overrides hash with a block
34
+
35
+ ```diff
36
+ - Bugsnag.notify(e, {severity: 'info'})
37
+ + Bugsnag.notify(e) do |report|
38
+ + report.severity = 'info'
39
+ + end
40
+ ```
41
+
42
+ * `Bugsnag.notify_or_ignore` and `Bugsnag.auto_notify` have been removed removed. Call `notify` directly instead.
43
+ * `after_notify_callbacks` has been removed
44
+ * `Bugsnag::Notification` has been renamed to `Bugsnag::Report`
45
+
46
+ #### Logging
47
+
48
+ * `config.debug` boolean has been removed. Set the logger level directly
49
+
50
+ ```diff
51
+ + require 'logger'
52
+
53
+ Bugsnag.configure do |config|
54
+ # .. set API key and other properties
55
+ - config.debug = true
56
+ + config.logger.level = Logger::DEBUG
57
+ end
58
+ ```
data/VERSION CHANGED
@@ -1 +1 @@
1
- 5.5.0
1
+ 6.0.0
@@ -18,13 +18,4 @@ Gem::Specification.new do |s|
18
18
  ]
19
19
  s.require_paths = ["lib"]
20
20
  s.required_ruby_version = '>= 1.9.2'
21
-
22
- s.add_development_dependency 'rake', '~> 10.1.1'
23
- s.add_development_dependency 'rspec'
24
- s.add_development_dependency 'rdoc'
25
- s.add_development_dependency 'pry'
26
- s.add_development_dependency 'addressable', '~> 2.3.8'
27
- s.add_development_dependency 'webmock', '2.1.0'
28
- s.add_development_dependency 'delayed_job'
29
- s.add_development_dependency 'activesupport', '~> 4.2.10'
30
21
  end
@@ -4,16 +4,16 @@ require "thread"
4
4
  require "bugsnag/version"
5
5
  require "bugsnag/configuration"
6
6
  require "bugsnag/meta_data"
7
- require "bugsnag/notification"
7
+ require "bugsnag/report"
8
8
  require "bugsnag/cleaner"
9
9
  require "bugsnag/helpers"
10
- require "bugsnag/deploy"
11
10
 
12
11
  require "bugsnag/delivery"
13
12
  require "bugsnag/delivery/synchronous"
14
13
  require "bugsnag/delivery/thread_queue"
15
14
 
16
- require "bugsnag/rack"
15
+ require "bugsnag/integrations/rack"
16
+ require "bugsnag/integrations/railtie" if defined?(Rails::Railtie)
17
17
 
18
18
  require "bugsnag/middleware/rack_request"
19
19
  require "bugsnag/middleware/warden_user"
@@ -27,92 +27,88 @@ require "bugsnag/middleware/callbacks"
27
27
  require "bugsnag/middleware/classify_error"
28
28
 
29
29
  module Bugsnag
30
- LOG_PREFIX = "** [Bugsnag] "
31
30
  LOCK = Mutex.new
32
31
 
33
32
  class << self
34
33
  # Configure the Bugsnag notifier application-wide settings.
35
- def configure(config_hash=nil)
36
- if config_hash
37
- config_hash.each do |k,v|
38
- configuration.send("#{k}=", v) rescue nil if configuration.respond_to?("#{k}=")
39
- end
40
- end
41
-
34
+ def configure
42
35
  yield(configuration) if block_given?
43
36
 
44
- # Use resque for asynchronous notification if required
45
- require "bugsnag/delay/resque" if configuration.delay_with_resque && defined?(Resque)
46
-
47
- # Add info error classifier to internal middleware
48
- configuration.internal_middleware.use(Bugsnag::Middleware::ClassifyError)
49
-
50
- # Warn if an api_key hasn't been set
51
37
  @key_warning = false unless defined?(@key_warning)
52
-
53
- if !configuration.api_key && !@key_warning
54
- warn "No API key has been set, check your configuration"
38
+ if !configuration.valid_api_key? && !@key_warning
39
+ configuration.warn("No valid API key has been set, notifications will not be sent")
55
40
  @key_warning = true
56
41
  end
42
+ end
57
43
 
58
- # Log that we are ready to rock
59
- @logged_ready = false unless defined?(@logged_ready)
44
+ # Explicitly notify of an exception
45
+ def notify(exception, auto_notify=false, &block)
60
46
 
61
- if configuration.api_key && !@logged_ready
62
- log "Bugsnag exception handler #{VERSION} ready"
63
- @logged_ready = true
47
+ if !configuration.auto_notify && auto_notify
48
+ configuration.debug("Not notifying because auto_notify is disabled")
49
+ return
64
50
  end
65
- end
66
51
 
67
- # Explicitly notify of an exception
68
- def notify(exception, overrides=nil, request_data=nil, &block)
69
- notification = Notification.new(exception, configuration, overrides, request_data)
52
+ if !configuration.valid_api_key?
53
+ configuration.debug("Not notifying due to an invalid api_key")
54
+ return
55
+ end
70
56
 
71
- initial_severity = notification.severity
72
- initial_reason = notification.severity_reason
57
+ if !configuration.should_notify_release_stage?
58
+ configuration.debug("Not notifying due to notify_release_stages :#{configuration.notify_release_stages.inspect}")
59
+ return
60
+ end
73
61
 
74
- yield(notification) if block_given?
62
+ report = Report.new(exception, configuration, auto_notify)
75
63
 
76
- if notification.severity != initial_severity
77
- notification.severity_reason = {
78
- :type => Bugsnag::Notification::USER_CALLBACK_SET_SEVERITY
79
- }
80
- else
81
- notification.severity_reason = initial_reason
64
+ # If this is an auto_notify we yield the block before the any middleware is run
65
+ yield(report) if block_given? && auto_notify
66
+ if report.ignore?
67
+ configuration.debug("Not notifying #{report.exceptions.last[:errorClass]} due to ignore being signified in auto_notify block")
68
+ return
82
69
  end
83
70
 
84
- unless notification.ignore?
85
- notification.deliver
86
- notification
87
- else
88
- false
71
+ # Run internal middleware
72
+ configuration.internal_middleware.run(report)
73
+ if report.ignore?
74
+ configuration.debug("Not notifying #{report.exceptions.last[:errorClass]} due to ignore being signified in internal middlewares")
75
+ return
89
76
  end
90
- end
91
- alias_method :notify_or_ignore, :notify
92
-
93
- # Auto notify of an exception, called from rails and rack exception
94
- # rescuers, unless auto notification is disabled, or we should ignore this
95
- # error class
96
- def auto_notify(exception, overrides=nil, request_data=nil, &block)
97
- overrides ||= {}
98
- overrides[:severity] = "error" unless overrides.has_key? :severity
99
- overrides[:unhandled] = true unless overrides.has_key? :unhandled
100
- notify_or_ignore(exception, overrides, request_data, &block) if configuration.auto_notify
101
- end
102
77
 
103
- # Log wrapper
104
- def log(message)
105
- configuration.logger.info("#{LOG_PREFIX}#{message}")
106
- end
78
+ # Store before_middleware severity reason for future reference
79
+ initial_severity = report.severity
80
+ initial_reason = report.severity_reason
107
81
 
108
- # Warning logger
109
- def warn(message)
110
- configuration.logger.warn("#{LOG_PREFIX}#{message}")
111
- end
82
+ # Run users middleware
83
+ configuration.middleware.run(report) do
84
+ if report.ignore?
85
+ configuration.debug("Not notifying #{report.exceptions.last[:errorClass]} due to ignore being signified in user provided middleware")
86
+ return
87
+ end
88
+
89
+ # If this is not an auto_notify then the block was provided by the user. This should be the last
90
+ # block that is run as it is the users "most specific" block.
91
+ yield(report) if block_given? && !auto_notify
92
+ if report.ignore?
93
+ configuration.debug("Not notifying #{report.exceptions.last[:errorClass]} due to ignore being signified in user provided block")
94
+ return
95
+ end
96
+
97
+ # Test whether severity has been changed and ensure severity_reason is consistant in auto_notify case
98
+ if report.severity != initial_severity
99
+ report.severity_reason = {
100
+ :type => Report::USER_CALLBACK_SET_SEVERITY
101
+ }
102
+ else
103
+ report.severity_reason = initial_reason
104
+ end
112
105
 
113
- # Debug logger
114
- def debug(message)
115
- configuration.logger.info("#{LOG_PREFIX}#{message}") if configuration.debug
106
+ # Deliver
107
+ configuration.info("Notifying #{configuration.endpoint} of #{report.exceptions.last[:errorClass]}")
108
+ payload_string = ::JSON.dump(Bugsnag::Helpers.trim_if_needed(report.as_json))
109
+ configuration.debug("Payload: #{payload_string}")
110
+ Bugsnag::Delivery[configuration.delivery_method].deliver(configuration.endpoint, payload_string, configuration)
111
+ end
116
112
  end
117
113
 
118
114
  # Configuration getters
@@ -121,34 +117,16 @@ module Bugsnag
121
117
  @configuration || LOCK.synchronize { @configuration ||= Bugsnag::Configuration.new }
122
118
  end
123
119
 
124
- # Set "per-request" data, temporal data for use in bugsnag middleware
125
- def set_request_data(key, value)
126
- Bugsnag.configuration.set_request_data(key, value)
127
- end
128
-
129
- # Clear all "per-request" data, temporal data for use in bugsnag middleware
130
- # This method should be called after each distinct request or session ends
131
- # Eg. After completing a page request in a web app
132
- def clear_request_data
133
- Bugsnag.configuration.clear_request_data
134
- end
135
-
136
120
  # Allow access to "before notify" callbacks
137
121
  def before_notify_callbacks
138
122
  Bugsnag.configuration.request_data[:before_callbacks] ||= []
139
123
  end
140
-
141
- # Allow access to "after notify" callbacks
142
- def after_notify_callbacks
143
- Bugsnag.configuration.request_data[:after_callbacks] ||= []
144
- end
145
124
  end
146
125
  end
147
126
 
148
- require "bugsnag/railtie" if defined?(Rails::Railtie)
149
127
  [:resque, :sidekiq, :mailman, :delayed_job, :shoryuken, :que].each do |integration|
150
128
  begin
151
- require "bugsnag/#{integration}"
129
+ require "bugsnag/integrations/#{integration}"
152
130
  rescue LoadError
153
131
  end
154
132
  end
@@ -2,6 +2,11 @@ require "set"
2
2
  require "socket"
3
3
  require "logger"
4
4
  require "bugsnag/middleware_stack"
5
+ require "bugsnag/middleware/callbacks"
6
+ require "bugsnag/middleware/exception_meta_data"
7
+ require "bugsnag/middleware/ignore_error_class"
8
+ require "bugsnag/middleware/suggestion_data"
9
+ require "bugsnag/middleware/classify_error"
5
10
 
6
11
  module Bugsnag
7
12
  class Configuration
@@ -9,35 +14,30 @@ module Bugsnag
9
14
  attr_accessor :release_stage
10
15
  attr_accessor :notify_release_stages
11
16
  attr_accessor :auto_notify
12
- attr_accessor :use_ssl
13
17
  attr_accessor :ca_file
14
18
  attr_accessor :send_environment
15
19
  attr_accessor :send_code
16
20
  attr_accessor :project_root
17
- attr_accessor :vendor_paths
18
21
  attr_accessor :app_version
19
22
  attr_accessor :app_type
20
- attr_accessor :params_filters
21
- attr_accessor :ignore_user_agents
23
+ attr_accessor :meta_data_filters
22
24
  attr_accessor :endpoint
23
25
  attr_accessor :logger
24
26
  attr_accessor :middleware
25
27
  attr_accessor :internal_middleware
26
- attr_accessor :delay_with_resque
27
- attr_accessor :debug
28
28
  attr_accessor :proxy_host
29
29
  attr_accessor :proxy_port
30
30
  attr_accessor :proxy_user
31
31
  attr_accessor :proxy_password
32
32
  attr_accessor :timeout
33
33
  attr_accessor :hostname
34
- attr_writer :ignore_classes
34
+ attr_accessor :ignore_classes
35
35
 
36
+ API_KEY_REGEX = /[0-9a-f]{32}/i
36
37
  THREAD_LOCAL_NAME = "bugsnag_req_data"
38
+ DEFAULT_ENDPOINT = "https://notify.bugsnag.com"
37
39
 
38
- DEFAULT_ENDPOINT = "notify.bugsnag.com"
39
-
40
- DEFAULT_PARAMS_FILTERS = [
40
+ DEFAULT_META_DATA_FILTERS = [
41
41
  /authorization/i,
42
42
  /cookie/i,
43
43
  /password/i,
@@ -45,36 +45,39 @@ module Bugsnag
45
45
  "rack.request.form_vars"
46
46
  ].freeze
47
47
 
48
- DEFAULT_IGNORE_USER_AGENTS = [].freeze
49
-
50
- DEFAULT_DELIVERY_METHOD = :thread_queue
51
-
52
48
  def initialize
53
49
  @mutex = Mutex.new
54
50
 
55
51
  # Set up the defaults
56
52
  self.auto_notify = true
57
- self.use_ssl = true
58
53
  self.send_environment = false
59
54
  self.send_code = true
60
- self.params_filters = Set.new(DEFAULT_PARAMS_FILTERS)
61
- self.ignore_classes = Set.new()
62
- self.ignore_user_agents = Set.new(DEFAULT_IGNORE_USER_AGENTS)
55
+ self.meta_data_filters = Set.new(DEFAULT_META_DATA_FILTERS)
56
+ self.ignore_classes = Set.new([])
63
57
  self.endpoint = DEFAULT_ENDPOINT
64
58
  self.hostname = default_hostname
65
59
  self.timeout = 15
66
- self.vendor_paths = [%r{vendor/}]
67
60
  self.notify_release_stages = nil
68
61
 
69
62
  # Read the API key from the environment
70
63
  self.api_key = ENV["BUGSNAG_API_KEY"]
71
64
 
65
+ # Read NET::HTTP proxy environment variable
66
+ self.proxy_host = ENV["http_proxy"]
67
+
72
68
  # Set up logging
73
69
  self.logger = Logger.new(STDOUT)
74
- self.logger.level = Logger::WARN
70
+ self.logger.level = Logger::INFO
71
+ self.logger.formatter = proc do |severity, datetime, progname, msg|
72
+ "** [Bugsnag] #{datetime}: #{msg}\n"
73
+ end
75
74
 
76
75
  # Configure the bugsnag middleware stack
77
76
  self.internal_middleware = Bugsnag::MiddlewareStack.new
77
+ self.internal_middleware.use Bugsnag::Middleware::ExceptionMetaData
78
+ self.internal_middleware.use Bugsnag::Middleware::IgnoreErrorClass
79
+ self.internal_middleware.use Bugsnag::Middleware::SuggestionData
80
+ self.internal_middleware.use Bugsnag::Middleware::ClassifyError
78
81
 
79
82
  self.middleware = Bugsnag::MiddlewareStack.new
80
83
  self.middleware.use Bugsnag::Middleware::Callbacks
@@ -85,7 +88,7 @@ module Bugsnag
85
88
  # notification endpoint.
86
89
  #
87
90
  def delivery_method
88
- @delivery_method || @default_delivery_method || DEFAULT_DELIVERY_METHOD
91
+ @delivery_method || @default_delivery_method || :thread_queue
89
92
  end
90
93
 
91
94
  ##
@@ -104,13 +107,12 @@ module Bugsnag
104
107
  @default_delivery_method = delivery_method
105
108
  end
106
109
 
107
- # Accept both String and Class instances as an ignored class
108
- def ignore_classes
109
- @mutex.synchronize { @ignore_classes.map! { |klass| klass.is_a?(Class) ? klass.name : klass } }
110
+ def should_notify_release_stage?
111
+ @release_stage.nil? || @notify_release_stages.nil? || @notify_release_stages.include?(@release_stage)
110
112
  end
111
113
 
112
- def should_notify?
113
- @release_stage.nil? || @notify_release_stages.nil? || @notify_release_stages.include?(@release_stage)
114
+ def valid_api_key?
115
+ !api_key.nil? && api_key =~ API_KEY_REGEX
114
116
  end
115
117
 
116
118
  def request_data
@@ -129,6 +131,20 @@ module Bugsnag
129
131
  Thread.current[THREAD_LOCAL_NAME] = nil
130
132
  end
131
133
 
134
+ def info(message)
135
+ logger.info(message)
136
+ end
137
+
138
+ # Warning logger
139
+ def warn(message)
140
+ logger.warn(message)
141
+ end
142
+
143
+ # Debug logger
144
+ def debug(message)
145
+ logger.debug(message)
146
+ end
147
+
132
148
  private
133
149
 
134
150
  def default_hostname