module Roqua::Support::Errors

Public Class Methods

add_parameters(params) click to toggle source

adds instance variable roqua_extra_parameters to current exception.

# File lib/roqua/support/errors.rb, line 15
def self.add_parameters(params)
  return unless params.is_a?(Hash) && $!
  $!.instance_eval do
    (@roqua_extra_parameters ||= {}).merge! params
  end
end
appsignal_namespace_for_category(category) click to toggle source
# File lib/roqua/support/errors.rb, line 32
def self.appsignal_namespace_for_category(category)
  case category
  when :background then Appsignal::Transaction::BACKGROUND_JOB
  when :web then        Appsignal::Transaction::HTTP_REQUEST
  when :hl7 then        'hl7'
  else                  Appsignal::Transaction::BLANK
  end
end
extra_parameters() click to toggle source

global extra parameters to be added to all reports.

# File lib/roqua/support/errors.rb, line 5
def self.extra_parameters
  @extra_parameters || {}
end
extra_parameters=(hash) click to toggle source
# File lib/roqua/support/errors.rb, line 9
def self.extra_parameters=(hash)
  fail 'not a hash' unless hash.is_a? Hash
  @extra_parameters = hash
end
report(exception, context = {}) click to toggle source
# File lib/roqua/support/errors.rb, line 22
def self.report(exception, context = {})
  return if const_defined?(:Rails) && Rails.env.test?

  namespace, parameters, _controller, skip_backtrace = merge_parameters(exception, context)
  notification_urls = [notify_appsignal(exception, parameters, namespace)]

  # Notify Roqua logging
  log_exception(exception, parameters, notification_urls.compact, skip_backtrace)
end

Private Class Methods

extra_parameters_from_exception(exception) click to toggle source
# File lib/roqua/support/errors.rb, line 55
def extra_parameters_from_exception(exception)
  exception.instance_variable_get(:@roqua_extra_parameters) || {}
end
log_exception(exception, parameters = {}, notification_urls = [], skip_backtrace = false) click to toggle source
# File lib/roqua/support/errors.rb, line 59
def log_exception(exception, parameters = {}, notification_urls = [], skip_backtrace = false)
  if Roqua.respond_to?(:logger)
    exception_info = {class_name: exception.class.to_s,
                      message: exception.message,
                      parameters: parameters}
    exception_info[:notification_urls] = notification_urls if notification_urls.present?
    exception_info[:backtrace] = exception.backtrace unless skip_backtrace
    Roqua.logger.error('roqua.exception', exception_info)
  end
rescue Exception
end
merge_parameters(exception, context = {}) click to toggle source
# File lib/roqua/support/errors.rb, line 44
def merge_parameters(exception, context = {})
  controller = context.delete :controller
  skip_backtrace = context.delete :skip_backtrace
  namespace = context.delete(:namespace) || :background

  [namespace,
   extra_parameters.merge(context).merge(extra_parameters_from_exception(exception)),
   controller,
   skip_backtrace]
end
notify_appsignal(exception, labels, namespace) click to toggle source
# File lib/roqua/support/errors.rb, line 75
def notify_appsignal(exception, labels, namespace)
  return unless notify_appsignal?(exception)

  namespace = appsignal_namespace_for_category(namespace)
  current_transaction = Appsignal::Transaction.current

  if current_transaction.namespace == Appsignal::Transaction::HTTP_REQUEST
    current_transaction.set_tags(labels)
    current_transaction.add_exception(exception)
  else
    Appsignal.send_error exception do |transaction|
      transaction.set_tags labels
      transaction.set_namespace namespace
    end
  end
end
notify_appsignal?(exception) click to toggle source
# File lib/roqua/support/errors.rb, line 71
def notify_appsignal?(exception)
  const_defined?(:Appsignal) && Appsignal.active? && !Appsignal.is_ignored_exception?(exception)
end