From 8b25b7193fc0c5c741ac03d9766e05dbf714447d Mon Sep 17 00:00:00 2001 From: Neelkanth Kaushik Date: Wed, 12 Nov 2025 22:22:54 +0530 Subject: [PATCH 1/2] Fixed Github Issue 515 --- segment/analytics/consumer.py | 24 +++++++++++++++++++----- segment/analytics/request.py | 4 ++-- 2 files changed, 21 insertions(+), 7 deletions(-) diff --git a/segment/analytics/consumer.py b/segment/analytics/consumer.py index 1c471573..554a7733 100644 --- a/segment/analytics/consumer.py +++ b/segment/analytics/consumer.py @@ -14,9 +14,11 @@ # lower to leave space for extra data that will be added later, eg. "sentAt". BATCH_SIZE_LIMIT = 475000 + class FatalError(Exception): def __init__(self, message): self.message = message + def __str__(self): msg = "[Segment] {0})" return msg.format(self.message) @@ -81,7 +83,7 @@ def upload(self): # mark items as acknowledged from queue for _ in batch: self.queue.task_done() - return success + return success def next(self): """Return the next batch of items to upload.""" @@ -132,14 +134,26 @@ def fatal_exception(exc): # retry on all other errors (eg. network) return False + attempt_count = 0 + @backoff.on_exception( backoff.expo, Exception, max_tries=self.retries + 1, - giveup=fatal_exception) + giveup=fatal_exception, + on_backoff=lambda details: self.log.debug( + f"Retry attempt {details['tries']}/{self.retries + 1} after {details['elapsed']:.2f}s" + )) def send_request(): - post(self.write_key, self.host, gzip=self.gzip, - timeout=self.timeout, batch=batch, proxies=self.proxies, - oauth_manager=self.oauth_manager) + nonlocal attempt_count + attempt_count += 1 + try: + return post(self.write_key, self.host, gzip=self.gzip, + timeout=self.timeout, batch=batch, proxies=self.proxies, + oauth_manager=self.oauth_manager) + except Exception as e: + if attempt_count > self.retries: + self.log.error(f"All {self.retries} retries exhausted. Final error: {e}") + raise send_request() diff --git a/segment/analytics/request.py b/segment/analytics/request.py index 4118e2cf..af370429 100644 --- a/segment/analytics/request.py +++ b/segment/analytics/request.py @@ -54,9 +54,9 @@ def post(write_key, host=None, gzip=False, timeout=15, proxies=None, oauth_manag try: res = _session.post(url, **kwargs) except Exception as e: - log.error(e) + # log.error(e) raise e - + if res.status_code == 200: log.debug('data uploaded successfully') return res From 11e1edb7b5fefc7a611d94d7f1c509c7de1339bc Mon Sep 17 00:00:00 2001 From: Neelkanth Kaushik Date: Tue, 18 Nov 2025 14:16:53 +0530 Subject: [PATCH 2/2] Minor changes and conditional fix --- segment/analytics/consumer.py | 2 +- segment/analytics/request.py | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/segment/analytics/consumer.py b/segment/analytics/consumer.py index 554a7733..157e3c93 100644 --- a/segment/analytics/consumer.py +++ b/segment/analytics/consumer.py @@ -152,7 +152,7 @@ def send_request(): timeout=self.timeout, batch=batch, proxies=self.proxies, oauth_manager=self.oauth_manager) except Exception as e: - if attempt_count > self.retries: + if attempt_count >= self.retries + 1: self.log.error(f"All {self.retries} retries exhausted. Final error: {e}") raise diff --git a/segment/analytics/request.py b/segment/analytics/request.py index af370429..ab92b807 100644 --- a/segment/analytics/request.py +++ b/segment/analytics/request.py @@ -54,7 +54,6 @@ def post(write_key, host=None, gzip=False, timeout=15, proxies=None, oauth_manag try: res = _session.post(url, **kwargs) except Exception as e: - # log.error(e) raise e if res.status_code == 200: