logstash-input-httpclient 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.gitignore +5 -0
- data/Gemfile +3 -0
- data/LICENSE +13 -0
- data/README.md +28 -0
- data/Rakefile +1 -0
- data/lib/logstash/inputs/httpclient.rb +110 -0
- data/logstash-input-httpclient.gemspec +25 -0
- data/spec/inputs/httpclient_spec.rb +1 -0
- metadata +116 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: dfffe002abaff65c15fae28f60bdb26c96a49296
|
4
|
+
data.tar.gz: a0ccb1d87c692aa0a408d1565000a7f758fc28d6
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: a2d781b3211acb8ccf50e73c1fa8d64fc3edcd8e15d176df3f1787c5596277a3e8cdad396cafb82129858715742709b623284191f670475ca596ca779290bf6e
|
7
|
+
data.tar.gz: 41cf27bfe287f24232626b2ee3d82a3a63f53adb5d0dcba29ea836b1e87a4a3254ecbfa978ba60d5f52b13f9df386a652aa330ca9d526be949efac2ef9c3adaf
|
data/.gitignore
ADDED
data/Gemfile
ADDED
data/LICENSE
ADDED
@@ -0,0 +1,13 @@
|
|
1
|
+
Copyright (c) 2012–2015 Elasticsearch <http://www.elastic.co>
|
2
|
+
|
3
|
+
Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
you may not use this file except in compliance with the License.
|
5
|
+
You may obtain a copy of the License at
|
6
|
+
|
7
|
+
http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
|
9
|
+
Unless required by applicable law or agreed to in writing, software
|
10
|
+
distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
See the License for the specific language governing permissions and
|
13
|
+
limitations under the License.
|
data/README.md
ADDED
@@ -0,0 +1,28 @@
|
|
1
|
+
# Logstash HTTP Client Input Plugin
|
2
|
+
|
3
|
+
This is a plugin for [Logstash](https://github.com/elasticsearch/logstash).
|
4
|
+
|
5
|
+
It is fully free and fully open source. The license is Apache 2.0, meaning you are pretty much free to use it however you want in whatever way.
|
6
|
+
|
7
|
+
## Documentation
|
8
|
+
|
9
|
+
This plugin will open up a http keep-alive connection to any http server and periodically execute GET requests. The response body will be added to the `message` field of the logstash event.
|
10
|
+
|
11
|
+
This plugin also adds a `X-Logstash-Avg-Queue-Secs` header to every GET request. This indicates the average amount of "wait time" an event is waiting to be added to logstash's intenal bounded/blocking input queue. The server could use this value to determine how many events to send to logstash based on the throughput/wait time.
|
12
|
+
|
13
|
+
## Installing
|
14
|
+
`{logstash_dir}/bin/plugin install logstash-input-httpclient`
|
15
|
+
|
16
|
+
## Need Help?
|
17
|
+
|
18
|
+
Need help? Try #logstash on freenode IRC or the logstash-users@googlegroups.com mailing list.
|
19
|
+
|
20
|
+
## Contributing
|
21
|
+
|
22
|
+
All contributions are welcome: ideas, patches, documentation, bug reports, complaints, and even something you drew up on a napkin.
|
23
|
+
|
24
|
+
Programming is not a required skill. Whatever you've seen about open source and maintainers or community members saying "send patches or die" - you will not see that here.
|
25
|
+
|
26
|
+
It is more important to the community that you are able to contribute.
|
27
|
+
|
28
|
+
For more information about contributing, see the [CONTRIBUTING](https://github.com/elasticsearch/logstash/blob/master/CONTRIBUTING.md) file.
|
data/Rakefile
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require "logstash/devutils/rake"
|
@@ -0,0 +1,110 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
require "logstash/inputs/base"
|
3
|
+
require "logstash/namespace"
|
4
|
+
require "stud/interval"
|
5
|
+
require "net/http"
|
6
|
+
|
7
|
+
# Query a http server with GET requests at a regular interval.
|
8
|
+
#
|
9
|
+
#[%hardbreaks]
|
10
|
+
# HTTP GET requests are performed using the provided url (which may contain URL parameters).
|
11
|
+
# The HTTP Response body will be added to "message" after being decoded by the provided codec.
|
12
|
+
# There is an additional header named `X-Logstash-Avg-Queue-Secs` added to each HTTP request. This is the
|
13
|
+
# average seconds it took for the past 20 events to be accepted by Logstash's bounded input queue.
|
14
|
+
# The HTTP server could use this as a indication of how many events the Logstash instance is able to process (throughput).
|
15
|
+
|
16
|
+
|
17
|
+
class LogStash::Inputs::HttpClient < LogStash::Inputs::Base
|
18
|
+
config_name "httpclient"
|
19
|
+
|
20
|
+
# If undefined, Logstash will complain, even if codec is unused.
|
21
|
+
default :codec, "plain"
|
22
|
+
|
23
|
+
#[%hardbreaks]
|
24
|
+
# The full url to execute GET requests on.
|
25
|
+
# It may contain URL parameters (you are responsible for URL encoding them)
|
26
|
+
# e.g. `https://mywebservice.int/`
|
27
|
+
# e.g. `http://mywebservice.int?queue=logstash_events&numevents=10`
|
28
|
+
#
|
29
|
+
# IMPORTANT: make sure you end with a slash (if not using url params). `http://mywebservice.int` is not valid, it must be `http://myswebservice.int/`
|
30
|
+
# todo: auto-append slash if user forgets
|
31
|
+
config :url, :validate => :string, :required => true
|
32
|
+
|
33
|
+
# Set how frequently we should query the url for messages
|
34
|
+
#
|
35
|
+
# The default, `10`, means send a message every 10 seconds.
|
36
|
+
config :interval, :validate => :number, :default => 10
|
37
|
+
|
38
|
+
# The name of the object that http response meta-data (headers, response code, etc) should be added to.
|
39
|
+
config :response_object_name, :validate => :string, :default => "http_response"
|
40
|
+
|
41
|
+
# Should the http headers be added to the `response_object_name`?
|
42
|
+
#
|
43
|
+
# If true, there will be a "headers" with all the response headers/values.
|
44
|
+
config :include_response_headers, :validate => :boolean, :default => false
|
45
|
+
|
46
|
+
# Should the http response code be added to the `response_object_name`?
|
47
|
+
#
|
48
|
+
# If true, there will be a "code" with all the response headers/values.
|
49
|
+
config :include_response_code, :validate => :boolean, :default => true
|
50
|
+
|
51
|
+
# Should the http request elapsed time be added to the `response_object_name`?
|
52
|
+
#
|
53
|
+
# If true, there will be a "took_secs" with the time it took for the http request to complete
|
54
|
+
config :include_http_request_time, :validate => :boolean, :default => true
|
55
|
+
|
56
|
+
public
|
57
|
+
def register
|
58
|
+
@uri = URI(@url)
|
59
|
+
end # def register
|
60
|
+
|
61
|
+
def run(queue)
|
62
|
+
queue_times = Array.new #track an average of how long it's taking to queue events into logstash
|
63
|
+
#::start creates a connection to the HTTP server and keeps it alive for the duration
|
64
|
+
Net::HTTP.start @uri.host, @uri.port, :use_ssl => @uri.scheme == 'https' do |http|
|
65
|
+
Stud.interval(@interval) do
|
66
|
+
begin
|
67
|
+
http_start = Time.now
|
68
|
+
request = Net::HTTP::Get.new(@uri.path)
|
69
|
+
request ["X-Logstash-Avg-Queue-Secs"] = arr_avg(queue_times, 20, 3)
|
70
|
+
response = http.request request # Net::HTTPResponse object
|
71
|
+
http_elapsed = Time.now - http_start
|
72
|
+
rescue => e
|
73
|
+
@logger.warn("Http request failed, will retry", :exception => e)
|
74
|
+
@logger.warn(e.backtrace)
|
75
|
+
sleep(@interval)
|
76
|
+
retry
|
77
|
+
end
|
78
|
+
#event = LogStash::Event.new("message" => response.body)
|
79
|
+
@codec.decode(response.body) do |event|
|
80
|
+
event[@response_object_name] = {}
|
81
|
+
if @include_response_headers
|
82
|
+
event[@response_object_name]["headers"] = response
|
83
|
+
end
|
84
|
+
if @include_response_code
|
85
|
+
event[@response_object_name]["code"] = response.code
|
86
|
+
end
|
87
|
+
if @include_http_request_time
|
88
|
+
event[@response_object_name]["took_secs"] = http_elapsed
|
89
|
+
end
|
90
|
+
decorate(event)
|
91
|
+
queue_start = Time.now
|
92
|
+
queue << event
|
93
|
+
queue_elapsed = Time.now - http_start
|
94
|
+
queue_times.push queue_elapsed
|
95
|
+
end
|
96
|
+
end #interval loop
|
97
|
+
end #HTTP keepalive
|
98
|
+
end # def run
|
99
|
+
|
100
|
+
def arr_avg(arr,cutoff,precision)
|
101
|
+
if(arr.size == 0)
|
102
|
+
return 0
|
103
|
+
end
|
104
|
+
if(arr.size > cutoff)
|
105
|
+
arr.drop(arr.length-cutoff) #removes from beginning of array
|
106
|
+
end
|
107
|
+
#get the average
|
108
|
+
(arr.inject{ |sum, el| sum + el }.to_f / arr.size).round(precision)
|
109
|
+
end
|
110
|
+
end # class LogStash::Inputs::Example
|
@@ -0,0 +1,25 @@
|
|
1
|
+
Gem::Specification.new do |s|
|
2
|
+
s.name = 'logstash-input-httpclient'
|
3
|
+
s.version = '0.1.0'
|
4
|
+
s.licenses = ['Apache License (2.0)']
|
5
|
+
s.summary = "This input queries a http url at a regular interval and sends the responses to logstash."
|
6
|
+
s.description = "This gem is a logstash plugin required to be installed on top of the Logstash core pipeline using $LS_HOME/bin/plugin install gemname. This gem is not a stand-alone program"
|
7
|
+
s.authors = ["bradvido"]
|
8
|
+
s.email = 'bradvido+logstash-input-httpclient@bradvido.com'
|
9
|
+
s.homepage = "http://www.elastic.co/guide/en/logstash/current/index.html"
|
10
|
+
s.require_paths = ["lib"]
|
11
|
+
|
12
|
+
# Files
|
13
|
+
s.files = `git ls-files`.split($\)
|
14
|
+
# Tests
|
15
|
+
s.test_files = s.files.grep(%r{^(test|spec|features)/})
|
16
|
+
|
17
|
+
# Special flag to let us know this is actually a logstash plugin
|
18
|
+
s.metadata = { "logstash_plugin" => "true", "logstash_group" => "input" }
|
19
|
+
|
20
|
+
# Gem dependencies
|
21
|
+
s.add_runtime_dependency "logstash-core", '>= 1.4.0', '< 2.0.0'
|
22
|
+
s.add_runtime_dependency 'logstash-codec-plain'
|
23
|
+
s.add_runtime_dependency 'stud'
|
24
|
+
s.add_development_dependency 'logstash-devutils'
|
25
|
+
end
|
@@ -0,0 +1 @@
|
|
1
|
+
require "logstash/devutils/rspec/spec_helper"
|
metadata
ADDED
@@ -0,0 +1,116 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: logstash-input-httpclient
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- bradvido
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2015-06-05 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: logstash-core
|
15
|
+
version_requirements: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - '>='
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: 1.4.0
|
20
|
+
- - <
|
21
|
+
- !ruby/object:Gem::Version
|
22
|
+
version: 2.0.0
|
23
|
+
requirement: !ruby/object:Gem::Requirement
|
24
|
+
requirements:
|
25
|
+
- - '>='
|
26
|
+
- !ruby/object:Gem::Version
|
27
|
+
version: 1.4.0
|
28
|
+
- - <
|
29
|
+
- !ruby/object:Gem::Version
|
30
|
+
version: 2.0.0
|
31
|
+
prerelease: false
|
32
|
+
type: :runtime
|
33
|
+
- !ruby/object:Gem::Dependency
|
34
|
+
name: logstash-codec-plain
|
35
|
+
version_requirements: !ruby/object:Gem::Requirement
|
36
|
+
requirements:
|
37
|
+
- - '>='
|
38
|
+
- !ruby/object:Gem::Version
|
39
|
+
version: '0'
|
40
|
+
requirement: !ruby/object:Gem::Requirement
|
41
|
+
requirements:
|
42
|
+
- - '>='
|
43
|
+
- !ruby/object:Gem::Version
|
44
|
+
version: '0'
|
45
|
+
prerelease: false
|
46
|
+
type: :runtime
|
47
|
+
- !ruby/object:Gem::Dependency
|
48
|
+
name: stud
|
49
|
+
version_requirements: !ruby/object:Gem::Requirement
|
50
|
+
requirements:
|
51
|
+
- - '>='
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: '0'
|
54
|
+
requirement: !ruby/object:Gem::Requirement
|
55
|
+
requirements:
|
56
|
+
- - '>='
|
57
|
+
- !ruby/object:Gem::Version
|
58
|
+
version: '0'
|
59
|
+
prerelease: false
|
60
|
+
type: :runtime
|
61
|
+
- !ruby/object:Gem::Dependency
|
62
|
+
name: logstash-devutils
|
63
|
+
version_requirements: !ruby/object:Gem::Requirement
|
64
|
+
requirements:
|
65
|
+
- - '>='
|
66
|
+
- !ruby/object:Gem::Version
|
67
|
+
version: '0'
|
68
|
+
requirement: !ruby/object:Gem::Requirement
|
69
|
+
requirements:
|
70
|
+
- - '>='
|
71
|
+
- !ruby/object:Gem::Version
|
72
|
+
version: '0'
|
73
|
+
prerelease: false
|
74
|
+
type: :development
|
75
|
+
description: This gem is a logstash plugin required to be installed on top of the Logstash core pipeline using $LS_HOME/bin/plugin install gemname. This gem is not a stand-alone program
|
76
|
+
email: bradvido+logstash-input-httpclient@bradvido.com
|
77
|
+
executables: []
|
78
|
+
extensions: []
|
79
|
+
extra_rdoc_files: []
|
80
|
+
files:
|
81
|
+
- .gitignore
|
82
|
+
- Gemfile
|
83
|
+
- LICENSE
|
84
|
+
- README.md
|
85
|
+
- Rakefile
|
86
|
+
- lib/logstash/inputs/httpclient.rb
|
87
|
+
- logstash-input-httpclient.gemspec
|
88
|
+
- spec/inputs/httpclient_spec.rb
|
89
|
+
homepage: http://www.elastic.co/guide/en/logstash/current/index.html
|
90
|
+
licenses:
|
91
|
+
- Apache License (2.0)
|
92
|
+
metadata:
|
93
|
+
logstash_plugin: 'true'
|
94
|
+
logstash_group: input
|
95
|
+
post_install_message:
|
96
|
+
rdoc_options: []
|
97
|
+
require_paths:
|
98
|
+
- lib
|
99
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - '>='
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: '0'
|
104
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
105
|
+
requirements:
|
106
|
+
- - '>='
|
107
|
+
- !ruby/object:Gem::Version
|
108
|
+
version: '0'
|
109
|
+
requirements: []
|
110
|
+
rubyforge_project:
|
111
|
+
rubygems_version: 2.4.6
|
112
|
+
signing_key:
|
113
|
+
specification_version: 4
|
114
|
+
summary: This input queries a http url at a regular interval and sends the responses to logstash.
|
115
|
+
test_files:
|
116
|
+
- spec/inputs/httpclient_spec.rb
|