sentry-raven 3.0.0 → 3.1.2

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 (57) hide show
  1. checksums.yaml +4 -4
  2. data/.craft.yml +19 -0
  3. data/.scripts/bump-version.rb +5 -0
  4. data/{changelog.md → CHANGELOG.md} +174 -1
  5. data/Gemfile +24 -25
  6. data/Makefile +3 -0
  7. data/README.md +44 -16
  8. data/lib/raven/backtrace.rb +9 -5
  9. data/lib/raven/base.rb +7 -2
  10. data/lib/raven/breadcrumbs.rb +1 -1
  11. data/lib/raven/breadcrumbs/{activesupport.rb → active_support_logger.rb} +9 -3
  12. data/lib/raven/breadcrumbs/logger.rb +2 -92
  13. data/lib/raven/breadcrumbs/sentry_logger.rb +73 -0
  14. data/lib/raven/cli.rb +10 -21
  15. data/lib/raven/client.rb +9 -4
  16. data/lib/raven/configuration.rb +95 -10
  17. data/lib/raven/context.rb +13 -8
  18. data/lib/raven/core_ext/object/deep_dup.rb +57 -0
  19. data/lib/raven/core_ext/object/duplicable.rb +153 -0
  20. data/lib/raven/event.rb +31 -15
  21. data/lib/raven/helpers/deprecation_helper.rb +17 -0
  22. data/lib/raven/instance.rb +21 -5
  23. data/lib/raven/integrations/delayed_job.rb +15 -15
  24. data/lib/raven/integrations/rack-timeout.rb +7 -4
  25. data/lib/raven/integrations/rack.rb +8 -6
  26. data/lib/raven/integrations/rails.rb +13 -3
  27. data/lib/raven/integrations/rails/active_job.rb +6 -4
  28. data/lib/raven/integrations/rails/backtrace_cleaner.rb +29 -0
  29. data/lib/raven/integrations/rails/overrides/debug_exceptions_catcher.rb +2 -2
  30. data/lib/raven/integrations/sidekiq.rb +4 -78
  31. data/lib/raven/integrations/sidekiq/cleanup_middleware.rb +13 -0
  32. data/lib/raven/integrations/sidekiq/error_handler.rb +38 -0
  33. data/lib/raven/interface.rb +2 -2
  34. data/lib/raven/interfaces/stack_trace.rb +1 -1
  35. data/lib/raven/linecache.rb +5 -2
  36. data/lib/raven/logger.rb +3 -2
  37. data/lib/raven/processor/cookies.rb +16 -6
  38. data/lib/raven/processor/post_data.rb +2 -0
  39. data/lib/raven/processor/removecircularreferences.rb +3 -1
  40. data/lib/raven/processor/sanitizedata.rb +65 -17
  41. data/lib/raven/processor/utf8conversion.rb +2 -0
  42. data/lib/raven/transports.rb +4 -0
  43. data/lib/raven/transports/http.rb +7 -8
  44. data/lib/raven/utils/context_filter.rb +42 -0
  45. data/lib/raven/utils/exception_cause_chain.rb +1 -0
  46. data/lib/raven/utils/real_ip.rb +1 -1
  47. data/lib/raven/utils/request_id.rb +16 -0
  48. data/lib/raven/version.rb +2 -2
  49. data/lib/sentry-raven-without-integrations.rb +6 -1
  50. data/lib/sentry_raven_without_integrations.rb +1 -0
  51. data/sentry-raven.gemspec +7 -0
  52. metadata +22 -10
  53. data/.gitignore +0 -13
  54. data/.gitmodules +0 -0
  55. data/.rspec +0 -1
  56. data/.rubocop.yml +0 -74
  57. data/.travis.yml +0 -43
data/lib/raven/base.rb CHANGED
@@ -1,4 +1,6 @@
1
1
  require 'raven/version'
2
+ require "raven/helpers/deprecation_helper"
3
+ require 'raven/core_ext/object/deep_dup'
2
4
  require 'raven/backtrace'
3
5
  require 'raven/breadcrumbs'
4
6
  require 'raven/processor'
@@ -23,6 +25,7 @@ require 'raven/transports'
23
25
  require 'raven/transports/http'
24
26
  require 'raven/utils/deep_merge'
25
27
  require 'raven/utils/real_ip'
28
+ require 'raven/utils/request_id'
26
29
  require 'raven/utils/exception_cause_chain'
27
30
  require 'raven/instance'
28
31
 
@@ -85,12 +88,13 @@ module Raven
85
88
 
