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

Improve Claim Evidence API Error Logging #23304

Merged
merged 4 commits into from
Oct 22, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
14 changes: 14 additions & 0 deletions app/controllers/application_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,20 @@ class ApplicationController < ApplicationBaseController
end

rescue_from BGS::SensitivityLevelCheckFailure do |e|
current_user = RequestStore[:current_user]
user_sensitivity_level = if current_user.present?
SensitivityChecker.new(current_user).sensitivity_level_for_user(current_user)
else
"User is not set in the RequestStore"
end

error_details = {
user_css_id: current_user&.css_id || "User is not set in the RequestStore",
user_sensitivity_level: user_sensitivity_level,
error_uuid: SecureRandom.uuid
}
ErrorHandlers::ClaimEvidenceApiErrorHandler.new.handle_error(error: e, error_details: error_details)

render json: {
status: e.message
}, status: :forbidden
Expand Down
31 changes: 31 additions & 0 deletions app/services/error_handlers/claim_evidence_api_error_handler.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
# frozen_string_literal: true

class ErrorHandlers::ClaimEvidenceApiErrorHandler
def handle_error(error:, error_details:)
report_error_to_sentry(error: error, error_details: error_details)
end

private

def report_error_to_sentry(error:, error_details:)
Raven.capture_exception(
error,
tags: { feature: "claim_evidence_api" },
extra: {
feature_toggle_enabled_use_ce_api: use_ce_api?,
feature_toggle_enabled_send_current_user_cred_to_ce_api: send_current_user_cred_to_ce_api?,
user_css_id: error_details[:user_css_id],
user_sensitivity_level: error_details[:user_sensitivity_level],
error_uuid: error_details[:error_uuid]
}
)
end

def send_current_user_cred_to_ce_api?
FeatureToggle.enabled?(:send_current_user_cred_to_ce_api)
end

def use_ce_api?
FeatureToggle.enabled?(:use_ce_api)
end
end
86 changes: 62 additions & 24 deletions app/services/external_api/vbms_service.rb
Original file line number Diff line number Diff line change
Expand Up @@ -27,9 +27,10 @@ def self.fetch_document_file(document)

