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.
@@ -0,0 +1,8 @@
1
+ # Changelog
2
+
3
+ ## 0.1.1
4
+ * #2 Use yajl instead of json as json serializer
5
+ * #1 Fix a bug where a nil HTTP response caused the plugin to stop working
6
+
7
+ ## 0.1.0
8
+ * Initial release
@@ -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.0"
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 "json"
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 = JSON.dump(data)
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
- $log.warn "failed to #{req.method} #{uri} (#{res.code} #{res.message} #{res.body})"
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
- require 'json'
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] = JSON.parse(req.body)
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.0
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-02-14 00:00:00.000000000 +09:00
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: &70205234747520 !ruby/object:Gem::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: *70205234747520
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: fluentd
39
- requirement: &70205234746660 !ruby/object:Gem::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: *70205234746660
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.6.2
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