Sha256: 07ae1f375982344934b8dd503afbd17e2c97e8c7a9f269296e0ae7c9b8c8debb

Contents?: true

Size: 1.01 KB

Versions: 1

Compression:

Stored size: 1.01 KB

Contents

module HydraulicBrake
  # In-memory, thread-safe storage for notices that haven't yet been sent to
  # Airbrake
  class AsyncSender
    attr_reader :sync_sender
    attr_reader :thread

    def initialize(opts={})
      @sync_sender = opts[:sync_sender]
      @q = Queue.new
      @capacity = opts[:capacity] || 100
      @logger = opts
      @thread = nil
    end

    def send_to_airbrake(notice)
      return will_not_deliver(notice) if @q.length >= @capacity

      @q.push(notice)

      return if @thread && @thread.alive?

      @thread = Thread.new do
        while n = @q.pop
          @sync_sender.send_to_airbrake(n)
        end
      end
    end

    private
    def will_not_deliver(notice)
      HydraulicBrake.logger.error(
        "[HydraulicBrake::AsyncSender has reached its capacity of "          \
        "#{@capacity} and the following notice will not be delivered "       \
        "Error: #{notice.error_class} - #{notice.error_message}\n"           \
        "Backtrace: \n#{notice.backtrace}")
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
hydraulic_brake-0.2.0 lib/hydraulic_brake/async_sender.rb