if FeatureToggle.enabled?(:use_ce_api)
verify_current_user_veteran_file_number_access(document.file_number)
VeteranFileFetcher.get_document_content(
doc_series_id: document.series_id,
claim_evidence_request: claim_evidence_request
send_claim_evidence_request(
class_name: VeteranFileFetcher,
class_method: :get_document_content,
method_args: { doc_series_id: document.series_id, claim_evidence_request: claim_evidence_request }
)
else
@vbms_client ||= init_vbms_client
Expand All @@ -46,9 +47,10 @@ def self.fetch_documents_for(appeal, _user = nil)
if FeatureToggle.enabled?(:use_ce_api)
verify_current_user_veteran_access(appeal.veteran)

response = VeteranFileFetcher.fetch_veteran_file_list(
veteran_file_number: appeal.veteran_file_number,
claim_evidence_request: claim_evidence_request
response = send_claim_evidence_request(
class_name: VeteranFileFetcher,
class_method: :fetch_veteran_file_list,
method_args: { veteran_file_number: appeal.veteran_file_number, claim_evidence_request: claim_evidence_request }
)
documents = JsonApiResponseAdapter.new.adapt_fetch_document_series_for(response)
{
Expand All @@ -64,9 +66,10 @@ def self.fetch_documents_for(appeal, _user = nil)
def self.fetch_document_series_for(appeal)
if FeatureToggle.enabled?(:use_ce_api)
verify_current_user_veteran_access(appeal.veteran)
response = VeteranFileFetcher.fetch_veteran_file_list(
veteran_file_number: appeal.veteran_file_number,
claim_evidence_request: claim_evidence_request
response = send_claim_evidence_request(
class_name: VeteranFileFetcher,
class_method: :fetch_veteran_file_list,
method_args: { veteran_file_number: appeal.veteran_file_number, claim_evidence_request: claim_evidence_request }
)
JsonApiResponseAdapter.new.adapt_fetch_document_series_for(response)
else
Expand All @@ -90,11 +93,15 @@ def self.upload_document_to_vbms(appeal, uploadable_document)
subject: uploadable_document.document_type,
new_mail: true
)
response = VeteranFileUploader.upload_veteran_file(
file_path: uploadable_document.pdf_location,
claim_evidence_request: claim_evidence_request,
veteran_file_number: appeal.veteran_file_number,
doc_info: file_upload_payload
response = send_claim_evidence_request(
class_name: VeteranFileUploader,
class_method: :upload_veteran_file,
method_args: {
file_path: uploadable_document.pdf_location,
claim_evidence_request: claim_evidence_request,
veteran_file_number: appeal.veteran_file_number,
doc_info: file_upload_payload
}
)
JsonApiResponseAdapter.new.adapt_upload_document(response)
else
Expand All @@ -118,11 +125,15 @@ def self.upload_document_to_vbms_veteran(veteran_file_number, uploadable_documen
new_mail: true
)

response = VeteranFileUploader.upload_veteran_file(
file_path: uploadable_document.pdf_location,
claim_evidence_request: claim_evidence_request,
veteran_file_number: veteran_file_number,
doc_info: file_upload_payload
response = send_claim_evidence_request(
class_name: VeteranFileUploader,
class_method: :upload_veteran_file,
method_args: {
file_path: uploadable_document.pdf_location,
claim_evidence_request: claim_evidence_request,
veteran_file_number: veteran_file_number,
doc_info: file_upload_payload
}
)
JsonApiResponseAdapter.new.adapt_upload_document(response)
else
Expand Down Expand Up @@ -200,11 +211,15 @@ def self.update_document(appeal, uploadable_document)

file_uuid = uploadable_document.document_series_reference_id.delete("{}")

response = VeteranFileUpdater.update_veteran_file(
veteran_file_number: appeal.veteran_file_number,
claim_evidence_request: claim_evidence_request,
file_uuid: file_uuid,
file_update_payload: file_update_payload
response = send_claim_evidence_request(
class_name: VeteranFileUpdater,
class_method: :update_veteran_file,
method_args: {
veteran_file_number: appeal.veteran_file_number,
claim_evidence_request: claim_evidence_request,
file_uuid: file_uuid,
file_update_payload: file_update_payload
}
)
JsonApiResponseAdapter.new.adapt_update_document(response)
else
Expand Down Expand Up @@ -377,4 +392,27 @@ def self.claim_evidence_request
def self.send_user_info?
RequestStore[:current_user].present? && FeatureToggle.enabled?(:send_current_user_cred_to_ce_api)
end

class << self
private

def send_claim_evidence_request(class_name:, class_method:, method_args:)
class_name.public_send(class_method, **method_args)
rescue StandardError => error
current_user = RequestStore[:current_user]
user_sensitivity_level = if current_user.present?
SensitivityChecker.new(current_user).sensitivity_level_for_user(current_user)
else
"User is not set in the RequestStore"
end
error_details = {
user_css_id: current_user&.css_id || "User is not set in the RequestStore",
user_sensitivity_level: user_sensitivity_level,
error_uuid: SecureRandom.uuid
}
ErrorHandlers::ClaimEvidenceApiErrorHandler.new.handle_error(error: error, error_details: error_details)

nil
end
end
end
24 changes: 22 additions & 2 deletions app/services/sensitivity_checker.rb
Original file line number Diff line number Diff line change
Expand Up @@ -11,12 +11,19 @@ def sensitivity_levels_compatible?(user:, veteran:)
bgs_service.sensitivity_level_for_user(user) >=
bgs_service.sensitivity_level_for_veteran(veteran)
rescue StandardError => error
error_uuid = SecureRandom.uuid
Raven.capture_exception(error, extra: { error_uuid: error_uuid })
report_error(error)

false
end

def sensitivity_level_for_user(user)
bgs_service.sensitivity_level_for_user(user)
rescue StandardError => error
report_error(error)

nil
end

private

attr_accessor :current_user
Expand All @@ -29,4 +36,17 @@ def bgs_service

@bgs_service = BGSService.new
end

def error_handler
@error_handler ||= ErrorHandlers::ClaimEvidenceApiErrorHandler.new
end

def report_error(error)
error_details = {
user_css_id: RequestStore[:current_user]&.css_id || "User is not set in RequestStore",
user_sensitivity_level: "Error occurred in SensitivityChecker",
error_uuid: SecureRandom.uuid
}
error_handler.handle_error(error: error, error_details: error_details)
end
end
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
# frozen_string_literal: true

require "rails_helper"

describe ErrorHandlers::ClaimEvidenceApiErrorHandler do
subject(:described) { described_class.new }

describe "#handle_error" do
let(:mock_sentry_client) { class_double(Raven) }

before do
FeatureToggle.enable!(:use_ce_api)
FeatureToggle.enable!(:send_current_user_cred_to_ce_api)
end

after do
FeatureToggle.disable!(:use_ce_api)
FeatureToggle.disable!(:send_current_user_cred_to_ce_api)
end

it "sends the error to its registered clients" do
error = StandardError.new("Example CE API failure")

expect(Raven).to receive(:capture_exception)
.with(
error,
tags: { feature: "claim_evidence_api" },
extra: {
feature_toggle_enabled_use_ce_api: true,
feature_toggle_enabled_send_current_user_cred_to_ce_api: true,
user_css_id: "USER_12345",
user_sensitivity_level: 4,
error_uuid: "1234-1234-1234"
}
)

error_details = {
user_css_id: "USER_12345",
user_sensitivity_level: 4,
error_uuid: "1234-1234-1234"
}

described.handle_error(error: error, error_details: error_details)
end
end
end
Loading
Loading