fluent-plugin-out-http 0.1.0 → 0.1.1
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG.md +8 -0
- data/fluent-plugin-out-http.gemspec +4 -4
- data/lib/fluent/plugin/out_http.rb +8 -4
- data/test/plugin/test_out_http.rb +25 -4
- metadata +47 -22
data/CHANGELOG.md
ADDED
@@ -2,7 +2,7 @@
|
|
2
2
|
|
3
3
|
Gem::Specification.new do |gem|
|
4
4
|
gem.name = "fluent-plugin-out-http"
|
5
|
-
gem.version = "0.1.
|
5
|
+
gem.version = "0.1.1"
|
6
6
|
gem.authors = ["Marica Odagaki"]
|
7
7
|
gem.email = ["ento.entotto@gmail.com"]
|
8
8
|
gem.summary = %q{A generic Fluentd output plugin to send logs to an HTTP endpoint}
|
@@ -14,8 +14,8 @@ Gem::Specification.new do |gem|
|
|
14
14
|
gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
|
15
15
|
gem.require_paths = ["lib"]
|
16
16
|
|
17
|
+
gem.add_runtime_dependency "yajl-ruby", "~> 1.0"
|
18
|
+
gem.add_runtime_dependency "fluentd", "~> 0.10.0"
|
17
19
|
gem.add_development_dependency "bundler"
|
18
|
-
gem.add_development_dependency "
|
19
|
-
gem.add_development_dependency "fluentd"
|
20
|
-
gem.add_runtime_dependency "fluentd"
|
20
|
+
gem.add_development_dependency "rake"
|
21
21
|
end
|
@@ -1,5 +1,3 @@
|
|
1
|
-
require 'json'
|
2
|
-
|
3
1
|
class Fluent::HTTPOutput < Fluent::Output
|
4
2
|
Fluent::Plugin.register_output('http', self)
|
5
3
|
|
@@ -7,6 +5,7 @@ class Fluent::HTTPOutput < Fluent::Output
|
|
7
5
|
super
|
8
6
|
require 'net/http'
|
9
7
|
require 'uri'
|
8
|
+
require 'yajl'
|
10
9
|
end
|
11
10
|
|
12
11
|
# Endpoint URL ex. localhost.local/api/
|
@@ -77,7 +76,7 @@ class Fluent::HTTPOutput < Fluent::Output
|
|
77
76
|
end
|
78
77
|
|
79
78
|
def set_json_body(req, data)
|
80
|
-
req.body =
|
79
|
+
req.body = Yajl.dump(data)
|
81
80
|
req['Content-Type'] = 'application/json'
|
82
81
|
end
|
83
82
|
|
@@ -109,7 +108,12 @@ class Fluent::HTTPOutput < Fluent::Output
|
|
109
108
|
$log.warn "Net::HTTP.#{req.method.capitalize} raises exception: #{$!.class}, '#{$!.message}'"
|
110
109
|
end
|
111
110
|
unless res and res.is_a?(Net::HTTPSuccess)
|
112
|
-
|
111
|
+
res_summary = if res
|
112
|
+
"#{res.code} #{res.message} #{res.body}"
|
113
|
+
else
|
114
|
+
"res=nil"
|
115
|
+
end
|
116
|
+
$log.warn "failed to #{req.method} #{uri} (#{res_summary})"
|
113
117
|
end
|
114
118
|
end
|
115
119
|
|
@@ -1,4 +1,6 @@
|
|
1
|
-
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
require 'uri'
|
3
|
+
require 'yajl'
|
2
4
|
require 'fluent/test/http_output_test'
|
3
5
|
require 'fluent/plugin/out_http'
|
4
6
|
|
@@ -13,6 +15,7 @@ class HTTPOutputTestBase < Test::Unit::TestCase
|
|
13
15
|
@posts = []
|
14
16
|
@puts = []
|
15
17
|
@prohibited = 0
|
18
|
+
@requests = 0
|
16
19
|
@auth = false
|
17
20
|
@dummy_server_thread = Thread.new do
|
18
21
|
srv = if ENV['VERBOSE']
|
@@ -24,6 +27,7 @@ class HTTPOutputTestBase < Test::Unit::TestCase
|
|
24
27
|
begin
|
25
28
|
allowed_methods = %w(POST PUT)
|
26
29
|
srv.mount_proc('/api/') { |req,res|
|
30
|
+
@requests += 1
|
27
31
|
unless allowed_methods.include? req.request_method
|
28
32
|
res.status = 405
|
29
33
|
res.body = 'request method mismatch'
|
@@ -41,7 +45,7 @@ class HTTPOutputTestBase < Test::Unit::TestCase
|
|
41
45
|
|
42
46
|
record = {:auth => nil}
|
43
47
|
if req.content_type == 'application/json'
|
44
|
-
record[:json] =
|
48
|
+
record[:json] = Yajl.load(req.body)
|
45
49
|
else
|
46
50
|
record[:form] = Hash[*(req.body.split('&').map{|kv|kv.split('=')}.flatten)]
|
47
51
|
end
|
@@ -143,6 +147,10 @@ class HTTPOutputTest < HTTPOutputTestBase
|
|
143
147
|
http_method put
|
144
148
|
]
|
145
149
|
|
150
|
+
CONFIG_HTTP_ERROR = %[
|
151
|
+
endpoint_url https://127.0.0.1:#{TEST_LISTEN_PORT + 1}/api/
|
152
|
+
]
|
153
|
+
|
146
154
|
RATE_LIMIT_MSEC = 1200
|
147
155
|
|
148
156
|
CONFIG_RATE_LIMIT = %[
|
@@ -166,7 +174,7 @@ class HTTPOutputTest < HTTPOutputTestBase
|
|
166
174
|
|
167
175
|
def test_emit_form
|
168
176
|
d = create_driver
|
169
|
-
d.emit({ 'field1' => 50, 'field2' => 20, 'field3' => 10, 'otherfield' => 1 })
|
177
|
+
d.emit({ 'field1' => 50, 'field2' => 20, 'field3' => 10, 'otherfield' => 1, 'binary' => "\xe3\x81\x82".force_encoding("ascii-8bit") })
|
170
178
|
d.run
|
171
179
|
|
172
180
|
assert_equal 1, @posts.size
|
@@ -176,6 +184,7 @@ class HTTPOutputTest < HTTPOutputTestBase
|
|
176
184
|
assert_equal '20', record[:form]['field2']
|
177
185
|
assert_equal '10', record[:form]['field3']
|
178
186
|
assert_equal '1', record[:form]['otherfield']
|
187
|
+
assert_equal URI.escape("あ"), record[:form]['binary']
|
179
188
|
assert_nil record[:auth]
|
180
189
|
|
181
190
|
d.emit({ 'field1' => 50, 'field2' => 20, 'field3' => 10, 'otherfield' => 1 })
|
@@ -204,8 +213,9 @@ class HTTPOutputTest < HTTPOutputTestBase
|
|
204
213
|
end
|
205
214
|
|
206
215
|
def test_emit_json
|
216
|
+
binary_string = "\xe3\x81\x82".force_encoding("ascii-8bit")
|
207
217
|
d = create_driver CONFIG_JSON
|
208
|
-
d.emit({ 'field1' => 50, 'field2' => 20, 'field3' => 10, 'otherfield' => 1 })
|
218
|
+
d.emit({ 'field1' => 50, 'field2' => 20, 'field3' => 10, 'otherfield' => 1, 'binary' => binary_string })
|
209
219
|
d.run
|
210
220
|
|
211
221
|
assert_equal 1, @posts.size
|
@@ -215,9 +225,20 @@ class HTTPOutputTest < HTTPOutputTestBase
|
|
215
225
|
assert_equal 20, record[:json]['field2']
|
216
226
|
assert_equal 10, record[:json]['field3']
|
217
227
|
assert_equal 1, record[:json]['otherfield']
|
228
|
+
assert_equal binary_string, record[:json]['binary']
|
218
229
|
assert_nil record[:auth]
|
219
230
|
end
|
220
231
|
|
232
|
+
def test_http_error
|
233
|
+
d = create_driver CONFIG_HTTP_ERROR
|
234
|
+
d.emit({ 'field1' => 50 })
|
235
|
+
d.run
|
236
|
+
# drive asserts the next output chain is called;
|
237
|
+
# so no exception means our plugin handled the error
|
238
|
+
|
239
|
+
assert_equal 0, @requests
|
240
|
+
end
|
241
|
+
|
221
242
|
def test_rate_limiting
|
222
243
|
d = create_driver CONFIG_RATE_LIMIT
|
223
244
|
record = { :k => 1 }
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: fluent-plugin-out-http
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.1
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,12 +9,43 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-
|
13
|
-
default_executable:
|
12
|
+
date: 2013-12-01 00:00:00.000000000 Z
|
14
13
|
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: yajl-ruby
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ~>
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '1.0'
|
22
|
+
type: :runtime
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ~>
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '1.0'
|
30
|
+
- !ruby/object:Gem::Dependency
|
31
|
+
name: fluentd
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
33
|
+
none: false
|
34
|
+
requirements:
|
35
|
+
- - ~>
|
36
|
+
- !ruby/object:Gem::Version
|
37
|
+
version: 0.10.0
|
38
|
+
type: :runtime
|
39
|
+
prerelease: false
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ~>
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: 0.10.0
|
15
46
|
- !ruby/object:Gem::Dependency
|
16
47
|
name: bundler
|
17
|
-
requirement:
|
48
|
+
requirement: !ruby/object:Gem::Requirement
|
18
49
|
none: false
|
19
50
|
requirements:
|
20
51
|
- - ! '>='
|
@@ -22,21 +53,15 @@ dependencies:
|
|
22
53
|
version: '0'
|
23
54
|
type: :development
|
24
55
|
prerelease: false
|
25
|
-
version_requirements:
|
26
|
-
- !ruby/object:Gem::Dependency
|
27
|
-
name: json
|
28
|
-
requirement: &70205234747080 !ruby/object:Gem::Requirement
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
29
57
|
none: false
|
30
58
|
requirements:
|
31
59
|
- - ! '>='
|
32
60
|
- !ruby/object:Gem::Version
|
33
61
|
version: '0'
|
34
|
-
type: :development
|
35
|
-
prerelease: false
|
36
|
-
version_requirements: *70205234747080
|
37
62
|
- !ruby/object:Gem::Dependency
|
38
|
-
name:
|
39
|
-
requirement:
|
63
|
+
name: rake
|
64
|
+
requirement: !ruby/object:Gem::Requirement
|
40
65
|
none: false
|
41
66
|
requirements:
|
42
67
|
- - ! '>='
|
@@ -44,18 +69,12 @@ dependencies:
|
|
44
69
|
version: '0'
|
45
70
|
type: :development
|
46
71
|
prerelease: false
|
47
|
-
version_requirements:
|
48
|
-
- !ruby/object:Gem::Dependency
|
49
|
-
name: fluentd
|
50
|
-
requirement: &70205234746240 !ruby/object:Gem::Requirement
|
72
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
73
|
none: false
|
52
74
|
requirements:
|
53
75
|
- - ! '>='
|
54
76
|
- !ruby/object:Gem::Version
|
55
77
|
version: '0'
|
56
|
-
type: :runtime
|
57
|
-
prerelease: false
|
58
|
-
version_requirements: *70205234746240
|
59
78
|
description: A generic Fluentd output plugin to send logs to an HTTP endpoint
|
60
79
|
email:
|
61
80
|
- ento.entotto@gmail.com
|
@@ -64,6 +83,7 @@ extensions: []
|
|
64
83
|
extra_rdoc_files: []
|
65
84
|
files:
|
66
85
|
- .gitignore
|
86
|
+
- CHANGELOG.md
|
67
87
|
- Gemfile
|
68
88
|
- LICENSE.txt
|
69
89
|
- README.md
|
@@ -72,7 +92,6 @@ files:
|
|
72
92
|
- lib/fluent/plugin/out_http.rb
|
73
93
|
- lib/fluent/test/http_output_test.rb
|
74
94
|
- test/plugin/test_out_http.rb
|
75
|
-
has_rdoc: true
|
76
95
|
homepage: https://github.com/ento/fluent-plugin-out-http
|
77
96
|
licenses: []
|
78
97
|
post_install_message:
|
@@ -85,15 +104,21 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
85
104
|
- - ! '>='
|
86
105
|
- !ruby/object:Gem::Version
|
87
106
|
version: '0'
|
107
|
+
segments:
|
108
|
+
- 0
|
109
|
+
hash: 4460454963525016737
|
88
110
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
89
111
|
none: false
|
90
112
|
requirements:
|
91
113
|
- - ! '>='
|
92
114
|
- !ruby/object:Gem::Version
|
93
115
|
version: '0'
|
116
|
+
segments:
|
117
|
+
- 0
|
118
|
+
hash: 4460454963525016737
|
94
119
|
requirements: []
|
95
120
|
rubyforge_project:
|
96
|
-
rubygems_version: 1.
|
121
|
+
rubygems_version: 1.8.23
|
97
122
|
signing_key:
|
98
123
|
specification_version: 3
|
99
124
|
summary: A generic Fluentd output plugin to send logs to an HTTP endpoint
|