From f61a2fa2bf7356acfbcf9b98e7779d322060bf85 Mon Sep 17 00:00:00 2001 From: Maikel Linke Date: Fri, 6 Oct 2023 16:27:15 +1100 Subject: [PATCH 1/2] Rescue errors in report generation So we can report them to Bugsnag and the job isn't marked as failed and therefore won't repeat. --- app/jobs/report_job.rb | 6 ++++++ spec/jobs/report_job_spec.rb | 11 +++++++++++ 2 files changed, 17 insertions(+) diff --git a/app/jobs/report_job.rb b/app/jobs/report_job.rb index 73184ae574..38b7358c1f 100644 --- a/app/jobs/report_job.rb +++ b/app/jobs/report_job.rb @@ -21,6 +21,12 @@ class ReportJob < ApplicationJob email_result(user, blob) if execution_time > NOTIFICATION_TIME broadcast_result(channel, format, blob) if channel + rescue StandardError => e + Bugsnag.notify(e) do |payload| + payload.add_metadata :report, { + report_class:, user:, params:, format: + } + end end def email_result(user, blob) diff --git a/spec/jobs/report_job_spec.rb b/spec/jobs/report_job_spec.rb index b8326634b0..c99f5fc38a 100644 --- a/spec/jobs/report_job_spec.rb +++ b/spec/jobs/report_job_spec.rb @@ -64,6 +64,17 @@ describe ReportJob do }.to_not enqueue_mail end + it "rescues errors" do + expect(report_class).to receive(:new).and_raise + expect(Bugsnag).to receive(:notify) + + job = ReportJob.perform_later(**report_args) + + expect { + perform_enqueued_jobs(only: ReportJob) + }.to_not raise_error + end + def expect_csv_report blob.reload expect(blob.filename.to_s).to eq "report.csv" From 702f3b77848fc4702df956f08e1eb506d0dd63f3 Mon Sep 17 00:00:00 2001 From: Maikel Linke Date: Thu, 12 Oct 2023 16:31:13 +1100 Subject: [PATCH 2/2] Notify user about errors raised in reports --- app/jobs/report_job.rb | 9 +++++++++ config/locales/en.yml | 4 ++++ 2 files changed, 13 insertions(+) diff --git a/app/jobs/report_job.rb b/app/jobs/report_job.rb index 38b7358c1f..9d1e081433 100644 --- a/app/jobs/report_job.rb +++ b/app/jobs/report_job.rb @@ -27,6 +27,8 @@ class ReportJob < ApplicationJob report_class:, user:, params:, format: } end + + broadcast_error(channel) end def email_result(user, blob) @@ -43,6 +45,13 @@ class ReportJob < ApplicationJob ).broadcast end + def broadcast_error(channel) + cable_ready[channel].inner_html( + selector: "#report-table", + html: I18n.t("report_job.report_failed") + ).broadcast + end + def actioncable_content(format, blob) return blob.result if format.to_sym == :html diff --git a/config/locales/en.yml b/config/locales/en.yml index 95ea7a2e0a..62ecbce5ba 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -335,6 +335,10 @@ en: not_array_error: "must be an array" invalid_element_error: "must contain only valid integers" + report_job: + report_failed: | + This report failed. It may be too big to process. + We will look into it but please let us know if the problem persists. enterprise_mailer: confirmation_instructions: subject: "Please confirm the email address for %{enterprise}"