logstash-input-zeromq 2.0.4 → 3.0.0

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: bd37dfb55ab097ade7a77551197510e8a1155f9c
4
- data.tar.gz: b53a58b848c7695f29b376222ff681eb43f13981
3
+ metadata.gz: 150429261e93e326c4af010caefb4ca3811d6624
4
+ data.tar.gz: 5af0979b436ffbfd933f38a2e78391355ed8f367
5
5
  SHA512:
6
- metadata.gz: a054a6a1db8c599d2139d00701605ab91364cb552066a41f97f43a37656dd7a193b55bc56e8e265e56f3b55061f3d61a2ba9c38f885ef7797eaa08b02cbfd55f
7
- data.tar.gz: ccf5d4c940a2220eb308600d711b77e8f65be0f2b4e85559564684db9afeea178ce65f9e6fa67647a0acc3f862fad1709767e0ea7081790c3f55f84b4e169715
6
+ metadata.gz: 6707e2ddb978dcca1deb114129f1970769a5fedb1a1532ac0dfb6b5c049a1a59afe5b5c28f3d0dd519efd85e200373863140ae8b7733bc36c852a5e68abda03b
7
+ data.tar.gz: c2b48f30b7652ed4e54fe529097d43dbcab0b64a26ae65abddfbefcf54a75a661709fd22899b4b5c6ca73d67b6685b9ad121d83069d6ff7f6d62ebd35afec763
@@ -1,9 +1,17 @@
1
+ ## 3.0.0
2
+ - Update the plugin to the version 2.0 of the plugin api, this change is required for Logstash 5.0 compatibility. See https://github.com/elastic/logstash/issues/5141
3
+ # 2.1.0
4
+ - Depend on logstash-mixin-zeromq, remove lib/logstash/util/zeromq
5
+ - Adapt test usage to be friendly with the way we run LS core default plugins test
6
+ - Fix plugin consumes 100% cpu
7
+ - Properly set topic field in pubsub topology
8
+ - Support multiple message frames
1
9
  # 2.0.4
2
10
  - Depend on logstash-core-plugin-api instead of logstash-core, removing the need to mass update plugins on major releases of logstash
3
11
  # 2.0.3
4
12
  - New dependency requirements for logstash-core for the 5.0 release
5
13
  ## 2.0.0
6
- - Plugins were updated to follow the new shutdown semantic, this mainly allows Logstash to instruct input plugins to terminate gracefully,
14
+ - Plugins were updated to follow the new shutdown semantic, this mainly allows Logstash to instruct input plugins to terminate gracefully,
7
15
  instead of using Thread.raise on the plugins' threads. Ref: https://github.com/elastic/logstash/pull/3895
8
16
  - Dependency on logstash-core update to 2.0
9
17
 
@@ -8,6 +8,7 @@ Contributors:
8
8
  * Pier-Hugues Pellerin (ph)
9
9
  * Richard Pijnenburg (electrical)
10
10
  * Suyog Rao (suyograo)
11
+ * Avishai Ish-Shalom (avishai-ish-shalom)
11
12
 
12
13
  Note: If you've sent us patches, bug reports, or otherwise contributed to
13
14
  Logstash, and you aren't on the list above and want to be, please let us know
data/Gemfile CHANGED
@@ -1,2 +1,4 @@
1
1
  source 'https://rubygems.org'
2
- gemspec
2
+
3
+ # Specify your gem's dependencies in logstash-mass_effect.gemspec
4
+ gemspec
data/LICENSE CHANGED
@@ -1,4 +1,4 @@
1
- Copyright (c) 2012–2015 Elasticsearch <http://www.elastic.co>
1
+ Copyright (c) 2012–2016 Elasticsearch <http://www.elastic.co>
2
2
 
3
3
  Licensed under the Apache License, Version 2.0 (the "License");
4
4
  you may not use this file except in compliance with the License.
data/README.md CHANGED
@@ -1,7 +1,6 @@
1
1
  # Logstash Plugin
2
2
 
