logstash-output-mqtt 1.1.0 → 1.2.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.
- checksums.yaml +4 -4
- data/Gemfile +7 -0
- data/lib/logstash/outputs/mqtt.rb +21 -23
- data/logstash-output-mqtt.gemspec +5 -4
- data/spec/outputs/mqtt_spec.rb +8 -23
- metadata +22 -17
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 69b541cd6a2abd62541b3500c13cafdd67c2ea83270fcdfbbcc923dee527a0d9
|
4
|
+
data.tar.gz: e1696a7ecffef182fac7aff34e57def48983ba8dc064ba7504ddb61ef2a5db31
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3f19c42ebcad7d7d0f80788ab2509396d2a4602b7f7cb344b195124a702acdd12c37ded9986d09d003c54fd69d9ee1fa7784282e674c3149f28441cb6ddf8dca
|
7
|
+
data.tar.gz: 4f7d48105f283f95705e0d127a79739a7f625928762404c11d3374e23e6b316fb85e316cf3cdb222d5be2b0df462be9c9761ada9c0453d8a4311f36856ce30db
|
data/Gemfile
CHANGED
@@ -1,3 +1,10 @@
|
|
1
1
|
source 'https://rubygems.org'
|
2
2
|
gemspec
|
3
3
|
|
4
|
+
logstash_path = ENV["LOGSTASH_PATH"] || "/usr/share/logstash"
|
5
|
+
use_logstash_source = ENV["LOGSTASH_SOURCE"] && ENV["LOGSTASH_SOURCE"].to_s == "1"
|
6
|
+
|
7
|
+
if Dir.exist?(logstash_path) && use_logstash_source
|
8
|
+
gem 'logstash-core', :path => "#{logstash_path}/logstash-core"
|
9
|
+
gem 'logstash-core-plugin-api', :path => "#{logstash_path}/logstash-core-plugin-api"
|
10
|
+
end
|
@@ -102,7 +102,11 @@ class LogStash::Outputs::MQTT < LogStash::Outputs::Base
|
|
102
102
|
# Time in seconds to wait before retrying a connection
|
103
103
|
config :connect_retry_interval, :validate => :number, :default => 10
|
104
104
|
|
105
|
-
|
105
|
+
# Time Keep alive connexion between ping to remote servers
|
106
|
+
config :keep_alive, :validate => :number, :default => 15
|
107
|
+
|
108
|
+
|
109
|
+
|
106
110
|
def register
|
107
111
|
@options = {
|
108
112
|
:host => @host
|
@@ -131,6 +135,9 @@ class LogStash::Outputs::MQTT < LogStash::Outputs::Base
|
|
131
135
|
if @ca_file
|
132
136
|
@options[:ca_file] = @ca_file
|
133
137
|
end
|
138
|
+
if @keep_alive
|
139
|
+
@options[:keep_alive] = @keep_alive
|
140
|
+
end
|
134
141
|
|
135
142
|
# Encode events using the given codec
|
136
143
|
# Use an array as a buffer so the multi_receive can handle multiple events with a single connection
|
@@ -138,50 +145,41 @@ class LogStash::Outputs::MQTT < LogStash::Outputs::Base
|
|
138
145
|
@codec.on_event do |event, encoded_event|
|
139
146
|
@event_buffer.push([event, encoded_event])
|
140
147
|
end
|
141
|
-
|
142
148
|
end # def register
|
143
149
|
|
144
|
-
public
|
145
150
|
def receive(event)
|
146
|
-
|
147
151
|
@codec.encode(event)
|
148
152
|
handle_events
|
149
153
|
end # def receive
|
150
154
|
|
151
|
-
public
|
152
155
|
def multi_receive(events)
|
153
|
-
events.each
|
154
|
-
@codec.encode(event)
|
155
|
-
end
|
156
|
-
|
156
|
+
events.each { |event| @codec.encode(event) }
|
157
157
|
# Handle all events at once to prevent taking a new connection for each event
|
158
158
|
handle_events
|
159
159
|
end
|
160
160
|
|
161
|
-
public
|
162
161
|
def close
|
163
|
-
|
164
162
|
@closing = true
|
165
163
|
end # def close
|
166
164
|
|
167
165
|
private
|
168
|
-
|
169
|
-
|
170
|
-
# This way it is easy to cope with network failures, ie. if connection fails just try it again
|
166
|
+
|
167
|
+
def mqtt_client
|
171
168
|
@logger.debug("Connecting MQTT with options #{@options}")
|
172
|
-
MQTT::Client.connect(@options)
|
173
|
-
|
174
|
-
@logger.debug("Publishing MQTT event #{event[1]} with topic #{@topic}, retain #{@retain}, qos #{@qos}")
|
175
|
-
client.publish(event[0].sprintf(@topic), event[1], @retain, @qos)
|
176
|
-
@event_buffer.shift
|
177
|
-
end
|
178
|
-
end
|
169
|
+
@mqtt_client ||= MQTT::Client.connect(@options)
|
170
|
+
end
|
179
171
|
|
172
|
+
def handle_events
|
173
|
+
# It is easy to cope with network failures, ie. if connection fails just try it again
|
174
|
+
while event = @event_buffer.first do
|
175
|
+
@logger.debug("Publishing MQTT event #{event[1]} with topic #{@topic}, retain #{@retain}, qos #{@qos}")
|
176
|
+
mqtt_client.publish(event[0].sprintf(@topic), event[1], @retain, @qos)
|
177
|
+
@event_buffer.shift
|
178
|
+
end
|
180
179
|
rescue StandardError => e
|
181
180
|
@logger.error("Error #{e.message} while publishing to MQTT server. Will retry in #{@connect_retry_interval} seconds.")
|
182
|
-
|
181
|
+
@mqtt_client = nil
|
183
182
|
Stud.stoppable_sleep(@connect_retry_interval, 1) { @closing }
|
184
183
|
retry
|
185
184
|
end # def handle_event
|
186
|
-
|
187
185
|
end # class LogStash::Outputs::MQTT
|
@@ -1,7 +1,7 @@
|
|
1
1
|
Gem::Specification.new do |s|
|
2
2
|
s.name = 'logstash-output-mqtt'
|
3
|
-
s.version = "1.1
|
4
|
-
s.licenses = ["Apache
|
3
|
+
s.version = "1.2.1"
|
4
|
+
s.licenses = ["Apache-2.0"]
|
5
5
|
s.summary = "This is Logstash output plugin for the http://mqtt.org/[MQTT] protocol"
|
6
6
|
s.description = "This gem is a logstash plugin required to be installed on top of the Logstash core pipeline using $LS_HOME/bin/plugin install gemname. This gem is not a stand-alone program"
|
7
7
|
s.authors = ["Tommi Palomäki"]
|
@@ -19,8 +19,9 @@ Gem::Specification.new do |s|
|
|
19
19
|
s.metadata = { "logstash_plugin" => "true", "logstash_group" => "output" }
|
20
20
|
|
21
21
|
# Gem dependencies
|
22
|
-
s.add_runtime_dependency "logstash-core-plugin-api", "
|
22
|
+
s.add_runtime_dependency "logstash-core-plugin-api", ">= 1.60", "<= 2.99"
|
23
23
|
s.add_runtime_dependency "logstash-codec-json"
|
24
24
|
s.add_runtime_dependency "mqtt"
|
25
|
-
|
25
|
+
|
26
|
+
s.add_development_dependency "logstash-devutils"
|
26
27
|
end
|
data/spec/outputs/mqtt_spec.rb
CHANGED
@@ -4,6 +4,7 @@ require "logstash/outputs/mqtt"
|
|
4
4
|
require "logstash/codecs/json"
|
5
5
|
require "logstash/event"
|
6
6
|
require "time"
|
7
|
+
require "json"
|
7
8
|
|
8
9
|
describe LogStash::Outputs::MQTT do
|
9
10
|
# Define a sample event and its JSON encoded form
|
@@ -11,48 +12,37 @@ describe LogStash::Outputs::MQTT do
|
|
11
12
|
tstamp = Time.parse(datestring)
|
12
13
|
tstamp_utc = tstamp.utc.iso8601(3)
|
13
14
|
let(:sample_event) { LogStash::Event.new("message" => "test message", "@timestamp" => datestring) }
|
14
|
-
encoded_event = "{\"
|
15
|
+
encoded_event = "{\"message\":\"test message\",\"@version\":\"1\",\"@timestamp\":\"" + tstamp_utc + "\"}"
|
15
16
|
|
16
17
|
settings = {
|
17
18
|
"host" => "test.mosquitto.org",
|
18
19
|
"topic" => "hello"
|
19
20
|
}
|
20
21
|
let(:output) { LogStash::Outputs::MQTT.new(settings) }
|
21
|
-
let(:stub_client) {
|
22
|
+
let(:stub_client) { instance_double(MQTT::Client) }
|
22
23
|
|
23
24
|
before do
|
24
25
|
output.register
|
25
26
|
end
|
26
27
|
|
27
28
|
describe "receive message" do
|
28
|
-
|
29
29
|
it "connects and publishes with correct arguments" do
|
30
|
-
|
31
30
|
expect(MQTT::Client).to receive(:connect).with(
|
32
31
|
:host => "test.mosquitto.org",
|
33
32
|
:port => 8883
|
34
|
-
)
|
35
|
-
block.call(stub_client)
|
36
|
-
end
|
37
|
-
|
33
|
+
).and_return(stub_client)
|
38
34
|
expect(stub_client).to receive(:publish).with("hello", encoded_event, false, 0)
|
39
|
-
|
40
35
|
output.receive(sample_event)
|
41
36
|
end
|
42
37
|
end
|
43
38
|
|
44
39
|
describe "multi_receive" do
|
45
40
|
it "connects once and publishes all messages" do
|
46
|
-
|
47
41
|
expect(MQTT::Client).to receive(:connect).once.with(
|
48
42
|
:host => "test.mosquitto.org",
|
49
43
|
:port => 8883
|
50
|
-
)
|
51
|
-
block.call(stub_client)
|
52
|
-
end
|
53
|
-
|
44
|
+
).and_return(stub_client)
|
54
45
|
expect(stub_client).to receive(:publish).exactly(3).times.with("hello", encoded_event, false, 0)
|
55
|
-
|
56
46
|
three_events = [sample_event, sample_event, sample_event]
|
57
47
|
output.multi_receive(three_events)
|
58
48
|
end
|
@@ -65,14 +55,14 @@ describe "Test subtopic:" do
|
|
65
55
|
tstamp = Time.parse(datestring)
|
66
56
|
tstamp_utc = tstamp.utc.iso8601(3)
|
67
57
|
let(:sample_event) { LogStash::Event.new("message" => "test message", "@timestamp" => datestring, "subtopic" => "mysubtopic") }
|
68
|
-
encoded_event = "{\"@timestamp\":\"" + tstamp_utc + "\",\"
|
58
|
+
encoded_event = "{\"@version\":\"1\",\"@timestamp\":\"" + tstamp_utc + "\",\"message\":\"test message\",\"subtopic\":\"mysubtopic\"}"
|
69
59
|
|
70
60
|
settings = {
|
71
61
|
"host" => "test.mosquitto.org",
|
72
62
|
"topic" => "hello/%{subtopic}"
|
73
63
|
}
|
74
64
|
let(:output) { LogStash::Outputs::MQTT.new(settings) }
|
75
|
-
let(:stub_client) {
|
65
|
+
let(:stub_client) { instance_double(MQTT::Client) }
|
76
66
|
|
77
67
|
before do
|
78
68
|
output.register
|
@@ -80,16 +70,11 @@ describe "Test subtopic:" do
|
|
80
70
|
|
81
71
|
describe "receive message on a subtopic based on a field of an event" do
|
82
72
|
it "connects and publishes" do
|
83
|
-
|
84
73
|
expect(MQTT::Client).to receive(:connect).with(
|
85
74
|
:host => "test.mosquitto.org",
|
86
75
|
:port => 8883
|
87
|
-
)
|
88
|
-
block.call(stub_client)
|
89
|
-
end
|
90
|
-
|
76
|
+
).and_return(stub_client)
|
91
77
|
expect(stub_client).to receive(:publish).with("hello/mysubtopic", encoded_event, false, 0)
|
92
|
-
|
93
78
|
output.receive(sample_event)
|
94
79
|
end
|
95
80
|
end
|
metadata
CHANGED
@@ -1,29 +1,35 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: logstash-output-mqtt
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.1
|
4
|
+
version: 1.2.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Tommi Palomäki
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2023-03-07 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
requirement: !ruby/object:Gem::Requirement
|
15
15
|
requirements:
|
16
|
-
- - "
|
16
|
+
- - ">="
|
17
|
+
- !ruby/object:Gem::Version
|
18
|
+
version: '1.60'
|
19
|
+
- - "<="
|
17
20
|
- !ruby/object:Gem::Version
|
18
|
-
version: '2.
|
21
|
+
version: '2.99'
|
19
22
|
name: logstash-core-plugin-api
|
20
|
-
prerelease: false
|
21
23
|
type: :runtime
|
24
|
+
prerelease: false
|
22
25
|
version_requirements: !ruby/object:Gem::Requirement
|
23
26
|
requirements:
|
24
|
-
- - "
|
27
|
+
- - ">="
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '1.60'
|
30
|
+
- - "<="
|
25
31
|
- !ruby/object:Gem::Version
|
26
|
-
version: '2.
|
32
|
+
version: '2.99'
|
27
33
|
- !ruby/object:Gem::Dependency
|
28
34
|
requirement: !ruby/object:Gem::Requirement
|
29
35
|
requirements:
|
@@ -31,8 +37,8 @@ dependencies:
|
|
31
37
|
- !ruby/object:Gem::Version
|
32
38
|
version: '0'
|
33
39
|
name: logstash-codec-json
|
34
|
-
prerelease: false
|
35
40
|
type: :runtime
|
41
|
+
prerelease: false
|
36
42
|
version_requirements: !ruby/object:Gem::Requirement
|
37
43
|
requirements:
|
38
44
|
- - ">="
|
@@ -45,8 +51,8 @@ dependencies:
|
|
45
51
|
- !ruby/object:Gem::Version
|
46
52
|
version: '0'
|
47
53
|
name: mqtt
|
48
|
-
prerelease: false
|
49
54
|
type: :runtime
|
55
|
+
prerelease: false
|
50
56
|
version_requirements: !ruby/object:Gem::Requirement
|
51
57
|
requirements:
|
52
58
|
- - ">="
|
@@ -55,17 +61,17 @@ dependencies:
|
|
55
61
|
- !ruby/object:Gem::Dependency
|
56
62
|
requirement: !ruby/object:Gem::Requirement
|
57
63
|
requirements:
|
58
|
-
- - "
|
64
|
+
- - ">="
|
59
65
|
- !ruby/object:Gem::Version
|
60
|
-
version:
|
66
|
+
version: '0'
|
61
67
|
name: logstash-devutils
|
62
|
-
prerelease: false
|
63
68
|
type: :development
|
69
|
+
prerelease: false
|
64
70
|
version_requirements: !ruby/object:Gem::Requirement
|
65
71
|
requirements:
|
66
|
-
- - "
|
72
|
+
- - ">="
|
67
73
|
- !ruby/object:Gem::Version
|
68
|
-
version:
|
74
|
+
version: '0'
|
69
75
|
description: This gem is a logstash plugin required to be installed on top of the
|
70
76
|
Logstash core pipeline using $LS_HOME/bin/plugin install gemname. This gem is not
|
71
77
|
a stand-alone program
|
@@ -85,7 +91,7 @@ files:
|
|
85
91
|
- spec/outputs/mqtt_spec.rb
|
86
92
|
homepage: https://github.com/kompa3/logstash-output-mqtt
|
87
93
|
licenses:
|
88
|
-
- Apache
|
94
|
+
- Apache-2.0
|
89
95
|
metadata:
|
90
96
|
logstash_plugin: 'true'
|
91
97
|
logstash_group: output
|
@@ -104,8 +110,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
104
110
|
- !ruby/object:Gem::Version
|
105
111
|
version: '0'
|
106
112
|
requirements: []
|
107
|
-
|
108
|
-
rubygems_version: 2.6.13
|
113
|
+
rubygems_version: 3.2.33
|
109
114
|
signing_key:
|
110
115
|
specification_version: 4
|
111
116
|
summary: This is Logstash output plugin for the http://mqtt.org/[MQTT] protocol
|