sentry-rails 4.1.5 → 4.2.2

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
  SHA256:
3
- metadata.gz: ea1c3fea4d0f1f017e5b56786e85414e459a181e8e4cebe2a45374b6c3e648dc
4
- data.tar.gz: b41da6b3dc3a3a7836ed533029821b4f53dc40e8b7cb0d10023a52af13236218
3
+ metadata.gz: e22a278e6c74ad09c754d5270c227c1dd0989c90654d2f3f55d3ca06e06ad577
4
+ data.tar.gz: c3bed6941cf8abdc306d20fd6ef7ebcecf08bb246b05921002423ac984a20d2b
5
5
  SHA512:
6
- metadata.gz: 359b3757908046fa6dfde636715b598a6977c3a131b11e4a7f8d8df3666246e867867ca3c32161bbb645fe9bc0110c50efac415ed42b4db754e21cf36878af86
7
- data.tar.gz: 4605d701de78b04adc04c74dc7b7dd1a1e02c1d500a663965d4ba9de35cf35db4a70331d21afd2b2c07a5c2917d2ccb0e2b7a7cced8f5026188e189cf119ecdb
6
+ metadata.gz: bdda28d73217516a73ffdf82ddc81687649255623a38ebcd3f9aa52d98bdf6ced7882a13c1d9dae8509eda5e1bc82a99c2762c8c5e89cd27153a98e81ba7d691
7
+ data.tar.gz: 396aaacdf3db30251891de7bf4c5e6e5c27f5ce69eb6c9fc157f5fc70dada5c4fa782dac0dcf6050c6a8cf2474f680d801f4a7dac555b20f990aca077e8cfbc9
data/CHANGELOG.md CHANGED
@@ -1,5 +1,65 @@
1
1
  # Changelog
2
2
 
