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.
@@ -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