fluent-plugin-mqtt 0.0.7 → 0.0.8

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: 9ebd832e07164e15a36a3617c61c78ac14cc1c10
4
- data.tar.gz: 9ac4921e763bc8484beb993182513ff0e16937a5
3
+ metadata.gz: 19e8964bfff6ad942926e4e1607b91a099f8a1f9
4
+ data.tar.gz: dcf3560aca07e73b59eb1ff319620977dc63ac6b
5
5
  SHA512:
6
- metadata.gz: bc796bd26c90e7ff7f1dbb93cd59b95083ff3ca8b26c6a97e1404efcee4ad936d976be1c41358708ace9ac2e889b9983725c8e54ad04f7f397f8c6f0de516b3c
7
- data.tar.gz: 036f05679c777eab6d332c205b4fc804f17774c9276d63d56d3cedf79843eff4d7d27e7b7143e682a9c005eb568b6774244f0abbbbdfd7e4dfaf900e3b219161
6
+ metadata.gz: a86199765c2bdcd8309c2e79c0ea4a073a443acef5a55574ee8fc951d8974c45116f0fdaf5ae94d6c72c6477bb565746be676de52f6ca8ec44f9836cd382b378
7
+ data.tar.gz: b3d1b82362c57f3860338946b44f5af6419a133173caee3fc8b0fbf6f2978aa8f5b1a8189bc8f912797911d9bc5b1bdf9588a400a9dd50169fae9496b0ac3f4f
@@ -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.7"
7
+ spec.version = "0.0.8"
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}
@@ -1,23 +1,23 @@
1
- module Fluent
1
+ require 'mqtt'
2
+ require 'fluent/plugin/input'
3
+ require 'fluent/plugin/parser'
4
+
5
+ module Fluent::Plugin
2
6
  class MqttInput < Input
3
- Plugin.register_input('mqtt', self)
7
+ Fluent::Plugin.register_input('mqtt', self)
8
+
9
+ helpers :thread, :inject, :compat_parameters, :parser
10
+
11
+ DEFAULT_PARSER_TYPE = 'none'
4
12
 
5
- include Fluent::SetTagKeyMixin
6
13
  config_set_default :include_tag_key, false
7
-
8
- include Fluent::SetTimeKeyMixin
9
14
  config_set_default :include_time_key, true
10
15
 
11
- # Define `router` method of v0.12 to support v0.10 or earlier
12
- unless method_defined?(:router)
13
- define_method("router") { Fluent::Engine }
14
- end
15
-
16
-
17
16
  config_param :port, :integer, :default => 1883
18
17
  config_param :bind, :string, :default => '127.0.0.1'
19
18
  config_param :topic, :string, :default => '#'
20
- config_param :format, :string, :default => 'none'
19
+ config_param :format, :string, :default => DEFAULT_PARSER_TYPE
20
+ config_param :client_id, :string, :default => nil
21
21
  config_param :username, :string, :default => nil
22
22
  config_param :password, :string, :default => nil
23
23
  config_param :ssl, :bool, :default => nil
@@ -25,31 +25,33 @@ module Fluent
25
25
  config_param :key, :string, :default => nil
26
26
  config_param :cert, :string, :default => nil
27
27
 
28
- require 'mqtt'
28
+ config_section :parse do
29
+ config_set_default :@type, DEFAULT_PARSER_TYPE
30
+ end
29
31
 
30
32
  def configure(conf)
33
+ compat_parameters_convert(conf, :inject, :parser)
31
34
  super
32
- @bind ||= conf['bind']
33
- @topic ||= conf['topic']
34
- @port ||= conf['port']
35
-
36
35
  configure_parser(conf)
37
36
  end
38
37
 
39
38
  def configure_parser(conf)
40
- @parser = Plugin.new_parser(@format)
41
- @parser.configure(conf)
39
+ @parser = parser_create(usage: 'in_mqtt_parser', type: @format, conf: conf)
42
40
  end
43
41
 
44
42
  # Return [time (if not available return now), message]
45
43
  def parse(message)
46
- return @parser.parse(message)[1], @parser.parse(message)[0] || Fluent::Engine.now
44
+ @parser.parse(message) {|time, record|
45
+ return (time || Fluent::Engine.now), record
46
+ }
47
47
  end
48
48
 
49
49
  def start
50
- $log.debug "start mqtt #{@bind}"
50
+ super
51
+ log.debug "start mqtt #{@bind}"
51
52
  opts = {host: @bind,
52
53
  port: @port}