3
+ ## 4.2.2
4
+
5
+ - Always define Sentry::SendEventJob to avoid eager load issues [#1286](https://github.com/getsentry/sentry-ruby/pull/1286)
6
+ - Fixes [#1283](https://github.com/getsentry/sentry-ruby/issues/1283)
7
+
8
+ ## 4.2.1
9
+
10
+ - Add additional checks to SendEventJob's definition [#1275](https://github.com/getsentry/sentry-ruby/pull/1275)
11
+ - Fixes [#1270](https://github.com/getsentry/sentry-ruby/issues/1270)
12
+ - Fixes [#1277](https://github.com/getsentry/sentry-ruby/issues/1277)
13
+
14
+ ## 4.2.0
15
+
16
+ ### Features
17
+
18
+ - Make sentry-rails a Rails engine and provide default job class for async [#1181](https://github.com/getsentry/sentry-ruby/pull/1181)
19
+
20
+ `sentry-rails` now provides a default ActiveJob class for sending events asynchronously. You can use it directly without define your own one:
21
+
22
+ ```ruby
23
+ config.async = lambda { |event, hint| Sentry::SendEventJob.perform_later(event, hint) }
24
+ ```
25
+
26
+ - Add configuration option for trusted proxies [#1126](https://github.com/getsentry/sentry-ruby/pull/1126)
27
+
28
+ `sentry-rails` now injects `Rails.application.config.action_dispatch.trusted_proxies` into `Sentry.configuration.trusted_proxies` automatically.
29
+
30
+ - Allow users to configure ActiveJob adapters to ignore [#1256](https://github.com/getsentry/sentry-ruby/pull/1256)
31
+
32
+ ```ruby
33
+ # sentry-rails will skip active_job reporting for jobs that use ActiveJob::QueueAdapters::SidekiqAdapter
34
+ # you should use this option when:
35
+ # - you don't want to see events from a certain adapter
36
+ # - you already have a better reporting setup for the adapter (like having `sentry-sidekiq` installed)
37
+ config.rails.skippable_job_adapters = ["ActiveJob::QueueAdapters::SidekiqAdapter"]
38
+ ```
39
+
40
+ - Tag `job_id` and `provider_job_id` on ActiveJob events [#1259](https://github.com/getsentry/sentry-ruby/pull/1259)
41
+
42
+ <img width="1330" alt="example of tagged event" src="https://user-images.githubusercontent.com/5079556/106389781-3a03f100-6420-11eb-810c-a99869eb26dd.png">
43
+
44
+ - Use another method for post initialization callback [#1261](https://github.com/getsentry/sentry-ruby/pull/1261)
45
+
46
+ ### Bug Fixes
47
+
48
+ - Inspect exception cause by default & don't exclude ActiveJob::DeserializationError [#1180](https://github.com/getsentry/sentry-ruby/pull/1180)
49
+ - Fixes [#1071](https://github.com/getsentry/sentry-ruby/issues/1071)
50
+
51
+ ## 4.1.7
52
+
53
+ - Use env to carry original transaction name [#1255](https://github.com/getsentry/sentry-ruby/pull/1255)
54
+ - Fix duration of tracing event in Rails 5 [#1254](https://github.com/getsentry/sentry-ruby/pull/1254) (by @abcang)
55
+ - Filter out static file transaction [#1247](https://github.com/getsentry/sentry-ruby/pull/1247)
56
+
57
+ ## 4.1.6
58
+
59
+ - Prevent exceptions app from overriding event's transaction name [#1230](https://github.com/getsentry/sentry-ruby/pull/1230)
60
+ - Fix project root detection [#1242](https://github.com/getsentry/sentry-ruby/pull/1242)
61
+ - Use sentry-ruby-core as the main SDK dependency [#1244](https://github.com/getsentry/sentry-ruby/pull/1244)
62
+
3
63
  ## 4.1.5
4
64
 
5
65
  - Add `ActionDispatch::Http::MimeNegotiation::InvalidType` to the list of default ignored Rails exceptions [#1215](https://github.com/getsentry/sentry-ruby/pull/1215) (by @agrobbin)
@@ -63,4 +123,3 @@ Release test
63
123
  ## 0.1.0
64
124
 
65
125
  First version
66
-
data/Gemfile CHANGED
@@ -8,15 +8,24 @@ rails_version = "6.1.0" if rails_version.nil?
8
8
 
9
9
  gem 'activerecord-jdbcmysql-adapter', platform: :jruby
10
10
  gem "jdbc-sqlite3", platform: :jruby
11
- gem "sqlite3", platform: :ruby
11
+
12
+ if rails_version.to_f < 6
13
+ gem "sqlite3", "~> 1.3.0", platform: :ruby
14
+ else
15
+ gem "sqlite3", platform: :ruby
16
+ end
12
17
 
13
18
  gem "rails", "~> #{rails_version}"
19
+ gem "sprockets-rails"
14
20
  gem "rspec-rails", "~> 4.0"
15
21
  gem "codecov", "0.2.12"
16
22
 
17
23
  gem "rake", "~> 12.0"
18
24
  gem "rspec", "~> 3.0"
19
25
 
26
+ # TODO: Remove this if https://github.com/jruby/jruby/issues/6547 is addressed
27
+ gem "i18n", "<= 1.8.7"
28
+
20
29
  gem "sidekiq"
21
30
 
22
31
  gem "sentry-ruby", path: "../sentry-ruby"
data/Makefile ADDED
@@ -0,0 +1,3 @@
1
+ build:
2
+ bundle install
3
+ gem build sentry-rails.gemspec
@@ -0,0 +1,34 @@
1
+ if defined?(ActiveJob)
2
+ module Sentry
3
+ parent_job =
4
+ if defined?(::ApplicationJob) && ::ApplicationJob.ancestors.include?(::ActiveJob::Base)
5
+ ::ApplicationJob
6
+ else
7
+ ::ActiveJob::Base
8
+ end
9
+
10
+ class SendEventJob < parent_job
11
+ # the event argument is usually large and creates noise
12
+ self.log_arguments = false if respond_to?(:log_arguments=)
13
+
14
+ # this will prevent infinite loop when there's an issue deserializing SentryJob
15
+ if respond_to?(:discard_on)
16
+ discard_on ActiveJob::DeserializationError
17
+ else
18
+ # mimic what discard_on does for Rails 5.0
19
+ rescue_from ActiveJob::DeserializationError do
20
+ logger.error "Discarded #{self.class} due to a #{exception}. The original exception was #{error.cause.inspect}."
21
+ end
22
+ end
23
+
24
+ def perform(event, hint = {})
25
+ Sentry.send_event(event, hint)
26
+ end
27
+ end
28
+ end
29
+ else
30
+ module Sentry
31
+ class SendEventJob; end
32
+ end
33
+ end
34
+
data/lib/sentry/rails.rb CHANGED
@@ -1,6 +1,7 @@
1
1
  require "sentry-ruby"
2
2
  require "sentry/integrable"
3
3
  require "sentry/rails/configuration"
4
+ require "sentry/rails/engine"
4
5
  require "sentry/rails/railtie"
5
6
  require "sentry/rails/tracing"
6
7
 
@@ -1,10 +1,6 @@
1
1
  module Sentry
2
2
  module Rails
3
3
  module ActiveJobExtensions
4
- ALREADY_SUPPORTED_SENTRY_ADAPTERS = %w(
5
- ActiveJob::QueueAdapters::SidekiqAdapter
6
- ).freeze
7
-
8
4
  def self.included(base)
9
5
  base.class_eval do
10
6
  around_perform do |job, block|
@@ -29,28 +25,30 @@ module Sentry
29
25
  rescue_handler_result = rescue_with_handler(e)
30
26
  return rescue_handler_result if rescue_handler_result
31
27
 
32
- Sentry::Rails.capture_exception(e, extra: sentry_context(job))
28
+ Sentry::Rails.capture_exception(
29
+ e,
30
+ extra: sentry_context(job),
31
+ tags: {
32
+ job_id: job.job_id,
33
+ provider_job_id: job.provider_job_id
34
+ }
35
+ )
33
36
  raise e
34
37
  end
35
38
 
36
39
  def already_supported_by_specific_integration?(job)
37
- ALREADY_SUPPORTED_SENTRY_ADAPTERS.include?(job.class.queue_adapter.class.to_s)
40
+ Sentry.configuration.rails.skippable_job_adapters.include?(job.class.queue_adapter.class.to_s)
38
41
  end
39
42
 
40
43
  def sentry_context(job)
41
- ctx = {
42
- :active_job => job.class.name,
43
- :arguments => job.arguments,
44
- :scheduled_at => job.scheduled_at,
45
- :job_id => job.job_id,
46
- :locale => job.locale
44
+ {
45
+ active_job: job.class.name,
46
+ arguments: job.arguments,
47
+ scheduled_at: job.scheduled_at,
48
+ job_id: job.job_id,
49
+ provider_job_id: job.provider_job_id,
50
+ locale: job.locale
47
51
  }
48
- # Add provider_job_id details if Rails 5
49
- if job.respond_to?(:provider_job_id)
50
- ctx[:provider_job_id] = job.provider_job_id
51
- end
52
-
53
- ctx
54
52
  end
55
53
  end
56
54
  end
@@ -1,6 +1,14 @@
1
1
  module Sentry
2
2
  module Rails
3
3
  class CaptureExceptions < Sentry::Rack::CaptureExceptions
4
+ def initialize(app)
5
+ super
6
+
7
+ if defined?(::Sprockets::Rails)
8
+ @assets_regex = %r(\A/{0,2}#{::Rails.application.config.assets.prefix})
9
+ end
10
+ end
11
+
4
12
  private
5
13
 
6
14
  def collect_exception(env)
@@ -12,8 +20,21 @@ module Sentry
12
20
  end
13
21
 
14
22
  def capture_exception(exception)
23
+ current_scope = Sentry.get_current_scope
24
+
25
+ if original_transaction = current_scope.rack_env["sentry.original_transaction"]
26
+ current_scope.set_transaction_name(original_transaction)
27
+ end
28
+
15
29
  Sentry::Rails.capture_exception(exception)
16
30
  end
31
+
32
+ def finish_span(span, status_code)
33
+ if @assets_regex.nil? || !span.name.match?(@assets_regex)
34
+ span.set_http_status(status_code)
35
+ span.finish
36
+ end
37
+ end
17
38
  end
18
39
  end
19
40
  end
@@ -2,7 +2,7 @@ module Sentry
2
2
  class Configuration
3
3
  attr_reader :rails
4
4
 
5
- def post_initialization_callback
5
+ add_post_initialization_callback do
6
6
  @rails = Sentry::Rails::Configuration.new
7
7
  @excluded_exceptions = @excluded_exceptions.concat(Sentry::Rails::IGNORE_DEFAULT)
8
8
  end
@@ -23,7 +23,6 @@ module Sentry
23
23
  'ActionDispatch::Http::MimeNegotiation::InvalidType',
24
24
  'ActionController::UnknownHttpMethod',
25
25
  'ActionDispatch::Http::Parameters::ParseError',
26
- 'ActiveJob::DeserializationError', # Can cause infinite loops
27
26
  'ActiveRecord::RecordNotFound'
28
27
  ].freeze
29
28
  class Configuration
@@ -33,8 +32,14 @@ module Sentry
33
32
  # will report exceptions even when they are rescued by these middlewares.
34
33
  attr_accessor :report_rescued_exceptions
35
34
 
35
+ # Some adapters, like sidekiq, already have their own sentry integration.
36
+ # In those cases, we should skip ActiveJob's reporting to avoid duplicated reports.
37
+ attr_accessor :skippable_job_adapters
38
+
36
39
  def initialize
37
40
  @report_rescued_exceptions = true
41
+ # TODO: Remove this in 4.2.0
42
+ @skippable_job_adapters = []
38
43
  end
39
44
  end
40
45
  end
@@ -0,0 +1,5 @@
1
+ module Sentry
2
+ class Engine < ::Rails::Engine
3
+ isolate_namespace Sentry
4
+ end
5
+ end
@@ -0,0 +1,16 @@
1
+ module Sentry
2
+ module Rails
3
+ module Overrides
4
+ module FileHandler
5
+ def serve(*args)
6
+ if Sentry.initialized? && current_transaction = Sentry.get_current_scope.span
7
+ # we don't want to expose a setter for @sampled just for this case
8
+ current_transaction.instance_variable_set(:@sampled, false)
9
+ end
10
+
11
+ super
12
+ end
13
+ end
14
+ end
15
+ end
16
+ end
@@ -5,6 +5,7 @@ require "sentry/rails/backtrace_cleaner"
5
5
  require "sentry/rails/controller_methods"
6
6
  require "sentry/rails/controller_transaction"
7
7
  require "sentry/rails/overrides/streaming_reporter"
8
+ require "sentry/rails/overrides/file_handler"
8
9
 
9
10
  module Sentry
10
11
  class Railtie < ::Rails::Railtie
@@ -16,22 +17,33 @@ module Sentry
16
17
  app.config.middleware.use(Sentry::Rails::RescuedExceptionInterceptor)
17
18
  end
18
19
 
19
- config.after_initialize do
20
+ config.after_initialize do |app|
20
21
  next unless Sentry.initialized?
21
22
 
23
+ configure_project_root
22
24
  configure_sentry_logger
25
+ configure_trusted_proxies
23
26
  extend_controller_methods
24
27
  extend_active_job if defined?(ActiveJob)
25
28
  override_streaming_reporter
29
+ override_file_handler if app.config.public_file_server.enabled
26
30
  setup_backtrace_cleanup_callback
27
31
  inject_breadcrumbs_logger
28
32
  activate_tracing
29
33
  end
30
34
 
35
+ def configure_project_root
36
+ Sentry.configuration.project_root = ::Rails.root.to_s
37
+ end
38
+
31
39
  def configure_sentry_logger
32
40
  Sentry.configuration.logger = ::Rails.logger
33
41
  end
34
42
 
43
+ def configure_trusted_proxies
44
+ Sentry.configuration.trusted_proxies += Array(::Rails.application.config.action_dispatch.trusted_proxies)
45
+ end
46
+
35
47
  def extend_active_job
36
48
  require "sentry/rails/active_job"
37
49
  ActiveJob::Base.send(:prepend, Sentry::Rails::ActiveJobExtensions)
@@ -66,6 +78,12 @@ module Sentry
66
78
  end
67
79
  end
68
80
 
81
+ def override_file_handler
82
+ ActiveSupport.on_load :action_controller do
83
+ ActionDispatch::FileHandler.send(:prepend, Sentry::Rails::Overrides::FileHandler)
84
+ end
85
+ end
86
+
69
87
  def activate_tracing
70
88
  if Sentry.configuration.tracing_enabled?
71
89
  Sentry::Rails::Tracing.subscribe_tracing_events
@@ -17,7 +17,9 @@ module Sentry
17
17
  # so we need to hold a copy of env to report the accurate data (like request's url)
18
18
  if request.show_exceptions?
19
19
  scope = Sentry.get_current_scope
20
- scope.set_rack_env(scope.rack_env.dup)
20
+ copied_env = scope.rack_env.dup
21
+ copied_env["sentry.original_transaction"] = scope.transaction_name
22
+ scope.set_rack_env(copied_env)
21
23
  end
22
24
 
23
25
  env["sentry.rescued_exception"] = e if Sentry.configuration.rails.report_rescued_exceptions
@@ -14,11 +14,11 @@ module Sentry
14
14
 
15
15
  def subscribe_to_event(event_name)
16
16
  if ::Rails.version.to_i == 5
17
- ActiveSupport::Notifications.subscribe(event_name) do |_, start, finish, _, payload|
17
+ ActiveSupport::Notifications.subscribe(event_name) do |*args|
18
18
  next unless Tracing.get_current_transaction
19
19
 
20
- duration = finish.to_f - start.to_f
21
- yield(event_name, duration, payload)
20
+ event = ActiveSupport::Notifications::Event.new(*args)
21
+ yield(event_name, event.duration, event.payload)
22
22
  end
23
23
  else
24
24
  ActiveSupport::Notifications.subscribe(event_name) do |event|
@@ -1,5 +1,5 @@
1
1
  module Sentry
2
2
  module Rails
3
- VERSION = "4.1.5"
3
+ VERSION = "4.2.2"
4
4
  end
5
5
  end
data/sentry-rails.gemspec CHANGED
@@ -16,12 +16,12 @@ Gem::Specification.new do |spec|
16
16
 
17
17
  spec.metadata["homepage_uri"] = spec.homepage
18
18
  spec.metadata["source_code_uri"] = spec.homepage
19
- spec.metadata["changelog_uri"] = "#{spec.homepage}/blob/master/CHANGELOG.md"
19
+ spec.metadata["changelog_uri"] = "#{spec.homepage}/blob/master/sentry-rails/CHANGELOG.md"
20
20
 
21
21
  spec.bindir = "exe"
22
22
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
23
23
  spec.require_paths = ["lib"]
24
24
 
25
25
  spec.add_dependency "rails", ">= 5.0"
26
- spec.add_dependency "sentry-ruby", "~> 4.1.2"
26
+ spec.add_dependency "sentry-ruby-core", "~> 4.2.0"
27
27
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sentry-rails
3
3
  version: !ruby/object:Gem::Version
4
- version: 4.1.5
4
+ version: 4.2.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sentry Team
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2021-01-21 00:00:00.000000000 Z
11
+ date: 2021-02-18 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -25,19 +25,19 @@ dependencies:
25
25
  - !ruby/object:Gem::Version
26
26
  version: '5.0'
27
27
  - !ruby/object:Gem::Dependency
28
- name: sentry-ruby
28
+ name: sentry-ruby-core
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: 4.1.2
33
+ version: 4.2.0
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
- version: 4.1.2
40
+ version: 4.2.0
41
41
  description: A gem that provides Rails integration for the Sentry error logger
42
42
  email: accounts@sentry.io
43
43
  executables: []
@@ -49,13 +49,14 @@ files:
49
49
  - ".craft.yml"
50
50
  - ".gitignore"
51
51
  - ".rspec"
52
- - ".travis.yml"
53
52
  - CHANGELOG.md
54
53
  - CODE_OF_CONDUCT.md
55
54
  - Gemfile
56
55
  - LICENSE.txt
56
+ - Makefile
57
57
  - README.md
58
58
  - Rakefile
59
+ - app/jobs/sentry/send_event_job.rb
59
60
  - bin/console
60
61
  - bin/setup
61
62
  - lib/sentry-rails.rb
@@ -67,6 +68,8 @@ files:
67
68
  - lib/sentry/rails/configuration.rb
68
69
  - lib/sentry/rails/controller_methods.rb
69
70
  - lib/sentry/rails/controller_transaction.rb
71
+ - lib/sentry/rails/engine.rb
72
+ - lib/sentry/rails/overrides/file_handler.rb
70
73
  - lib/sentry/rails/overrides/streaming_reporter.rb
71
74
  - lib/sentry/rails/railtie.rb
72
75
  - lib/sentry/rails/rescued_exception_interceptor.rb
@@ -83,7 +86,7 @@ licenses:
83
86
  metadata:
84
87
  homepage_uri: https://github.com/getsentry/sentry-ruby
85
88
  source_code_uri: https://github.com/getsentry/sentry-ruby
86
- changelog_uri: https://github.com/getsentry/sentry-ruby/blob/master/CHANGELOG.md
89
+ changelog_uri: https://github.com/getsentry/sentry-ruby/blob/master/sentry-rails/CHANGELOG.md
87
90
  post_install_message:
88
91
  rdoc_options: []
89
92
  require_paths:
data/.travis.yml DELETED
@@ -1,6 +0,0 @@
1
- ---
2
- language: ruby
3
- cache: bundler
4
- rvm:
5
- - 2.6.5
6
- before_install: gem install bundler -v 2.1.1