logstash-input-udp 3.3.3 → 3.3.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
  SHA256:
3
- metadata.gz: 5e1175824b16831674875cc4ede62188e3e6d38bff5aed42b169453be00c3cdf
4
- data.tar.gz: fc54de7e53214b4f68db927f8e6bf5e81e6cb530a7fa104cb439ceb8920b03bf
3
+ metadata.gz: fa380c5310565f3b74449cda1e9105f3becb648783328a93aeb824d6eec25f91
4
+ data.tar.gz: 0d08f2b0646f20f2c34392a3e4d68110712d8d8a49c4ed3b454c9156dcd22d52
5
5
  SHA512:
6
- metadata.gz: bee71becfe577ce656daecce595d2b97dafc208a3b93d3dda7718f8f647adbb806e08caadd4ea81e0819158d1914c7efbe3f4745296c80c2dd6d71861faf4b21
7
- data.tar.gz: e6cd007d1d904bff2a511101112d40b27f896294f820fc0bdba5213895f5ee5f7219d20cc2dbcaae07c9374ba6ae617237dcddabae3e4ad9833353d4990d5a38
6
+ metadata.gz: 5179c29aee0fcb092d9e22691863f1320c823e0e0353647569e82e132758de545dedbe6055fbebf0a22fd8e950903c30be8e223fb894cf96822e0191def2ee1e
7
+ data.tar.gz: 3efdd9cd5de25320f949454959601f8144605c6fc773c611e3a05d84b091e21097107ac68e4b574a3ed670a3197abe7b3ad39f9fd16beba1bfa56e522e3911b6
@@ -1,3 +1,6 @@
1
+ ## 3.3.4
2
+ - Fixed input workers exception handling and shutdown handling [#44](https://github.com/logstash-plugins/logstash-input-udp/pull/44)
3
+
1
4
  ## 3.3.3
2
5
  - Work around jruby/jruby#5148 by cloning messages on jruby 9k, therefore resizing the underlying byte buffer
3
6
 
@@ -40,6 +40,7 @@ This plugin supports the following configuration options plus the <<plugins-{typ
40
40
  | <<plugins-{type}s-{plugin}-queue_size>> |<<number,number>>|No
41
41
  | <<plugins-{type}s-{plugin}-receive_buffer_bytes>> |<<number,number>>|No
42
42
  | <<plugins-{type}s-{plugin}-workers>> |<<number,number>>|No
43
+ | <<plugins-{type}s-{plugin}-source_ip_fieldname>> |<<string,string>>|No
43
44
  |=======================================================================
44
45
 
45
46
  Also see <<plugins-{type}s-{plugin}-common-options>> for a list of options supported by all
@@ -101,9 +102,15 @@ Consult your operating system documentation if you need to increase this max all
101
102
 
102
103
  Number of threads processing packets
103
104
 
105
+ [id="plugins-{type}s-{plugin}-source_ip_fieldname"]
106
+ ===== `source_ip_fieldname`
104
107
 
108
+ * Value type is <<string,string>>
109
+ * Default value is `"host"`
110
+
111
+ The name of the field where the source IP address will be stored.
105
112
 
106
113
  [id="plugins-{type}s-{plugin}-common-options"]
107
114
  include::{include_path}/{type}.asciidoc[]
108
115
 
109
- :default_codec!:
116
+ :default_codec!:
@@ -38,7 +38,8 @@ class LogStash::Inputs::Udp < LogStash::Inputs::Base
38
38
  # before packets will start dropping.
39
39
  config :queue_size, :validate => :number, :default => 2000
40
40
 
41
- HOST_FIELD = "host".freeze
41
+ # The name of the field where the source IP address will be stored
42
+ config :source_ip_fieldname, :validate => :string, :default => 'host'
42
43
 
43
44
  def initialize(params)
44
45
  super
@@ -53,14 +54,27 @@ class LogStash::Inputs::Udp < LogStash::Inputs::Base
53
54
  def run(output_queue)
54
55
  @output_queue = output_queue
55
56
 
57
+ @input_to_worker = SizedQueue.new(@queue_size)
58
+ metric.gauge(:queue_size, @queue_size)
59
+ metric.gauge(:workers, @workers)
60
+
61
+ @input_workers = (1..@workers).to_a.map do |i|
62
+ @logger.debug("Starting UDP worker thread", :worker => i)
63
+ Thread.new(i, @codec.clone) { |i, codec| inputworker(i, codec) }
64
+ end
65
+
56
66
  begin
57
67
  # udp server
58
68
  udp_listener(output_queue)
59
69
  rescue => e
60
- @logger.warn("UDP listener died", :exception => e, :backtrace => e.backtrace)
70
+ @logger.error("UDP listener died", :exception => e, :backtrace => e.backtrace)
61
71
  @metric_errors.increment(:listener)
62
72
  Stud.stoppable_sleep(5) { stop? }
63
73
  retry unless stop?
74
+ ensure
75
+ # signal workers to end
76
+ @input_workers.size.times { @input_to_worker.push([:END, nil]) }
77
+ @input_workers.each { |thread| thread.join }
64
78
  end
65
79
  end
66
80
 
@@ -102,14 +116,6 @@ class LogStash::Inputs::Udp < LogStash::Inputs::Base
102
116
  @udp.bind(@host, @port)
103
117
  @logger.info("UDP listener started", :address => "#{@host}:#{@port}", :receive_buffer_bytes => "#{rcvbuf}", :queue_size => "#{@queue_size}")
104
118
 
105
- @input_to_worker = SizedQueue.new(@queue_size)
106
- metric.gauge(:queue_size, @queue_size)
107
- metric.gauge(:workers, @workers)
108
-
109
- @input_workers = @workers.times do |i|
110
- @logger.debug("Starting UDP worker thread", :worker => i)
111
- Thread.new(i, @codec.clone) { |i, codec| inputworker(i, codec) }
112
- end
113
119
 
114
120
  while !stop?
115
121
  next if IO.select([@udp], [], [], 0.5).nil?
@@ -134,17 +140,20 @@ class LogStash::Inputs::Udp < LogStash::Inputs::Base
134
140
  def inputworker(number, codec)
135
141
  LogStash::Util::set_thread_name("<udp.#{number}")
136
142
 
137
- begin
138
- while true
143
+ while true
144
+ # a worker should never terminate from an exception, only when it receives the :END symbol
145
+ begin
139
146
  payload, client = @input_to_worker.pop
140
- host = client[3]
147
+ break if payload == :END
141
148
 
142
- codec.decode(payload) { |event| push_decoded_event(host, event) }
143
- codec.flush { |event| push_decoded_event(host, event) }
149
+ ip_address = client[3]
150
+
151
+ codec.decode(payload) { |event| push_decoded_event(ip_address, event) }
152
+ codec.flush { |event| push_decoded_event(ip_address, event) }
153
+ rescue => e
154
+ @logger.error("Exception in inputworker", "exception" => e, "backtrace" => e.backtrace)
155
+ @metric_errors.increment(:worker)
144
156
  end
145
- rescue => e
146
- @logger.error("Exception in inputworker", "exception" => e, "backtrace" => e.backtrace)
147
- @metric_errors.increment(:worker)
148
157
  end
149
158
  end
150
159
 
@@ -163,9 +172,9 @@ class LogStash::Inputs::Udp < LogStash::Inputs::Base
163
172
  end
164
173
  end
165
174
 
166
- def push_decoded_event(host, event)
175
+ def push_decoded_event(ip_address, event)
167
176
  decorate(event)
168
- event.set(HOST_FIELD, host) if event.get(HOST_FIELD).nil?
177
+ event.set(source_ip_fieldname, ip_address) if event.get(source_ip_fieldname).nil?
169
178
  @output_queue.push(event)
170
179
  metric.increment(:events)
171
180
  end
@@ -1,7 +1,7 @@
1
1
  Gem::Specification.new do |s|
2
2
 
3
3
  s.name = 'logstash-input-udp'
4
- s.version = '3.3.3'
4
+ s.version = '3.3.4'
5
5
  s.licenses = ['Apache License (2.0)']
6
6
  s.summary = "Reads events over UDP"
7
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"
@@ -1,9 +1,19 @@
1
1
  # encoding: utf-8
2
2
  require_relative "../spec_helper"
3
3
  require_relative "../support/client"
4
+ require "logstash/codecs/base"
4
5
 
5
- describe LogStash::Inputs::Udp do
6
6
 
7
+ class LogStash::Codecs::Crash < LogStash::Codecs::Base
8
+ config_name "crash"
9
+
10
+ def decode(data)
11
+ raise("decode crash") if data == "crash"
12
+ yield LogStash::Event.new({"message" => data })
13
+ end
14
+ end
15
+
16
+ describe LogStash::Inputs::Udp do
7
17
  before do
8
18
  srand(RSpec.configuration.seed)
9
19
  end
@@ -87,4 +97,30 @@ describe LogStash::Inputs::Udp do
87
97
  it_behaves_like "an interruptible input plugin" do
88
98
  # see https://github.com/elastic/logstash-devutils/blob/9c4a1fbf2b0c4547e428c5a40ed84f60aad17f97/lib/logstash/devutils/rspec/shared_examples.rb
89
99
  end
100
+
101
+ describe "worker should ignore codec exception" do
102
+ # see custom "crash" codec above which raises upon decoding the "crash" straing payload
103
+ let(:config) { { "port" => port, "workers" => 1, "codec" => "crash" } }
104
+
105
+ let(:events) do
106
+ helper.input(subject, 3) do
107
+ client.send("crash")
108
+ client.send("foo")
109
+ client.send("bar")
110
+ client.send("crash")
111
+ client.send("baz")
112
+ end
113
+ end
114
+
115
+ before(:each) do
116
+ subject.register
117
+ end
118
+
119
+ it "should receive events been generated" do
120
+ expect(events.size).to be(3)
121
+ expect(events[0].get("message")).to match("foo")
122
+ expect(events[1].get("message")).to match("bar")
123
+ expect(events[2].get("message")).to match("baz")
124
+ end
125
+ end
90
126
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: logstash-input-udp
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.3.3
4
+ version: 3.3.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Elastic
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-05-09 00:00:00.000000000 Z
11
+ date: 2018-08-24 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  requirement: !ruby/object:Gem::Requirement