From 979ebb40878e012fff3ba6692d10ba83d516c282 Mon Sep 17 00:00:00 2001 From: Gustavo Diel Date: Thu, 4 Jul 2024 13:08:25 -0300 Subject: [PATCH 1/2] feat: add warn_after option to allow warning not only for the last one --- README.md | 4 ++- lib/sidekiq/silent_retry/server_middleware.rb | 18 ++++++---- .../silent_retry/server_middleware_spec.rb | 35 +++++++++++++++++++ 3 files changed, 49 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index a79bd28..c4776e9 100644 --- a/README.md +++ b/README.md @@ -40,6 +40,8 @@ In your Sidekiq job class, configure the silent_retry option to control silent r - `true`: Always enabled, no matter the error. - Some class / Array of classes: Only exceptions of said class(es) will be silently retried. +You can also set `warn_after` option to start raise warnings after a number of retries instead of only the last one. + ```ruby class MyJob include Sidekiq::Job @@ -54,7 +56,7 @@ end class MyJob include Sidekiq::Job - sidekiq_options silent_retry: [VeryCommonNotImportantError, VeryCommonNotImportantError2] + sidekiq_options silent_retry: [CommonError, CommonError2], warn_after: 2 def perform(*args) # Your job logic here diff --git a/lib/sidekiq/silent_retry/server_middleware.rb b/lib/sidekiq/silent_retry/server_middleware.rb index 8aba9e7..f6561e5 100644 --- a/lib/sidekiq/silent_retry/server_middleware.rb +++ b/lib/sidekiq/silent_retry/server_middleware.rb @@ -7,21 +7,25 @@ class ServerMiddleware def call(_job_instance, job_payload, _queue) yield - rescue => error - raise error unless silent_retry_enabled?(job_payload, error) - raise error if retries_exhausted?(job_payload) # if it's the last retry, raise the original error + rescue StandardError => e + raise e unless silent_retry_enabled?(job_payload, e) + raise e if should_warn?(job_payload) - raise Sidekiq::SilentRetry.silent_retry_error_class, error.message + raise Sidekiq::SilentRetry.silent_retry_error_class, e.message end private - def retries_exhausted?(job_payload) - job_payload['retry_count'] == job_payload['retry'] - 1 + def should_warn?(job_payload) + job_payload["retry_count"] >= warn_after(job_payload) + end + + def warn_after(job_payload) + job_payload["warn_after"]&.to_i || job_payload["retry"] - 1 end def silent_retry_enabled?(job_payload, error) - option = job_payload['silent_retry'] + option = job_payload["silent_retry"] case option when TrueClass, FalseClass diff --git a/spec/sidekiq/silent_retry/server_middleware_spec.rb b/spec/sidekiq/silent_retry/server_middleware_spec.rb index 9f5704f..cecc243 100644 --- a/spec/sidekiq/silent_retry/server_middleware_spec.rb +++ b/spec/sidekiq/silent_retry/server_middleware_spec.rb @@ -55,6 +55,41 @@ expect { subject }.to raise_error(StandardError, "some message") end end + + context 'when the job has a warn_after option' do + let(:job_payload) do + { + "retry_count" => retry_count, + "retry" => 2, + "silent_retry" => silent_retry, + "warn_after" => 1 + } + end + + context 'when the retry count is less than warn_after' do + let(:retry_count) { 0 } + + it 'silents the error' do + expect { subject }.to raise_error(Sidekiq::SilentRetry.silent_retry_error_class, "some message") + end + end + + context 'when the retry count is equal to warn_after' do + let(:retry_count) { 1 } + + it 'raises original error' do + expect { subject }.to raise_error(StandardError, "some message") + end + end + + context 'when the retry count is greater than warn_after' do + let(:retry_count) { 2 } + + it 'raises original error' do + expect { subject }.to raise_error(StandardError, "some message") + end + end + end end context "when silent retry is for specific classes" do From a987667c4dd46c13fc711e6f26c06cc66b733101 Mon Sep 17 00:00:00 2001 From: Gustavo Diel Date: Thu, 4 Jul 2024 13:08:49 -0300 Subject: [PATCH 2/2] chore: bump version --- Gemfile.lock | 2 +- lib/sidekiq/silent_retry/version.rb | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index 16b5f5b..b56fd92 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,7 +1,7 @@ PATH remote: . specs: - sidekiq-silent-retry (0.1.0) + sidekiq-silent-retry (0.2.0) sidekiq (>= 6.0) GEM diff --git a/lib/sidekiq/silent_retry/version.rb b/lib/sidekiq/silent_retry/version.rb index 5fc0970..1ebe5bb 100644 --- a/lib/sidekiq/silent_retry/version.rb +++ b/lib/sidekiq/silent_retry/version.rb @@ -2,6 +2,6 @@ module Sidekiq module SilentRetry - VERSION = "0.1.0" + VERSION = "0.2.0" end end