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.
- checksums.yaml +4 -4
- data/.craft.yml +19 -0
- data/.scripts/bump-version.rb +5 -0
- data/{changelog.md → CHANGELOG.md} +174 -1
- data/Gemfile +24 -25
- data/Makefile +3 -0
- data/README.md +44 -16
- data/lib/raven/backtrace.rb +9 -5
- data/lib/raven/base.rb +7 -2
- data/lib/raven/breadcrumbs.rb +1 -1
- data/lib/raven/breadcrumbs/{activesupport.rb → active_support_logger.rb} +9 -3
- data/lib/raven/breadcrumbs/logger.rb +2 -92
- data/lib/raven/breadcrumbs/sentry_logger.rb +73 -0
- data/lib/raven/cli.rb +10 -21
- data/lib/raven/client.rb +9 -4
- data/lib/raven/configuration.rb +95 -10
- data/lib/raven/context.rb +13 -8
- data/lib/raven/core_ext/object/deep_dup.rb +57 -0
- data/lib/raven/core_ext/object/duplicable.rb +153 -0
- data/lib/raven/event.rb +31 -15
- data/lib/raven/helpers/deprecation_helper.rb +17 -0
- data/lib/raven/instance.rb +21 -5
- data/lib/raven/integrations/delayed_job.rb +15 -15
- data/lib/raven/integrations/rack-timeout.rb +7 -4
- data/lib/raven/integrations/rack.rb +8 -6
- data/lib/raven/integrations/rails.rb +13 -3
- data/lib/raven/integrations/rails/active_job.rb +6 -4
- data/lib/raven/integrations/rails/backtrace_cleaner.rb +29 -0
- data/lib/raven/integrations/rails/overrides/debug_exceptions_catcher.rb +2 -2
- data/lib/raven/integrations/sidekiq.rb +4 -78
- data/lib/raven/integrations/sidekiq/cleanup_middleware.rb +13 -0
- data/lib/raven/integrations/sidekiq/error_handler.rb +38 -0
- data/lib/raven/interface.rb +2 -2
- data/lib/raven/interfaces/stack_trace.rb +1 -1
- data/lib/raven/linecache.rb +5 -2
- data/lib/raven/logger.rb +3 -2
- data/lib/raven/processor/cookies.rb +16 -6
- data/lib/raven/processor/post_data.rb +2 -0
- data/lib/raven/processor/removecircularreferences.rb +3 -1
- data/lib/raven/processor/sanitizedata.rb +65 -17
- data/lib/raven/processor/utf8conversion.rb +2 -0
- data/lib/raven/transports.rb +4 -0
- data/lib/raven/transports/http.rb +7 -8
- data/lib/raven/utils/context_filter.rb +42 -0
- data/lib/raven/utils/exception_cause_chain.rb +1 -0
- data/lib/raven/utils/real_ip.rb +1 -1
- data/lib/raven/utils/request_id.rb +16 -0
- data/lib/raven/version.rb +2 -2
- data/lib/sentry-raven-without-integrations.rb +6 -1
- data/lib/sentry_raven_without_integrations.rb +1 -0
- data/sentry-raven.gemspec +7 -0
- metadata +22 -10
- data/.gitignore +0 -13
- data/.gitmodules +0 -0
- data/.rspec +0 -1
- data/.rubocop.yml +0 -74
- 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 =>
|
89
|
-
logger.warn "Unable to load raven/integrations/#{integration}: #{
|
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
|
data/lib/raven/breadcrumbs.rb
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
module Raven
|
2
|
-
module
|
3
|
-
|
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
|
-
|
1
|
+
DeprecationHelper.deprecate_old_breadcrumbs_configuration(:sentry_logger)
|
2
2
|
|
3
|
-
|
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)
|
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.
|
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 =>
|
33
|
-
evt = instance.capture_exception(
|
32
|
+
rescue ZeroDivisionError => e
|
33
|
+
evt = instance.capture_exception(e)
|
34
34
|
end
|
35
35
|
|
36
|
-
if evt
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
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
|
-
|
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'
|
10
|
-
USER_AGENT = "raven-ruby/#{Raven::VERSION}"
|
11
|
-
CONTENT_TYPE = 'application/json'
|
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
|
-
|
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
|
|
data/lib/raven/configuration.rb
CHANGED
@@ -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
|
-
|
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
|
-
'
|
184
|
-
'
|
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
|
-
|
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
|
257
|
-
@server
|
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 =>
|
355
|
-
logger.error "Error detecting release: #{
|
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
|
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(
|
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
|