Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Dex 93107 686 logging and email #19062

Merged
merged 26 commits into from
Nov 8, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
26 commits
Select commit Hold shift + click to select a range
f5a8fc8
initial pass at exhaustion monitor for 686c
evansmith Oct 24, 2024
b5fdb5a
temp reduce retries to 1 for testing
evansmith Oct 24, 2024
79182c5
Merge branch 'master' into dex-93107-686-logging-and-email
evansmith Oct 24, 2024
5353c99
update codeowners
evansmith Oct 24, 2024
59718c5
Merge branch 'master' into dex-93107-686-logging-and-email
evansmith Oct 25, 2024
74a700b
add keys for future monitoring
evansmith Oct 25, 2024
cc6e87a
Merge branch 'master' into dex-93107-686-logging-and-email
evansmith Oct 28, 2024
e02b116
Merge branch 'master' into dex-93107-686-logging-and-email
evansmith Nov 1, 2024
9152255
keys for emails
evansmith Nov 1, 2024
ec2e6f4
Merge branch 'master' into dex-93107-686-logging-and-email
evansmith Nov 4, 2024
4e69551
wip: flipper and new method
evansmith Nov 6, 2024
f1cfb7f
unit test for monitor
evansmith Nov 6, 2024
d253d8f
codeowners update
evansmith Nov 6, 2024
269638d
Merge branch 'master' into dex-93107-686-logging-and-email
evansmith Nov 6, 2024
ac54486
wip: unit tests
evansmith Nov 6, 2024
1c0f5db
unit tests and cleanup
evansmith Nov 7, 2024
1313486
fix codeowners
evansmith Nov 7, 2024
13a26f5
Merge branch 'master' into dex-93107-686-logging-and-email
evansmith Nov 7, 2024
839abab
put back to 14
evansmith Nov 7, 2024
cb9e2f8
Merge branch 'master' into dex-93107-686-logging-and-email
evansmith Nov 7, 2024
ada902e
Merge branch 'master' into dex-93107-686-logging-and-email
evansmith Nov 7, 2024
203bd4f
Merge branch 'master' into dex-93107-686-logging-and-email
evansmith Nov 7, 2024
0cd2cf7
Merge branch 'master' into dex-93107-686-logging-and-email
evansmith Nov 7, 2024
569761d
remove reference to dual email
evansmith Nov 8, 2024
f017c83
change to date submitted
evansmith Nov 8, 2024
cba12f9
add two more date submitted attributes to test
evansmith Nov 8, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions .github/CODEOWNERS
Original file line number Diff line number Diff line change
Expand Up @@ -870,6 +870,7 @@ lib/data_migrations/write_benefits_intake_uuids_to_form_submission_attempts.rb @
lib/debt_management_center @department-of-veterans-affairs/vsa-debt-resolution @department-of-veterans-affairs/backend-review-group
lib/decision_review @department-of-veterans-affairs/benefits-decision-reviews-be @department-of-veterans-affairs/va-api-engineers @department-of-veterans-affairs/backend-review-group
lib/decision_review_v1 @department-of-veterans-affairs/benefits-decision-reviews-be @department-of-veterans-affairs/va-api-engineers @department-of-veterans-affairs/backend-review-group
lib/dependents/monitor.rb @department-of-veterans-affairs/benefits-dependents-management @department-of-veterans-affairs/va-api-engineers @department-of-veterans-affairs/backend-review-group
lib/disability_compensation @department-of-veterans-affairs/Disability-Experience @department-of-veterans-affairs/va-api-engineers @department-of-veterans-affairs/backend-review-group @department-of-veterans-affairs/dbex-trex @department-of-veterans-affairs/benefits-disability-2
lib/efolder @department-of-veterans-affairs/vsa-debt-resolution @department-of-veterans-affairs/backend-review-group
lib/efolder/service.rb @department-of-veterans-affairs/vsa-debt-resolution @department-of-veterans-affairs/backend-review-group
Expand Down Expand Up @@ -1422,6 +1423,7 @@ spec/lib/common/pdf_helpers_spec.rb @department-of-veterans-affairs/benefits-dec
spec/lib/debt_management_center @department-of-veterans-affairs/vsa-debt-resolution @department-of-veterans-affairs/backend-review-group
spec/lib/decision_review @department-of-veterans-affairs/benefits-decision-reviews-be @department-of-veterans-affairs/va-api-engineers @department-of-veterans-affairs/backend-review-group
spec/lib/decision_review_v1 @department-of-veterans-affairs/benefits-decision-reviews-be @department-of-veterans-affairs/va-api-engineers @department-of-veterans-affairs/backend-review-group
spec/lib/dependents/monitor_spec.rb @department-of-veterans-affairs/benefits-dependents-management @department-of-veterans-affairs/va-api-engineers @department-of-veterans-affairs/backend-review-group
spec/lib/disability_compensation @department-of-veterans-affairs/Disability-Experience @department-of-veterans-affairs/va-api-engineers @department-of-veterans-affairs/backend-review-group
spec/lib/efolder/service_spec.rb @department-of-veterans-affairs/vsa-debt-resolution @department-of-veterans-affairs/backend-review-group
spec/lib/evss/auth_headers_spec.rb @department-of-veterans-affairs/va-api-engineers @department-of-veterans-affairs/backend-review-group
Expand Down
36 changes: 32 additions & 4 deletions app/sidekiq/central_mail/submit_central_form686c_job.rb
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
require 'pdf_utilities/datestamp_pdf'
require 'pdf_info'
require 'simple_forms_api_submission/metadata_validator'
require 'dependents/monitor'

