Sha256: e3d08f186689ae472737642ca03c611804840846dc86f489f636d0c416bac393

Contents?: true

Size: 1.86 KB

Versions: 2

Compression:

Stored size: 1.86 KB

Contents

module ExceptionNotifier
  class SlackNotifier < BaseNotifier
    include ExceptionNotifier::BacktraceCleaner

    attr_accessor :notifier

    def initialize(options)
      super
      begin
        @ignore_data_if = options[:ignore_data_if]

        webhook_url = options.fetch(:webhook_url)
        @message_opts = options.fetch(:additional_parameters, {})
        @notifier = Slack::Notifier.new webhook_url, options
      rescue
        @notifier = nil
      end
    end

    def call(exception, options={})
      env = options[:env] || {}
      title = "#{env['REQUEST_METHOD']} <#{env['REQUEST_URI']}>"
      data = (env['exception_notifier.exception_data'] || {}).merge(options[:data] || {})
      text = "*An exception occurred while doing*: `#{title}`\n"

      clean_message = exception.message.gsub("`", "'")
      fields = [ { title: 'Exception', value: clean_message} ]

      if exception.backtrace
        formatted_backtrace = "```#{exception.backtrace.first(5).join("\n")}```"
        fields.push({ title: 'Backtrace', value: formatted_backtrace })
      end

      unless data.empty?
        deep_reject(data, @ignore_data_if) if @ignore_data_if.is_a?(Proc)
        data_string = data.map{|k,v| "#{k}: #{v}"}.join("\n")
        fields.push({ title: 'Data', value: "```#{data_string}```" })
      end

      attchs = [color: 'danger', text: text, fields: fields, mrkdwn_in: %w(text fields)]

      if valid?
        send_notice(exception, options, clean_message, @message_opts.merge(attachments: attchs)) do |msg, message_opts| 
          @notifier.ping '', message_opts
        end
      end
    end

    protected

    def valid?
      !@notifier.nil?
    end

    def deep_reject(hash, block)
      hash.each do |k, v|
        if v.is_a?(Hash)
          deep_reject(v, block)
        end

        if block.call(k, v)
          hash.delete(k)
        end
      end
    end

  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
exception_notification-4.1.4 lib/exception_notifier/slack_notifier.rb
exception_notification-4.1.3 lib/exception_notifier/slack_notifier.rb