logstash-input-unix 3.1.0 → 3.1.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +7 -0
- data/lib/logstash/inputs/unix.rb +42 -19
- data/logstash-input-unix.gemspec +1 -1
- data/spec/inputs/unix_spec.rb +23 -2
- data/spec/spec_helper.rb +1 -2
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: dce11755b6f6a09ad708f79ee8d9e85fb87e0d98bf2aaedb6d47a316e1de6731
|
4
|
+
data.tar.gz: 84c73daebb51aa1813b528e42113e1a26f73a5162ced25a8c9043648daf54f14
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a259754acac7b218a5f62f6341f981266833a26395f3fd4341fcec6ed1af843d891561937cd7a16a2478863d2bd7a5d61b85dfe62a00b4ee3f340b35f3ce02d6
|
7
|
+
data.tar.gz: f85ae87765a0c9ddde40a91d8b4438d4e62d6ec68b1abb187d6c59fa3e643f4ce624656f97a13fd84fde86e85c63021e46f8eafddef1ba05ea8a9557a312b2ca
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,10 @@
|
|
1
|
+
## 3.1.2
|
2
|
+
- Fix: eliminate high CPU usage when data timeout is disabled and no data is available on the socket [#30](https://github.com/logstash-plugins/logstash-input-unix/pull/30)
|
3
|
+
|
4
|
+
## 3.1.1
|
5
|
+
- Fix: unable to stop plugin (on LS 6.x) [#29](https://github.com/logstash-plugins/logstash-input-unix/pull/29)
|
6
|
+
- Refactor: plugin internals got reviewed for `data_timeout => ...` to work reliably
|
7
|
+
|
1
8
|
## 3.1.0
|
2
9
|
- Feat: adjust fields for ECS compatibility [#28](https://github.com/logstash-plugins/logstash-input-unix/pull/28)
|
3
10
|
|
data/lib/logstash/inputs/unix.rb
CHANGED
@@ -15,8 +15,6 @@ class LogStash::Inputs::Unix < LogStash::Inputs::Base
|
|
15
15
|
|
16
16
|
include LogStash::PluginMixins::ECSCompatibilitySupport(:disabled, :v1, :v8 => :v1)
|
17
17
|
|
18
|
-
class Interrupted < StandardError; end
|
19
|
-
|
20
18
|
config_name "unix"
|
21
19
|
|
22
20
|
default :codec, "line"
|
@@ -54,7 +52,6 @@ class LogStash::Inputs::Unix < LogStash::Inputs::Base
|
|
54
52
|
public
|
55
53
|
def register
|
56
54
|
require "socket"
|
57
|
-
require "timeout"
|
58
55
|
|
59
56
|
if server?
|
60
57
|
@logger.info("Starting unix input listener", :address => @path, :force_unlink => @force_unlink)
|
@@ -87,26 +84,24 @@ class LogStash::Inputs::Unix < LogStash::Inputs::Base
|
|
87
84
|
begin
|
88
85
|
hostname = Socket.gethostname
|
89
86
|
while !stop?
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
end
|
87
|
+
data = io_interruptable_readpartial(socket, 16384, @data_timeout)
|
88
|
+
|
89
|
+
if data == :data_timeout
|
90
|
+
# socket not ready after @data_timeout seconds
|
91
|
+
@logger.info("Closing connection after read timeout", :path => @path)
|
92
|
+
return
|
93
|
+
elsif data == :stopping
|
94
|
+
@logger.trace("Shutdown in progress", :path => @path)
|
95
|
+
next # let next loop handle graceful stop
|
100
96
|
end
|
101
|
-
|
97
|
+
|
98
|
+
@codec.decode(data) do |event|
|
102
99
|
decorate(event)
|
103
100
|
event.set(@host_name_field, hostname) unless event.include?(@host_name_field)
|
104
101
|
event.set(@file_path_field, @path) unless event.include?(@file_path_field)
|
105
102
|
output_queue << event
|
106
103
|
end
|
107
104
|
end
|
108
|
-
rescue Timeout::Error
|
109
|
-
@logger.info("Closing connection after read timeout", :path => @path)
|
110
105
|
rescue => e
|
111
106
|
if @logger.debug?
|
112
107
|
@logger.debug("Closing connection", :path => @path, :exception => e, :backtrace => e.backtrace)
|
@@ -114,7 +109,6 @@ class LogStash::Inputs::Unix < LogStash::Inputs::Base
|
|
114
109
|
@logger.info("Closing connection", :path => @path, :exception => e)
|
115
110
|
end
|
116
111
|
end
|
117
|
-
|
118
112
|
ensure
|
119
113
|
begin
|
120
114
|
socket.close
|
@@ -123,6 +117,35 @@ class LogStash::Inputs::Unix < LogStash::Inputs::Base
|
|
123
117
|
end
|
124
118
|
end
|
125
119
|
|
120
|
+
##
|
121
|
+
# Emulates `IO#readpartial` with a timeout and our plugin's stop-condition,
|
122
|
+
# limiting blocking calls to windows of 10s or less to ensure it can be interrupted.
|
123
|
+
#
|
124
|
+
# @param readable_io [IO] the IO to read from
|
125
|
+
# @param maxlen [Integer] the max bytes to be read
|
126
|
+
# @param timeout [Number] the maximum number of seconds to , or -1 to disable timeouts
|
127
|
+
#
|
128
|
+
# @return [:data_timeout] if timeout was reached before bytes were available
|
129
|
+
# @return [:stopping] if plugin stop-condition was detected before bytes were available
|
130
|
+
# @return [String] a non-empty string if bytes became available before the timeout was reached
|
131
|
+
def io_interruptable_readpartial(readable_io, maxlen, timeout)
|
132
|
+
|
133
|
+
data_timeout_deadline = timeout < 0 ? nil : Time.now + timeout
|
134
|
+
maximum_blocking_seconds = timeout < 0 || timeout > 10 ? 10 : timeout
|
135
|
+
|
136
|
+
loop do
|
137
|
+
return :stopping if stop?
|
138
|
+
result = readable_io.read_nonblock(maxlen, exception: false)
|
139
|
+
|
140
|
+
return result if result.kind_of?(String)
|
141
|
+
raise EOFError if result.nil?
|
142
|
+
|
143
|
+
return :data_timeout if (data_timeout_deadline && data_timeout_deadline < Time.now)
|
144
|
+
IO.select([readable_io], nil, nil, maximum_blocking_seconds)
|
145
|
+
end
|
146
|
+
end
|
147
|
+
private :io_interruptable_readpartial
|
148
|
+
|
126
149
|
private
|
127
150
|
def server?
|
128
151
|
@mode == "server"
|
@@ -141,9 +164,9 @@ class LogStash::Inputs::Unix < LogStash::Inputs::Base
|
|
141
164
|
end
|
142
165
|
else
|
143
166
|
while !stop?
|
144
|
-
if File.socket?(@path)
|
167
|
+
if File.socket?(@path)
|
145
168
|
@client_socket = UNIXSocket.new(@path)
|
146
|
-
@client_socket.
|
169
|
+
@client_socket.extend ::LogStash::Util::SocketPeer
|
147
170
|
@logger.debug("Opened connection", :client => @path)
|
148
171
|
handle_socket(@client_socket, output_queue)
|
149
172
|
else
|
data/logstash-input-unix.gemspec
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
Gem::Specification.new do |s|
|
2
2
|
|
3
3
|
s.name = 'logstash-input-unix'
|
4
|
-
s.version = '3.1.
|
4
|
+
s.version = '3.1.2'
|
5
5
|
s.licenses = ['Apache License (2.0)']
|
6
6
|
s.summary = "Reads events over a UNIX socket"
|
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"
|
data/spec/inputs/unix_spec.rb
CHANGED
@@ -55,8 +55,29 @@ describe LogStash::Inputs::Unix do
|
|
55
55
|
end
|
56
56
|
|
57
57
|
context "when the unix socket has no data to be read" do
|
58
|
-
|
59
|
-
|
58
|
+
|
59
|
+
let(:run_forever) { false }
|
60
|
+
|
61
|
+
it_behaves_like "an interruptible input plugin"
|
62
|
+
|
63
|
+
context 'with timeout' do
|
64
|
+
|
65
|
+
let(:config) { super().merge "data_timeout" => 1.0 }
|
66
|
+
|
67
|
+
let(:queue) { SizedQueue.new(10) }
|
68
|
+
before(:each) { subject.register }
|
69
|
+
after(:each) { subject.do_stop }
|
70
|
+
|
71
|
+
it "closes socket after timeout" do
|
72
|
+
plugin_thread = Thread.new(subject, queue) { |subject, queue| subject.run(queue) }
|
73
|
+
sleep 0.5
|
74
|
+
client_socket = subject.instance_variable_get :@client_socket
|
75
|
+
expect( client_socket.closed? ).to be false
|
76
|
+
sleep 1.0 # allow timeout to kick in
|
77
|
+
expect( client_socket.closed? ).to be true
|
78
|
+
expect( plugin_thread ).to be_alive
|
79
|
+
end
|
80
|
+
|
60
81
|
end
|
61
82
|
end
|
62
83
|
|
data/spec/spec_helper.rb
CHANGED
@@ -12,7 +12,7 @@ class UnixSocketHelper
|
|
12
12
|
end
|
13
13
|
|
14
14
|
def new_socket(path)
|
15
|
-
@path
|
15
|
+
@path = path
|
16
16
|
File.unlink if File.exists?(path) && File.socket?(path)
|
17
17
|
@socket = UNIXServer.new(path)
|
18
18
|
self
|
@@ -31,7 +31,6 @@ class UnixSocketHelper
|
|
31
31
|
end
|
32
32
|
|
33
33
|
def close
|
34
|
-
@thread.kill
|
35
34
|
@socket.close
|
36
35
|
File.unlink(path)
|
37
36
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: logstash-input-unix
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 3.1.
|
4
|
+
version: 3.1.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Elastic
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2022-10-03 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
requirement: !ruby/object:Gem::Requirement
|