fluent-plugin-mqtt 0.0.3 → 0.0.4

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: d4e453c77b000aeef76dbe664b9fb67d63a6e532
4
- data.tar.gz: f22a3f8159fdfc1bc4571619406534292a082652
3
+ metadata.gz: 58d93e842a532198c75c7520cedb5417db36252a
4
+ data.tar.gz: b12b3618be94456a9307fc4d816e0e44b0255858
5
5
  SHA512:
6
- metadata.gz: d38f63aaabf190906296242b259ad742c9f43d659abda789dda94007d34271caa68852a2976626207c1285ca8d060a7682effe8251977bdb0ca301d958e9ec56
7
- data.tar.gz: 972613c5cd9484810ba8757577748781a9659404dba58459e572183a22986dc682e39482b45b85ed6266737b2bcfef1cb66ce726881765cbf4d54076cdbb3cf1
6
+ metadata.gz: e65f421d83d3b588430f378b5b87d18af278162ec42b21fb0d53a4ccbc8aa2d34b1f7f0c88f3acbaf0d3a8b2d62f983e54ae6e5a8ebd234fc96a44d2c388f4b5
7
+ data.tar.gz: f3e3113d8cadafe1d4347f0f8bc41d982a18fd1375df7aea0f7059beaf41e9d89f8baa571074f2511359c087b8dcbc5a8d1215ae91a631c9f8d9f8d0cedf7dc2
data/README.md CHANGED
@@ -27,6 +27,8 @@ MQTT topic is set "#".
27
27
  type mqtt
28
28
  bind 127.0.0.1
29
29
  port 1883
30
+ username username
31
+ password password
30
32
  </source>
31
33
 
