Skip to content

Commit 8bbcc0d

Browse files
solnicCodex
andcommitted
fix(jobs): retain applied extension context
Co-Authored-By: Codex <noreply@example.com>
1 parent 430828d commit 8bbcc0d

2 files changed

Lines changed: 22 additions & 2 deletions

File tree

‎sentry-rails/lib/sentry/rails/active_job.rb‎

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ module ActiveJobExtensions
1313

1414
def self.prepended(base)
1515
base.attr_accessor :_sentry
16+
base.attr_accessor :_sentry_extension_scope_contexts
1617
base.attr_reader :_sentry_job_data
1718
end
1819

@@ -156,14 +157,15 @@ def log_producer_span_error(e)
156157

157158
def record(job, trace_headers: nil, user: nil, payload: nil, &block)
158159
original_hub = Sentry.get_current_hub_internal
160+
original_extension_scope_contexts = job._sentry_extension_scope_contexts
159161
Sentry.clone_hub_to_current_thread
160162

161163
Sentry.with_scope do |scope|
162164
begin
163165
extension = Sentry.job_extensions.for(job)
164166
scope.set_user(user.transform_keys(&:to_sym)) if user && !user.empty?
165167

166-
apply_extension_scope_data(scope, extension, job)
168+
job._sentry_extension_scope_contexts = apply_extension_scope_data(scope, extension, job)
167169

168170
scope.set_transaction_name(Sentry.job_extensions.call(extension, :transaction_name, job) || job.class.name, source: :task)
169171
scope.set_tags(queue: job.queue_name)
@@ -216,6 +218,7 @@ def record(job, trace_headers: nil, user: nil, payload: nil, &block)
216218
end
217219
end
218220
ensure
221+
job._sentry_extension_scope_contexts = original_extension_scope_contexts
219222
Sentry.set_current_hub_internal(original_hub)
220223
end
221224

@@ -238,6 +241,7 @@ def apply_extension_scope_data(scope, extension, job)
238241
scope.set_tags(data[:tags]) if data[:tags]
239242
scope.set_extras(data[:extra]) if data[:extra]
240243
scope.set_user(data[:user]) if data[:user]
244+
data.fetch(:contexts, {}).deep_dup
241245
end
242246

243247
def set_extension_messaging_data(span, extension, job)
@@ -291,7 +295,7 @@ def compute_latency(job)
291295
def capture_exception(job, e, extension = Sentry.job_extensions.for(job))
292296
error_data = additive_error_data(
293297
Sentry.job_extensions.call(extension, :error_data, job, e),
294-
Sentry.job_extensions.call(extension, :scope_data, job).fetch(:contexts, {})
298+
job._sentry_extension_scope_contexts || {}
295299
)
296300

297301
options = {

‎sentry-rails/spec/sentry/rails/active_job_job_extensions_spec.rb‎

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,22 @@ def messaging_data(_job)
103103
end
104104
end
105105

106+
describe "error data from a changing job" do
107+
it "updates extension context values from before execution when the job fails" do
108+
register_extension do
109+
def scope_data(job)
110+
{ contexts: { backend: { attempt: job.executions } } }
111+
end
112+
113+
def error_data(job, _exception)
114+
{ contexts: { backend: { attempt: job.executions } } }
115+
end
116+
end
117+
118+
expect(perform_failing_job.contexts[:backend]).to eq(attempt: 1)
119+
end
120+
end
121+
106122
describe "error data overlapping the job's scope" do
107123
it "does not let the extension's error data replace tags and extra already on the job's scope" do
108124
register_extension do

0 commit comments

Comments
 (0)