Class: LogStash::Inputs::HttpClient

Inherits:
Base
  • Object
show all
Defined in:
lib/logstash/inputs/httpclient.rb

Instance Method Summary collapse

Instance Method Details

#arr_avg(arr, cutoff, precision) ⇒ Object

def run



109
110
111
112
113
114
115
116
117
118
# File 'lib/logstash/inputs/httpclient.rb', line 109

def arr_avg(arr,cutoff,precision)
  if(arr.size == 0)
    return 0
  end
  if(arr.size > cutoff)
    arr.drop(arr.length-cutoff) #removes from beginning of array

  end
  #get the average

  (arr.inject{ |sum, el| sum + el }.to_f / arr.size).round(precision)
end

#registerObject



57
58
59
# File 'lib/logstash/inputs/httpclient.rb', line 57

def register
  @uri = URI(@url)
end

#run(queue) ⇒ Object

def register



61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
# File 'lib/logstash/inputs/httpclient.rb', line 61

def run(queue)
  queue_times = Array.new #track an average of how long it's taking to queue events into logstash

  #::start creates a connection to the HTTP server and keeps it alive for the duration

  Net::HTTP.start @uri.host, @uri.port, :use_ssl => @uri.scheme == 'https' do |http|
    while true
      begin
        sleepIval = @interval
        begin
          http_start = Time.now
          request = Net::HTTP::Get.new(@uri.request_uri)
          request ["X-Logstash-Avg-Queue-Secs"] = arr_avg(queue_times, 20, 3)
          response = http.request request  # Net::HTTPResponse object

          http_elapsed = Time.now - http_start
        rescue => e
          @logger.warn("Http request failed, will retry", :exception => e)
          @logger.warn(e.backtrace)
          sleep(sleepIval)
          retry
        end

        if response["X-More-Events-Available"] == "true"
          sleepIval = 0 #don't wait if the server indicated there are more events ready now

        end

        @codec.decode(response.body) do |event|
          event[@response_object_name] = {}
          if @include_response_headers 
            event[@response_object_name]["headers"] = response
          end
          if @include_response_code 
            event[@response_object_name]["code"] = response.code
          end
          if @include_http_request_time 
            event[@response_object_name]["took_secs"] = http_elapsed
          end
          decorate(event)
          queue_start = Time.now
          queue << event
          queue_elapsed = Time.now - queue_start
          queue_times.push queue_elapsed
        end
      ensure
        sleep(@interval)
      end 
    end #interval loop

  end #HTTP keepalive

end