32
34
  ```
@@ -4,7 +4,7 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
4
 
5
5
  Gem::Specification.new do |spec|
6
6
  spec.name = "fluent-plugin-mqtt"
7
- spec.version = "0.0.3"
7
+ spec.version = "0.0.4"
8
8
  spec.authors = ["Yuuna Kurita"]
9
9
  spec.email = ["yuuna.m@gmail.com"]
10
10
  spec.summary = %q{fluentd input plugin for mqtt server}
@@ -17,12 +17,10 @@ Gem::Specification.new do |spec|
17
17
  spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
18
18
  spec.require_paths = ["lib"]
19
19
 
20
- spec.add_development_dependency "bundler", "~> 1.5"
21
- spec.add_development_dependency "rake"
22
- spec.add_development_dependency "mqtt"
23
- spec.add_development_dependency "fluentd"
24
- spec.add_runtime_dependency "mqtt"
20
+ spec.add_runtime_dependency "mqtt", "~> 0.3.1"
25
21
  spec.add_runtime_dependency "fluentd"
26
22
  spec.add_runtime_dependency "yajl-ruby"
27
-
23
+ spec.add_runtime_dependency "test-unit"
24
+ spec.add_development_dependency "bundler", "~> 1.5"
25
+ spec.add_development_dependency "rake"
28
26
  end
@@ -11,6 +11,13 @@ module Fluent
11
11
  config_param :port, :integer, :default => 1883
12
12
  config_param :bind, :string, :default => '127.0.0.1'
13
13
  config_param :topic, :string, :default => '#'
14
+ config_param :format, :string, :default => 'none'
15
+ config_param :username, :string, :default => nil
16
+ config_param :password, :string, :default => nil
17
+ config_param :ssl, :bool, :default => nil
18
+ config_param :ca, :string, :default => nil
19
+ config_param :key, :string, :default => nil
20
+ config_param :cert, :string, :default => nil
14
21
 
15
22
  require 'mqtt'
16
23
 
@@ -19,23 +26,48 @@ module Fluent
19
26
  @bind ||= conf['bind']
20
27
  @topic ||= conf['topic']
21
28
  @port ||= conf['port']
29
+
30
+ configure_parser(conf)
31
+ end
32
+
33
+ def configure_parser(conf)
34
+ @parser = Plugin.new_parser(@format)
35
+ @parser.configure(conf)
36
+ end
37
+
38
+ # Return [time (if not available return now), message]
39
+ def parse(message)
40
+ return @parser.parse(message)[1], @parser.parse(message)[0] || Fluent::Engine.now
22
41
  end
23
42
 
24
43
  def start
25
44
  $log.debug "start mqtt #{@bind}"
26
- @connect = MQTT::Client.connect({remote_host: @bind, remote_port: @port})
45
+ opts = {host: @bind,
46
+ port: @port,
47
+ username: @username,
48
+ password: @password}
49
+ opts[:ssl] = @ssl if @ssl
50
+ opts[:ca_file] = @ca if @ca
51
+ opts[:crt_file] = @crt if @crt
52
+ opts[:key_file] = @key if @key
53
+ @connect = MQTT::Client.connect(opts)
27
54
  @connect.subscribe(@topic)
28
55
 
29
56
  @thread = Thread.new do
30
57
  @connect.get do |topic,message|
31
58
  topic.gsub!("/","\.")
32
59
  $log.debug "#{topic}: #{message}"
33
- emit topic, json_parse(message)
60
+ begin
61
+ parsed_message = self.parse(message)
62
+ rescue Exception => e
63
+ $log.error e
64
+ end
65
+ emit topic, parsed_message[0], parsed_message[1]
34
66
  end
35
67
  end
36
68
  end
37
69
 
38
- def emit topic, message , time = Fluent::Engine.now
70
+ def emit topic, message, time = Fluent::Engine.now
39
71
  if message.class == Array
40
72
  message.each do |data|
41
73
  $log.debug "#{topic}: #{data}"
@@ -46,15 +78,6 @@ module Fluent
46
78
  end
47
79
  end
48
80
 
49
- def json_parse message
50
- begin
51
- y = Yajl::Parser.new
52
- y.parse(message)
53
- rescue
54
- $log.error "JSON parse error", :error => $!.to_s, :error_class => $!.class.to_s
55
- $log.warn_backtrace $!.backtrace
56
- end
57
- end
58
81
  def shutdown
59
82
  @thread.kill
60
83
  @connect.disconnect
@@ -1,16 +1,16 @@
1
1
  require 'helper'
2
2
 
3
- class Fluent::MqttInput
4
- def emit topic, message , time = Fluent::Engine.now
5
- if message.class == Array
6
- message.each do |data|
7
- $log.debug "#{topic}: #{data}"
8
- Fluent::Engine.emit(topic, message["t"], data)
9
- end
10
- else
11
- Fluent::Engine.emit(topic, message["t"], message)
12
- end
13
- end
3
+ class Fluent::MqttInput
4
+ #def emit topic, message , time = Fluent::Engine.now
5
+ #if message.class == Array
6
+ #message.each do |data|
7
+ #$log.debug "#{topic}: #{data}"
8
+ #Fluent::Engine.emit(topic, message["t"], data)
9
+ #end
10
+ #else
11
+ #Fluent::Engine.emit(topic, message["t"], message)
12
+ #end
13
+ #end
14
14
 
15
15
  end
16
16
 
@@ -19,50 +19,221 @@ class MqttInputTest < Test::Unit::TestCase
19
19
  Fluent::Test.setup
20
20
  end
21
21
 
22
+ CONFIG = %[ bind 127.0.0.1
23
+ port 1883
24
+ format json ]
22
25
 
23
- CONFIG = %[
24
- ]
25
-
26
- def create_driver(conf = CONFIG)
26
+ def create_driver(conf = CONFIG)
27
27
  Fluent::Test::InputTestDriver.new(Fluent::MqttInput).configure(conf)
28
28
  end
29
-
30
- def test_configure
29
+
30
+ def test_configure_1
31
31
  d = create_driver(
32
32
  %[ bind 127.0.0.1
33
- port 1300 ]
33
+ port 1883
34
+ format none]
34
35
  )
35
36
  assert_equal '127.0.0.1', d.instance.bind
36
- assert_equal 1300, d.instance.port
37
+ assert_equal 1883, d.instance.port
38
+ assert_equal 'none', d.instance.format
39
+
40
+ d2 = create_driver(
41
+ %[ bind 127.0.0.1
42
+ port 1883
43
+ format csv
44
+ keys time,message
45
+ time_key time]
46
+ )
47
+ assert_equal 'csv', d2.instance.format
48
+ assert_equal 'time', d2.instance.time_key
37
49
  end
38
50
 
51
+ def test_configure_2
52
+ d = create_driver(
53
+ %[ bind 127.0.0.1
54
+ port 1883
55
+ format csv
56
+ keys time,message ]
57
+ )
58
+ assert_equal '127.0.0.1', d.instance.bind
59
+ assert_equal 1883, d.instance.port
60
+ assert_equal 'csv', d.instance.format
61
+ end
39
62
 
40
63
  def sub_client
41
- connect = MQTT::Client.connect
64
+ connect = MQTT::Client.connect("localhost")
42
65
  connect.subscribe('#')
43
66
  return connect
44
67
  end
45
68
 
69
+ def test_format_json_without_time_key
70
+ d = create_driver(
71
+ %[ bind 127.0.0.1
72
+ port 1883
73
+ format json ]
74
+ )
75
+ time = Time.parse("2011-01-02 13:14:15 UTC").to_i
76
+ data = [
77
+ {tag: "tag1", message: {"t" => time, "v" => {"a"=>1}}},
78
+ {tag: "tag2", message: {"t" => time, "v" => {"a"=>1}}},
79
+ {tag: "tag3", message: {"t" => time, "v" => {"a"=>32}}},
80
+ ]
81
+
82
+ d.run do
83
+ data.each do |record|
84
+ send_data record[:tag], record[:message], d.instance.format
85
+ sleep 0.1
86
+ end
87
+ end
88
+
89
+ emits = d.emits
90
+ assert_equal('tag1', emits[0][0])
91
+ assert_equal({"t" => time, "v" => {"a"=>1}}, emits[0][2])
92
+
93
+ assert_equal('tag2', emits[1][0])
94
+ assert_equal({"t" => time, "v" => {"a"=>1}}, emits[1][2])
95
+
96
+ assert_equal('tag3', emits[2][0])
97
+ assert_equal({"t" => time, "v" => {"a"=>32}}, emits[2][2])
98
+ end
99
+
100
+ def test_format_json_with_time_key
101
+ d = create_driver(
102
+ %[ bind 127.0.0.1
103
+ port 1883
104
+ format json
105
+ time_key t ]
106
+ )
107
+ time = Time.parse("2011-01-02 13:14:15 UTC").to_i
108
+ data = [
109
+ {tag: "tag1", message: {"t" => time, "v" => {"a"=>1}}},
110
+ {tag: "tag2", message: {"t" => time, "v" => {"a"=>1}}},
111
+ {tag: "tag3", message: {"t" => time, "v" => {"a"=>31}}},
112
+ {tag: "tag3", message: {"t" => time, "v" => {"a"=>32}}},
113
+ ]
114
+
115
+ d.run do
116
+ data.each do |record|
117
+ send_data record[:tag], record[:message], d.instance.format
118
+ end
119
+ end
120
+
121
+ emits = d.emits
122
+ assert_equal('tag1', emits[0][0])
123
+ assert_equal(time, emits[0][1])
124
+ assert_equal({"v" => {"a"=>1}}, emits[0][2])
125
+ end
126
+
127
+ def test_format_none
128
+ d = create_driver(
129
+ %[ bind 127.0.0.1
130
+ port 1883
131
+ format none]
132
+ )
46
133
 
47
- def test_client
48
- d = create_driver
49
- time = Time.parse("2011-01-02 13:14:15 UTC").to_i
50
- d.expect_emit "tag1", time, {"t" => time, "v" => {"a"=>1}}
51
- d.expect_emit "tag2", time, {"t" => time, "v" => {"a"=>2}}
52
- d.expect_emit "tag3", time, {"t" => time, "v" => {"a"=>31}}
53
- d.expect_emit "tag3", time, {"t" => time, "v" => {"a"=>32}}
134
+ data = [
135
+ {tag: "tag1", message: 'hello world'},
136
+ {tag: "tag2", message: 'another world'},
137
+ {tag: "tag3", message: ''},
138
+ ]
54
139
 
55
140
  d.run do
56
- d.expected_emits.each {|tag,time,record|
57
- send_data tag, time, record
58
- }
59
- send_data "tag3", time , [{"t" => time, "v" => {"a"=>31}} , {"t" => time, "v" => {"a"=>32}}]
60
- sleep 0.5
141
+ data.each do |record|
142
+ send_data record[:tag], record[:message], d.instance.format
143
+ end
61
144
  end
62
145
 
146
+ emits = d.emits
147
+ time = Fluent::Engine.now
148
+ assert_equal('tag1', emits[0][0])
149
+ assert_equal({'message' => 'hello world'}, emits[0][2])
150
+ assert_equal('tag2', emits[1][0])
151
+ assert_equal({'message' => 'another world'}, emits[1][2])
152
+ assert_equal('tag3', emits[2][0])
153
+ assert_equal({'message' => ''}, emits[2][2])
63
154
  end
64
155
 
65
- def send_data tag, time, record
66
- sub_client.publish(tag, record.to_json)
156
+ def test_format_csv
157
+ d = create_driver(
158
+ %[ bind 127.0.0.1
159
+ port 1883
160
+ format csv
161
+ keys time,message]
162
+ )
163
+
164
+ time = Time.parse("2011-01-02 13:14:15 UTC").to_i
165
+ data = [
166
+ {tag: "tag1", message: "#{time},hello world" },
167
+ {tag: "tag2", message: "#{time},hello to you to" },
168
+ {tag: "tag3", message: "#{time}," },
169
+ ]
170
+
171
+ d.run do
172
+ data.each do |record|
173
+ send_data record[:tag], record[:message], d.instance.format
174
+ end
175
+ end
176
+
177
+ emits = d.emits
178
+ #puts 'emits length', emits.length.to_s
179
+ assert_equal('tag1', emits[0][0])
180
+ assert_equal({'time' => time.to_s, 'message' => 'hello world'}, emits[0][2])
181
+
182
+ assert_equal('tag2', emits[1][0])
183
+ assert_equal({'time' => time.to_s, 'message' => 'hello to you to'}, emits[1][2])
184
+ assert_equal('tag3', emits[2][0])
185
+ assert_equal({'time' => time.to_s, 'message' => nil}, emits[2][2])
186
+ end
187
+
188
+ def test_format_csv_with_time_key
189
+ d = create_driver(
190
+ %[ bind 127.0.0.1
191
+ port 1883
192
+ format csv
193
+ keys time2,message
194
+ time_key time2
195
+ time_format %S]
196
+ )
197
+
198
+ time = Time.parse("2011-01-02 13:14:15 UTC").to_i
199
+ data = [
200
+ {tag: "tag1", message: "#{time},abc" },
201
+ {tag: "tag2", message: "#{time},def" },
202
+ {tag: "tag3", message: "#{time},ghi" },
203
+ {tag: "tag3", message: "#{time}," },
204
+ ]
205
+
206
+ d.run do
207
+ data.each do |record|
208
+ send_data record[:tag], record[:message], d.instance.format
209
+ end
210
+ end
211
+
212
+ emits = d.emits
213
+ assert_equal('tag1', emits[0][0])
214
+ assert_equal({'message' => 'abc'}, emits[0][2])
215
+
216
+ assert_equal('tag2', emits[1][0])
217
+ assert_equal({'message' => 'def'}, emits[1][2])
218
+
219
+ assert_equal('tag3', emits[2][0])
220
+ assert_equal({'message' => 'ghi'}, emits[2][2])
221
+
222
+ assert_equal('tag3', emits[3][0])
223
+ assert_equal({'message' => nil}, emits[3][2])
224
+ end
225
+
226
+ def send_data tag, record, format
227
+ case format
228
+ when 'none'
229
+ sub_client.publish(tag, record)
230
+ when 'json'
231
+ sub_client.publish(tag, record.to_json)
232
+ when 'csv'
233
+ sub_client.publish(tag, record)
234
+ else
235
+ sub_client.publish(tag, record)
236
+ end
237
+ sleep 0.2
67
238
  end
68
239
  end
metadata CHANGED
@@ -1,111 +1,97 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fluent-plugin-mqtt
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.3
4
+ version: 0.0.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Yuuna Kurita
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-04-17 00:00:00.000000000 Z
11
+ date: 2015-10-09 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- name: bundler
15
- requirement: !ruby/object:Gem::Requirement
16
- requirements:
17
- - - ~>
18
- - !ruby/object:Gem::Version
19
- version: '1.5'
20
- type: :development
21
- prerelease: false
22
- version_requirements: !ruby/object:Gem::Requirement
23
- requirements:
24
- - - ~>
25
- - !ruby/object:Gem::Version
26
- version: '1.5'
27
- - !ruby/object:Gem::Dependency
28
- name: rake
14
+ name: mqtt
29
15
  requirement: !ruby/object:Gem::Requirement
30
16
  requirements:
31
- - - '>='
17
+ - - "~>"
32
18
  - !ruby/object:Gem::Version
33
- version: '0'
34
- type: :development
19
+ version: 0.3.1
20
+ type: :runtime
35
21
  prerelease: false
36
22
  version_requirements: !ruby/object:Gem::Requirement
37
23
  requirements:
38
- - - '>='
24
+ - - "~>"
39
25
  - !ruby/object:Gem::Version
40
- version: '0'
26
+ version: 0.3.1
41
27
  - !ruby/object:Gem::Dependency
42
- name: mqtt
28
+ name: fluentd
43
29
  requirement: !ruby/object:Gem::Requirement
44
30
  requirements:
45
- - - '>='
31
+ - - ">="
46
32
  - !ruby/object:Gem::Version
47
33
  version: '0'
48
- type: :development
34
+ type: :runtime
49
35
  prerelease: false
50
36
  version_requirements: !ruby/object:Gem::Requirement
51
37
  requirements:
52
- - - '>='
38
+ - - ">="
53
39
  - !ruby/object:Gem::Version
54
40
  version: '0'
55
41
  - !ruby/object:Gem::Dependency
56
- name: fluentd
42
+ name: yajl-ruby
57
43
  requirement: !ruby/object:Gem::Requirement
58
44
  requirements:
59
- - - '>='
45
+ - - ">="
60
46
  - !ruby/object:Gem::Version
61
47
  version: '0'
62
- type: :development
48
+ type: :runtime
63
49
  prerelease: false
64
50
  version_requirements: !ruby/object:Gem::Requirement
65
51
  requirements:
66
- - - '>='
52
+ - - ">="
67
53
  - !ruby/object:Gem::Version
68
54
  version: '0'
69
55
  - !ruby/object:Gem::Dependency
70
- name: mqtt
56
+ name: test-unit
71
57
  requirement: !ruby/object:Gem::Requirement
72
58
  requirements:
73
- - - '>='
59
+ - - ">="
74
60
  - !ruby/object:Gem::Version
75
61
  version: '0'
76
62
  type: :runtime
77
63
  prerelease: false
78
64
  version_requirements: !ruby/object:Gem::Requirement
79
65
  requirements:
80
- - - '>='
66
+ - - ">="
81
67
  - !ruby/object:Gem::Version
82
68
  version: '0'
83
69
  - !ruby/object:Gem::Dependency
84
- name: fluentd
70
+ name: bundler
85
71
  requirement: !ruby/object:Gem::Requirement
86
72
  requirements:
87
- - - '>='
73
+ - - "~>"
88
74
  - !ruby/object:Gem::Version
89
- version: '0'
90
- type: :runtime
75
+ version: '1.5'
76
+ type: :development
91
77
  prerelease: false
92
78
  version_requirements: !ruby/object:Gem::Requirement
93
79
  requirements:
94
- - - '>='
80
+ - - "~>"
95
81
  - !ruby/object:Gem::Version
96
- version: '0'
82
+ version: '1.5'
97
83
  - !ruby/object:Gem::Dependency
98
- name: yajl-ruby
84
+ name: rake
99
85
  requirement: !ruby/object:Gem::Requirement
100
86
  requirements:
101
- - - '>='
87
+ - - ">="
102
88
  - !ruby/object:Gem::Version
103
89
  version: '0'
104
- type: :runtime
90
+ type: :development
105
91
  prerelease: false
106
92
  version_requirements: !ruby/object:Gem::Requirement
107
93
  requirements:
108
- - - '>='
94
+ - - ">="
109
95
  - !ruby/object:Gem::Version
110
96
  version: '0'
111
97
  description: fluentd input plugin for mqtt server
@@ -115,7 +101,7 @@ executables: []
115
101
  extensions: []
116
102
  extra_rdoc_files: []
117
103
  files:
118
- - .gitignore
104
+ - ".gitignore"
119
105
  - Gemfile
120
106
  - LICENSE.txt
121
107
  - README.md
@@ -134,17 +120,17 @@ require_paths:
134
120
  - lib
135
121
  required_ruby_version: !ruby/object:Gem::Requirement
136
122
  requirements:
137
- - - '>='
123
+ - - ">="
138
124
  - !ruby/object:Gem::Version
139
125
  version: '0'
140
126
  required_rubygems_version: !ruby/object:Gem::Requirement
141
127
  requirements:
142
- - - '>='
128
+ - - ">="
143
129
  - !ruby/object:Gem::Version
144
130
  version: '0'
145
131
  requirements: []
146
132
  rubyforge_project:
147
- rubygems_version: 2.0.6
133
+ rubygems_version: 2.2.2
148
134
  signing_key:
149
135
  specification_version: 4
150
136
  summary: fluentd input plugin for mqtt server