class SplunkLogger::Client

Constants

COLLECTOR_PATH

Attributes

message_queue[RW]

Public Class Methods

new(options = {}) click to toggle source
# File lib/splunk_logger/client.rb, line 12
def initialize(options = {})
  token = options[:token]
  url = options[:url]
  verify_ssl = options[:verify_ssl].nil? ? true : options[:verify_ssl]
  @default_level = options[:default_level] || 'info'
  @send_interval = options[:send_interval].to_i
  @max_batch_size = (options[:max_batch_size] || 100).to_i
  @max_queue_size = (options[:max_queue_size] || 10000).to_i
  @message_queue = []
  @current_message_size = 0
  headers = {'Authorization': "Splunk #{token}", 'Content-Type': 'application/json'}
  @conn = Faraday.new(url: url, headers: headers) do |faraday|
    faraday.request :json
    faraday.response :json, content_type: 'application/json'
    faraday.adapter  Faraday.default_adapter
  end
  @conn.ssl.verify = verify_ssl
  @semaphore = Mutex.new
  start
end

Public Instance Methods

delayed?() click to toggle source
# File lib/splunk_logger/client.rb, line 53
def delayed?
  return @send_interval > 0
end
start() click to toggle source
# File lib/splunk_logger/client.rb, line 35
def start
  return unless (@timer.nil? && delayed?)
  @timer = Thread.new do
    while true do
      sleep @send_interval
      @semaphore.synchronize do
        send_log
      end
    end
  end
end
stop() click to toggle source
# File lib/splunk_logger/client.rb, line 47
def stop
  return if @timer.nil?
  @timer.kill
  @timer = nil
end

Protected Instance Methods

send_log() click to toggle source
# File lib/splunk_logger/client.rb, line 59
def send_log
  return if @message_queue.empty? || @current_message_size > 0

  until(@message_queue.empty?) do
    @current_message_size = [@message_queue.length, @max_batch_size].min
    messages = { "event": @message_queue.slice(0, @current_message_size) }
    body = messages[:event].map { |m| "#{{event: m}.to_json}" }.join("\n")

    begin
      response = @conn.post SplunkLogger::Client::COLLECTOR_PATH, body
      if response.body['text'] == 'Success' && response.body['code'] == 0
        @message_queue.shift(@current_message_size)
      else
        @current_message_size = 0
        return
      end
    rescue Faraday::Error => e
      @current_message_size = 0
      return
    end
  end

  @current_message_size = 0
end
send_log_now(message) click to toggle source
# File lib/splunk_logger/client.rb, line 84
def send_log_now(message)
  body = "#{{event: message}.to_json}"

  begin
    response = @conn.post SplunkLogger::Client::COLLECTOR_PATH, body
    return ( response.body['text'] == 'Success' && response.body['code'] == 0 )
  rescue Faraday::Error => e
    return false
  end
end