3
- [![Build
4
- Status](http://build-eu-00.elastic.co/view/LS%20Plugins/view/LS%20Inputs/job/logstash-plugin-input-zeromq-unit/badge/icon)](http://build-eu-00.elastic.co/view/LS%20Plugins/view/LS%20Inputs/job/logstash-plugin-input-zeromq-unit/)
3
+ [![Travis Build Status](https://travis-ci.org/logstash-plugins/logstash-input-zeromq.svg)](https://travis-ci.org/logstash-plugins/logstash-input-zeromq)
5
4
 
6
5
  This is a plugin for [Logstash](https://github.com/elastic/logstash).
7
6
 
@@ -56,7 +55,12 @@ gem "logstash-filter-awesome", :path => "/your/local/logstash-filter-awesome"
56
55
  ```
57
56
  - Install plugin
58
57
  ```sh
58
+ # Logstash 2.3 and higher
59
+ bin/logstash-plugin install --no-verify
60
+
61
+ # Prior to Logstash 2.3
59
62
  bin/plugin install --no-verify
63
+
60
64
  ```
61
65
  - Run Logstash with your plugin
62
66
  ```sh
@@ -74,7 +78,12 @@ gem build logstash-filter-awesome.gemspec
74
78
  ```
75
79
  - Install the plugin from the Logstash home
76
80
  ```sh
77
- bin/plugin install /your/local/plugin/logstash-filter-awesome.gem
81
+ # Logstash 2.3 and higher
82
+ bin/logstash-plugin install --no-verify
83
+
84
+ # Prior to Logstash 2.3
85
+ bin/plugin install --no-verify
86
+
78
87
  ```
79
88
  - Start Logstash and proceed to test the plugin
80
89
 
@@ -8,7 +8,7 @@ require "socket"
8
8
  # You need to have the 0mq 2.1.x library installed to be able to use
9
9
  # this input plugin.
10
10
  #
11
- # The default settings will create a subscriber binding to `tcp://127.0.0.1:2120`
11
+ # The default settings will create a subscriber binding to `tcp://127.0.0.1:2120`
12
12
  # waiting for connecting publishers.
13
13
  #
14
14
  class LogStash::Inputs::ZeroMQ < LogStash::Inputs::Base
@@ -46,13 +46,19 @@ class LogStash::Inputs::ZeroMQ < LogStash::Inputs::Base
46
46
  # You can specify multiple topics here
47
47
  config :topic, :validate => :array
48
48
 
49
+ # Event topic field
50
+ # This is used for the `pubsub` topology only
51
+ # When a message is received on a topic, the topic name on which
52
+ # the message was received will saved in this field.
53
+ config :topic_field, :validate => :string, :default => "topic"
54
+
49
55
  # mode
50
56
  # server mode binds/listens
51
57
  # client mode connects
52
58
  config :mode, :validate => ["server", "client"], :default => "server"
53
59
 
54
60
  # sender
55
- # overrides the sender to
61
+ # overrides the sender to
56
62
  # set the source of the event
57
63
  # default is `zmq+topology://type/`
58
64
  config :sender, :validate => :string
@@ -68,18 +74,30 @@ class LogStash::Inputs::ZeroMQ < LogStash::Inputs::Base
68
74
  # * `ZMQ::IDENTITY` - named queues
69
75
  # * `ZMQ::SWAP_SIZE` - space for disk overflow
70
76
  #
71
- # example: `sockopt => ["ZMQ::HWM", 50, "ZMQ::IDENTITY", "my_named_queue"]`
72
- config :sockopt, :validate => :hash
77
+ # Example:
78
+ # [source,ruby]
79
+ # sockopt => {
80
+ # "ZMQ::HWM" => 50
81
+ # "ZMQ::IDENTITY" => "my_named_queue"
82
+ # }
83
+ #
84
+ # defaults to: `sockopt => { "ZMQ::RCVTIMEO" => "1000" }`, which has the effect of "interrupting"
85
+ # the recv operation at least once every second to allow for properly shutdown handling.
86
+ config :sockopt, :validate => :hash, :default => { "ZMQ::RCVTIMEO" => "1000" }
73
87
 
74
88
  public
75
89
  def register
76
90
  require "ffi-rzmq"
77
- require "logstash/util/zeromq"
78
- self.class.send(:include, LogStash::Util::ZeroMQ)
91
+ require "logstash/plugin_mixins/zeromq"
92
+ self.class.send(:include, LogStash::PluginMixins::ZeroMQ)
93
+ @host = Socket.gethostname
94
+ init_socket
95
+ end # def register
79
96
 
97
+ def init_socket
80
98
  case @topology
81
99
  when "pair"
82
- zmq_const = ZMQ::PAIR
100
+ zmq_const = ZMQ::PAIR
83
101
  when "pushpull"
84
102
  zmq_const = ZMQ::PULL
85
103
  when "pubsub"
@@ -110,8 +128,7 @@ class LogStash::Inputs::ZeroMQ < LogStash::Inputs::Base
110
128
  end
111
129
  end
112
130
  end
113
-
114
- end # def register
131
+ end
115
132
 
116
133
  def close
117
134
  begin
@@ -127,36 +144,12 @@ class LogStash::Inputs::ZeroMQ < LogStash::Inputs::Base
127
144
  end # def server?
128
145
 
129
146
  def run(output_queue)
130
- host = Socket.gethostname
131
147
  begin
132
148
  while !stop?
133
- # Here's the unified receiver
134
- # Get the first part as the msg
135
- m1 = ""
136
- rc = @zsocket.recv_string(m1, ZMQ::DONTWAIT)
137
- next if rc == -1 && ZMQ::Util.errno == ZMQ::EAGAIN
138
- error_check(rc, "in recv_string")
139
-
140
- @logger.debug("ZMQ receiving", :event => m1)
141
- msg = m1
142
- # If we have more parts, we'll eat the first as the topic
143
- # and set the message to the second part
144
- if @zsocket.more_parts?
145
- @logger.debug("Multipart message detected. Setting @message to second part. First part was: #{m1}")
146
- m2 = ''
147
- rc2 = @zsocket.recv_string(m2)
148
- error_check(rc2, "in recv_string")
149
- @logger.debug("ZMQ receiving", :event => m2)
150
- msg = m2
151
- end
152
- @codec.decode(msg) do |event|
153
- event["host"] ||= host
154
- decorate(event)
155
- output_queue << event
156
- end
149
+ handle_message(output_queue)
157
150
  end
158
151
  rescue => e
159
- @logger.debug("ZMQ Error", :subscriber => @zsocket,
152
+ @logger.debug? && @logger.debug("ZMQ Error", :subscriber => @zsocket,
160
153
  :exception => e)
161
154
  retry
162
155
  end # begin
@@ -167,4 +160,27 @@ class LogStash::Inputs::ZeroMQ < LogStash::Inputs::Base
167
160
  id = @address.first.clone
168
161
  end
169
162
 
163
+ def handle_message(output_queue)
164
+ # Here's the unified receiver
165
+ more = true
166
+ parts = []
167
+ rc = @zsocket.recv_strings(parts)
168
+ error_check(rc, "in recv_strings", true)
169
+ return unless ZMQ::Util.resultcode_ok?(rc)
170
+
171
+ if @topology == "pubsub" && parts.length > 1
172
+ # assume topic is a simple string
173
+ topic, *parts = parts
174
+ else
175
+ topic = nil
176
+ end
177
+ parts.each do |msg|
178
+ @codec.decode(msg) do |event|
179
+ event.set("host", event.get("host") || @host)
180
+ event.set(@topic_field, topic.force_encoding('UTF-8')) unless topic.nil?
181
+ decorate(event)
182
+ output_queue << event
183
+ end
184
+ end
185
+ end
170
186
  end # class LogStash::Inputs::ZeroMQ
@@ -1,10 +1,10 @@
1
1
  Gem::Specification.new do |s|
2
2
 
3
3
  s.name = 'logstash-input-zeromq'
4
- s.version = '2.0.4'
4
+ s.version = '3.0.0'
5
5
  s.licenses = ['Apache License (2.0)']
6
6
  s.summary = "$summary"
7
- 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
+ s.description = "This gem is a Logstash plugin required to be installed on top of the Logstash core pipeline using $LS_HOME/bin/logstash-plugin install gemname. This gem is not a stand-alone program"
8
8
  s.authors = ["Elastic"]
9
9
  s.email = 'info@elastic.co'
10
10
  s.homepage = "http://www.elastic.co/guide/en/logstash/current/index.html"
@@ -20,9 +20,9 @@ Gem::Specification.new do |s|
20
20
  s.metadata = { "logstash_plugin" => "true", "logstash_group" => "input" }
21
21
 
22
22
  # Gem dependencies
23
- s.add_runtime_dependency "logstash-core-plugin-api", "~> 1.0"
23
+ s.add_runtime_dependency "logstash-core-plugin-api", "~> 2.0"
24
+ s.add_runtime_dependency "logstash-mixin-zeromq", ">= 2.0.1"
24
25
 
25
26
  s.add_runtime_dependency 'logstash-codec-json'
26
- s.add_runtime_dependency 'ffi-rzmq', '~> 2.0.4'
27
27
  s.add_development_dependency 'logstash-devutils'
28
28
  end
@@ -2,6 +2,23 @@
2
2
  require_relative "../spec_helper"
3
3
  require "logstash/plugin"
4
4
  require "logstash/event"
5
+ require "securerandom"
6
+
7
+ def send_mock_messages(messages, &block)
8
+ socket = double("socket")
9
+ expect(socket).to receive(:recv_strings) do |arr|
10
+ messages.each do |msg|
11
+ msg.each do |frame|
12
+ arr << frame
13
+ end
14
+ end
15
+ 0
16
+ end
17
+ plugin.instance_variable_set(:@zsocket, socket)
18
+ q = []
19
+ plugin.send(:handle_message, q)
20
+ q
21
+ end
5
22
 
6
23
  describe LogStash::Inputs::ZeroMQ, :zeromq => true do
7
24
 
@@ -24,4 +41,39 @@ describe LogStash::Inputs::ZeroMQ, :zeromq => true do
24
41
  end
25
42
 
26
43
  end
44
+
45
+ context "pubsub" do
46
+ topic_field = SecureRandom.hex
47
+ let(:plugin) { LogStash::Plugin.lookup("input", "zeromq").new({"topology" => "pubsub", "topic_field" => topic_field}) }
48
+
49
+ before do
50
+ allow(plugin).to receive(:init_socket)
51
+ plugin.register
52
+ end
53
+
54
+ it "should set the topic field with multiple message frames" do
55
+ events = send_mock_messages([["topic", '{"message": "message"}', '{"message": "message2"}']])
56
+ expect(events.first.get(topic_field)).to eq("topic")
57
+ expect(events.first.get("message")).to eq("message")
58
+ expect(events[1].get("message")).to eq("message2")
59
+ expect(events[1].get(topic_field)).to eq("topic")
60
+ expect(events.length).to eq(2)
61
+ end
62
+ end
63
+
64
+ context "pushpull" do
65
+ let(:plugin) { LogStash::Plugin.lookup("input", "zeromq").new({ "topology" => "pushpull" }) }
66
+
67
+ before do
68
+ allow(plugin).to receive(:init_socket)
69
+ plugin.register
70
+ end
71
+
72
+ it "should receive multiple frames" do
73
+ events = send_mock_messages([['{"message": "message"}', '{"message": "message2"}']])
74
+ expect(events.first.get("message")).to eq("message")
75
+ expect(events[1].get("message")).to eq("message2")
76
+ expect(events.length).to eq(2)
77
+ end
78
+ end
27
79
  end
@@ -2,9 +2,12 @@
2
2
  require_relative "../spec_helper"
3
3
  require "logstash/plugin"
4
4
  require "logstash/event"
5
+ require "json"
5
6
 
6
7
  describe LogStash::Inputs::ZeroMQ, :integration => true do
7
8
 
9
+ let(:helpers) { ZeroMQHelpers.new }
10
+
8
11
  describe "receive events" do
9
12
 
10
13
  let(:nevents) { 10 }
@@ -16,10 +19,11 @@ describe LogStash::Inputs::ZeroMQ, :integration => true do
16
19
  end
17
20
 
18
21
  let(:events) do
19
- input(conf, nevents) do
22
+ helpers.input(conf, nevents) do
20
23
  client = ZeroMQClient.new("127.0.0.1", port)
21
24
  nevents.times do |value|
22
- client.send("data #{value}")
25
+ client.send("TOPIC", ZMQ::SNDMORE)
26
+ client.send({"message" => "data #{value}"}.to_json)
23
27
  end
24
28
  client.close
25
29
  end
@@ -27,6 +31,7 @@ describe LogStash::Inputs::ZeroMQ, :integration => true do
27
31
 
28
32
  it "should receive the events" do
29
33
  expect(events.count).to be(nevents)
34
+ expect(events.map(&:to_hash)).to all(include("topic" => "TOPIC"))
30
35
  end
31
36
  end
32
37
  end
@@ -3,13 +3,7 @@ require "logstash/devutils/rspec/spec_helper"
3
3
  require "logstash/inputs/zeromq"
4
4
  require_relative "support/client"
5
5
 
6
- module ZeroMQHelpers
7
-
8
- def setup_clients(number_of_clients, port)
9
- number_of_clients.times.inject([]) do |clients|
10
- clients << ZeroMQClient.new(localhost, port)
11
- end
12
- end
6
+ class ZeroMQHelpers
13
7
 
14
8
  def input(config, size, &block)
15
9
  plugin = LogStash::Plugin.lookup("input", "zeromq").new(config)
@@ -31,7 +25,6 @@ module ZeroMQHelpers
31
25
  end
32
26
 
33
27
  RSpec.configure do |config|
34
- config.include ZeroMQHelpers
35
- config.filter_run_excluding({ :zeromq => true, :integration => true })
28
+ # config.filter_run_excluding({ :zeromq => true, :integration => true })
36
29
  config.order = :random
37
30
  end
@@ -13,8 +13,8 @@ class ZeroMQClient
13
13
  @requester.connect("tcp://#{addr}:#{port}")
14
14
  end
15
15
 
16
- def send(data)
17
- @requester.send_string(data)
16
+ def send(data, flags=0)
17
+ @requester.send_string(data, flags)
18
18
  end
19
19
 
20
20
  def close
metadata CHANGED
@@ -1,72 +1,74 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: logstash-input-zeromq
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.4
4
+ version: 3.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Elastic
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-03-24 00:00:00.000000000 Z
11
+ date: 2016-05-06 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
+ name: logstash-core-plugin-api
14
15
  requirement: !ruby/object:Gem::Requirement
15
16
  requirements:
16
17
  - - "~>"
17
18
  - !ruby/object:Gem::Version
18
- version: '1.0'
19
- name: logstash-core-plugin-api
20
- prerelease: false
19
+ version: '2.0'
21
20
  type: :runtime
21
+ prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: '1.0'
26
+ version: '2.0'
27
27
  - !ruby/object:Gem::Dependency
28
+ name: logstash-mixin-zeromq
28
29
  requirement: !ruby/object:Gem::Requirement
29
30
  requirements:
30
31
  - - ">="
31
32
  - !ruby/object:Gem::Version
32
- version: '0'
33
- name: logstash-codec-json
34
- prerelease: false
33
+ version: 2.0.1
35
34
  type: :runtime
35
+ prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - ">="
39
39
  - !ruby/object:Gem::Version
40
- version: '0'
40
+ version: 2.0.1
41
41
  - !ruby/object:Gem::Dependency
42
+ name: logstash-codec-json
42
43
  requirement: !ruby/object:Gem::Requirement
43
44
  requirements:
44
- - - "~>"
45
+ - - ">="
45
46
  - !ruby/object:Gem::Version
46
- version: 2.0.4
47
- name: ffi-rzmq
48
- prerelease: false
47
+ version: '0'
49
48
  type: :runtime
49
+ prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
- - - "~>"
52
+ - - ">="
53
53
  - !ruby/object:Gem::Version
54
- version: 2.0.4
54
+ version: '0'
55
55
  - !ruby/object:Gem::Dependency
56
+ name: logstash-devutils
56
57
  requirement: !ruby/object:Gem::Requirement
57
58
  requirements:
58
59
  - - ">="
59
60
  - !ruby/object:Gem::Version
60
61
  version: '0'
61
- name: logstash-devutils
62
- prerelease: false
63
62
  type: :development
63
+ prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
66
  - - ">="
67
67
  - !ruby/object:Gem::Version
68
68
  version: '0'
69
- 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
69
+ description: This gem is a Logstash plugin required to be installed on top of the
70
+ Logstash core pipeline using $LS_HOME/bin/logstash-plugin install gemname. This
71
+ gem is not a stand-alone program
70
72
  email: info@elastic.co
71
73
  executables: []
72
74
  extensions: []
@@ -79,7 +81,6 @@ files:
79
81
  - NOTICE.TXT
80
82
  - README.md
81
83
  - lib/logstash/inputs/zeromq.rb
82
- - lib/logstash/util/zeromq.rb
83
84
  - logstash-input-zeromq.gemspec
84
85
  - spec/inputs/zeromq_spec.rb
85
86
  - spec/integration/zeromq_spec.rb
@@ -91,7 +92,7 @@ licenses:
91
92
  metadata:
92
93
  logstash_plugin: 'true'
93
94
  logstash_group: input
94
- post_install_message:
95
+ post_install_message:
95
96
  rdoc_options: []
96
97
  require_paths:
97
98
  - lib
@@ -106,9 +107,9 @@ required_rubygems_version: !ruby/object:Gem::Requirement
106
107
  - !ruby/object:Gem::Version
107
108
  version: '0'
108
109
  requirements: []
109
- rubyforge_project:
110
- rubygems_version: 2.4.8
111
- signing_key:
110
+ rubyforge_project:
111
+ rubygems_version: 2.5.1
112
+ signing_key:
112
113
  specification_version: 4
113
114
  summary: "$summary"
114
115
  test_files:
@@ -1,46 +0,0 @@
1
- # encoding: utf-8
2
- require 'ffi-rzmq'
3
- require "logstash/namespace"
4
-
5
- module LogStash::Util::ZeroMQ
6
- # LOGSTASH-400
7
- # see https://github.com/chuckremes/ffi-rzmq/blob/master/lib/ffi-rzmq/socket.rb#L93-117
8
- STRING_OPTS = %w{IDENTITY SUBSCRIBE UNSUBSCRIBE}
9
-
10
- def context
11
- @context ||= ZMQ::Context.new
12
- end
13
-
14
- def setup(socket, address)
15
- if server?
16
- error_check(socket.bind(address), "binding to #{address}")
17
- else
18
- error_check(socket.connect(address), "connecting to #{address}")
19
- end
20
- @logger.info("0mq: #{server? ? 'connected' : 'bound'}", :address => address)
21
- end
22
-
23
- def error_check(rc, doing)
24
- unless ZMQ::Util.resultcode_ok?(rc)
25
- @logger.error("ZeroMQ error while #{doing}", { :error_code => rc })
26
- raise "ZeroMQ Error while #{doing}"
27
- end
28
- end # def error_check
29
-
30
- def setopts(socket, options)
31
- options.each do |opt,value|
32
- sockopt = opt.split('::')[1]
33
- option = ZMQ.const_defined?(sockopt) ? ZMQ.const_get(sockopt) : ZMQ.const_missing(sockopt)
34
- unless STRING_OPTS.include?(sockopt)
35
- begin
36
- Float(value)
37
- value = value.to_i
38
- rescue ArgumentError
39
- raise "#{sockopt} requires a numeric value. #{value} is not numeric"
40
- end
41
- end # end unless
42
- error_check(socket.setsockopt(option, value),
43
- "while setting #{opt} == #{value}")
44
- end # end each
45
- end # end setopts
46
- end # module LogStash::Util::ZeroMQ