Skip to content

Commit 17b8e88

Browse files
committed
Add support for :skip_retries to Oban.ErrorReporter
1 parent 0dbf638 commit 17b8e88

2 files changed

Lines changed: 45 additions & 1 deletion

File tree

lib/sentry/integrations/oban/error_reporter.ex

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,13 +31,20 @@ defmodule Sentry.Integrations.Oban.ErrorReporter do
3131
%{job: job, kind: kind, reason: reason, stacktrace: stacktrace} = _metadata,
3232
config
3333
) do
34-
if report?(reason) do
34+
if report?(reason) and should_report?(job, config) do
3535
report(job, kind, reason, stacktrace, config)
3636
else
3737
:ok
3838
end
3939
end
4040

41+
defp should_report?(job, config) do
42+
case Keyword.get(config, :skip_retries) do
43+
true -> job.attempt == job.max_attempts
44+
_ -> true
45+
end
46+
end
47+
4148
defp report(job, kind, reason, stacktrace, config) do
4249
stacktrace =
4350
case {apply(Oban.Worker, :from_string, [job.worker]), stacktrace} do

test/sentry/integrations/oban/error_reporter_test.exs

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -210,6 +210,43 @@ defmodule Sentry.Integrations.Oban.ErrorReporterTest do
210210
assert [event] = Sentry.Test.pop_sentry_reports()
211211
assert event.tags.custom_tag == "custom_value"
212212
end
213+
214+
test "with skip_retries: true, only reports final attempt failures" do
215+
job =
216+
%{"id" => "123", "entity" => "user", "type" => "delete"}
217+
|> MyWorker.new()
218+
|> Ecto.Changeset.apply_action!(:validate)
219+
220+
reason = %RuntimeError{message: "oops"}
221+
222+
Sentry.Test.start_collecting()
223+
224+
job_attempt_1 = Map.merge(job, %{attempt: 1, max_attempts: 3})
225+
226+
assert :ok =
227+
ErrorReporter.handle_event(
228+
[:oban, :job, :exception],
229+
%{},
230+
%{job: job_attempt_1, kind: :error, reason: reason, stacktrace: []},
231+
skip_retries: true
232+
)
233+
234+
assert [] = Sentry.Test.pop_sentry_reports()
235+
236+
job_attempt_3 = Map.merge(job, %{attempt: 3, max_attempts: 3})
237+
238+
assert :ok =
239+
ErrorReporter.handle_event(
240+
[:oban, :job, :exception],
241+
%{},
242+
%{job: job_attempt_3, kind: :error, reason: reason, stacktrace: []},
243+
skip_retries: true
244+
)
245+
246+
assert [event] = Sentry.Test.pop_sentry_reports()
247+
assert event.original_exception == %RuntimeError{message: "oops"}
248+
assert event.tags.oban_worker == "Sentry.Integrations.Oban.ErrorReporterTest.MyWorker"
249+
end
213250
end
214251

215252
## Helpers

0 commit comments

Comments
 (0)