fluent-plugin-mqtt 0.0.3 → 0.0.4

Sign up to get free protection for your applications and to get access to all the features.
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