Skip to content
Merged
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
80 changes: 41 additions & 39 deletions real_intent/client.py
Original file line number Diff line number Diff line change
Expand Up @@ -127,52 +127,54 @@ def __request(self, request: Request) -> dict:
}"
)

for n_attempt in range(1, self.max_request_attempts+1):
try:
with Session() as session:
response = session.send(
request.prepare(),
timeout=self.request_timeout_seconds
)

response.raise_for_status()
break
except RequestException as e:
last_exception: RequestException = e
with Session() as session:
response = session.send(
request.prepare(),
timeout=self.request_timeout_seconds
)

if n_attempt == self.max_request_attempts:
continue # on last failed attempt, skip to else block
response.raise_for_status()
log("trace", f"Received response: {response}")
return response.json()

# Log it, sleep, loop again to try again
sleep_time = round(
number=random.uniform(30 * n_attempt, (30 * n_attempt) + 10),
ndigits=2
)
def _request(self, request: Request) -> dict:
"""Request abstraction with logging and retry backoff."""
with log_span(f"Requesting {request.method} {request.url}", _level="trace"):
for n_attempt in range(1, self.max_request_attempts+1):
try:
response: dict = self.__request(request)
break
except RequestException as e:
last_exception: RequestException = e

if n_attempt == self.max_request_attempts:
continue # on last failed attempt, skip to else block

# Log it, sleep, loop again to try again
sleep_time = round(
number=random.uniform(30 * n_attempt, (30 * n_attempt) + 10),
ndigits=2
)
log(
"warn",
(
f"Request attempt {n_attempt} of {self.max_request_attempts} "
f"failed. Retrying in {sleep_time}s. Error: {e}"
)
)
time.sleep(sleep_time)
else:
log(
"warn",
"error",
(
f"Request attempt {n_attempt} of {self.max_request_attempts} "
f"failed. Retrying in {sleep_time}s. Error: {e}"
f"Request failed after {self.max_request_attempts} "
f"attempts. Error: {last_exception}"
)
)
time.sleep(sleep_time)
else:
log(
"error",
(
f"Request failed after {self.max_request_attempts} "
f"attempts. Error: {last_exception}"
)
)
raise last_exception
raise last_exception

log("trace", f"Received response: {response.text}")
return response.json()

def _request(self, request: Request) -> dict:
"""Request abstraction with logging."""
with log_span(f"Requesting {request.method} {request.url}", _level="trace"):
return self.__request(request)
log("trace", f"Received response: {response}")
return response

def get_config_dates(self) -> ConfigDates:
"""Get the configuration dates from /config."""
Expand Down
Loading