Sha256: f5bb11a02e428d356b078506f4af20fc47e5f5056ea43197034e03fcb0c2ada5

Contents?: true

Size: 1.66 KB

Versions: 1

Compression:

Stored size: 1.66 KB

Contents

module Justlogging

  class Agent

    attr_reader :queue, :active, :sleep_time

    def initialize
      @sleep_time = 5
      @queue = []
      @active = true
      @thread = Thread.new do
        while true do
          if (@queue.any? && @active == true)
            send_queue
          end
          sleep @sleep_time
        end
      end
    end

    def add_to_queue(transaction)
      Rails.logger.info 'added transaction to queue'
      @queue << transaction
    end

    def uri
      URI(Justlogging.config[:endpoint])
    end

    def http_client
      Net::HTTP.new(uri.host, uri.port).tap do |http|
        if uri.scheme == 'https'
          http.use_ssl = true
          http.verify_mode = OpenSSL::SSL::VERIFY_PEER
        end
      end
    end

    def send_queue
      json = ActiveSupport::JSON.encode @queue
      request = Net::HTTP::Post.new(uri.request_uri)
      request.set_form_data('api_key' => Justlogging.config[:api_key], 'log_entries' => json)

      begin
        result = http_client.request(request)
        code = result.code
      rescue => error
        Rails.logger.err "[Justlogging] Error: #{error.message}"
        code = nil
      end
      Rails.logger.info "[Justlogging] Sent queue: #{code}"
      handle_result(code)
    end

    # Empty queue is result is 200 ok.
    # Throttle connection when result is 403
    # Unsubscribe and stop sending all together on any other code.
    def handle_result(code)
      if code == '200'
        @queue = []
      elsif code == '403'
        @sleep_time = @sleep_time * 1.5
      else
        ActiveSupport::Notifications.unsubscribe(Justlogging.subscriber)
        @active = false
      end
    end

  end

end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
justlogging-rails-0.0.4 lib/justlogging/agent.rb