86
89
  def load_integration(integration)
87
90
  require "raven/integrations/#{integration}"
88
- rescue Exception => error
89
- logger.warn "Unable to load raven/integrations/#{integration}: #{error}"
91
+ rescue Exception => e
92
+ logger.warn "Unable to load raven/integrations/#{integration}: #{e}"
90
93
  end
91
94
 
92
95
  def safely_prepend(module_name, opts = {})
93
96
  return if opts[:to].nil? || opts[:from].nil?
97
+
94
98
  if opts[:to].respond_to?(:prepend, true)
95
99
  opts[:to].send(:prepend, opts[:from].const_get(module_name))
96
100
  else
@@ -101,6 +105,7 @@ module Raven
101
105
  def sys_command(command)
102
106
  result = `#{command} 2>&1` rescue nil
103
107
  return if result.nil? || result.empty? || ($CHILD_STATUS && $CHILD_STATUS.exitstatus != 0)
108
+
104
109
  result.strip
105
110
  end
106
111
  end
@@ -64,7 +64,7 @@ module Raven
64
64
  end
65
65
 
66
66
  def empty?
67
- !members.any?
67
+ members.none?
68
68
  end
69
69
 
70
70
  def to_hash
@@ -1,6 +1,7 @@
1
1
  module Raven
2
- module ActiveSupportBreadcrumbs
3
- class << self
2
+ module Breadcrumbs
3
+ module ActiveSupportLogger
4
+ class << self
4
5
  def add(name, started, _finished, _unique_id, data)
5
6
  Raven.breadcrumbs.record do |crumb|
6
7
  crumb.data = data
@@ -10,10 +11,15 @@ module Raven
10
11
  end
11
12
 
12
13
  def inject
13
- ActiveSupport::Notifications.subscribe(/.*/) do |name, started, finished, unique_id, data|
14
+ @subscriber = ::ActiveSupport::Notifications.subscribe(/.*/) do |name, started, finished, unique_id, data|
14
15
  add(name, started, finished, unique_id, data)
15
16
  end
16
17
  end
18
+
19
+ def detach
20
+ ::ActiveSupport::Notifications.unsubscribe(@subscriber)
21
+ end
22
+ end
17
23
  end
18
24
  end
19
25
  end
@@ -1,93 +1,3 @@
1
- require 'logger'
1
+ DeprecationHelper.deprecate_old_breadcrumbs_configuration(:sentry_logger)
2
2
 