module CentralMail
class SubmitCentralForm686cJob
Expand All @@ -30,10 +31,13 @@ def extract_uuid_from_central_mail_message(data)
sidekiq_options retry: RETRY

sidekiq_retries_exhausted do |msg, _ex|
Rails.logger.error(
"Failed all retries on CentralMail::SubmitCentralForm686cJob, last error: #{msg['error_message']}"
)
StatsD.increment("#{STATSD_KEY_PREFIX}.exhausted")
monitor = Dependents::Monitor.new
monitor.track_submission_exhaustion(msg)

saved_claim_id, _, encrypted_user_struct = msg['args']
if Flipper.enabled?(:dependents_trigger_action_needed_email)
CentralMail::SubmitCentralForm686cJob.trigger_failure_events(saved_claim_id, encrypted_user_struct)
end
end

def perform(saved_claim_id, encrypted_vet_info, encrypted_user_struct)
Expand Down Expand Up @@ -228,6 +232,30 @@ def send_confirmation_email(user)
)
end

def self.trigger_failure_events(saved_claim_id, encrypted_user_struct)
claim = SavedClaim.find(saved_claim_id)
user_struct = JSON.parse(KmsEncrypted::Box.new.decrypt(encrypted_user_struct))
email = claim.parsed_form.dig('dependents_application', 'veteran_contact_information', 'email_address') ||
user_struct.va_profile_email
template_ids = []
template_ids << Settings.vanotify.services.va_gov.template_id.form21_686c_action_needed_email if claim.submittable_686? # rubocop:disable Layout/LineLength
template_ids << Settings.vanotify.services.va_gov.template_id.form21_674_action_needed_email if claim.submittable_674? # rubocop:disable Layout/LineLength

template_ids.each do |template_id|
if claim.present? && email.present?
VANotify::EmailJob.perform_async(
email,
template_id,
{
'first_name' => claim.parsed_form.dig('veteran_information', 'full_name', 'first')&.upcase.presence,
'date_submitted' => Time.zone.today.strftime('%B %d, %Y'),
'confirmation_number' => claim.confirmation_number
}
)
end
end
end

private

def stamped_pdf_with_form(form_id, path, timestamp)
Expand Down
3 changes: 3 additions & 0 deletions config/features.yml
Original file line number Diff line number Diff line change
Expand Up @@ -454,6 +454,9 @@ features:
actor_type: user
description: Manage dependent removal from view dependent page
enable_in_development: true
dependents_trigger_action_needed_email:
actor_type: user
description: Set whether to enable VANotify email to Veteran for Dependents Backup Path failure exhaustion
disability_526_form4142_polling_records:
actor_type: user
description: enables creation of, and tracking of, sent form 4142 documents, from the 526 flow, to the Lighthouse Benefits Intake API
Expand Down
3 changes: 3 additions & 0 deletions config/settings.yml
Original file line number Diff line number Diff line change
Expand Up @@ -1292,6 +1292,9 @@ vanotify:
form1990emeb_offramp_confirmation_email: form1990emeb_offramp_confirmation_email_template_id
form1990emeb_denied_confirmation_email: form1990emeb_denied_confirmation_email_template_id
form1995_confirmation_email: form1995_confirmation_email_template_id
form21_686c_action_needed_email: form21_686c_action_needed_email_template_id
form21_686c_674_action_needed_email: form21_686c_674_action_needed_email_template_id
form21_674_action_needed_email: form21_674_action_needed_email_template_id
form21_0966_confirmation_email: form21_0966_confirmation_email_template_id
form21_0966_error_email: form21_0966_error_email_template_id
form21_0972_confirmation_email: form21_0972_confirmation_email_template_id
Expand Down
38 changes: 38 additions & 0 deletions lib/dependents/monitor.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
# frozen_string_literal: true

