logstash-output-newrelic 1.4.0 → 1.5.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
  SHA256:
3
- metadata.gz: 9e6c4d247631f976e7a7fc6153a02cc764f583491c749654a827c1fd6846c6c2
4
- data.tar.gz: 42389a3c04b5f1ef4804f9bf7efa820d7037c25e2df73c127354d180c624ff02
3
+ metadata.gz: 25593f8efc45dce5d2366a19ce89a4d722f6e5a55fdb3d6d8cad607d551dcbd7
4
+ data.tar.gz: d729dc031d6276a9dafdd1ae5a7615bd378993437a36b6828c540fc901839c88
5
5
  SHA512:
6
- metadata.gz: deebd2f6b0c7f5c07ee4fc347f577a9011a481be03f8e170a9e9c368594009cbc33b853e05c025a1938b038febc8cc6d6db8c906aa3eacbeacfabab3483d7755
7
- data.tar.gz: becf3aef35efc785f84ea956cabf2004d8d1ddbde4dac11f11bec3a25b65ab9a3277a97dcb35add2839581fb0b19ddf59114a83c9e5afd7a54da14ddd9b181d1
6
+ metadata.gz: 82c061a523aab278574d91373f8691c1499d0560b04e96dd8a8f178b14438eaceb7236dc62cea8ca6ac15d56e9ffa7acdfc2534338d4ae00306b0ef3e47b9f58
7
+ data.tar.gz: a6b92e08674d6d67e04d9ca2cb5bc0007c717e43c07c888399f715e4c5de546a58cf8237ae9128b742d5cd96ba7b9d52142e11875d1e02b9649af7e515e5e3a0
@@ -13,7 +13,7 @@ require_relative './exception/error'
13
13
  class LogStash::Outputs::NewRelic < LogStash::Outputs::Base
14
14
  java_import java.util.concurrent.Executors;
15
15
 
16
- NON_RETRYABLE_CODES = Set[401, 403]
16
+ RETRIABLE_CODES = Set[408, 429, 500, 502, 503, 504, 599]
17
17
 
18
18
  MAX_PAYLOAD_SIZE_BYTES = 1_000_000
19
19
 
@@ -145,6 +145,8 @@ class LogStash::Outputs::NewRelic < LogStash::Outputs::Base
145
145
 
146
146
  def nr_send(payload)
147
147
  retries = 0
148
+ retry_duration = 1
149
+
148
150
  begin
149
151
  http = Net::HTTP.new(@end_point.host, 443)
150
152
  request = Net::HTTP::Post.new(@end_point.request_uri)
@@ -163,7 +165,8 @@ class LogStash::Outputs::NewRelic < LogStash::Outputs::Base
163
165
  @logger.error(e.message)
164
166
  if (should_retry(retries) && is_retryable_code(e))
165
167
  retries += 1
166
- sleep(1)
168
+ sleep(retry_duration)
169
+ retry_duration *= 2
167
170
  retry
168
171
  end
169
172
  rescue => e
@@ -178,7 +181,8 @@ class LogStash::Outputs::NewRelic < LogStash::Outputs::Base
178
181
  :error_class => e.class.name,
179
182
  :backtrace => e.backtrace
180
183
  )
181
- sleep(1)
184
+ sleep(retry_duration)
185
+ retry_duration *= 2
182
186
  retry
183
187
  else
