Sha256: f6fcb3332ada463da2918813b3c378ac07f7b04c9d9fb8f2b43c9171134855c3

Contents?: true

Size: 1.76 KB

Versions: 1

Compression:

Stored size: 1.76 KB

Contents

# frozen_string_literal: true

module Bellman
  module Handlers
    # Handle Sentry logging
    class Sentry < BaseHandler
      OBJECT_KEYS = [:profile_id, 'profile_id'].freeze

      def initialize(sentry: nil)
        super()
        @sentry = sentry
      end

      # rubocop:disable Metrics/CyclomaticComplexity
      # rubocop:disable Metrics/ParameterLists
      # rubocop:disable Metrics/PerceivedComplexity
      def handle(
        error, severity: nil, trace_id: nil, objects: nil, data: nil, **
      )
        sentry.with_scope do |scope|
          scope.set_level(severity)
          set_sentry_context(scope, objects) if objects.present?

          if trace_id
            data ||= {}
            data[:trace_id] = trace_id
          end

          set_sentry_user_and_tags(scope, data) if data.present?

          error = '[EMPTY MESSAGE]' if error.nil?
          if error.respond_to?(:message) && error.respond_to?(:backtrace)
            sentry.capture_exception(error)
          else
            sentry.capture_message(error.to_s)
          end
        end
      end
      # rubocop:enable Metrics/CyclomaticComplexity
      # rubocop:enable Metrics/ParameterLists
      # rubocop:enable Metrics/PerceivedComplexity

      def sentry
        @sentry || ::Sentry
      end

      private

      def set_sentry_context(scope, objects)
        scope.set_context(
          objects: objects.map { |object| "#{object.class.name}|#{object.id}" }
        )
      end

      def set_sentry_user_and_tags(scope, data)
        data = data.with_indifferent_access
        scope.set_user(id: data[:profile_id]) if data[:profile_id]
        data.each do |key, val|
          next if OBJECT_KEYS.include? key

          scope.send(:set_tags, **{ key => val })
        end
      end
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
bellman-0.1.0 lib/bellman/handlers/sentry.rb