Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

(sentry-sidekiq): Fixed a deprecation warning in error handler #2160

Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
6 changes: 6 additions & 0 deletions CHANGELOG.md
@@ -1,3 +1,9 @@
## Unreleased

### Bug Fixes

- Fixed a deprecation in `sidekiq-ruby` error handler [#2160](https://github.com/getsentry/sentry-ruby/pull/2160)

## 5.13.0

### Features
Expand Down
9 changes: 8 additions & 1 deletion CONTRIBUTING.md
Expand Up @@ -19,8 +19,15 @@ And if you have any questions, please feel free to reach out on [Discord].

## Contribute To Individual Gems

- Install the dependencies of a specific gem by running `bundle` in it's subdirectory. I.e:
```bash
cd sentry-sidekiq
bundle install
```
- Install any additional dependencies. `sentry-sidekiq` assumes you have `redis` running.
- Use `bundle exec rake` to run tests.
- In `sentry-rails`, you can use `RAILS_VERSION=version` to specify the Rails version to test against. Default is `6.1`
- In `sentry-rails`, you can use `RAILS_VERSION=version` to specify the Rails version to test against. Default is `7.0`
- In `sentry-sidekiq`, you can use `SIDEKIQ_VERSION=version` to specify what version of Sidekiq to install when you run `bundle install`. Default is `7.0`
- Use example apps under the `example` or `examples` folder to test the change. (Remember to change the DSN first)
- To learn more about `sentry-ruby`'s structure, you can read the [Sentry SDK spec]

Expand Down
2 changes: 1 addition & 1 deletion sentry-sidekiq/Gemfile
Expand Up @@ -19,7 +19,7 @@ gem "loofah", "2.20.0" if RUBY_VERSION.to_f < 2.5
gem "psych", "5.1.0"

sidekiq_version = ENV["SIDEKIQ_VERSION"]
sidekiq_version = "6.0" if sidekiq_version.nil?
sidekiq_version = "7.0" if sidekiq_version.nil?
sidekiq_version = Gem::Version.new(sidekiq_version)

gem "sidekiq", "~> #{sidekiq_version}"
Expand Down
24 changes: 20 additions & 4 deletions sentry-sidekiq/lib/sentry/sidekiq/error_handler.rb
Expand Up @@ -5,17 +5,26 @@ module Sidekiq
class ErrorHandler
WITH_SIDEKIQ_7 = ::Gem::Version.new(::Sidekiq::VERSION) >= ::Gem::Version.new("7.0")

def call(ex, context)
# @param ex [Exception] the exception / error that occured
# @param context [Hash or Array] Sidekiq error context
# @param sidekiq_config [Sidekiq::Config, Hash] Sidekiq configuration,
# Defaults to nil.
# Sidekiq will pass the config in starting Sidekiq 7.1.5, see
# https://github.com/sidekiq/sidekiq/pull/6051
def call(ex, context, sidekiq_config = nil)
return unless Sentry.initialized?

context_filter = Sentry::Sidekiq::ContextFilter.new(context)

scope = Sentry.get_current_scope
scope.set_transaction_name(context_filter.transaction_name, source: :task) unless scope.transaction_name

# If Sentry is configured to only report an error _after_ all retries have been exhausted,
# and if the job is retryable, and have not exceeded the retry_limit,
# return early.
if Sentry.configuration.sidekiq.report_after_job_retries && retryable?(context)
retry_count = context.dig(:job, "retry_count")
if retry_count.nil? || retry_count < retry_limit(context) - 1
if retry_count.nil? || retry_count < retry_limit(context, sidekiq_config) - 1
return
end
end
Expand All @@ -37,7 +46,10 @@ def retryable?(context)
retry_option == true || (retry_option.is_a?(Integer) && retry_option.positive?)
end

def retry_limit(context)
# @return [Integer] the number of retries allowed for the job
# Tries to fetch the retry limit from the job config first,
# then falls back to Sidekiq's configuration.
def retry_limit(context, sidekiq_config)
limit = context.dig(:job, "retry")

case limit
Expand All @@ -46,7 +58,11 @@ def retry_limit(context)
when TrueClass
max_retries =
if WITH_SIDEKIQ_7
::Sidekiq.default_configuration[:max_retries]
# Sidekiq 7.1.5+ passes the config to the error handler, so we should use that.
# Sidekiq 7.0 -> 7.1.5 provides ::Sidekiq.default_configuration.
sidekiq_config.is_a?(::Sidekiq::Config) ?
sidekiq_config[:max_retries] :
::Sidekiq.default_configuration[:max_retries]
else
::Sidekiq.options[:max_retries]
end
Expand Down