mirror of
https://github.com/rails/rails.git
synced 2022-11-09 12:12:34 -05:00
Move ActiveJob retry and discard logging into log subscriber
This commit is contained in:
parent
26dc9bc8ee
commit
3bf33d7c2c
3 changed files with 103 additions and 32 deletions
|
@ -48,11 +48,11 @@ module ActiveJob
|
|||
job: self,
|
||||
adapter: self.class.queue_adapter,
|
||||
error: error,
|
||||
wait: wait
|
||||
}
|
||||
|
||||
if executions < attempts
|
||||
ActiveSupport::Notifications.instrument("enqueue_retry.active_job", payload) do
|
||||
logger.error "Retrying #{self.class} in #{wait} seconds, due to a #{error.class}. The original exception was #{error.cause.inspect}."
|
||||
retry_job wait: determine_delay(wait), queue: queue, priority: priority
|
||||
end
|
||||
else
|
||||
|
@ -61,7 +61,7 @@ module ActiveJob
|
|||
yield self, error
|
||||
end
|
||||
else
|
||||
logger.error "Stopped retrying #{self.class} due to a #{error.class}, which reoccurred on #{executions} attempts. The original exception was #{error.cause.inspect}."
|
||||
ActiveSupport::Notifications.instrument("retry_stopped.active_job", payload)
|
||||
raise error
|
||||
end
|
||||
end
|
||||
|
@ -91,14 +91,12 @@ module ActiveJob
|
|||
payload = {
|
||||
job: self,
|
||||
adapter: self.class.queue_adapter,
|
||||
error: error,
|
||||
error: error
|
||||
}
|
||||
|
||||
ActiveSupport::Notifications.instrument("discard.active_job", payload) do
|
||||
if block_given?
|
||||
yield self, error
|
||||
else
|
||||
logger.error "Discarded #{self.class} due to a #{error.class}. The original exception was #{error.cause.inspect}."
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
@ -88,6 +88,34 @@ module ActiveJob
|
|||
end
|
||||
end
|
||||
|
||||
def enqueue_retry(event)
|
||||
job = event.payload[:job]
|
||||
ex = event.payload[:error]
|
||||
wait = event.payload[:wait]
|
||||
|
||||
error do
|
||||
"Retrying #{job.class} in #{wait} seconds, due to a #{ex.class}. The original exception was #{ex.cause.inspect}."
|
||||
end
|
||||
end
|
||||
|
||||
def retry_stopped(event)
|
||||
job = event.payload[:job]
|
||||
ex = event.payload[:error]
|
||||
|
||||
error do
|
||||
"Stopped retrying #{job.class} due to a #{ex.class}, which reoccurred on #{job.executions} attempts. The original exception was #{ex.cause.inspect}."
|
||||
end
|
||||
end
|
||||
|
||||
def discard(event)
|
||||
job = event.payload[:job]
|
||||
ex = event.payload[:error]
|
||||
|
||||
error do
|
||||
"Discarded #{job.class} due to a #{ex.class}. The original exception was #{ex.cause.inspect}."
|
||||
end
|
||||
end
|
||||
|
||||
private
|
||||
def queue_name(event)
|
||||
event.payload[:adapter].class.name.demodulize.remove("Adapter") + "(#{event.payload[:job].queue_name})"
|
||||
|
|
|
@ -8,9 +8,11 @@ require "jobs/logging_job"
|
|||
require "jobs/overridden_logging_job"
|
||||
require "jobs/nested_job"
|
||||
require "jobs/rescue_job"
|
||||
require "jobs/retry_job"
|
||||
require "models/person"
|
||||
|
||||
class LoggingTest < ActiveSupport::TestCase
|
||||
include ActiveJob::TestHelper
|
||||
include ActiveSupport::LogSubscriber::TestHelper
|
||||
include ActiveSupport::Logger::Severity
|
||||
|
||||
|
@ -59,13 +61,17 @@ class LoggingTest < ActiveSupport::TestCase
|
|||
end
|
||||
|
||||
def test_uses_job_name_as_tag
|
||||
LoggingJob.perform_later "Dummy"
|
||||
assert_match(/\[LoggingJob\]/, @logger.messages)
|
||||
perform_enqueued_jobs do
|
||||
LoggingJob.perform_later "Dummy"
|
||||
assert_match(/\[LoggingJob\]/, @logger.messages)
|
||||
end
|
||||
end
|
||||
|
||||
def test_uses_job_id_as_tag
|
||||
LoggingJob.perform_later "Dummy"
|
||||
assert_match(/\[LOGGING-JOB-ID\]/, @logger.messages)
|
||||
perform_enqueued_jobs do
|
||||
LoggingJob.perform_later "Dummy"
|
||||
assert_match(/\[LOGGING-JOB-ID\]/, @logger.messages)
|
||||
end
|
||||
end
|
||||
|
||||
def test_logs_correct_queue_name
|
||||
|
@ -78,19 +84,23 @@ class LoggingTest < ActiveSupport::TestCase
|
|||
end
|
||||
|
||||
def test_globalid_parameter_logging
|
||||
person = Person.new(123)
|
||||
LoggingJob.perform_later person
|
||||
assert_match(%r{Enqueued.*gid://aj/Person/123}, @logger.messages)
|
||||
assert_match(%r{Dummy, here is it: #<Person:.*>}, @logger.messages)
|
||||
assert_match(%r{Performing.*gid://aj/Person/123}, @logger.messages)
|
||||
perform_enqueued_jobs do
|
||||
person = Person.new(123)
|
||||
LoggingJob.perform_later person
|
||||
assert_match(%r{Enqueued.*gid://aj/Person/123}, @logger.messages)
|
||||
assert_match(%r{Dummy, here is it: #<Person:.*>}, @logger.messages)
|
||||
assert_match(%r{Performing.*gid://aj/Person/123}, @logger.messages)
|
||||
end
|
||||
end
|
||||
|
||||
def test_globalid_nested_parameter_logging
|
||||
person = Person.new(123)
|
||||
LoggingJob.perform_later(person: person)
|
||||
assert_match(%r{Enqueued.*gid://aj/Person/123}, @logger.messages)
|
||||
assert_match(%r{Dummy, here is it: .*#<Person:.*>}, @logger.messages)
|
||||
assert_match(%r{Performing.*gid://aj/Person/123}, @logger.messages)
|
||||
perform_enqueued_jobs do
|
||||
person = Person.new(123)
|
||||
LoggingJob.perform_later(person: person)
|
||||
assert_match(%r{Enqueued.*gid://aj/Person/123}, @logger.messages)
|
||||
assert_match(%r{Dummy, here is it: .*#<Person:.*>}, @logger.messages)
|
||||
assert_match(%r{Performing.*gid://aj/Person/123}, @logger.messages)
|
||||
end
|
||||
end
|
||||
|
||||
def test_enqueue_job_logging
|
||||
|
@ -102,22 +112,26 @@ class LoggingTest < ActiveSupport::TestCase
|
|||
end
|
||||
|
||||
def test_perform_job_logging
|
||||
LoggingJob.perform_later "Dummy"
|
||||
assert_match(/Performing LoggingJob \(Job ID: .*?\) from .*? with arguments:.*Dummy/, @logger.messages)
|
||||
assert_match(/Dummy, here is it: Dummy/, @logger.messages)
|
||||
assert_match(/Performed LoggingJob \(Job ID: .*?\) from .*? in .*ms/, @logger.messages)
|
||||
perform_enqueued_jobs do
|
||||
LoggingJob.perform_later "Dummy"
|
||||
assert_match(/Performing LoggingJob \(Job ID: .*?\) from .*? with arguments:.*Dummy/, @logger.messages)
|
||||
assert_match(/Dummy, here is it: Dummy/, @logger.messages)
|
||||
assert_match(/Performed LoggingJob \(Job ID: .*?\) from .*? in .*ms/, @logger.messages)
|
||||
end
|
||||
end
|
||||
|
||||
def test_perform_nested_jobs_logging
|
||||
NestedJob.perform_later
|
||||
assert_match(/\[LoggingJob\] \[.*?\]/, @logger.messages)
|
||||
assert_match(/\[ActiveJob\] Enqueued NestedJob \(Job ID: .*\) to/, @logger.messages)
|
||||
assert_match(/\[ActiveJob\] \[NestedJob\] \[NESTED-JOB-ID\] Performing NestedJob \(Job ID: .*?\) from/, @logger.messages)
|
||||
assert_match(/\[ActiveJob\] \[NestedJob\] \[NESTED-JOB-ID\] Enqueued LoggingJob \(Job ID: .*?\) to .* with arguments: "NestedJob"/, @logger.messages)
|
||||
assert_match(/\[ActiveJob\].*\[LoggingJob\] \[LOGGING-JOB-ID\] Performing LoggingJob \(Job ID: .*?\) from .* with arguments: "NestedJob"/, @logger.messages)
|
||||
assert_match(/\[ActiveJob\].*\[LoggingJob\] \[LOGGING-JOB-ID\] Dummy, here is it: NestedJob/, @logger.messages)
|
||||
assert_match(/\[ActiveJob\].*\[LoggingJob\] \[LOGGING-JOB-ID\] Performed LoggingJob \(Job ID: .*?\) from .* in/, @logger.messages)
|
||||
assert_match(/\[ActiveJob\] \[NestedJob\] \[NESTED-JOB-ID\] Performed NestedJob \(Job ID: .*?\) from .* in/, @logger.messages)
|
||||
perform_enqueued_jobs do
|
||||
NestedJob.perform_later
|
||||
assert_match(/\[LoggingJob\] \[.*?\]/, @logger.messages)
|
||||
assert_match(/\[ActiveJob\] Enqueued NestedJob \(Job ID: .*\) to/, @logger.messages)
|
||||
assert_match(/\[ActiveJob\] \[NestedJob\] \[NESTED-JOB-ID\] Performing NestedJob \(Job ID: .*?\) from/, @logger.messages)
|
||||
assert_match(/\[ActiveJob\] \[NestedJob\] \[NESTED-JOB-ID\] Enqueued LoggingJob \(Job ID: .*?\) to .* with arguments: "NestedJob"/, @logger.messages)
|
||||
assert_match(/\[ActiveJob\].*\[LoggingJob\] \[LOGGING-JOB-ID\] Performing LoggingJob \(Job ID: .*?\) from .* with arguments: "NestedJob"/, @logger.messages)
|
||||
assert_match(/\[ActiveJob\].*\[LoggingJob\] \[LOGGING-JOB-ID\] Dummy, here is it: NestedJob/, @logger.messages)
|
||||
assert_match(/\[ActiveJob\].*\[LoggingJob\] \[LOGGING-JOB-ID\] Performed LoggingJob \(Job ID: .*?\) from .* in/, @logger.messages)
|
||||
assert_match(/\[ActiveJob\] \[NestedJob\] \[NESTED-JOB-ID\] Performed NestedJob \(Job ID: .*?\) from .* in/, @logger.messages)
|
||||
end
|
||||
end
|
||||
|
||||
def test_enqueue_at_job_logging
|
||||
|
@ -151,4 +165,35 @@ class LoggingTest < ActiveSupport::TestCase
|
|||
assert_match(/Performing RescueJob \(Job ID: .*?\) from .*? with arguments:.*other/, @logger.messages)
|
||||
assert_match(/Error performing RescueJob \(Job ID: .*?\) from .*? in .*ms: RescueJob::OtherError \(Bad hair\):\n.*\brescue_job\.rb:\d+:in `perform'/, @logger.messages)
|
||||
end
|
||||
|
||||
def test_enqueue_retry_logging
|
||||
perform_enqueued_jobs do
|
||||
RetryJob.perform_later "DefaultsError", 2
|
||||
assert_match(/Retrying RetryJob in \d+ seconds, due to a DefaultsError\. The original exception was nil\./, @logger.messages)
|
||||
end
|
||||
end
|
||||
|
||||
def test_retry_stopped_logging
|
||||
perform_enqueued_jobs do
|
||||
RetryJob.perform_later "CustomCatchError", 6
|
||||
assert_match(/Stopped retrying RetryJob due to a CustomCatchError, which reoccurred on \d+ attempts\. The original exception was #<CustomCatchError: CustomCatchError>\./, @logger.messages)
|
||||
end
|
||||
end
|
||||
|
||||
def test_retry_stopped_logging_without_block
|
||||
perform_enqueued_jobs do
|
||||
begin
|
||||
RetryJob.perform_later "DefaultsError", 6
|
||||
rescue DefaultsError
|
||||
assert_match(/Stopped retrying RetryJob due to a DefaultsError, which reoccurred on \d+ attempts\. The original exception was #<DefaultsError: DefaultsError>\./, @logger.messages)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
def test_discard_logging
|
||||
perform_enqueued_jobs do
|
||||
RetryJob.perform_later "DiscardableError", 2
|
||||
assert_match(/Discarded RetryJob due to a DiscardableError\. The original exception was nil\./, @logger.messages)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
Loading…
Reference in a new issue