Skip to content

Commit e5e634c

Browse files
committed
fix: added retries for http 429 & 504
1 parent 53190b4 commit e5e634c

File tree

2 files changed

+57
-5
lines changed

2 files changed

+57
-5
lines changed

logdna/logdna.py

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -212,8 +212,10 @@ def send_request(self, data): # noqa: max-complexity: 13
212212
3XX unexpected status
213213
401, 403 expected client error,
214214
invalid ingestion key
215+
429 expected server error (client error),
216+
transient
215217
4XX unexpected client error
216-
500 502 503 507 expected server error, transient
218+
500 502 503 504 507 expected server error, transient
217219
5XX unexpected server error
218220
handling:
219221
expected status discard flush buffer
@@ -256,6 +258,14 @@ def send_request(self, data): # noqa: max-complexity: 13
256258
'Error Response: %s', response.text)
257259
return True # discard
258260

261+
if status_code in [429]:
262+
self.internalLogger.debug('Client Error: %s. Retrying...',
263+
reason)
264+
if self.log_error_response:
265+
self.internalLogger.debug(
266+
'Error Response: %s', response.text)
267+
return False # retry
268+
259269
if 400 <= status_code <= 499:
260270
self.internalLogger.debug('Client Error: %s. ' +
261271
'Discarding flush buffer',
@@ -265,7 +275,7 @@ def send_request(self, data): # noqa: max-complexity: 13
265275
'Error Response: %s', response.text)
266276
return True # discard
267277

268-
if status_code in [500, 502, 503, 507]:
278+
if status_code in [500, 502, 503, 504, 507]:
269279
self.internalLogger.debug('Server Error: %s. Retrying...',
270280
reason)
271281
if self.log_error_response:

tests/test_logger.py

Lines changed: 45 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -171,7 +171,49 @@ def test_try_request_500(self):
171171
with patch('requests.post') as post_mock:
172172
r = requests.Response()
173173
r.status_code = 500
174-
r.reason = 'OK'
174+
r.reason = 'Internal Server Error'
175+
post_mock.return_value = r
176+
handler = LogDNAHandler(LOGDNA_API_KEY, sample_options)
177+
sample_message['timestamp'] = unittest.mock.ANY
178+
handler.buf = [sample_message]
179+
handler.try_request()
180+
self.assertTrue(handler.exception_flag)
181+
self.assertTrue(post_mock.call_count, 3)
182+
183+
@mock.patch('time.time', unittest.mock.MagicMock(return_value=now))
184+
def test_try_request_502(self):
185+
with patch('requests.post') as post_mock:
186+
r = requests.Response()
187+
r.status_code = 502
188+
r.reason = 'Bad Gateway'
189+
post_mock.return_value = r
190+
handler = LogDNAHandler(LOGDNA_API_KEY, sample_options)
191+
sample_message['timestamp'] = unittest.mock.ANY
192+
handler.buf = [sample_message]
193+
handler.try_request()
194+
self.assertTrue(handler.exception_flag)
195+
self.assertTrue(post_mock.call_count, 3)
196+
197+
@mock.patch('time.time', unittest.mock.MagicMock(return_value=now))
198+
def test_try_request_504(self):
199+
with patch('requests.post') as post_mock:
200+
r = requests.Response()
201+
r.status_code = 504
202+
r.reason = 'Gateway Timeout'
203+
post_mock.return_value = r
204+
handler = LogDNAHandler(LOGDNA_API_KEY, sample_options)
205+
sample_message['timestamp'] = unittest.mock.ANY
206+
handler.buf = [sample_message]
207+
handler.try_request()
208+
self.assertTrue(handler.exception_flag)
209+
self.assertTrue(post_mock.call_count, 3)
210+
211+
@mock.patch('time.time', unittest.mock.MagicMock(return_value=now))
212+
def test_try_request_429(self):
213+
with patch('requests.post') as post_mock:
214+
r = requests.Response()
215+
r.status_code = 429
216+
r.reason = 'Too Many Requests'
175217
post_mock.return_value = r
176218
handler = LogDNAHandler(LOGDNA_API_KEY, sample_options)
177219
sample_message['timestamp'] = unittest.mock.ANY
@@ -185,7 +227,7 @@ def test_try_request_403(self):
185227
with patch('requests.post') as post_mock:
186228
r = requests.Response()
187229
r.status_code = 403
188-
r.reason = 'OK'
230+
r.reason = 'Forbidden'
189231
post_mock.return_value = r
190232
handler = LogDNAHandler(LOGDNA_API_KEY, sample_options)
191233
sample_message['timestamp'] = unittest.mock.ANY
@@ -199,7 +241,7 @@ def test_try_request_403_log_response(self):
199241
with patch('requests.post') as post_mock:
200242
r = requests.Response()
201243
r.status_code = 403
202-
r.reason = 'OK'
244+
r.reason = 'Forbidden'
203245
post_mock.return_value = r
204246
sample_options['log_error_response'] = True
205247
handler = LogDNAHandler(LOGDNA_API_KEY, sample_options)

0 commit comments

Comments
 (0)