|
| 1 | +# frozen_string_literal: true |
| 2 | + |
| 3 | +module Vets |
| 4 | + module SharedLogging |
| 5 | + extend ActiveSupport::Concern |
| 6 | + |
| 7 | + def log_message_to_sentry(message, level, extra_context = {}, tags_context = {}) |
| 8 | + level = normalize_shared_level(level, nil) |
| 9 | + # https://docs.sentry.io/platforms/ruby/usage/set-level/ |
| 10 | + # valid sentry levels: log, debug, info, warning, error, fatal |
| 11 | + level = 'warning' if level == 'warn' |
| 12 | + |
| 13 | + if Settings.sentry.dsn.present? |
| 14 | + set_sentry_metadata(extra_context, tags_context) |
| 15 | + Sentry.capture_message(message, level:) |
| 16 | + end |
| 17 | + end |
| 18 | + |
| 19 | + def log_exception_to_sentry(exception, extra_context = {}, tags_context = {}, level = 'error') |
| 20 | + level = normalize_shared_level(level, exception) |
| 21 | + |
| 22 | + if Settings.sentry.dsn.present? |
| 23 | + set_sentry_metadata(extra_context, tags_context) |
| 24 | + Sentry.capture_exception(exception.cause.presence || exception, level:) |
| 25 | + end |
| 26 | + end |
| 27 | + |
| 28 | + def log_message_to_rails(message, level, extra_context = {}) |
| 29 | + # this can be a drop-in replacement for now, but maybe suggest teams |
| 30 | + # handle extra context on their own and move to a direct Rails.logger call? |
| 31 | + formatted_message = extra_context.empty? ? message : "#{message} : #{extra_context}" |
| 32 | + Rails.logger.send(level, formatted_message) |
| 33 | + end |
| 34 | + |
| 35 | + def log_exception_to_rails(exception, level = 'error') |
| 36 | + level = normalize_shared_level(level, exception) |
| 37 | + if exception.is_a? Common::Exceptions::BackendServiceException |
| 38 | + error_details = exception.errors.first.attributes.compact.reject { |_k, v| v.try(:empty?) } |
| 39 | + log_message_to_rails(exception.message, level, error_details.merge(backtrace: exception.backtrace)) |
| 40 | + else |
| 41 | + log_message_to_rails("#{exception.message}.", level) |
| 42 | + end |
| 43 | + |
| 44 | + log_message_to_rails(exception.backtrace.join("\n"), level) unless exception.backtrace.nil? |
| 45 | + end |
| 46 | + |
| 47 | + def normalize_shared_level(level, exception) |
| 48 | + case exception |
| 49 | + when Pundit::NotAuthorizedError |
| 50 | + 'info' |
| 51 | + when Common::Exceptions::BaseError |
| 52 | + # could change this attribute to log_level |
| 53 | + # to make clear it is not just a Sentry concern |
| 54 | + exception.sentry_type.to_s |
| 55 | + else |
| 56 | + level.to_s |
| 57 | + end |
| 58 | + end |
| 59 | + |
| 60 | + def non_nil_hash?(h) |
| 61 | + h.is_a?(Hash) && !h.empty? |
| 62 | + end |
| 63 | + |
| 64 | + private |
| 65 | + |
| 66 | + def set_sentry_metadata(extra_context, tags_context) |
| 67 | + Sentry.set_extras(extra_context) if non_nil_hash?(extra_context) |
| 68 | + Sentry.set_tags(tags_context) if non_nil_hash?(tags_context) |
| 69 | + end |
| 70 | + end |
| 71 | +end |
0 commit comments