sentry-raven 2.5.3 → 2.6.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 70b9abf6b93e96df6d2be4056417be002fdd5fc3
4
- data.tar.gz: 6c74a0b9414e202c40f51da20914ce7b135c0961
3
+ metadata.gz: f9a90db025f175635bb089674602bd66c1d5dfe1
4
+ data.tar.gz: 44d3c2baa95de9c91ebc5de66967a8046e1ce8ae
5
5
  SHA512:
6
- metadata.gz: 4498c19ed966bed8a2ea43773f01f7b587896cd434ce702e2d2f7c34fbcd902fa369ab75218b575e2468cc87b11634588a1f70a24078c966f14ae12da74d2207
7
- data.tar.gz: 807dd7e9185458135d27777acc47eba17b5671a03dc90e4cc29015e8b683bb9ce51225e9c645c755e0c0d76b0cd07d7ea0a13b87d612b8638d56c91bc7383a1d
6
+ metadata.gz: a8a454427885043f2647bd4cb74d8d9856187fea01f0830c30ffaf32c97024dc8705e7f59edcf2008890138501da5459fa1786bcca89813cff7e493e318d98d3
7
+ data.tar.gz: e6d8d7c3f3abfb12168a5d023eed5b8858e40a145c9e90426c3e759eb58d88713eb2bc1a079b68ae6cef9d80fc3f24425d33ce036451e0df6aaa360916c05bf1
@@ -31,9 +31,9 @@ matrix:
31
31
  env: RAILS_VERSION=4
32
32
  - rvm: jruby-1.7.27
33
33
  env: JRUBY_OPTS="--dev" RAILS_VERSION=4
34
- - rvm: jruby-9.1.10.0
34
+ - rvm: jruby-9.1.12.0
35
35
  env: JRUBY_OPTS="--dev -J-Djruby.launch.inproc=true -J-Xmx1024M" RAILS_VERSION=4
36
- - rvm: jruby-9.1.10.0
36
+ - rvm: jruby-9.1.12.0
37
37
  env: JRUBY_OPTS="--dev -J-Djruby.launch.inproc=true -J-Xmx1024M" RAILS_VERSION=5
38
38
  - rvm: ruby-head
39
39
  env: RAILS_VERSION=0
data/Gemfile CHANGED
@@ -4,8 +4,12 @@ gemspec
4
4
 
5
5
  if ENV["RAILS_VERSION"] && (ENV["RAILS_VERSION"].to_i == 4)
6
6
  gem "rails", "< 5"
7
- elsif ENV["RAILS_VERSION"] && (ENV["RAILS_VERSION"].to_i == 5)
7
+ gem "rspec-rails"
8
+ elsif ENV["RAILS_VERSION"] && (ENV["RAILS_VERSION"].to_i == 0)
9
+ # no-op. No Rails.
10
+ else
8
11
  gem "rails", "< 6"
12
+ gem "rspec-rails"
9
13
  end
10
14
 
11
15
  if RUBY_VERSION < '2.0'
@@ -25,6 +29,5 @@ gem "ruby-prof", platform: :mri
25
29
  gem "rake"
26
30
  gem "rubocop", "~> 0.41.1"
27
31
  gem "rspec"
28
- gem "rspec-rails"
29
32
  gem "timecop"
30
33
  gem "test-unit", platform: :mri if RUBY_VERSION > '2.2'
data/README.md CHANGED
@@ -1,9 +1,17 @@
1
- # Raven-Ruby
1
+ <p align="center">
2
+ <img src="https://cdn.rawgit.com/getsentry/raven-python/1e525422/docs/_static/logo.png">
3
+ </p>
4
+
5
+ # Raven-Ruby, the Ruby Client for Sentry
2
6
 
