logstash-output-http 5.3.0 → 5.4.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +3 -0
- data/lib/logstash/outputs/http.rb +16 -1
- data/logstash-output-http.gemspec +1 -1
- data/spec/outputs/http_spec.rb +111 -21
- 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: dd850256e5336762a98ed5cc4ae699ddcc1c3c3bcb9e5382b033aa21aebd5fea
|
4
|
+
data.tar.gz: '08b1450d6eadd6ea8e7a9451d781c4fd78c3d7b199751616c1e74cabc75e3899'
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 11dce3822d80720abedca11fe586cb8d4c8384e44cb793da13bba509c571c48bf8b617a0545297fb49a8cd254d5374e5b4702dddf607e4bad04eaaf07b24e0d0
|
7
|
+
data.tar.gz: 62546e31fc1386c48a0b77c25f5e13093fc63bfc371ea1924ebc8737ec26b4855c4c0bd40cebbd5a2eac82288315da436c46772793c2fc86adcf848d79cfadd9
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,6 @@
|
|
1
|
+
## 5.4.0
|
2
|
+
- Introduce retryable unknown exceptions for "connection reset by peer" and "timeout" [#127](https://github.com/logstash-plugins/logstash-output-http/pull/127)
|
3
|
+
|
1
4
|
## 5.3.0
|
2
5
|
- Feat: support ssl_verification_mode option [#126](https://github.com/logstash-plugins/logstash-output-http/pull/126)
|
3
6
|
|
@@ -23,6 +23,12 @@ class LogStash::Outputs::Http < LogStash::Outputs::Base
|
|
23
23
|
::Manticore::SocketTimeout
|
24
24
|
]
|
25
25
|
|
26
|
+
RETRYABLE_UNKNOWN_EXCEPTION_STRINGS = [
|
27
|
+
/Connection reset by peer/i,
|
28
|
+
/Read Timed out/i
|
29
|
+
]
|
30
|
+
|
31
|
+
|
26
32
|
# This output lets you send events to a
|
27
33
|
# generic HTTP(S) endpoint
|
28
34
|
#
|
@@ -295,7 +301,16 @@ class LogStash::Outputs::Http < LogStash::Outputs::Base
|
|
295
301
|
end
|
296
302
|
|
297
303
|
def retryable_exception?(exception)
|
298
|
-
|
304
|
+
retryable_manticore_exception?(exception) || retryable_unknown_exception?(exception)
|
305
|
+
end
|
306
|
+
|
307
|
+
def retryable_manticore_exception?(exception)
|
308
|
+
RETRYABLE_MANTICORE_EXCEPTIONS.any? {|me| exception.is_a?(me)}
|
309
|
+
end
|
310
|
+
|
311
|
+
def retryable_unknown_exception?(exception)
|
312
|
+
exception.is_a?(::Manticore::UnknownException) &&
|
313
|
+
RETRYABLE_UNKNOWN_EXCEPTION_STRINGS.any? { |snippet| exception.message =~ snippet }
|
299
314
|
end
|
300
315
|
|
301
316
|
# This is split into a separate method mostly to help testing
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Gem::Specification.new do |s|
|
2
2
|
s.name = 'logstash-output-http'
|
3
|
-
s.version = '5.
|
3
|
+
s.version = '5.4.0'
|
4
4
|
s.licenses = ['Apache License (2.0)']
|
5
5
|
s.summary = "Sends events to a generic HTTP or HTTPS endpoint"
|
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/logstash-plugin install gemname. This gem is not a stand-alone program"
|
data/spec/outputs/http_spec.rb
CHANGED
@@ -126,6 +126,44 @@ describe LogStash::Outputs::Http do
|
|
126
126
|
let(:method) { "post" }
|
127
127
|
|
128
128
|
shared_examples("verb behavior") do |method|
|
129
|
+
|
130
|
+
shared_examples("failure log behaviour") do
|
131
|
+
it "logs failure" do
|
132
|
+
expect(subject).to have_received(:log_failure).with(any_args)
|
133
|
+
end
|
134
|
+
|
135
|
+
it "does not log headers" do
|
136
|
+
expect(subject).to have_received(:log_failure).with(anything, hash_not_including(:headers))
|
137
|
+
end
|
138
|
+
|
139
|
+
it "does not log the message body" do
|
140
|
+
expect(subject).to have_received(:log_failure).with(anything, hash_not_including(:body))
|
141
|
+
end
|
142
|
+
|
143
|
+
context "with debug log level" do
|
144
|
+
before :all do
|
145
|
+
@current_log_level = LogStash::Logging::Logger.get_logging_context.get_root_logger.get_level.to_s.downcase
|
146
|
+
LogStash::Logging::Logger.configure_logging "debug"
|
147
|
+
end
|
148
|
+
after :all do
|
149
|
+
LogStash::Logging::Logger.configure_logging @current_log_level
|
150
|
+
end
|
151
|
+
|
152
|
+
it "logs a failure" do
|
153
|
+
expect(subject).to have_received(:log_failure).with(any_args)
|
154
|
+
end
|
155
|
+
|
156
|
+
it "logs headers" do
|
157
|
+
expect(subject).to have_received(:log_failure).with(anything, hash_including(:headers))
|
158
|
+
end
|
159
|
+
|
160
|
+
it "logs the body" do
|
161
|
+
expect(subject).to have_received(:log_failure).with(anything, hash_including(:body))
|
162
|
+
end
|
163
|
+
end
|
164
|
+
|
165
|
+
end
|
166
|
+
|
129
167
|
let(:verb_behavior_config) { {"url" => url, "http_method" => method, "pool_max" => 1} }
|
130
168
|
subject { LogStash::Outputs::Http.new(verb_behavior_config) }
|
131
169
|
|
@@ -213,44 +251,96 @@ describe LogStash::Outputs::Http do
|
|
213
251
|
end
|
214
252
|
end
|
215
253
|
|
216
|
-
context "on exception" do
|
254
|
+
context "on retryable unknown exception" do
|
217
255
|
before :each do
|
218
|
-
|
256
|
+
raised = false
|
257
|
+
original_method = subject.client.method(:send)
|
258
|
+
allow(subject).to receive(:send_event).and_call_original
|
259
|
+
expect(subject.client).to receive(:send) do |*args|
|
260
|
+
unless raised
|
261
|
+
raised = true
|
262
|
+
raise ::Manticore::UnknownException.new("Read timed out")
|
263
|
+
end
|
264
|
+
original_method.call(args)
|
265
|
+
end
|
219
266
|
subject.multi_receive([event])
|
220
267
|
end
|
221
268
|
|
222
|
-
|
223
|
-
expect(subject).to have_received(:log_failure).with(anything, hash_not_including(:headers))
|
224
|
-
end
|
269
|
+
include_examples("failure log behaviour")
|
225
270
|
|
226
|
-
it "
|
227
|
-
expect(subject).to have_received(:
|
271
|
+
it "retries" do
|
272
|
+
expect(subject).to have_received(:send_event).exactly(2).times
|
228
273
|
end
|
274
|
+
end
|
229
275
|
|
230
|
-
|
231
|
-
|
232
|
-
|
233
|
-
|
234
|
-
|
235
|
-
|
236
|
-
|
276
|
+
context "on non-retryable unknown exception" do
|
277
|
+
before :each do
|
278
|
+
raised = false
|
279
|
+
original_method = subject.client.method(:send)
|
280
|
+
allow(subject).to receive(:send_event).and_call_original
|
281
|
+
expect(subject.client).to receive(:send) do |*args|
|
282
|
+
unless raised
|
283
|
+
raised = true
|
284
|
+
raise ::Manticore::UnknownException.new("broken")
|
285
|
+
end
|
286
|
+
original_method.call(args)
|
237
287
|
end
|
288
|
+
subject.multi_receive([event])
|
289
|
+
end
|
238
290
|
|
239
|
-
|
240
|
-
expect(subject).to have_received(:log_failure).with(any_args)
|
241
|
-
end
|
291
|
+
include_examples("failure log behaviour")
|
242
292
|
|
243
|
-
|
244
|
-
|
293
|
+
it "does not retry" do
|
294
|
+
expect(subject).to have_received(:send_event).exactly(1).times
|
295
|
+
end
|
296
|
+
end
|
297
|
+
|
298
|
+
context "on non-retryable exception" do
|
299
|
+
before :each do
|
300
|
+
raised = false
|
301
|
+
original_method = subject.client.method(:send)
|
302
|
+
allow(subject).to receive(:send_event).and_call_original
|
303
|
+
expect(subject.client).to receive(:send) do |*args|
|
304
|
+
unless raised
|
305
|
+
raised = true
|
306
|
+
raise RuntimeError.new("broken")
|
307
|
+
end
|
308
|
+
original_method.call(args)
|
245
309
|
end
|
310
|
+
subject.multi_receive([event])
|
311
|
+
end
|
246
312
|
|
247
|
-
|
248
|
-
|
313
|
+
include_examples("failure log behaviour")
|
314
|
+
|
315
|
+
it "does not retry" do
|
316
|
+
expect(subject).to have_received(:send_event).exactly(1).times
|
317
|
+
end
|
318
|
+
end
|
319
|
+
|
320
|
+
context "on retryable exception" do
|
321
|
+
before :each do
|
322
|
+
raised = false
|
323
|
+
original_method = subject.client.method(:send)
|
324
|
+
allow(subject).to receive(:send_event).and_call_original
|
325
|
+
expect(subject.client).to receive(:send) do |*args|
|
326
|
+
unless raised
|
327
|
+
raised = true
|
328
|
+
raise ::Manticore::Timeout.new("broken")
|
329
|
+
end
|
330
|
+
original_method.call(args)
|
249
331
|
end
|
332
|
+
subject.multi_receive([event])
|
250
333
|
end
|
334
|
+
|
335
|
+
it "retries" do
|
336
|
+
expect(subject).to have_received(:send_event).exactly(2).times
|
337
|
+
end
|
338
|
+
|
339
|
+
include_examples("failure log behaviour")
|
251
340
|
end
|
252
341
|
end
|
253
342
|
|
343
|
+
|
254
344
|
LogStash::Outputs::Http::VALID_METHODS.each do |method|
|
255
345
|
context "when using '#{method}'" do
|
256
346
|
include_examples("verb behavior", method)
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: logstash-output-http
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 5.
|
4
|
+
version: 5.4.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Elastic
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2022-02-
|
11
|
+
date: 2022-02-09 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
requirement: !ruby/object:Gem::Requirement
|