sentry-raven 2.6.3 → 2.7.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.rspec +0 -1
- data/.rubocop.yml +1 -1
- data/.travis.yml +6 -5
- data/README.md +0 -3
- data/changelog.md +22 -0
- data/docs/breadcrumbs.rst +11 -0
- data/docs/config.rst +17 -5
- data/docs/context.rst +23 -0
- data/docs/index.rst +1 -0
- data/docs/integrations/puma.rst +1 -1
- data/docs/processors.rst +124 -0
- data/lib/raven/backtrace.rb +2 -1
- data/lib/raven/base.rb +6 -0
- data/lib/raven/cli.rb +1 -1
- data/lib/raven/client.rb +0 -3
- data/lib/raven/configuration.rb +60 -4
- data/lib/raven/context.rb +2 -1
- data/lib/raven/event.rb +136 -211
- data/lib/raven/integrations/rack.rb +1 -0
- data/lib/raven/integrations/rails.rb +2 -0
- data/lib/raven/integrations/rails/controller_transaction.rb +13 -0
- data/lib/raven/integrations/rake.rb +6 -1
- data/lib/raven/integrations/sidekiq.rb +11 -7
- data/lib/raven/interfaces/exception.rb +0 -2
- data/lib/raven/interfaces/http.rb +0 -2
- data/lib/raven/interfaces/single_exception.rb +0 -2
- data/lib/raven/interfaces/stack_trace.rb +3 -14
- data/lib/raven/processor/sanitizedata.rb +2 -2
- data/lib/raven/processor/utf8conversion.rb +1 -0
- data/lib/raven/transports.rb +0 -2
- data/lib/raven/transports/http.rb +0 -1
- data/lib/raven/utils/deep_merge.rb +6 -14
- data/lib/raven/version.rb +1 -1
- metadata +5 -4
- data/lib/raven/error.rb +0 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 720bbe2b86e0c01584514a17c2f6299bb1313af1
|
4
|
+
data.tar.gz: 0410c196dffd1e8d0617ff1d01335c120b9dfa3c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 81eb505ebd43d3946a29ecd8e73ea67349c64907eee5821e1259e36353b6b204c7a42c7b584a4f2e93b1d45ee4a5fddf43c7c1f8315f5e63ff123caad2f73656
|
7
|
+
data.tar.gz: f81baee39e752d97874a88f6c37457325d0ab3baa9a8d3b54a495842bf08095879940854965023cda72397d85ee00e8839b51c6bd7954a0c8668143df57c0c2f
|
data/.rspec
CHANGED
data/.rubocop.yml
CHANGED
data/.travis.yml
CHANGED
@@ -8,9 +8,9 @@ branches:
|
|
8
8
|
only: [master]
|
9
9
|
|
10
10
|
rvm:
|
11
|
-
- 2.2.
|
12
|
-
- 2.3.
|
13
|
-
- 2.4.
|
11
|
+
- 2.2.8
|
12
|
+
- 2.3.5
|
13
|
+
- 2.4.2
|
14
14
|
|
15
15
|
env:
|
16
16
|
- RAILS_VERSION=4
|
@@ -24,6 +24,7 @@ addons:
|
|
24
24
|
|
25
25
|
before_install:
|
26
26
|
- service haveged start
|
27
|
+
- gem install bundler
|
27
28
|
|
28
29
|
matrix:
|
29
30
|
include:
|
@@ -31,9 +32,9 @@ matrix:
|
|
31
32
|
env: RAILS_VERSION=4
|
32
33
|
- rvm: jruby-1.7.27
|
33
34
|
env: JRUBY_OPTS="--dev" RAILS_VERSION=4
|
34
|
-
- rvm: jruby-9.1.
|
35
|
+
- rvm: jruby-9.1.13.0
|
35
36
|
env: JRUBY_OPTS="--dev -J-Djruby.launch.inproc=true -J-Xmx1024M" RAILS_VERSION=4
|
36
|
-
- rvm: jruby-9.1.
|
37
|
+
- rvm: jruby-9.1.13.0
|
37
38
|
env: JRUBY_OPTS="--dev -J-Djruby.launch.inproc=true -J-Xmx1024M" RAILS_VERSION=5
|
38
39
|
- rvm: ruby-head
|
39
40
|
env: RAILS_VERSION=0
|
data/README.md
CHANGED
@@ -89,9 +89,6 @@ config.async = lambda { |event| SentryJob.perform_later(event) }
|
|
89
89
|
class SentryJob < ActiveJob::Base
|
90
90
|
queue_as :default
|
91
91
|
|
92
|
-
# Important for ActiveJob! Otherwise, we can get caught in an infinite loop.
|
93
|
-
rescue_from(ActiveJob::DeserializationError) { |e| Rails.logger.error e }
|
94
|
-
|
95
92
|
def perform(event)
|
96
93
|
Raven.send_event(event)
|
97
94
|
end
|
data/changelog.md
CHANGED
@@ -1,3 +1,25 @@
|
|
1
|
+
2.7.1
|
2
|
+
-----
|
3
|
+
|
4
|
+
* BUGFIX: Fixed LocalJumpError in Rails controllers [@nateberkopec w/@frodsan, #774]
|
5
|
+
|
6
|
+
2.7.0
|
7
|
+
-----
|
8
|
+
|
9
|
+
* FEATURE: Add random sampling. [@nateberkopec, #734]
|
10
|
+
* FEATURE: Transactions. See Context docs for usage. [@nateberkopec, #743]
|
11
|
+
* FEATURE: You can set the current environment for Sentry via `SENTRY_CURRENT_ENV` env variable. Useful if your staging environment's RACK_ENV is "production", for example. [@tijmenb, #736]
|
12
|
+
|
13
|
+
* BUGFIX: Fix wrapped classnames in old versions of Sidekiq and ActiveJob [@nateberkopec, #702]
|
14
|
+
* BUGFIX: Server names on Heroku were pretty useless before - now they follow the dyno name ("worker.1", "web.2") [@nateberkopec, #703]
|
15
|
+
* BUGFIX: ActiveJob::DeserializationError is now ignored by default. Not doing so can cause infinite loops if you are using an ActiveJob async callback. [@nateberkopec, #701]
|
16
|
+
* BUGFIX: Binary conversion to UTF-8 when binary is frozen is fixed [@nateberkopec, #757]
|
17
|
+
* BUGFIX: Our credit-card regex now matches Sentry's server behavior, which means it does not censor milliseconds since the epoch [@nateberkopec, #771]
|
18
|
+
|
19
|
+
* REFACTOR: We now use an updated port of Rails' deep_merge which should be 5-10% faster [@nateberkopec, #770]
|
20
|
+
* REFACTOR: Tests have been cleaned up, and now run in random order. [@nateberkopec]
|
21
|
+
* REFACTOR: Raven::Event has been refactored a bit [@nateberkopec]
|
22
|
+
|
1
23
|
2.6.3
|
2
24
|
-----
|
3
25
|
|
data/docs/breadcrumbs.rst
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
.. versionadded:: 1.2
|
2
|
+
|
1
3
|
Breadcrumbs
|
2
4
|
===========
|
3
5
|
|
@@ -38,3 +40,12 @@ Appropriate places to inject Breadcrumbs may be places like your HTTP library:
|
|
38
40
|
end
|
39
41
|
end
|
40
42
|
end
|
43
|
+
|
44
|
+
.. versionadded:: 2.6
|
45
|
+
|
46
|
+
The breadcrumb buffer is publicly accessible if you wish to manipulate it beyond
|
47
|
+
what is possible with the ``record`` method.
|
48
|
+
|
49
|
+
.. sourcecode:: ruby
|
50
|
+
|
51
|
+
Raven.breadcrumbs.buffer # Array of breadcrumbs
|
data/docs/config.rst
CHANGED
@@ -23,7 +23,12 @@ Optional settings
|
|
23
23
|
Thread.new { Raven.send_event(event) }
|
24
24
|
}
|
25
25
|
|
26
|
-
Using a thread to send events will be adequate for truly parallel Ruby platforms such as JRuby, though the benefit on MRI/CRuby will be limited.
|
26
|
+
Using a thread to send events will be adequate for truly parallel Ruby platforms such as JRuby, though the benefit on MRI/CRuby will be limited.
|
27
|
+
|
28
|
+
The example above is extremely basic. For example, exceptions in Rake tasks
|
29
|
+
will not be reported because the Rake task will probably exit before the thread
|
30
|
+
can completely send the event to Sentry. Threads also won't report any
|
31
|
+
exceptions raised inside of them, so be careful!
|
27
32
|
|
28
33
|
If the async callback raises an exception, Raven will attempt to send synchronously.
|
29
34
|
|
@@ -40,9 +45,6 @@ Optional settings
|
|
40
45
|
class SentryJob < ActiveJob::Base
|
41
46
|
queue_as :default
|
42
47
|
|
43
|
-
# Important! Otherwise, we can get caught in an infinite loop.
|
44
|
-
rescue_from(ActiveJob::DeserializationError) { |e| Rails.logger.error e }
|
45
|
-
|
46
48
|
def perform(event)
|
47
49
|
Raven.send_event(event)
|
48
50
|
end
|
@@ -68,7 +70,7 @@ Optional settings
|
|
68
70
|
|
69
71
|
config.environments = %w[ production ]
|
70
72
|
|
71
|
-
Sentry automatically sets the current environment to RAILS_ENV, or if it is not present, RACK_ENV. If you are using Sentry outside of Rack or Rails, or wish to override environment detection, you'll need to set the current environment yourself:
|
73
|
+
Sentry automatically sets the current environment to RAILS_ENV, or if it is not present, RACK_ENV. If you are using Sentry outside of Rack or Rails, or wish to override environment detection, you'll need to set the current environment by setting SENTRY_CURRENT_ENV or configuring the client yourself:
|
72
74
|
|
73
75
|
.. code-block:: ruby
|
74
76
|
|
@@ -183,6 +185,16 @@ Optional settings
|
|
183
185
|
|
184
186
|
config.release = '721e41770371db95eee98ca2707686226b993eda'
|
185
187
|
|
188
|
+
.. describe:: sample_rate
|
189
|
+
|
190
|
+
The sampling factor to apply to events. A value of 0.00 will deny sending
|
191
|
+
any events, and a value of 1.00 will send 100% of events.
|
192
|
+
|
193
|
+
.. code-block:: ruby
|
194
|
+
|
195
|
+
# send 50% of events
|
196
|
+
config.sample_rate = 0.5
|
197
|
+
|
186
198
|
.. describe:: should_capture
|
187
199
|
|
188
200
|
By providing a proc or lambda, you can control what events are captured. Events are passed to the Proc or lambda you provide - returning false will stop the event from sending to Sentry:
|
data/docs/context.rst
CHANGED
@@ -25,6 +25,7 @@ The following attributes are available:
|
|
25
25
|
* ``tags``: a mapping of tags describing this event
|
26
26
|
* ``extra``: a mapping of arbitrary context
|
27
27
|
* ``user``: a mapping of user context
|
28
|
+
* ``transaction``: An array of strings. The final element in the array represents the current transaction, e.g. "HelloController#hello_world" for a Rails controller.
|
28
29
|
|
29
30
|
Providing Request Context
|
30
31
|
-------------------------
|
@@ -116,3 +117,25 @@ for you, otherwise you'll need to ensure you perform it manually:
|
|
116
117
|
|
117
118
|
Note: the rack and user context will perform a set operation, whereas tags
|
118
119
|
and extra context will merge with any existing request context.
|
120
|
+
|
121
|
+
Transactions
|
122
|
+
~~~~~~~~~~~~
|
123
|
+
|
124
|
+
The "transaction" is intended to represent the action the event occurred during.
|
125
|
+
In Rack, this will be the request URL. In Rails, it's the controller name and
|
126
|
+
action ("HelloController#hello_world").
|
127
|
+
|
128
|
+
Transactions are modeled as a stack. The top item in the stack (i.e. the last
|
129
|
+
element of the array) will be used as the ``transaction`` for any events:
|
130
|
+
|
131
|
+
.. sourcecode:: ruby
|
132
|
+
|
133
|
+
Raven.context.transactions.push "User Import"
|
134
|
+
# import some users
|
135
|
+
Raven.context.transactions.pop
|
136
|
+
|
137
|
+
Transactions may also be overridden/set explicitly during event creation:
|
138
|
+
|
139
|
+
.. sourcecode:: ruby
|
140
|
+
|
141
|
+
Raven.capture_exception(exception, transaction: "User Import")
|
data/docs/index.rst
CHANGED
data/docs/integrations/puma.rst
CHANGED
@@ -23,7 +23,7 @@ Puma provides a config option for handling low level errors.
|
|
23
23
|
ex,
|
24
24
|
:message => ex.message,
|
25
25
|
:extra => { :puma => env },
|
26
|
-
:
|
26
|
+
:transaction => "Puma"
|
27
27
|
)
|
28
28
|
# note the below is just a Rack response
|
29
29
|
[500, {}, ["An error has occurred, and engineers have been informed. Please reload the page. If you continue to have problems, contact support@example.com\n"]]
|
data/docs/processors.rst
ADDED
@@ -0,0 +1,124 @@
|
|
1
|
+
Processors
|
2
|
+
==========
|
3
|
+
|
4
|
+
Raven Ruby contains several "processors", which scrub data before it is sent to Sentry.
|
5
|
+
Processors remove invalid or sensitive data. The following are the processors
|
6
|
+
which are enabled by default (and are applied to all outgoing data in this order):
|
7
|
+
|
8
|
+
RemoveCircularReferences
|
9
|
+
Many Ruby JSON implementations simply throw an exception if they detect a
|
10
|
+
circular reference. This processor removes circular references from hashes
|
11
|
+
and arrays.
|
12
|
+
|
13
|
+
UTF8Conversion
|
14
|
+
Many Ruby JSON implementations will throw exceptions if data is not in a
|
15
|
+
consistent UTF-8 format. This processor looks for invalid encodings and fixes
|
16
|
+
them.
|
17
|
+
|
18
|
+
SanitizeData
|
19
|
+
Censors any data which looks like a password, social security number or credit
|
20
|
+
card number. Can be configured to scrub other data.
|
21
|
+
|
22
|
+
Cookies
|
23
|
+
Removes any HTTP cookies from the Sentry event data.
|
24
|
+
|
25
|
+
PostData
|
26
|
+
Removes any HTTP Post request bodies.
|
27
|
+
|
28
|
+
HTTPHeaders
|
29
|
+
Removes all HTTP headers which match a regex. By default, this will only remove the
|
30
|
+
"Authorization" header, but can be configured to remove others.
|
31
|
+
|
32
|
+
Finally, another processor is included in the source but is not turned on by default,
|
33
|
+
RemoveStackTrace.
|
34
|
+
|
35
|
+
To remove stacktraces from events:
|
36
|
+
|
37
|
+
.. sourcecode:: ruby
|
38
|
+
|
39
|
+
Raven.configure do |config|
|
40
|
+
config.processors += [Raven::Processor::RemoveStacktrace]
|
41
|
+
end
|
42
|
+
|
43
|
+
Writing Your Own Processor
|
44
|
+
--------------------------
|
45
|
+
|
46
|
+
Processors are simple to write and understand. As an example, let's say that we
|
47
|
+
send user API keys to a background job (using Sidekiq), and if the background job
|
48
|
+
raises an exception, we want to make sure that the API key is removed from the
|
49
|
+
event data.
|
50
|
+
|
51
|
+
This is what a basic processor might look like:
|
52
|
+
|
53
|
+
.. sourcecode:: ruby
|
54
|
+
|
55
|
+
class MyJobProcessor < Raven::Processor
|
56
|
+
def process(data)
|
57
|
+
return data unless data["extra"]["arguments"] &&
|
58
|
+
data["extra"]["arguments"].first["sensitive_parameter"]
|
59
|
+
|
60
|
+
data["extra"]["arguments"].first["sensitive_parameter"] = STRING_MASK
|
61
|
+
data
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
Processors should inherit from the ``Raven::Processor`` class. This ensures that the
|
66
|
+
processor has access to its client (all processors have a ``client`` instance method,
|
67
|
+
which will be populated with the current ``Raven::Client`` when the processor
|
68
|
+
is initialized), and gives you a few convenient constants for masking data.
|
69
|
+
|
70
|
+
Processors must have a method called ``process`` defined. It must accept one
|
71
|
+
argument, which will be the Raven event data hash. The method must return a hash,
|
72
|
+
which represents the data after it has been modified by the processor.
|
73
|
+
|
74
|
+
To help you in writing your own processor, here is what the Event data hash looks
|
75
|
+
like (slightly modified/concatenated) when it is passed to the processor:
|
76
|
+
|
77
|
+
.. sourcecode:: ruby
|
78
|
+
|
79
|
+
{
|
80
|
+
"environment" => "default",
|
81
|
+
"event_id" => "02ea6d3d35c840b1a8f339ba896917e3",
|
82
|
+
"extra" => {
|
83
|
+
"server" => {
|
84
|
+
# server related information
|
85
|
+
}
|
86
|
+
"active_job" => "MyActiveJob",
|
87
|
+
"arguments" => [ {"sensitive_parameter": "sensitive"} ],
|
88
|
+
"job_id" => "cbc2c146-0486-4e98-b81c-1a251d636b34",
|
89
|
+
},
|
90
|
+
"modules" => {
|
91
|
+
"rake"=>"12.0.0",
|
92
|
+
"concurrent-ruby"=>"1.0.5",
|
93
|
+
"i18n"=>"0.8.6",
|
94
|
+
"minitest"=>"5.10.3",
|
95
|
+
# ...
|
96
|
+
},
|
97
|
+
"platform" => "ruby",
|
98
|
+
"release" => "e4d5ced",
|
99
|
+
"sdk" => {"name"=>"raven-ruby", "version"=>"2.6.3"},
|
100
|
+
"server_name" => "myserver.local",
|
101
|
+
"timestamp" => "2017-10-09T19:53:20",
|
102
|
+
"exception" => {
|
103
|
+
# A very large and complex exception object
|
104
|
+
}
|
105
|
+
}
|
106
|
+
|
107
|
+
However, it will probably be more helpful if you use a debugger, such as `pry`, to
|
108
|
+
inspect the event data hash for yourself.
|
109
|
+
|
110
|
+
The example processor given above looks for the ActiveJob arguments hash, looks for
|
111
|
+
a particular value, and then replaces it with the string mask. There is a fast return
|
112
|
+
if the event does not contain the ActiveJob data we're looking for, using Ruby 2.3+'s
|
113
|
+
safe navigation operator.
|
114
|
+
|
115
|
+
Once you have your processor written, you simply need to add it to the processor chain:
|
116
|
+
|
117
|
+
.. sourcecode:: ruby
|
118
|
+
|
119
|
+
Raven.configure do |config|
|
120
|
+
config.processors += MyJobProcessor
|
121
|
+
end
|
122
|
+
|
123
|
+
For more information about writing processors, read the code for the default
|
124
|
+
processors, located in ``lib/processor``.
|
data/lib/raven/backtrace.rb
CHANGED
@@ -5,6 +5,7 @@ module Raven
|
|
5
5
|
class Backtrace
|
6
6
|
# Handles backtrace parsing line by line
|
7
7
|
class Line
|
8
|
+
RB_EXTENSION = ".rb".freeze
|
8
9
|
# regexp (optional leading X: on windows, or JRuby9000 class-prefix)
|
9
10
|
RUBY_INPUT_FORMAT = /
|
10
11
|
^ \s* (?: [a-zA-Z]: | uri:classloader: )? ([^:]+ | <.*>):
|
@@ -34,7 +35,7 @@ module Raven
|
|
34
35
|
ruby_match = unparsed_line.match(RUBY_INPUT_FORMAT)
|
35
36
|
if ruby_match
|
36
37
|
_, file, number, method = ruby_match.to_a
|
37
|
-
file.sub!(/\.class$/,
|
38
|
+
file.sub!(/\.class$/, RB_EXTENSION)
|
38
39
|
module_name = nil
|
39
40
|
else
|
40
41
|
java_match = unparsed_line.match(JAVA_INPUT_FORMAT)
|
data/lib/raven/base.rb
CHANGED
@@ -12,12 +12,15 @@ require 'raven/configuration'
|
|
12
12
|
require 'raven/context'
|
13
13
|
require 'raven/client'
|
14
14
|
require 'raven/event'
|
15
|
+
require 'raven/linecache'
|
15
16
|
require 'raven/logger'
|
16
17
|
require 'raven/interfaces/message'
|
17
18
|
require 'raven/interfaces/exception'
|
18
19
|
require 'raven/interfaces/single_exception'
|
19
20
|
require 'raven/interfaces/stack_trace'
|
20
21
|
require 'raven/interfaces/http'
|
22
|
+
require 'raven/transports'
|
23
|
+
require 'raven/transports/http'
|
21
24
|
require 'raven/utils/deep_merge'
|
22
25
|
require 'raven/utils/real_ip'
|
23
26
|
require 'raven/instance'
|
@@ -28,6 +31,9 @@ require 'English'
|
|
28
31
|
module Raven
|
29
32
|
AVAILABLE_INTEGRATIONS = %w(delayed_job railties sidekiq rack rack-timeout rake).freeze
|
30
33
|
|
34
|
+
class Error < StandardError
|
35
|
+
end
|
36
|
+
|
31
37
|
class << self
|
32
38
|
extend Forwardable
|
33
39
|
|
data/lib/raven/cli.rb
CHANGED
data/lib/raven/client.rb
CHANGED
data/lib/raven/configuration.rb
CHANGED
@@ -91,6 +91,10 @@ module Raven
|
|
91
91
|
# We automatically try to set this to a git SHA or Capistrano release.
|
92
92
|
attr_accessor :release
|
93
93
|
|
94
|
+
# The sampling factor to apply to events. A value of 0.0 will not send
|
95
|
+
# any events, and a value of 1.0 will send 100% of events.
|
96
|
+
attr_accessor :sample_rate
|
97
|
+
|
94
98
|
# Boolean - sanitize values that look like credit card numbers
|
95
99
|
attr_accessor :sanitize_credit_cards
|
96
100
|
|
@@ -161,7 +165,8 @@ module Raven
|
|
161
165
|
'ActiveRecord::RecordNotFound',
|
162
166
|
'CGI::Session::CookieStore::TamperedWithCookie',
|
163
167
|
'Mongoid::Errors::DocumentNotFound',
|
164
|
-
'Sinatra::NotFound'
|
168
|
+
'Sinatra::NotFound',
|
169
|
+
'ActiveJob::DeserializationError'
|
165
170
|
].freeze
|
166
171
|
|
167
172
|
# Note the order - we have to remove circular references and bad characters
|
@@ -176,11 +181,12 @@ module Raven
|
|
176
181
|
].freeze
|
177
182
|
|
178
183
|
LOG_PREFIX = "** [Raven] ".freeze
|
184
|
+
MODULE_SEPARATOR = "::".freeze
|
179
185
|
|
180
186
|
def initialize
|
181
187
|
self.async = false
|
182
188
|
self.context_lines = 3
|
183
|
-
self.current_environment = ENV['RAILS_ENV'] || ENV['RACK_ENV'] || 'default'
|
189
|
+
self.current_environment = ENV['SENTRY_CURRENT_ENV'] || ENV['RAILS_ENV'] || ENV['RACK_ENV'] || 'default'
|
184
190
|
self.encoding = 'gzip'
|
185
191
|
self.environments = []
|
186
192
|
self.exclude_loggers = []
|
@@ -194,13 +200,14 @@ module Raven
|
|
194
200
|
self.rails_activesupport_breadcrumbs = false
|
195
201
|
self.rails_report_rescued_exceptions = true
|
196
202
|
self.release = detect_release
|
203
|
+
self.sample_rate = 1.0
|
197
204
|
self.sanitize_credit_cards = true
|
198
205
|
self.sanitize_fields = []
|
199
206
|
self.sanitize_fields_excluded = []
|
200
207
|
self.sanitize_http_headers = []
|
201
208
|
self.send_modules = true
|
202
209
|
self.server = ENV['SENTRY_DSN'] if ENV['SENTRY_DSN']
|
203
|
-
self.server_name = resolve_hostname
|
210
|
+
self.server_name = heroku_dyno_name || resolve_hostname
|
204
211
|
self.should_capture = false
|
205
212
|
self.ssl_verification = true
|
206
213
|
self.tags = {}
|
@@ -273,7 +280,8 @@ module Raven
|
|
273
280
|
|
274
281
|
valid? &&
|
275
282
|
capture_in_current_environment? &&
|
276
|
-
capture_allowed_by_callback?(message_or_exc)
|
283
|
+
capture_allowed_by_callback?(message_or_exc) &&
|
284
|
+
sample_allowed?
|
277
285
|
end
|
278
286
|
# If we cannot capture, we cannot send.
|
279
287
|
alias sending_allowed? capture_allowed?
|
@@ -304,8 +312,41 @@ module Raven
|
|
304
312
|
end
|
305
313
|
end
|
306
314
|
|
315
|
+
def exception_class_allowed?(exc)
|
316
|
+
if exc.is_a?(Raven::Error)
|
317
|
+
# Try to prevent error reporting loops
|
318
|
+
logger.debug "Refusing to capture Raven error: #{exc.inspect}"
|
319
|
+
false
|
320
|
+
elsif excluded_exception?(exc)
|
321
|
+
logger.debug "User excluded error: #{exc.inspect}"
|
322
|
+
false
|
323
|
+
else
|
324
|
+
true
|
325
|
+
end
|
326
|
+
end
|
327
|
+
|
307
328
|
private
|
308
329
|
|
330
|
+
def excluded_exception?(exc)
|
331
|
+
excluded_exceptions.any? { |x| get_exception_class(x) === exc }
|
332
|
+
end
|
333
|
+
|
334
|
+
def get_exception_class(x)
|
335
|
+
x.is_a?(Module) ? x : qualified_const_get(x)
|
336
|
+
end
|
337
|
+
|
338
|
+
# In Ruby <2.0 const_get can't lookup "SomeModule::SomeClass" in one go
|
339
|
+
def qualified_const_get(x)
|
340
|
+
x = x.to_s
|
341
|
+
if !x.match(/::/)
|
342
|
+
Object.const_get(x)
|
343
|
+
else
|
344
|
+
x.split(MODULE_SEPARATOR).reject(&:empty?).inject(Object) { |a, e| a.const_get(e) }
|
345
|
+
end
|
346
|
+
rescue NameError # There's no way to safely ask if a constant exist for an unknown string
|
347
|
+
nil
|
348
|
+
end
|
349
|
+
|
309
350
|
def detect_release_from_heroku
|
310
351
|
return unless running_on_heroku?
|
311
352
|
logger.warn(heroku_dyno_metadata_message) && return unless ENV['HEROKU_SLUG_COMMIT']
|
@@ -361,6 +402,21 @@ module Raven
|
|
361
402
|
false
|
362
403
|
end
|
363
404
|
|
405
|
+
def heroku_dyno_name
|
406
|
+
return unless running_on_heroku?
|
407
|
+
ENV['DYNO']
|
408
|
+
end
|
409
|
+
|
410
|
+
def sample_allowed?
|
411
|
+
return true if sample_rate == 1.0
|
412
|
+
if Random::DEFAULT.rand >= sample_rate
|
413
|
+
@errors << "Excluded by random sample"
|
414
|
+
false
|
415
|
+
else
|
416
|
+
true
|
417
|
+
end
|
418
|
+
end
|
419
|
+
|
364
420
|
# Try to resolve the hostname to an FQDN, but fall back to whatever
|
365
421
|
# the load name is.
|
366
422
|
def resolve_hostname
|