lib/ree_lib/packages/ree_logger/package/ree_logger/appenders/rollbar_appender.rb



# frozen_string_literal: true

require_relative 'appender'
require 'digest'

class ReeLogger::RollbarAppender < ReeLogger::Appender
  include Ree::LinkDSL

  link 'ree_logger/log_event', -> { LogEvent }

  contract(
    Symbol,
    Kwargs[
      access_token: String,
      environment: String,
    ],
    Ksplat[
      branch?: Nilor[String],
      host?: Nilor[String],
    ] =>  Any
  )
  def initialize(level, access_token:, environment:, **opts)
    super(level, nil)

    require 'rollbar'

    Rollbar.configure do |config|
      config.enabled = true
      config.access_token = access_token
      config.environment = environment
      config.branch = opts[:branch] if opts[:branch]
      config.host = opts[:host] if opts[:host]
    end
  end

  contract(LogEvent, Nilor[String] => nil)
  def append(event, progname = nil)
    rollbar_level =
      case event.level
      when :fatal
        'critical'
      when :unknown
        'critical'
      else
        event.level.to_s
      end

    fingerprint = event.message.to_s

    if event.exception
      fingerprint += event.exception.class.to_s
    end

    scope = {}
    parameters = event.parameters.dup

    if parameters.key?(:rollbar_scope) && parameters[:rollbar_scope].is_a?(Hash)
      scope = scope.merge(
        parameters.delete(:rollbar_scope)
      )
    end

    if !scope[:fingerprint]
      fingerprint = event.message.to_s

      if event.exception
        fingerprint += event.exception.class.to_s
      end

      scope[:fingerprint] = Digest::MD5.new.update(fingerprint).to_s
    end

    Rollbar.scoped(scope) do
      Rollbar.log(rollbar_level, event.message, event.exception, parameters)
    end

    nil
  end
end