54
+ opts[:client_id] = @client_id if @client_id
53
55
  opts[:username] = @username if @username
54
56
  opts[:password] = @password if @password
55
57
  opts[:ssl] = @ssl if @ssl
@@ -59,25 +61,26 @@ module Fluent
59
61
  @connect = MQTT::Client.connect(opts)
60
62
  @connect.subscribe(@topic)
61
63
 
62
- @thread = Thread.new do
64
+ thread_create(:in_mqtt_worker) do
63
65
  @connect.get do |topic,message|
64
66
  topic.gsub!("/","\.")
65
- $log.debug "#{topic}: #{message}"
67
+ log.debug "#{topic}: #{message}"
66
68
  begin
67
- parsed_message = self.parse(message)
69
+ time, record = self.parse(message)
70
+ record = inject_values_to_record(topic, time, record)
68
71
  rescue Exception => e
69
- $log.error e
72
+ log.error e
70
73
  end
71
- emit topic, parsed_message[0], parsed_message[1]
74
+ emit topic, record, time
72
75
  end
73
76
  end
74
77
  end
75
78
 
76
-
79
+
77
80
  def emit topic, message, time = Fluent::Engine.now
78
81
  if message.class == Array
79
82
  message.each do |data|
80
- $log.debug "#{topic}: #{data}"
83
+ log.debug "#{topic}: #{data}"
81
84
  router.emit(topic , time , data)
82
85
  end
83
86
  else
@@ -86,9 +89,8 @@ module Fluent
86
89
  end
87
90
 
88
91
  def shutdown
89
- @thread.kill
90
92
  @connect.disconnect
93
+ super
91
94
  end
92
95
  end
93
96
  end
94
-
@@ -13,12 +13,14 @@ module Fluent
13
13
  config_param :bind, :string, :default => '127.0.0.1'
14
14
  config_param :topic, :string, :default => 'td-agent'
15
15
  config_param :format, :string, :default => 'none'
16
+ config_param :client_id, :string, :default => nil
16
17
  config_param :username, :string, :default => nil
17
18
  config_param :password, :string, :default => nil
18
19
  config_param :ssl, :bool, :default => nil
19
20
  config_param :ca, :string, :default => nil
20
21
  config_param :key, :string, :default => nil
21
22
  config_param :cert, :string, :default => nil
23
+ config_param :retain, :string, :default => true
22
24
 
23
25
  require 'mqtt'
24
26
 
@@ -38,8 +40,10 @@ module Fluent
38
40
  def configure(conf)
39
41
  super
40
42
  @bind ||= conf['bind']
41
- @topic ||= conf['topic']
42
- @port ||= conf['port']
43
+ @topic ||= conf['topic']
44
+ @port ||= conf['port']
45
+ @formatter = Plugin.new_formatter(@format)
46
+ @formatter.configure(conf)
43
47
  end
44
48
 
45
49
  def start
@@ -49,6 +53,7 @@ module Fluent
49
53
  $log.debug "start mqtt #{@bind}"
50
54
  opts = {host: @bind,
51
55
  port: @port}
56
+ opts[:client_id] = @client_id if @client_id
52
57
  opts[:username] = @username if @username
53
58
  opts[:password] = @password if @password
54
59
  opts[:ssl] = @ssl if @ssl
@@ -69,9 +74,9 @@ module Fluent
69
74
  end
70
75
 
71
76
  def write(chunk)
72
- $log.debug "write"
73
77
  chunk.msgpack_each { |tag, time, record|
74
- @connect.publish(tag, record , retain=true)
78
+ log.debug "write #{@topic} #{@formatter.format(tag,time,record)}"
79
+ @connect.publish(@topic, @formatter.format(tag,time,record), retain=@retain)
75
80
  }
76
81
  end
77
82
 
data/test/helper.rb CHANGED
@@ -12,6 +12,7 @@ require 'test/unit'
12
12
  $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
13
13
  $LOAD_PATH.unshift(File.dirname(__FILE__))
14
14
  require 'fluent/test'
15
+ require 'fluent/test/helpers'
15
16
  unless ENV.has_key?('VERBOSE')
16
17
  nulllogger = Object.new