184
188
  @logger.error(
@@ -197,6 +201,6 @@ class LogStash::Outputs::NewRelic < LogStash::Outputs::Base
197
201
 
198
202
  def is_retryable_code(response_error)
199
203
  error_code = response_error.response_code
200
- !NON_RETRYABLE_CODES.include?(error_code)
204
+ RETRIABLE_CODES.include?(error_code)
201
205
  end
202
206
  end # class LogStash::Outputs::NewRelic
@@ -1,7 +1,7 @@
1
1
  module LogStash
2
2
  module Outputs
3
3
  module NewRelicVersion
4
- VERSION = "1.4.0"
4
+ VERSION = "1.5.0"
5
5
  end
6
6
  end
7
7
  end
@@ -265,7 +265,7 @@ describe LogStash::Outputs::NewRelic do
265
265
  end
266
266
  end
267
267
 
268
- context "error handling" do
268
+ context "error handling and retry logic" do
269
269
  it "continues through errors, future calls should still succeed" do
270
270
  stub_request(:any, base_uri)
271
271
  .to_raise(StandardError.new("from test"))
@@ -281,33 +281,41 @@ describe LogStash::Outputs::NewRelic do
281
281
  .to have_been_made
282
282
  end
283
283
 
284
- it "retry when receive retryable http error code" do
285
- stub_request(:any, base_uri)
286
- .to_return(status: 500)
287
- .to_return(status: 200)
288
-
289
- event1 = LogStash::Event.new({ "message" => "Test message 1" })
290
- @newrelic_output.multi_receive([event1])
291
-
292
- wait_for(a_request(:post, base_uri)
293
- .with { |request| single_gzipped_message(request.body)['message'] == 'Test message 1' })
294
- .to have_been_made.times(2)
295
- end
296
-
297
- it "not retry when receive a non retryable http error code" do
298
- stub_request(:any, base_uri)
299
- .to_return(status: 401)
300
-
301
- event1 = LogStash::Event.new({ "message" => "Test message 1" })
302
- @newrelic_output.multi_receive([event1])
303
- # Due the async behavior we need to wait to be sure that the method was not called more than 1 time
304
- sleep(2)
305
- wait_for(a_request(:post, base_uri)
306
- .with { |request| single_gzipped_message(request.body)['message'] == 'Test message 1' })
307
- .to have_been_made.times(1)
284
+ [
285
+ { "returned_status_code" => 200, "expected_to_retry" => false },
286
+ { "returned_status_code" => 202, "expected_to_retry" => false },
287
+ { "returned_status_code" => 400, "expected_to_retry" => false },
288
+ { "returned_status_code" => 404, "expected_to_retry" => false },
289
+ { "returned_status_code" => 408, "expected_to_retry" => true },
290
+ { "returned_status_code" => 429, "expected_to_retry" => true },
291
+ { "returned_status_code" => 500, "expected_to_retry" => true },
292
+ { "returned_status_code" => 502, "expected_to_retry" => true },
293
+ { "returned_status_code" => 503, "expected_to_retry" => true },
294
+ { "returned_status_code" => 504, "expected_to_retry" => true },
295
+ { "returned_status_code" => 599, "expected_to_retry" => true }
296
+ ].each do |test_case|
297
+ returned_status_code = test_case["returned_status_code"]
298
+ expected_to_retry = test_case["expected_to_retry"]
299
+
300
+ it "should #{expected_to_retry ? "" : "not"} retry on status code #{returned_status_code}" do
301
+ stub_request(:any, base_uri)
302
+ .to_return(status: returned_status_code)
303
+ .to_return(status: 200)
304
+
305
+ logstash_event = LogStash::Event.new({ "message" => "Test message" })
306
+ @newrelic_output.multi_receive([logstash_event])
307
+
308
+ expected_retries = expected_to_retry ? 2 : 1
309
+ wait_for(a_request(:post, base_uri)
310
+ .with { |request| single_gzipped_message(request.body)['message'] == 'Test message' })
311
+ .to have_been_made.at_least_times(expected_retries)
312
+ wait_for(a_request(:post, base_uri)
313
+ .with { |request| single_gzipped_message(request.body)['message'] == 'Test message' })
314
+ .to have_been_made.at_most_times(expected_retries)
315
+ end
308
316
  end
309
317
 
310
- it "not retries when retry is disabled" do
318
+ it "does not retry when max_retries is set to 0" do
311
319
  @newrelic_output = LogStash::Plugin.lookup("output", "newrelic").new(
312
320
  { "base_uri" => base_uri, "license_key" => api_key, "max_retries" => '0' }
313
321
  )
@@ -324,7 +332,7 @@ describe LogStash::Outputs::NewRelic do
324
332
  .to have_been_made.times(1)
325
333
  end
326
334
 
327
- it "retry when receive a not expected exception" do
335
+ it "retries when receive a not expected exception" do
328
336
  stub_request(:any, base_uri)
329
337
  .to_raise(StandardError.new("from test"))
330
338
  .to_return(status: 200)
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: logstash-output-newrelic
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.4.0
4
+ version: 1.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - New Relic Logging Team