3
- module Raven
4
- module BreadcrumbLogger
5
- LEVELS = {
6
- ::Logger::DEBUG => 'debug',
7
- ::Logger::INFO => 'info',
8
- ::Logger::WARN => 'warn',
9
- ::Logger::ERROR => 'error',
10
- ::Logger::FATAL => 'fatal'
11
- }.freeze
12
-
13
- EXC_FORMAT = /^([a-zA-Z0-9]+)\:\s(.*)$/
14
-
15
- def self.parse_exception(message)
16
- lines = message.split(/\n\s*/)
17
- # TODO: wat
18
- return nil unless lines.length > 2
19
-
20
- match = lines[0].match(EXC_FORMAT)
21
- return nil unless match
22
-
23
- _, type, value = match.to_a
24
- [type, value]
25
- end
26
-
27
- def add(*args)
28
- add_breadcrumb(*args)
29
- super
30
- end
31
-
32
- def add_breadcrumb(severity, message = nil, progname = nil)
33
- message = progname if message.nil? # see Ruby's Logger docs for why
34
- return if ignored_logger?(progname)
35
- return if message.nil? || message == ""
36
-
37
- # some loggers will add leading/trailing space as they (incorrectly, mind you)
38
- # think of logging as a shortcut to std{out,err}
39
- message = message.to_s.strip
40
-
41
- last_crumb = Raven.breadcrumbs.peek
42
- # try to avoid dupes from logger broadcasts
43
- if last_crumb.nil? || last_crumb.message != message
44
- error = Raven::BreadcrumbLogger.parse_exception(message)
45
- # TODO(dcramer): we need to filter out the "currently captured error"
46
- if error
47
- Raven.breadcrumbs.record do |crumb|
48
- crumb.level = Raven::BreadcrumbLogger::LEVELS.fetch(severity, nil)
49
- crumb.category = progname || 'error'
50
- crumb.type = 'error'
51
- crumb.data = {
52
- :type => error[0],
53
- :value => error[1]
54
- }
55
- end
56
- else
57
- Raven.breadcrumbs.record do |crumb|
58
- crumb.level = Raven::BreadcrumbLogger::LEVELS.fetch(severity, nil)
59
- crumb.category = progname || 'logger'
60
- crumb.message = message
61
- end
62
- end
63
- end
64
- end
65
-
66
- private
67
-
68
- def ignored_logger?(progname)
69
- progname == "sentry" ||
70
- Raven.configuration.exclude_loggers.include?(progname)
71
- end
72
- end
73
- module OldBreadcrumbLogger
74
- def self.included(base)
75
- base.class_eval do
76
- include Raven::BreadcrumbLogger
77
- alias_method :add_without_raven, :add
78
- alias_method :add, :add_with_raven
79
- end
80
- end
81
-
82
- def add_with_raven(*args)
83
- add_breadcrumb(*args)
84
- add_without_raven(*args)
85
- end
86
- end
87
- end
88
-
89
- Raven.safely_prepend(
90
- "BreadcrumbLogger",
91
- :from => Raven,
92
- :to => ::Logger
93
- )
3
+ require "raven/breadcrumbs/sentry_logger"
@@ -0,0 +1,73 @@
1
+ require 'logger'
2
+
3
+ module Raven
4
+ module Breadcrumbs
5
+ module SentryLogger
6
+ LEVELS = {
7
+ ::Logger::DEBUG => 'debug',
8
+ ::Logger::INFO => 'info',
9
+ ::Logger::WARN => 'warn',
10
+ ::Logger::ERROR => 'error',
11
+ ::Logger::FATAL => 'fatal'
12
+ }.freeze
13
+
14
+ def add(*args)
15
+ add_breadcrumb(*args)
16
+ super
17
+ end
18
+
19
+ def add_breadcrumb(severity, message = nil, progname = nil)
20
+ message = progname if message.nil? # see Ruby's Logger docs for why
21
+ return if ignored_logger?(progname)
22
+ return if message.nil? || message == ""
23
+
24
+ # some loggers will add leading/trailing space as they (incorrectly, mind you)
25
+ # think of logging as a shortcut to std{out,err}
26
+ message = message.to_s.strip
27
+
28
+ last_crumb = Raven.breadcrumbs.peek
29
+ # try to avoid dupes from logger broadcasts
30
+ if last_crumb.nil? || last_crumb.message != message
31
+ Raven.breadcrumbs.record do |crumb|
32
+ crumb.level = Raven::Breadcrumbs::SentryLogger::LEVELS.fetch(severity, nil)
33
+ crumb.category = progname || 'logger'
34
+ crumb.message = message
35
+ crumb.type =
36
+ if severity >= 3
37
+ "error"
38
+ else
39
+ crumb.level
40
+ end
41
+ end
42
+ end
43
+ end
44
+
45
+ private
46
+
47
+ def ignored_logger?(progname)
48
+ progname == "sentry" ||
49
+ Raven.configuration.exclude_loggers.include?(progname)
50
+ end
51
+ end
52
+ module OldBreadcrumbsSentryLogger
53
+ def self.included(base)
54
+ base.class_eval do
55
+ include Raven::Breadcrumbs::SentryLogger
56
+ alias_method :add_without_raven, :add
57
+ alias_method :add, :add_with_raven
58
+ end
59
+ end
60
+
61
+ def add_with_raven(*args)
62
+ add_breadcrumb(*args)
63
+ add_without_raven(*args)
64
+ end
65
+ end
66
+ end
67
+ end
68
+
69
+ Raven.safely_prepend(
70
+ "Breadcrumbs::SentryLogger",
71
+ :from => Raven,
72
+ :to => ::Logger
73
+ )
data/lib/raven/cli.rb CHANGED
@@ -1,6 +1,6 @@
1
1
  module Raven
2
2
  class CLI
3
- def self.test(dsn = nil, silent = false, config = nil) # rubocop:disable all
3
+ def self.test(dsn = nil, silent = false, config = nil)
4
4
  config ||= Raven.configuration
5
5
 
6
6
  config.logger = if silent
@@ -18,7 +18,7 @@ module Raven
18
18
 
19
19
  # wipe out env settings to ensure we send the event
20
20
  unless config.capture_allowed?
21
- env_name = config.environments.pop || 'production'
21
+ env_name = config.environments.last || 'production'
22
22
  config.current_environment = env_name
23
23
  end
24
24
 
@@ -29,31 +29,20 @@ module Raven
29
29
 
30
30
  begin
31
31
  1 / 0
