Files
openfoodnetwork/app/services/alert.rb
2025-02-11 15:36:07 +11:00

46 lines
1.3 KiB
Ruby

# frozen_string_literal: true
# A handy wrapper around error reporting libraries like Bugsnag.
#
# Bugsnag's API is great for general purpose but overly complex for our use.
# It also changes over time and we often make mistakes using it. So this class
# aims at:
#
# * Abstracting from Bugsnag, open for other services.
# * Simpler interface to reduce user error.
# * Central place to update Bugsnag API usage when it changes.
#
class Alert
# Alert Bugsnag with additional metadata to appear in tabs.
#
# Alert.raise(
# "Invalid order during checkout",
# {
# order: { number: "ABC123", state: "awaiting_return" },
# env: { referer: "example.com" }
# }
# )
def self.raise(error, metadata = {}, &block)
Bugsnag.notify(error) do |payload|
unless metadata.respond_to?(:each)
metadata = { metadata: { data: metadata } }
end
metadata.each do |name, data|
# Bugsnag only reports metadata when given a Hash.
data = { data: } unless data.is_a?(Hash)
payload.add_metadata(name, data)
end
block.call(payload)
end
end
def self.raise_with_record(error, record, &)
metadata = {
record.class.name => record&.attributes || { record_was_nil: true }
}
self.raise(error, metadata, &)
end
end