class Fluent::HTTPSOutput

Public Class Methods

new() click to toggle source
Calls superclass method
# File lib/fluent/plugin/out_https_client.rb, line 4
def initialize
  super
  require 'net/https'
  require 'openssl'
  require 'uri'
  require 'yajl'
end

Public Instance Methods

configure(conf) click to toggle source
Calls superclass method
# File lib/fluent/plugin/out_https_client.rb, line 27
def configure(conf)
   super

   @use_ssl = conf['use_ssl']
   @include_tag = conf['include_tag']
   @include_timestamp = conf['include_timestamp']


   @use_proxy = false
   if @proxy_port and @proxy_addr
     # check for proxy settings
     if @proxy_port > 0 and @proxy_addr.empty?
       raise Fluent::ConfigError, 'HTTPS Output :: provide a valid proxy address'
     elsif  @proxy_port <= 0 and !@proxy_addr.empty?
       raise Fluent::ConfigError, 'HTTPS Output :: provide a valid proxy port number'
     elsif @proxy_port == 0
       raise Fluent::ConfigError, 'HTTPS Output :: provide a valid proxy port number'
     elsif  @proxy_port > 0 and !@proxy_addr.empty?
       @use_proxy = true
     end
   end

   serializers = [:json, :form]
   @serializer = if serializers.include? @serializer.intern
                   @serializer.intern
                 else
                   :form
                 end

   http_methods = [:get, :put, :post, :delete]
   @http_method = if http_methods.include? @http_method.intern
                   @http_method.intern
                 else
                   :post
                 end

   @auth = case @auth
           when 'basic' then :basic
           else
             :none
           end

   # create the headers hash
   @headers = {}
   conf.elements.each do |elem|
       elem.keys.each do |key|
         @headers[key] = elem[key]
       end
   end
 end
create_request(tag, time, record) click to toggle source
# File lib/fluent/plugin/out_https_client.rb, line 116
def create_request(tag, time, record)
  url = format_url()
  uri = URI.parse(url)
  req = Net::HTTP.const_get(@http_method.to_s.capitalize).new(uri.path)
  set_body(req, tag, record)
  set_header(req)
  return req, uri
end
emit(tag, es, chain) click to toggle source
# File lib/fluent/plugin/out_https_client.rb, line 168
def emit(tag, es, chain)
  es.each do |time, record|
    handle_record(tag, time, record)
  end
  chain.next
end
format_url() click to toggle source
# File lib/fluent/plugin/out_https_client.rb, line 86
def format_url
   @endpoint_url
end
handle_record(tag, time, record) click to toggle source
# File lib/fluent/plugin/out_https_client.rb, line 163
def handle_record(tag, time, record)
  req, uri = create_request(tag, time, record)
  send_request(req, uri, record)
end
send_request(req, uri, record) click to toggle source
# File lib/fluent/plugin/out_https_client.rb, line 125
def send_request(req, uri, record)
  is_rate_limited = (@rate_limit_msec != 0 and not @last_request_time.nil?)
  if is_rate_limited and ((Time.now.to_f - @last_request_time) * 1000.0 < @rate_limit_msec)
    $log.info('Dropped request due to rate limiting')
    return
  end
  
  res = nil
  begin
    if @auth and @auth == :basic
      req.basic_auth(@username, @password)
    end
    @last_request_time = Time.now.to_f
    if @use_proxy
      https = Net::HTTP.new(uri.host, uri.port, @proxy_addr, @proxy_port)
    else
      https = Net::HTTP.new(uri.host, uri.port)
    end
    https.use_ssl = @use_ssl
    https.ca_file = OpenSSL::X509::DEFAULT_CERT_FILE 
    https.verify_mode = OpenSSL::SSL::VERIFY_NONE
    res = https.start {|http| http.request(req) }
  rescue IOError, EOFError, SystemCallError
    $log.warn "HTTPS Output :: Net::HTTP.#{req.method.capitalize} raises exception: #{$!.class}, '#{$!.message}'"
  end
  unless res and res.is_a?(Net::HTTPSuccess)
    res_summary = if res
                    "#{res.code} #{res.message} #{res.body}"
                  else
                    "res=nil"
                  end
    $log.warn "HTTPS Output :: failed to #{req.method} #{uri} (#{res_summary})"
    $log.warn "HTTPS Output :: record failed to send : #{record}"
  else 
    $log.info "HTTPS Output :: emitted record : #{record}"
  end
end
set_body(req, tag, record) click to toggle source
# File lib/fluent/plugin/out_https_client.rb, line 90
def set_body(req, tag, record)
  if @include_tag
    record['tag'] = tag
  end
  if @include_timestamp
    record['timestamp'] = Time.now.to_i
  end 
  if @serializer == :json
    set_json_body(req, record)
  else
    req.set_form_data(record)
  end
   req
end
set_header(req) click to toggle source
# File lib/fluent/plugin/out_https_client.rb, line 105
def set_header(req)
  @headers.each do |key, value|
    req[key] = value
  end
end
set_json_body(req, data) click to toggle source
# File lib/fluent/plugin/out_https_client.rb, line 111
def set_json_body(req, data)
  req.body = Yajl.dump(data)
  req['Content-Type'] = 'application/json'
end
shutdown() click to toggle source
Calls superclass method
# File lib/fluent/plugin/out_https_client.rb, line 82
def shutdown
  super
end
start() click to toggle source
Calls superclass method
# File lib/fluent/plugin/out_https_client.rb, line 78
def start
  super
end