32
- rescue ZeroDivisionError => exception
33
- evt = instance.capture_exception(exception)
32
+ rescue ZeroDivisionError => e
33
+ evt = instance.capture_exception(e)
34
34
  end
35
35
 
36
- if evt && !(evt.is_a? Thread)
37
- if evt.is_a? Hash
38
- instance.logger.debug "-> event ID: #{evt[:event_id]}"
39
- else
40
- instance.logger.debug "-> event ID: #{evt.id}"
41
- end
42
- elsif evt # async configuration
43
- if evt.value.is_a? Hash
44
- instance.logger.debug "-> event ID: #{evt.value[:event_id]}"
45
- else
46
- instance.logger.debug "-> event ID: #{evt.value.id}"
47
- end
36
+ if evt
37
+ instance.logger.debug "-> event ID: #{evt.id}"
38
+ instance.logger.debug ""
39
+ instance.logger.debug "Done!"
40
+ evt
48
41
  else
49
42
  instance.logger.debug ""
50
43
  instance.logger.debug "An error occurred while attempting to send the event."
51
- exit 1
44
+ false
52
45
  end
53
-
54
- instance.logger.debug ""
55
- instance.logger.debug "Done!"
56
- evt
57
46
  end
58
47
  end
59
48
  end
data/lib/raven/client.rb CHANGED
@@ -1,14 +1,17 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  require 'base64'
3
4
  require 'json'
4
5
  require 'zlib'
5
6
 
7
+ require "raven/transports"
8
+
6
9
  module Raven
7
10
  # Encodes events and sends them to the Sentry server.
8
11
  class Client
9
- PROTOCOL_VERSION = '5'.freeze
10
- USER_AGENT = "raven-ruby/#{Raven::VERSION}".freeze
11
- CONTENT_TYPE = 'application/json'.freeze
12
+ PROTOCOL_VERSION = '5'
13
+ USER_AGENT = "raven-ruby/#{Raven::VERSION}"
14
+ CONTENT_TYPE = 'application/json'
12
15
 
13
16
  attr_accessor :configuration
14
17
 
@@ -120,7 +123,9 @@ module Raven
120
123
  configuration.logger.warn "Not sending event due to previous failure(s)."
121
124
  end
122
125
  configuration.logger.warn("Failed to submit event: #{get_log_message(event)}")
123
- configuration.transport_failure_callback.call(event) if configuration.transport_failure_callback
126
+
127
+ # configuration.transport_failure_callback can be false & nil
128
+ configuration.transport_failure_callback.call(event, e) if configuration.transport_failure_callback # rubocop:disable Style/SafeNavigation
124
129
  end
125
130
  end
126
131
 
@@ -12,6 +12,11 @@ module Raven
12
12
  attr_reader :async
13
13
  alias async? async
14
14
 
15
+ # An array of breadcrumbs loggers to be used. Available options are:
16
+ # - :sentry_logger
17
+ # - :active_support_logger
18
+ attr_reader :breadcrumbs_logger
19
+
15
20
  # Number of lines of code context to capture, or nil for none
16
21
  attr_accessor :context_lines
17
22
 
@@ -83,7 +88,7 @@ module Raven
83
88
  attr_accessor :public_key
84
89
 
85
90
  # Turns on ActiveSupport breadcrumbs integration
86
- attr_accessor :rails_activesupport_breadcrumbs
91
+ attr_reader :rails_activesupport_breadcrumbs
87
92
 
88
93
  # Rails catches exceptions in the ActionDispatch::ShowExceptions or
89
94
  # ActionDispatch::DebugExceptions middlewares, depending on the environment.
@@ -118,6 +123,19 @@ module Raven
118
123
  # Otherwise, can be one of "http", "https", or "dummy"
119
124
  attr_accessor :scheme
120
125
 
126
+ # a proc/lambda that takes an array of stack traces
127
+ # it'll be used to silence (reduce) backtrace of the exception
128
+ #
129
+ # for example:
130
+ #
131
+ # ```ruby
132
+ # Raven.configuration.backtrace_cleanup_callback = lambda do |backtrace|
133
+ # Rails.backtrace_cleaner.clean(backtrace)
134
+ # end
135
+ # ```
136
+ #
137
+ attr_accessor :backtrace_cleanup_callback
138
+
121
139
  # Secret key for authentication with the Sentry server
122
140
  # If you provide a DSN, this will be set automatically.
123
141
  #
@@ -172,16 +190,34 @@ module Raven
172
190
  # Errors object - an Array that contains error messages. See #
173
191
  attr_reader :errors
