logstash-output-newrelic 1.4.0 → 1.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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