fluent-plugin-out-http 0.1.0 → 0.1.1
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.
- 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
|