174
192
 
193
+ # the dsn value, whether it's set via `config.dsn=` or `ENV["SENTRY_DSN"]`
194
+ attr_reader :dsn
195
+
196
+ # Array of rack env parameters to be included in the event sent to sentry.
197
+ attr_accessor :rack_env_whitelist
198
+
199
+ # Most of these errors generate 4XX responses. In general, Sentry clients
200
+ # only automatically report 5xx responses.
175
201
  IGNORE_DEFAULT = [
176
202
  'AbstractController::ActionNotFound',
203
+ 'ActionController::BadRequest',
177
204
  'ActionController::InvalidAuthenticityToken',
205
+ 'ActionController::InvalidCrossOriginRequest',
206
+ 'ActionController::MethodNotAllowed',
207
+ 'ActionController::NotImplemented',
208
+ 'ActionController::ParameterMissing',
178
209
  'ActionController::RoutingError',
179
210
  'ActionController::UnknownAction',
211
+ 'ActionController::UnknownFormat',
212
+ 'ActionController::UnknownHttpMethod',
213
+ 'ActionDispatch::Http::Parameters::ParseError',
214
+ 'ActiveJob::DeserializationError', # Can cause infinite loops
180
215
  'ActiveRecord::RecordNotFound',
181
216
  'CGI::Session::CookieStore::TamperedWithCookie',
182
217
  'Mongoid::Errors::DocumentNotFound',
183
- 'Sinatra::NotFound',
184
- 'ActiveJob::DeserializationError'
218
+ 'Rack::QueryParser::InvalidParameterError',
219
+ 'Rack::QueryParser::ParameterTypeError',
220
+ 'Sinatra::NotFound'
185
221
  ].freeze
186
222
 
187
223
  # Note the order - we have to remove circular references and bad characters
@@ -198,11 +234,20 @@ module Raven
198
234
  HEROKU_DYNO_METADATA_MESSAGE = "You are running on Heroku but haven't enabled Dyno Metadata. For Sentry's "\
199
235
  "release detection to work correctly, please run `heroku labs:enable runtime-dyno-metadata`".freeze
200
236
 
237
+ RACK_ENV_WHITELIST_DEFAULT = %w(
238
+ REMOTE_ADDR
239
+ SERVER_NAME
240
+ SERVER_PORT
241
+ ).freeze
242
+
201
243
  LOG_PREFIX = "** [Raven] ".freeze
202
244
  MODULE_SEPARATOR = "::".freeze
203
245
 
246
+ AVAILABLE_BREADCRUMBS_LOGGERS = [:sentry_logger, :active_support_logger].freeze
247
+
204
248
  def initialize
205
249
  self.async = false
250
+ self.breadcrumbs_logger = []
206
251
  self.context_lines = 3
207
252
  self.current_environment = current_environment_from_env
208
253
  self.encoding = 'gzip'
@@ -215,7 +260,8 @@ module Raven
215
260
  self.open_timeout = 1
216
261
  self.processors = DEFAULT_PROCESSORS.dup
217
262
  self.project_root = detect_project_root
218
- self.rails_activesupport_breadcrumbs = false
263
+ @rails_activesupport_breadcrumbs = false
264
+
219
265
  self.rails_report_rescued_exceptions = true
220
266
  self.release = detect_release
221
267
  self.sample_rate = 1.0
@@ -232,10 +278,14 @@ module Raven
232
278
  self.timeout = 2
233
279
  self.transport_failure_callback = false
234
280
  self.before_send = false
281
+ self.rack_env_whitelist = RACK_ENV_WHITELIST_DEFAULT
235
282
  end
236
283
 
237
284
  def server=(value)
238
285
  return if value.nil?
286
+
287
+ @dsn = value
288
+
239
289
  uri = URI.parse(value)
240
290
  uri_path = uri.path.split('/')
241
291
 
@@ -253,13 +303,14 @@ module Raven
253
303
 
254
304
  # For anyone who wants to read the base server string
255
305
  @server = "#{scheme}://#{host}"
256
- @server << ":#{port}" unless port == { 'http' => 80, 'https' => 443 }[scheme]
257
- @server << path
306
+ @server += ":#{port}" unless port == { 'http' => 80, 'https' => 443 }[scheme]
307
+ @server += path
258
308
  end
259
309
  alias dsn= server=
260
310
 
261
311
  def encoding=(encoding)
262
312
  raise(Error, 'Unsupported encoding') unless %w(gzip json).include? encoding
313
+
263
314
  @encoding = encoding