17
18
  nulllogger.instance_eval {|obj|
@@ -1,6 +1,7 @@
1
1
  require 'helper'
2
+ require 'fluent/test/driver/input'
2
3
 
3
- class Fluent::MqttInput
4
+ class Fluent::Plugin::MqttInput
4
5
  #def emit topic, message , time = Fluent::Engine.now
5
6
  #if message.class == Array
6
7
  #message.each do |data|
@@ -14,6 +15,8 @@ class Fluent::MqttInput
14
15
 
15
16
  end
16
17
 
18
+ include Fluent::Test::Helpers
19
+
17
20
  class MqttInputTest < Test::Unit::TestCase
18
21
  def setup
19
22
  Fluent::Test.setup
@@ -24,7 +27,7 @@ class MqttInputTest < Test::Unit::TestCase
24
27
  format json ]
25
28
 
26
29
  def create_driver(conf = CONFIG)
27
- Fluent::Test::InputTestDriver.new(Fluent::MqttInput).configure(conf)
30
+ Fluent::Test::Driver::Input.new(Fluent::Plugin::MqttInput).configure(conf)
28
31
  end
29
32
 
30
33
  def test_configure_1
@@ -45,7 +48,7 @@ class MqttInputTest < Test::Unit::TestCase
45
48
  time_key time]
46
49
  )
47
50
  assert_equal 'csv', d2.instance.format
48
- assert_equal 'time', d2.instance.time_key
51
+ assert_equal 'time', d2.instance.inject_config.time_key
49
52
  end
50
53
 
51
54
  def test_configure_2
@@ -72,21 +75,20 @@ class MqttInputTest < Test::Unit::TestCase
72
75
  port 1883
73
76
  format json ]
74
77
  )
75
- time = Time.parse("2011-01-02 13:14:15 UTC").to_i
78
+ time = event_time("2011-01-02 13:14:15 UTC")
76
79
  data = [
77
80
  {tag: "tag1", message: {"t" => time, "v" => {"a"=>1}}},
78
81
  {tag: "tag2", message: {"t" => time, "v" => {"a"=>1}}},
79
82
  {tag: "tag3", message: {"t" => time, "v" => {"a"=>32}}},
80
83
  ]
81
84
 
82
- d.run do
85
+ d.run(expect_emits: 3, timeout: 5) do
83
86
  data.each do |record|
84
87
  send_data record[:tag], record[:message], d.instance.format
85
- sleep 0.1
86
88
  end
87
89
  end
88
90
 
89
- emits = d.emits
91
+ emits = d.events
90
92
  assert_equal('tag1', emits[0][0])
91
93
  assert_equal({"t" => time, "v" => {"a"=>1}}, emits[0][2])
92
94
 
@@ -104,7 +106,7 @@ class MqttInputTest < Test::Unit::TestCase
104
106
  format json
105
107
  time_key t ]
106
108
  )
107
- time = Time.parse("2011-01-02 13:14:15 UTC").to_i
109
+ time = event_time("2011-01-02 13:14:15 UTC")
108
110
  data = [
109
111
  {tag: "tag1", message: {"t" => time, "v" => {"a"=>1}}},
110
112
  {tag: "tag2", message: {"t" => time, "v" => {"a"=>1}}},
@@ -112,16 +114,16 @@ class MqttInputTest < Test::Unit::TestCase
112
114
  {tag: "tag3", message: {"t" => time, "v" => {"a"=>32}}},
113
115
  ]
114
116
 
115
- d.run do
117
+ d.run(expect_emits: 4, timeout: 5) do
116
118
  data.each do |record|
117
119
  send_data record[:tag], record[:message], d.instance.format
118
120
  end
119
121
  end
120
122
 
121
- emits = d.emits
123
+ emits = d.events
122
124
  assert_equal('tag1', emits[0][0])
123
125
  assert_equal(time, emits[0][1])
124
- assert_equal({"v" => {"a"=>1}}, emits[0][2])
126
+ assert_equal({"v" => {"a"=>1}, "t" => time}, emits[0][2])
125
127
  end
126
128
 
127
129
  def test_format_none
@@ -137,13 +139,13 @@ class MqttInputTest < Test::Unit::TestCase
137
139
  {tag: "tag3", message: ''},
138
140
  ]
139
141
 
140
- d.run do
142
+ d.run(expect_emits: 3, timeout: 5) do
141
143
  data.each do |record|
142
144
  send_data record[:tag], record[:message], d.instance.format
143
145
  end
144
146
  end
145
147
 
