Skip to content

Commit f90b448

Browse files
authored
Merge pull request #65 from stuartio/errors
Implementing 500 and 429 error handling
2 parents 9ffbdc7 + 67872b5 commit f90b448

File tree

1 file changed

+34
-1
lines changed

1 file changed

+34
-1
lines changed

nodestream_akamai/akamai_utils/client.py

Lines changed: 34 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,10 +31,16 @@ def __init__(
3131
)
3232
self.account_key = account_key
3333

34-
def _get_api_from_relative_path(self, path, params=None, headers=None):
34+
def _get_api_from_relative_path(
35+
self, path, params=None, headers=None, backoff_index=None
36+
):
3537
full_url = urljoin(self.base_url, path)
3638
logger.info("Exec: %s", full_url)
3739

40+
backoff_delays = [5, 10, 20, 60, 180]
41+
if backoff_index is None:
42+
backoff_index = 0
43+
3844
# Insert account switch key
3945
if self.account_key is not None:
4046
if params is None:
@@ -45,6 +51,33 @@ def _get_api_from_relative_path(self, path, params=None, headers=None):
4551
if sleepy_seconds:
4652
time.sleep(sleepy_seconds)
4753
response = self.session.get(full_url, params=params, headers=headers)
54+
# Retry once for temporary 500 errors
55+
if response.status_code == 500:
56+
logger.error(f"Received 500 response for 'GET {full_url}'. Retrying...")
57+
response = self.session.get(full_url, params=params, headers=headers)
58+
59+
# Back off for rate limit 429
60+
if response.status_code == 429:
61+
# Increase bacoff for next attempt
62+
next_backoff_index = backoff_index + 1
63+
if next_backoff_index > len(backoff_delays):
64+
logger.error(
65+
f"Received 429 response for 'GET {full_url}' and backoff limit exceeded."
66+
)
67+
else:
68+
backoff = backoff_delays[backoff_index]
69+
logger.error(
70+
f"Received 429 response for 'GET {full_url}'. Waiting for {backoff} seconds before retrying"
71+
)
72+
time.sleep(backoff)
73+
response = self._get_api_from_relative_path(
74+
path,
75+
params=params,
76+
headers=headers,
77+
backoff_index=next_backoff_index,
78+
)
79+
80+
# Return body if 200
4881
if response.status_code == 200:
4982
return response.json()
5083
self.error_count += 1

0 commit comments

Comments
 (0)