oban_error_reporter.ex 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. defmodule ObanErrorReporter do
  2. require Logger
  3. def handle_event(name, measurements, metadata, _) do
  4. # handling telemetry event in a try/catch block
  5. # to avoid handler detachment in the case of an error
  6. # see https://hexdocs.pm/telemetry/telemetry.html#attach/4
  7. try do
  8. handle_event(name, measurements, metadata)
  9. catch
  10. kind, reason ->
  11. message = Exception.format(kind, reason, __STACKTRACE__)
  12. Logger.error(message)
  13. end
  14. end
  15. defp handle_event([:oban, :job, :exception], measure, %{job: job} = meta) do
  16. extra =
  17. job
  18. |> Map.take([:id, :args, :meta, :queue, :worker])
  19. |> Map.merge(measure)
  20. on_job_exception(job)
  21. Sentry.capture_exception(meta.reason, stacktrace: meta.stacktrace, extra: extra)
  22. end
  23. defp handle_event([:oban, :notifier, :exception], _timing, meta) do
  24. extra = Map.take(meta, ~w(channel payload)a)
  25. Sentry.capture_exception(meta.reason, stacktrace: meta.stacktrace, extra: extra)
  26. end
  27. defp handle_event([:oban, :plugin, :exception], _timing, meta) do
  28. extra = Map.take(meta, ~w(plugin)a)
  29. Sentry.capture_exception(meta.reason, stacktrace: meta.stacktrace, extra: extra)
  30. end
  31. defp on_job_exception(%Oban.Job{
  32. queue: "analytics_imports",
  33. args: %{"import_id" => import_id},
  34. state: "executing",
  35. attempt: attempt,
  36. max_attempts: max_attempts
  37. })
  38. when attempt >= max_attempts do
  39. site_import = Plausible.Repo.get(Plausible.Imported.SiteImport, import_id)
  40. if site_import do
  41. Plausible.Workers.ImportAnalytics.import_fail(site_import, [])
  42. end
  43. end
  44. defp on_job_exception(%Oban.Job{
  45. queue: "analytics_imports",
  46. args: %{"import_id" => import_id},
  47. state: "executing"
  48. }) do
  49. site_import = Plausible.Repo.get(Plausible.Imported.SiteImport, import_id)
  50. if site_import do
  51. Plausible.Workers.ImportAnalytics.import_fail_transient(site_import)
  52. end
  53. end
  54. defp on_job_exception(_job), do: :ignore
  55. end