3
7
  [![Gem Version](https://img.shields.io/gem/v/sentry-raven.svg)](https://rubygems.org/gems/sentry-raven)
4
8
  [![Build Status](https://img.shields.io/travis/getsentry/raven-ruby/master.svg)](https://travis-ci.org/getsentry/raven-ruby)
9
+ [![Gem](https://img.shields.io/gem/dt/sentry-raven.svg)](https://rubygems.org/gems/sentry-raven/)
10
+
11
+
12
+ [Documentation](https://docs.getsentry.com/hosted/clients/ruby/) | [Bug Tracker](https://github.com/getsentry/raven-ruby/issues) | [Forum](https://forum.sentry.io/) | IRC: irc.freenode.net, #sentry
5
13
 
6
- A client and integration layer for the [Sentry](https://github.com/getsentry/sentry) error reporting API.
14
+ The official Ruby-language client and integration layer for the [Sentry](https://github.com/getsentry/sentry) error reporting API.
7
15
 
8
16
  ## Requirements
9
17
 
@@ -32,15 +40,15 @@ Raven.configure do |config|
32
40
  end
33
41
  ```
34
42
 
35
- ### Raven doesn't report some kinds of data by default.
43
+ ### Raven doesn't report some kinds of data by default
36
44
 
37
- Raven ignores some exceptions by default - most of these are related to 404s or controller actions not being found. [For a complete list, see the `IGNORE_DEFAULT` constant](https://github.com/getsentry/raven-ruby/blob/master/lib/raven/configuration.rb).
45
+ **Raven ignores some exceptions by default** - most of these are related to 404s or controller actions not being found. [For a complete list, see the `IGNORE_DEFAULT` constant](https://github.com/getsentry/raven-ruby/blob/master/lib/raven/configuration.rb).
38
46
 
39
47
  Raven doesn't report POST data or cookies by default. In addition, it will attempt to remove any obviously sensitive data, such as credit card or Social Security numbers. For more information about how Sentry processes your data, [check out the documentation on the `processors` config setting.](https://docs.getsentry.com/hosted/clients/ruby/config/)
40
48
 
41
- ### Call
49
+ ### Usage
42
50
 
43
- If you use Rails, you're already done - no more configuration required! Check [Integrations](https://docs.getsentry.com/hosted/clients/ruby/integrations/) for more details on other gems Sentry integrates with automatically.
51
+ **If you use Rails, you're already done - no more configuration required!** Check [Integrations](https://docs.getsentry.com/hosted/clients/ruby/integrations/) for more details on other gems Sentry integrates with automatically.
44
52
 
45
53
  Otherwise, Raven supports two methods of capturing exceptions:
46
54
 
@@ -61,29 +69,6 @@ end
61
69
 
62
70
  You're all set - but there's a few more settings you may want to know about too!
63
71
 
64
- #### DSN
65
-
66
- While we advise that you set your Sentry DSN through the `SENTRY_DSN` environment
67
- variable, there are two other configuration settings for controlling Raven:
68
-
69
- ```ruby
70
- # DSN can be configured as a config setting instead.
71
- # Place in config/initializers or similar.
72
- Raven.configure do |config|
73
- config.dsn = 'your_dsn'
74
- end
75
- ```
76
-
77
- And, while not necessary if using `SENTRY_DSN`, you can also provide an `environments`
78
- setting. Raven will only capture events when `RACK_ENV` or `RAILS_ENV` matches
79
- an environment in the list.
80
-
81
- ```ruby
82
- Raven.configure do |config|
83
- config.environments = %w[staging production]
84
- end
85
- ```
86
-
87
72
  #### async
88
73
 
89
74
  When an error or message occurs, the notification is immediately sent to Sentry. Raven can be configured to send asynchronously:
@@ -96,15 +81,15 @@ config.async = lambda { |event|
96
81
 
97
82
  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. If the async callback raises an exception, Raven will attempt to send synchronously.
98
83
 
99
- We recommend creating a background job, using your background job processor, that will send Sentry notifications in the background. Rather than enqueuing an entire Raven::Event object, we recommend providing the Hash representation of an event as a job argument. Here’s an example for ActiveJob:
84
+ Note that the naive example implementation has a major drawback - it can create an infinite number of threads. We recommend creating a background job, using your background job processor, that will send Sentry notifications in the background.
100
85
 
101
86
  ```ruby
102
87
  config.async = lambda { |event| SentryJob.perform_later(event) }
103
88
 
104
89
  class SentryJob < ActiveJob::Base
105
90
  queue_as :default
106
-
107
- # Important! Otherwise, we can get caught in an infinite loop.
91
+
92
+ # Important for ActiveJob! Otherwise, we can get caught in an infinite loop.
108
93
  rescue_from(ActiveJob::DeserializationError) { |e| Rails.logger.error e }
109
94
 
110
95
  def perform(event)
@@ -146,6 +131,5 @@ For more information, see [Context](https://docs.sentry.io/clients/ruby/context/
146
131
 
147
132
  * [Documentation](https://docs.getsentry.com/hosted/clients/ruby/)
148
133
  * [Bug Tracker](https://github.com/getsentry/raven-ruby/issues)
149
- * [Code](https://github.com/getsentry/raven-ruby)
150
- * [Mailing List](https://groups.google.com/group/getsentry)
134
+ * [Forum](https://forum.sentry.io/)
151
135
  * [IRC](irc://irc.freenode.net/sentry>) (irc.freenode.net, #sentry)
@@ -1,3 +1,16 @@
1
+ 2.6.0
2
+ -----
3
+
4
+ * FEATURE: raven-ruby now marks itself as the "ruby" logger by default, to match raven-js behavior [@nateberkopec]
5
+ * FEATURE: You may now override the default sanitization parameters [#712, @nateberkopec]
6
+ * FEATURE: Breadcrumb buffers are now publicly accessible [#686, @nateberkopec]
7
+ * FEATURE: We yell at you now if you're using Heroku but don't have runtime-dyno-metadata enabled [#715, @nateberkopec]
8
+ * FEATURE: project_root will always be set, regardless of framework [#716, @nateberkopec]
9
+
10
+ * BUGFIX: Request body and message limits now match Sentry server defaults [#714, @nateberkopec]
11
+ * BUGFIX: Sidekiq context now works as expected [#713, @nateberkopec]
12
+ * BUGFIX: Capture exceptions in ActiveJob when not using Sidekiq adapter [#709, #671, @nateberkopec]
13
+
1
14
  2.5.3
2
15
  -----
3
16
 
@@ -82,13 +82,13 @@ Optional settings
82
82
 
83
83
  .. code-block:: ruby
84
84
 
85
- config.excluded_exceptions = ['ActionController::RoutingError', 'ActiveRecord::RecordNotFound']
85
+ config.excluded_exceptions += ['ActionController::RoutingError', 'ActiveRecord::RecordNotFound']
86
86
 
87
- You can find the list of exceptions that are excluded by default in ``Raven::Configuration::IGNORE_DEFAULT``. Remember you'll be overriding those defaults by setting this configuration.
87
+ You can find the list of exceptions that are excluded by default in ``Raven::Configuration::IGNORE_DEFAULT``. It is suggested that you append to these defaults rather than overwrite them with ``=``.
88
88
 
89
89
  .. describe:: logger
90
90
 
91
- The name of the logger used by Sentry. Default is an instance of Raven::Logger.
91
+ The logger used by Sentry. Default is an instance of Raven::Logger.
92
92
 
93
93
  .. code-block:: ruby
94
94
 
@@ -24,6 +24,7 @@ The following attributes are available:
24
24
  * ``server_name``: the hostname of the server
25
25
  * ``tags``: a mapping of tags describing this event
26
26
  * ``extra``: a mapping of arbitrary context
27
+ * ``user``: a mapping of user context
27
28
 
28
29
  Providing Request Context
29
30
  -------------------------
@@ -0,0 +1,11 @@
1
+ Heroku
2
+ ======
3
+
4
+ Installation
5
+ ------------
6
+
7
+ Enable the ``runtime-dyno-metadata`` Heroku Labs feature in order to enable automated release detection:
8
+
9
+ ::
10
+
11
+ heroku labs:enable runtime-dyno-metadata -a myapp
@@ -12,6 +12,7 @@ features if you want.
12
12
  rails
13
13
  rack
14
14
  puma
15
+ heroku
15
16
 
16
17
  The following integrations are available:
17
18
 
@@ -30,7 +31,7 @@ the default integration behavior doesn't suit your projects' needs.
30
31
 
31
32
  To explicitly include integrations:
32
33
 
33
- ::
34
+ .. sourcecode:: ruby
34
35
 
35
36
  require 'sentry-raven-without-integrations'
36
37
  Raven.inject_only(:railties, :rack, :rake)
@@ -38,7 +39,7 @@ To explicitly include integrations:
38
39
 
39
40
  To blacklist integrations:
40
41
 
41
- ::
42
+ .. sourcecode:: ruby
42
43
 
43
44
  require 'sentry-raven-without-integrations'
44
45
  Raven.inject_without(:sidekiq, :delayed_job)
@@ -46,13 +47,13 @@ To blacklist integrations:
46
47
 
47
48
  If you're using bundler, then in your gemfile:
48
49
 
49
- ::
50
+ .. sourcecode:: ruby
50
51
 
51
52
  gem 'sentry-raven', require: 'sentry-raven-without-integrations'
52
53
 
53
54
 
54
55
  And in some sort of initializer:
55
56
 
56
- ::
57
+ .. sourcecode:: ruby
57
58
 
58
59
  Raven.inject_without(:sidekiq)
@@ -28,6 +28,8 @@ module Raven
28
28
  class BreadcrumbBuffer
29
29
  include Enumerable
30
30
 
31
+ attr_accessor :buffer
32
+
31
33
  def self.current
32
34
  Thread.current[:sentry_breadcrumbs] ||= new
33
35
  end
@@ -1,57 +1,58 @@
1
1
  module Raven
2
2
  class CLI
3
- def self.test(dsn = nil, silent = false) # rubocop:disable all
4
- if silent
5
- Raven.configuration.logger = ::Logger.new(nil)
6
- else
7
- logger = ::Logger.new(STDOUT)
8
- logger.level = ::Logger::ERROR
9
- logger.formatter = proc do |_severity, _datetime, _progname, msg|
10
- "-> #{msg}\n"
11
- end
3
+ def self.test(dsn = nil, silent = false, config = nil) # rubocop:disable all
4
+ config ||= Raven.configuration
12
5
 
13
- Raven.configuration.logger = logger
14
- end
6
+ config.logger = if silent
7
+ ::Logger.new(nil)
8
+ else
9
+ logger = ::Logger.new(STDOUT)
10
+ logger.formatter = proc do |_severity, _datetime, _progname, msg|
11
+ "-> #{msg}\n"
12
+ end
13
+ logger
14
+ end
15
15
 
16
- Raven.configuration.timeout = 5
17
- Raven.configuration.dsn = dsn if dsn
16
+ config.timeout = 5
17
+ config.dsn = dsn if dsn
18
18
 
19
19
  # wipe out env settings to ensure we send the event
20
- unless Raven.configuration.capture_allowed?
21
- env_name = Raven.configuration.environments.pop || 'production'
22
- Raven.logger.debug "Setting environment to #{env_name}"
23
- Raven.configuration.current_environment = env_name
20
+ unless config.capture_allowed?
21
+ env_name = config.environments.pop || 'production'
22
+ config.current_environment = env_name
24
23
  end
25
24
 
26
- Raven.logger.debug "Sending a test event:"
27
- Raven.logger.debug ""
25
+ instance = Raven::Instance.new(nil, config)
26
+
27
+ instance.logger.debug "Sending a test event:"
28
+ instance.logger.debug ""
28
29
 
29
30
  begin
30
31
  1 / 0
31
32
  rescue ZeroDivisionError => exception
32
- evt = Raven.capture_exception(exception)
33
+ evt = instance.capture_exception(exception)
33
34
  end
34
35
 
35
36
  if evt && !(evt.is_a? Thread)
36
37
  if evt.is_a? Hash
37
- Raven.logger.debug "-> event ID: #{evt[:event_id]}"
38
+ instance.logger.debug "-> event ID: #{evt[:event_id]}"
38
39
  else
39
- Raven.logger.debug "-> event ID: #{evt.id}"
40
+ instance.logger.debug "-> event ID: #{evt.id}"
40
41
  end
41
42
  elsif evt # async configuration
42
43
  if evt.value.is_a? Hash
43
- Raven.logger.debug "-> event ID: #{evt.value[:event_id]}"
44
+ instance.logger.debug "-> event ID: #{evt.value[:event_id]}"
44
45
  else
45
- Raven.logger.debug "-> event ID: #{evt.value.id}"
46
+ instance.logger.debug "-> event ID: #{evt.value.id}"
46
47
  end
47
48
  else
48
- Raven.logger.debug ""
49
- Raven.logger.debug "An error occurred while attempting to send the event."
49
+ instance.logger.debug ""
50
+ instance.logger.debug "An error occurred while attempting to send the event."
50
51
  exit 1
51
52
  end
52
53
 
53
- Raven.logger.debug ""
54
- Raven.logger.debug "Done!"
54
+ instance.logger.debug ""
55
+ instance.logger.debug "Done!"
55
56
  true
56
57
  end
57
58
  end
@@ -99,6 +99,10 @@ module Raven
99
99
  # a hash key, will be censored and not sent to Sentry.
100
100
  attr_accessor :sanitize_fields
101
101
 
102
+ # If you're sure you want to override the default sanitization values, you can
103
+ # add to them to an array of Strings here, e.g. %w(authorization password)
104
+ attr_accessor :sanitize_fields_excluded
105
+
102
106
  # Sanitize additional HTTP headers - only Authorization is removed by default.
103
107
  attr_accessor :sanitize_http_headers
104
108
 
@@ -185,12 +189,14 @@ module Raven
185
189
  self.logger = ::Raven::Logger.new(STDOUT)
186
190
  self.open_timeout = 1
187
191
  self.processors = DEFAULT_PROCESSORS.dup
192
+ self.project_root = detect_project_root
188
193
  self.proxy = nil
189
194
  self.rails_activesupport_breadcrumbs = false
190
195
  self.rails_report_rescued_exceptions = true
191
196
  self.release = detect_release
192
197
  self.sanitize_credit_cards = true
193
198
  self.sanitize_fields = []
199
+ self.sanitize_fields_excluded = []
194
200
  self.sanitize_http_headers = []
195
201
  self.send_modules = true
196
202
  self.server = ENV['SENTRY_DSN'] if ENV['SENTRY_DSN']
@@ -286,28 +292,45 @@ module Raven
286
292
  detect_release_from_git ||
287
293
  detect_release_from_capistrano ||
288
294
  detect_release_from_heroku
295
+ rescue => ex
296
+ logger.error "Error detecting release: #{ex.message}"
297
+ end
298
+
299
+ def detect_project_root
300
+ if defined? Rails.root # we are in a Rails application
301
+ Rails.root.to_s
302
+ else
303
+ Dir.pwd
304
+ end
289
305
  end
290
306
 
291
307
  private
292
308
 
293
309
  def detect_release_from_heroku
294
- sys_dyno_info = File.read("/etc/heroku/dyno").strip if File.directory?("/etc/heroku") rescue nil
295
- return unless sys_dyno_info
296
-
297
- # being overly cautious, because if we raise an error Raven won't start
298
- begin
299
- hash = JSON.parse(sys_dyno_info)
300
- hash && hash["release"] && hash["release"]["commit"]
301
- rescue JSON::JSONError
302
- logger.error "Cannot parse Heroku JSON: #{sys_dyno_info}"
303
- end
310
+ return unless running_on_heroku?
311
+ logger.warn(heroku_dyno_metadata_message) && return unless ENV['HEROKU_SLUG_COMMIT']
312
+
313
+ ENV['HEROKU_SLUG_COMMIT']
314
+ end
315
+
316
+ def running_on_heroku?
317
+ File.directory?("/etc/heroku")
318
+ end
319
+
320
+ def heroku_dyno_metadata_message
321
+ "You are running on Heroku but haven't enabled Dyno Metadata. For Sentry's"\
322
+ "release detection to work correctly, please run `heroku labs:enable runtime-dyno-metadata`"
304
323
  end
305
324
 
306
325
  def detect_release_from_capistrano
307
- version = File.read(File.join(project_root, 'REVISION')).strip rescue nil
326
+ revision_file = File.join(project_root, 'REVISION')
327
+ revision_log = File.join(project_root, '..', 'revisions.log')
308
328
 
309
- # Capistrano 3.0 - 3.1.x
310
- version || File.open(File.join(project_root, '..', 'revisions.log')).to_a.last.strip.sub(/.*as release ([0-9]+).*/, '\1') rescue nil
329
+ if File.exist?(revision_file)
330
+ File.read(revision_file).strip
331
+ elsif File.exist?(revision_log)
332
+ File.open(revision_log).to_a.last.strip.sub(/.*as release ([0-9]+).*/, '\1')
333
+ end
311
334
  end
312
335
 
313
336
  def detect_release_from_git
@@ -19,6 +19,9 @@ module Raven
19
19
  }.freeze
20
20
 
21
21
  BACKTRACE_RE = /^(.+?):(\d+)(?::in `(.+?)')?$/
22
+ # See Sentry server default limits at
23
+ # https://github.com/getsentry/sentry/blob/master/src/sentry/conf/server.py
24
+ MAX_MESSAGE_SIZE_IN_BYTES = 1024 * 8
22
25
 
23
26
  PLATFORM = "ruby".freeze
24
27
  SDK = { "name" => "raven-ruby", "version" => Raven::VERSION }.freeze
@@ -38,7 +41,7 @@ module Raven
38
41
  @timestamp = Time.now.utc
39
42
  @time_spent = nil
40
43
  @level = :error
41
- @logger = ''
44
+ @logger = 'ruby'
42
45
  @culprit = nil
43
46
  @server_name = @configuration.server_name
44
47
  @release = @configuration.release
@@ -106,7 +109,7 @@ module Raven
106
109
 
107
110
  new(options) do |evt|
108
111
  evt.configuration = configuration
109
- evt.message = "#{exc.class}: #{exc.message}".byteslice(0...10_000) # Messages limited to 10kb
112
+ evt.message = "#{exc.class}: #{exc.message}".byteslice(0...MAX_MESSAGE_SIZE_IN_BYTES) # Messages limited to 10kb
110
113
  evt.level = options[:level] || :error
111
114
 
112
115
  add_exception_interface(evt, exc)
@@ -116,7 +119,7 @@ module Raven
116
119
  end
117
120
 
118
121
  def from_message(message, options = {})
119
- message = message.byteslice(0...10_000) # Messages limited to 10kb
122
+ message = message.byteslice(0...MAX_MESSAGE_SIZE_IN_BYTES)
120
123
  configuration = options[:configuration] || Raven.configuration
121
124
 
122
125
  new(options) do |evt|
@@ -80,11 +80,13 @@ module Raven
80
80
 
81
81
  private
82
82
 
83
+ # See Sentry server default limits at
84
+ # https://github.com/getsentry/sentry/blob/master/src/sentry/conf/server.py
83
85
  def read_data_from(request)
84
86
  if request.form_data?
85
87
  request.POST
86
88
  elsif request.body # JSON requests, etc
87
- data = request.body.read(2048) # Sentry server limit
89
+ data = request.body.read(4096 * 4) # Sentry server limit
88
90
  request.body.rewind
89
91
  data
90
92
  end
@@ -37,11 +37,6 @@ module Raven
37
37
  end
38
38
 
39
39
  config.after_initialize do
40
- Raven.configure do |config|
41
- config.project_root ||= ::Rails.root
42
- config.release ||= config.detect_release # if project_root has changed, need to re-check
43
- end
44
-
45
40
  if Raven.configuration.rails_activesupport_breadcrumbs
46
41
  require 'raven/breadcrumbs/activesupport'
47
42
  Raven::ActiveSupportBreadcrumbs.inject
@@ -63,6 +58,12 @@ module Raven
63
58
  end
64
59
  end
65
60
 
61
+ initializer 'raven.active_job' do
62
+ ActiveSupport.on_load :active_job do
63
+ require 'raven/integrations/rails/active_job'
64
+ end
65
+ end
66
+
66
67
  rake_tasks do
67
68
  require 'raven/integrations/tasks'
68
69
  end
@@ -1,31 +1,53 @@
1
1
  module Raven
2
2
  class Rails
3
- module ActiveJob
3
+ module ActiveJobExtensions
4
+ ALREADY_SUPPORTED_SENTRY_ADAPTERS = %w(
5
+ ActiveJob::QueueAdapters::SidekiqAdapter
6
+ ActiveJob::QueueAdapters::DelayedJobAdapter
7
+ ).freeze
8
+
4
9
  def self.included(base)
5
10
  base.class_eval do
6
- rescue_from(Exception) do |exception|
7
- # Do not capture exceptions when using Sidekiq so we don't capture
8
- # The same exception twice.
9
- unless self.class.queue_adapter.to_s == 'ActiveJob::QueueAdapters::SidekiqAdapter'
10
- active_job_details = {
11
- :active_job => self.class.name,
12
- :arguments => arguments,
13
- :scheduled_at => scheduled_at,
14
- :job_id => job_id,
15
- :locale => locale
16
- }
11
+ around_perform do |job, block|
12
+ capture_and_reraise_with_sentry(job, block)
13
+ end
14
+ end
15
+ end
17
16
 
18
- # Add provider_job_id details if Rails 5
19
- if defined?(provider_job_id)
20
- active_job_details[:provider_job_id] = provider_job_id
21
- end
17
+ def capture_and_reraise_with_sentry(job, block)
18
+ block.call
19
+ rescue Exception => exception # rubocop:disable Lint/RescueException
20
+ return if already_supported_by_specific_integration?(job)
21
+ Raven.capture_exception(exception, :extra => raven_context(job))
22
+ raise exception
23
+ ensure
24
+ Context.clear!
25
+ BreadcrumbBuffer.clear!
26
+ end
22
27
 
23
- Raven.capture_exception(exception, :extra => active_job_details)
24
- raise exception
25
- end
26
- end
28
+ def already_supported_by_specific_integration?(job)
29
+ ALREADY_SUPPORTED_SENTRY_ADAPTERS.include?(job.class.queue_adapter.to_s)
30
+ end
31
+
32
+ def raven_context(job)
33
+ ctx = {
34
+ :active_job => job.class.name,
35
+ :arguments => job.arguments,
36
+ :scheduled_at => job.scheduled_at,
37
+ :job_id => job.job_id,
38
+ :locale => job.locale
39
+ }
40
+ # Add provider_job_id details if Rails 5
41
+ if job.respond_to?(:provider_job_id)
42
+ ctx[:provider_job_id] = job.provider_job_id
27
43
  end
44
+
45
+ ctx
28
46
  end
29
47
  end
30
48
  end
31
49
  end
50
+
51
+ class ActiveJob::Base
52
+ include Raven::Rails::ActiveJobExtensions
53
+ end
@@ -5,7 +5,6 @@ module Raven
5
5
  class SidekiqCleanupMiddleware
6
6
  def call(_worker, _job, _queue)
7
7
  yield
8
- ensure
9
8
  Context.clear!
10
9
  BreadcrumbBuffer.clear!
11
10
  end
@@ -22,6 +21,8 @@ module Raven
22
21
  :extra => { :sidekiq => context },
23
22
  :culprit => culprit_from_context(context)
24
23
  )
24
+ Context.clear!
25
+ BreadcrumbBuffer.clear!
25
26
  end
26
27
 
27
28
  private
@@ -5,13 +5,16 @@ module Raven
5
5
  class Processor::SanitizeData < Processor
6
6
  DEFAULT_FIELDS = %w(authorization password passwd secret ssn social(.*)?sec).freeze
7
7
  CREDIT_CARD_RE = /^(?:\d[ -]*?){13,16}$/
8
+ QUERY_STRING = ['query_string', :query_string].freeze
9
+ JSON_STARTS_WITH = ["[", "{"].freeze
8
10
 
9
- attr_accessor :sanitize_fields, :sanitize_credit_cards
11
+ attr_accessor :sanitize_fields, :sanitize_credit_cards, :sanitize_fields_excluded
10
12
 
11
13
  def initialize(client)
12
14
  super
13
15
  self.sanitize_fields = client.configuration.sanitize_fields
14
16
  self.sanitize_credit_cards = client.configuration.sanitize_credit_cards
17
+ self.sanitize_fields_excluded = client.configuration.sanitize_fields_excluded
15
18
  end
16
19
 
17
20
  def process(value, key = nil)
@@ -28,7 +31,7 @@ module Raven
28
31
  process(json).to_json
29
32
  elsif matches_regexes?(key, value)
30
33
  STRING_MASK
31
- elsif key == 'query_string' || key == :query_string
34
+ elsif QUERY_STRING.include?(key)
32
35
  sanitize_query_string(value)
33
36
  else
34
37
  value
@@ -59,7 +62,10 @@ module Raven
59
62
  end
60
63
 
61
64
  def fields_re
62
- @fields_re ||= /#{(DEFAULT_FIELDS | sanitize_fields).map do |f|
65
+ return @fields_re if @fields_re
66
+ fields = DEFAULT_FIELDS | sanitize_fields
67
+ fields -= sanitize_fields_excluded
68
+ @fields_re = /#{fields.map do |f|
63
69
  use_boundary?(f) ? "\\b#{f}\\b" : f
64
70
  end.join("|")}/i
65
71
  end
@@ -73,7 +79,7 @@ module Raven
73
79
  end
74
80
 
75
81
  def parse_json_or_nil(string)
76
- return unless string.start_with?("[", "{")
82
+ return unless string.start_with?(*JSON_STARTS_WITH)
77
83
  JSON.parse(string)
78
84
  rescue JSON::ParserError, NoMethodError
79
85
  nil
@@ -12,7 +12,7 @@ module Raven
12
12
  this_value = hash[current_key]
13
13
 
14
14
  hash[current_key] = if this_value.is_a?(Hash) && other_value.is_a?(Hash)
15
- this_value.deep_merge(other_value, &block)
15
+ deep_merge(this_value, other_value, &block)
16
16
  else
17
17
  if block_given? && key?(current_key)
18
18
  block.call(current_key, this_value, other_value)
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
  module Raven
3
3
  # Freezing this constant breaks in 1.9.x
4
- VERSION = "2.5.3" # rubocop:disable Style/MutableConstant
4
+ VERSION = "2.6.0" # rubocop:disable Style/MutableConstant
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sentry-raven
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.5.3
4
+ version: 2.6.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sentry Team
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2017-06-14 00:00:00.000000000 Z
11
+ date: 2017-07-19 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: faraday
@@ -56,6 +56,7 @@ files:
56
56
  - docs/context.rst
57
57
  - docs/index.rst
58
58
  - docs/install.rst
59
+ - docs/integrations/heroku.rst
59
60
  - docs/integrations/index.rst
60
61
  - docs/integrations/puma.rst
61
62
  - docs/integrations/rack.rst