264
315
  end
265
316
 
@@ -267,13 +318,32 @@ module Raven
267
318
  unless value == false || value.respond_to?(:call)
268
319
  raise(ArgumentError, "async must be callable (or false to disable)")
269
320
  end
321
+
270
322
  @async = value
271
323
  end
272
324
 
325
+ def breadcrumbs_logger=(logger)
326
+ loggers =
327
+ if logger.is_a?(Array)
328
+ logger
329
+ else
330
+ unless AVAILABLE_BREADCRUMBS_LOGGERS.include?(logger)
331
+ raise Raven::Error, "Unsupported breadcrumbs logger. Supported loggers: #{AVAILABLE_BREADCRUMBS_LOGGERS}"
332
+ end
333
+
334
+ Array(logger)
335
+ end
336
+
337
+ require "raven/breadcrumbs/sentry_logger" if loggers.include?(:sentry_logger)
338
+
339
+ @breadcrumbs_logger = logger
340
+ end
341
+
273
342
  def transport_failure_callback=(value)
274
343
  unless value == false || value.respond_to?(:call)
275
344
  raise(ArgumentError, "transport_failure_callback must be callable (or false to disable)")
276
345
  end
346
+
277
347
  @transport_failure_callback = value
278
348
  end
279
349
 
@@ -281,6 +351,7 @@ module Raven
281
351
  unless value == false || value.respond_to?(:call)
282
352
  raise ArgumentError, "should_capture must be callable (or false to disable)"
283
353
  end
354
+
284
355
  @should_capture = value
285
356
  end
286
357
 
@@ -288,6 +359,7 @@ module Raven
288
359
  unless value == false || value.respond_to?(:call)
289
360
  raise ArgumentError, "before_send must be callable (or false to disable)"
290
361
  end
362
+
291
363
  @before_send = value
292
364
  end
293
365
 
@@ -323,6 +395,11 @@ module Raven
323
395
  Backtrace::Line.instance_variable_set(:@in_app_pattern, nil) # blow away cache
324
396
  end
325
397
 
398
+ def rails_activesupport_breadcrumbs=(val)
399
+ DeprecationHelper.deprecate_old_breadcrumbs_configuration(:active_support_logger)
400
+ @rails_activesupport_breadcrumbs = val
401
+ end
402
+
326
403
  def exception_class_allowed?(exc)
327
404
  if exc.is_a?(Raven::Error)
328
405
  # Try to prevent error reporting loops
@@ -336,6 +413,10 @@ module Raven
336
413
  end
337
414
  end
338
415
 
416
+ def enabled_in_current_env?
417
+ environments.empty? || environments.include?(current_environment)
418
+ end
419
+
339
420
  private
340
421
 
341
422
  def detect_project_root
@@ -351,8 +432,8 @@ module Raven
351
432
  detect_release_from_git ||
352
433
  detect_release_from_capistrano ||
353
434
  detect_release_from_heroku
354
- rescue => ex
355
- logger.error "Error detecting release: #{ex.message}"
435
+ rescue => e
436
+ logger.error "Error detecting release: #{e.message}"
356
437
  end
357
438
 
358
439
  def excluded_exception?(incoming_exception)
@@ -417,19 +498,22 @@ module Raven
417
498
  end
418
499
 
419
500
  def capture_in_current_environment?
420
- return true unless environments.any? && !environments.include?(current_environment)
501
+ return true if enabled_in_current_env?
502
+
421
503
  @errors << "Not configured to send/capture in environment '#{current_environment}'"
422
504
  false
423
505
  end
424
506
 
425
507
  def capture_allowed_by_callback?(message_or_exc)
426
- return true if !should_capture || message_or_exc.nil? || should_capture.call(*[message_or_exc])
508
+ return true if !should_capture || message_or_exc.nil? || should_capture.call(message_or_exc)
509
+
427
510
  @errors << "should_capture returned false"
428
511
  false
429
512
  end
430
513
 
431
514
  def valid?
432
515
  return true if %w(server host path public_key project_id).all? { |k| public_send(k) }
516
+
433
517
  if server
434
518
  %w(server host path public_key project_id).map do |key|
435
519
  @errors << "No #{key} specified" unless public_send(key)
@@ -442,6 +526,7 @@ module Raven
442
526
 
443
527
  def sample_allowed?
444
528
  return true if sample_rate == 1.0
529
+
445
530
  if Random::DEFAULT.rand >= sample_rate
446
531
  @errors << "Excluded by random sample"
447
532
  false