require 'zero_silent_failures/monitor'

module Dependents
##
# Monitor functions for Rails logging and StatsD
#
class Monitor < ::ZeroSilentFailures::Monitor
# statsd key for api
CLAIM_STATS_KEY = 'dependent-change'

# statsd key for initial sidekiq
BGS_SUBMISSION_STATS_KEY = 'worker.submit_686c_674_bgs'

# stats key for pdf submission
PDF_SUBMISSION_STATS_KEY = 'worker.submit_dependents_pdf'

# statsd key for backup sidekiq
SUBMISSION_STATS_KEY = 'worker.submit_686c_674_backup_submission'

def initialize
super('dependents-application')
end

def track_submission_exhaustion(msg)
additional_context = {
message: msg
}
log_silent_failure(additional_context, nil, call_location: caller_locations.first)

StatsD.increment("#{SUBMISSION_STATS_KEY}.exhausted")
Rails.logger.error(
"Failed all retries on CentralMail::SubmitCentralForm686cJob, last error: #{msg['error_message']}"
)
end
end
end
4 changes: 4 additions & 0 deletions spec/factories/dependency_claim.rb
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,10 @@

form {
{
'view:selectable686_options': {
add_child: true,
report674: true
},
add_child: true,
privacy_agreementAccepted: true,
veteran_information: {
Expand Down
66 changes: 66 additions & 0 deletions spec/lib/dependents/monitor_spec.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
# frozen_string_literal: true

require 'rails_helper'
require 'dependents/monitor'

RSpec.describe Dependents::Monitor do
let(:monitor) { described_class.new }
let(:claim_stats_key) { described_class::CLAIM_STATS_KEY }
let(:submission_stats_key) { described_class::SUBMISSION_STATS_KEY }
let(:claim) { create(:dependency_claim) }
let(:user) { FactoryBot.create(:evss_user, :loa3) }

let(:vet_info) do
{
'veteran_information' => {
'full_name' => {
'first' => 'Mark', 'middle' => 'A', 'last' => 'Webb'
},
'common_name' => 'Mark',
'participant_id' => '600061742',
'uuid' => user.uuid,
'email' => 'vets.gov.user+228@gmail.com',
'va_profile_email' => 'vets.gov.user+228@gmail.com',
'ssn' => '796104437',
'va_file_number' => '796104437',
'icn' => user.icn,
'birth_date' => '1950-10-04'
}
}
end
let(:encrypted_vet_info) { KmsEncrypted::Box.new.encrypt(vet_info.to_json) }
let(:central_mail_submission) { claim.central_mail_submission }

let(:user_struct) do
OpenStruct.new(
first_name: vet_info['veteran_information']['full_name']['first'],
last_name: vet_info['veteran_information']['full_name']['last'],
middle_name: vet_info['veteran_information']['full_name']['middle'],
ssn: vet_info['veteran_information']['ssn'],
email: vet_info['veteran_information']['email'],
va_profile_email: vet_info['veteran_information']['va_profile_email'],
participant_id: vet_info['veteran_information']['participant_id'],
icn: vet_info['veteran_information']['icn'],
uuid: vet_info['veteran_information']['uuid'],
common_name: vet_info['veteran_information']['common_name']
)
end
let(:encrypted_user) { KmsEncrypted::Box.new.encrypt(user_struct.to_h.to_json) }

describe '#track_submission_exhaustion' do
it 'logs sidekiq job exhaustion' do
msg = { 'args' => [claim.id, encrypted_vet_info, encrypted_user], error_message: 'Error!' }

log = "Failed all retries on CentralMail::SubmitCentralForm686cJob, last error: #{msg['error_message']}"
payload = {
message: msg
}

expect(monitor).to receive(:log_silent_failure).with(payload, nil, anything)
expect(StatsD).to receive(:increment).with("#{submission_stats_key}.exhausted")
expect(Rails.logger).to receive(:error).with(log)

monitor.track_submission_exhaustion(msg)
end
end
end
104 changes: 98 additions & 6 deletions spec/sidekiq/central_mail/submit_central_form686c_job_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,12 @@
end
let(:encrypted_user_struct) { KmsEncrypted::Box.new.encrypt(user_struct.to_h.to_json) }

let(:monitor) { double('monitor') }
let(:exhaustion_msg) do
{ 'args' => [], 'class' => 'CentralMail::SubmitCentralForm686cJob', 'error_message' => 'An error occured',
'queue' => nil }
end

describe '#perform' do
let(:success) { true }
let(:path) { 'tmp/pdf_path' }
Expand Down Expand Up @@ -248,13 +254,99 @@
)
end
end
end

describe 'sidekiq_retries_exhausted block' do
it 'logs a distinct error when retries are exhausted' do
CentralMail::SubmitCentralForm686cJob.within_sidekiq_retries_exhausted_block do
expect(Rails.logger).to receive(:error).exactly(:once)
expect(StatsD).to receive(:increment).with('worker.submit_686c_674_backup_submission.exhausted')
end
describe 'sidekiq_retries_exhausted block with flipper off' do
before do
allow(SavedClaim::DependencyClaim).to receive(:find).and_return(claim)
allow(Dependents::Monitor).to receive(:new).and_return(monitor)
allow(monitor).to receive :track_submission_exhaustion
Flipper.disable(:dependents_trigger_action_needed_email)
end

it 'logs a distinct error when retries are exhausted' do
CentralMail::SubmitCentralForm686cJob.within_sidekiq_retries_exhausted_block(
{ 'args' => [claim.id, encrypted_vet_info, encrypted_user_struct] }
) do
exhaustion_msg['args'] = [claim.id, encrypted_vet_info, encrypted_user_struct]
expect(monitor).to receive(:track_submission_exhaustion).with(exhaustion_msg)
end
end
end

describe 'sidekiq_retries_exhausted block with flipper on' do
before do
allow(SavedClaim::DependencyClaim).to receive(:find).and_return(claim)
allow(Dependents::Monitor).to receive(:new).and_return(monitor)
allow(monitor).to receive :track_submission_exhaustion
Flipper.enable(:dependents_trigger_action_needed_email)
end

it 'logs the error to zsf and sends an email with the 686C template' do
CentralMail::SubmitCentralForm686cJob.within_sidekiq_retries_exhausted_block(
{ 'args' => [claim.id, encrypted_vet_info, encrypted_user_struct] }
) do
exhaustion_msg['args'] = [claim.id, encrypted_vet_info, encrypted_user_struct]
expect(monitor).to receive(:track_submission_exhaustion).with(exhaustion_msg)
expect(SavedClaim).to receive(:find).with(claim.id).and_return(claim)
claim.parsed_form['view:selectable686_options']['report674'] = false
expect(VANotify::EmailJob).to receive(:perform_async).with(
'vets.gov.user+228@gmail.com',
'form21_686c_action_needed_email_template_id',
{
'first_name' => 'MARK',
'date_submitted' => Time.zone.today.strftime('%B %d, %Y'),
'confirmation_number' => claim.confirmation_number
}
)
end
end

it 'logs the error to zsf and sends an email with the 674 template' do
CentralMail::SubmitCentralForm686cJob.within_sidekiq_retries_exhausted_block(
{ 'args' => [claim.id, encrypted_vet_info, encrypted_user_struct] }
) do
exhaustion_msg['args'] = [claim.id, encrypted_vet_info, encrypted_user_struct]
expect(monitor).to receive(:track_submission_exhaustion).with(exhaustion_msg)
expect(SavedClaim).to receive(:find).with(claim.id).and_return(claim)
claim.parsed_form['view:selectable686_options'].delete('add_child')
expect(VANotify::EmailJob).to receive(:perform_async).with(
'vets.gov.user+228@gmail.com',
'form21_674_action_needed_email_template_id',
{
'first_name' => 'MARK',
'date_submitted' => Time.zone.today.strftime('%B %d, %Y'),
'confirmation_number' => claim.confirmation_number
}
)
end
end

it 'logs the error to zsf and sends two emails with the 686C 674 templates' do
CentralMail::SubmitCentralForm686cJob.within_sidekiq_retries_exhausted_block(
{ 'args' => [claim.id, encrypted_vet_info, encrypted_user_struct] }
) do
exhaustion_msg['args'] = [claim.id, encrypted_vet_info, encrypted_user_struct]
expect(monitor).to receive(:track_submission_exhaustion).with(exhaustion_msg)
expect(SavedClaim).to receive(:find).with(claim.id).and_return(claim)
expect(VANotify::EmailJob).to receive(:perform_async).with(
'vets.gov.user+228@gmail.com',
'form21_686c_action_needed_email_template_id',
{
'first_name' => 'MARK',
'date_submitted' => Time.zone.today.strftime('%B %d, %Y'),
'confirmation_number' => claim.confirmation_number
}
)
expect(VANotify::EmailJob).to receive(:perform_async).with(
'vets.gov.user+228@gmail.com',
'form21_674_action_needed_email_template_id',
{
'first_name' => 'MARK',
'date_submitted' => Time.zone.today.strftime('%B %d, %Y'),
'confirmation_number' => claim.confirmation_number
}
)
end
end
end
Expand Down
Loading