146
- emits = d.emits
148
+ emits = d.events
147
149
  time = Fluent::Engine.now
148
150
  assert_equal('tag1', emits[0][0])
149
151
  assert_equal({'message' => 'hello world'}, emits[0][2])
@@ -161,20 +163,20 @@ class MqttInputTest < Test::Unit::TestCase
161
163
  keys time,message]
162
164
  )
163
165
 
164
- time = Time.parse("2011-01-02 13:14:15 UTC").to_i
166
+ time = event_time("2011-01-02 13:14:15 UTC")
165
167
  data = [
166
168
  {tag: "tag1", message: "#{time},hello world" },
167
169
  {tag: "tag2", message: "#{time},hello to you to" },
168
170
  {tag: "tag3", message: "#{time}," },
169
171
  ]
170
172
 
171
- d.run do
173
+ d.run(expect_emits: 3, timeout: 5) do
172
174
  data.each do |record|
173
175
  send_data record[:tag], record[:message], d.instance.format
174
176
  end
175
177
  end
176
178
 
177
- emits = d.emits
179
+ emits = d.events
178
180
  #puts 'emits length', emits.length.to_s
179
181
  assert_equal('tag1', emits[0][0])
180
182
  assert_equal({'time' => time.to_s, 'message' => 'hello world'}, emits[0][2])
@@ -192,10 +194,10 @@ class MqttInputTest < Test::Unit::TestCase
192
194
  format csv
193
195
  keys time2,message
194
196
  time_key time2
195
- time_format %S]
197
+ time_format %s]
196
198
  )
197
199
 
198
- time = Time.parse("2011-01-02 13:14:15 UTC").to_i
200
+ time = event_time("2011-01-02 13:14:15 UTC").to_i # to obtain unixtime stamp
199
201
  data = [
200
202
  {tag: "tag1", message: "#{time},abc" },
201
203
  {tag: "tag2", message: "#{time},def" },
@@ -203,24 +205,24 @@ class MqttInputTest < Test::Unit::TestCase
203
205
  {tag: "tag3", message: "#{time}," },
204
206
  ]
205
207
 
206
- d.run do
208
+ d.run(expect_emits: 4, timeout: 5) do
207
209
  data.each do |record|
208
210
  send_data record[:tag], record[:message], d.instance.format
209
211
  end
210
212
  end
211
213
 
212
- emits = d.emits
214
+ emits = d.events
213
215
  assert_equal('tag1', emits[0][0])
214
- assert_equal({'message' => 'abc'}, emits[0][2])
216
+ assert_equal({'message' => 'abc', "time2" => time}, emits[0][2])
215
217
 
216
218
  assert_equal('tag2', emits[1][0])
217
- assert_equal({'message' => 'def'}, emits[1][2])
219
+ assert_equal({'message' => 'def', "time2" => time}, emits[1][2])
218
220
 
219
221
  assert_equal('tag3', emits[2][0])
220
- assert_equal({'message' => 'ghi'}, emits[2][2])
222
+ assert_equal({'message' => 'ghi', "time2" => time}, emits[2][2])
221
223
 
222
224
  assert_equal('tag3', emits[3][0])
223
- assert_equal({'message' => nil}, emits[3][2])
225
+ assert_equal({'message' => nil, "time2"=> time}, emits[3][2])
224
226
  end
225
227
 
226
228
  def send_data tag, record, format
@@ -234,6 +236,5 @@ class MqttInputTest < Test::Unit::TestCase
234
236
  else
235
237
  sub_client.publish(tag, record)
236
238
  end
237
- sleep 0.2
238
239
  end
239
240
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fluent-plugin-mqtt
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.7
4
+ version: 0.0.8
5
5
  platform: ruby
6
6
  authors:
7
7
  - Yuuna Kurita
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-04-29 00:00:00.000000000 Z
11
+ date: 2017-04-18 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: mqtt
@@ -131,11 +131,10 @@ required_rubygems_version: !ruby/object:Gem::Requirement
131
131
  version: '0'
132
132
  requirements: []
133
133
  rubyforge_project:
134
- rubygems_version: 2.4.5.1
134
+ rubygems_version: 2.5.1
135
135
  signing_key:
136
136
  specification_version: 4
137
137
  summary: fluentd input plugin for mqtt server
138
138
  test_files:
139
139
  - test/helper.rb
140
140
  - test/plugin/test_in_mqtt.rb
141
- has_rdoc: