Skip to content

Commit 4aaafcf

Browse files
devin-ai-integration[bot]bot_apk
andauthored
fix: suppress misleading backoff library log in user_defined_backoff_handler (#981)
Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> Co-authored-by: bot_apk <apk@cognition.ai>
1 parent 5b14f41 commit 4aaafcf

1 file changed

Lines changed: 14 additions & 6 deletions

File tree

airbyte_cdk/sources/streams/http/rate_limiting.py

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -106,23 +106,30 @@ def user_defined_backoff_handler(
106106
def sleep_on_ratelimit(details: Mapping[str, Any]) -> None:
107107
_, exc, _ = sys.exc_info()
108108
if isinstance(exc, UserDefinedBackoffException):
109-
if exc.response:
109+
retry_after = exc.backoff
110+
sleep_time = retry_after + 1 # extra second to cover any fractions of second
111+
if exc.response is not None:
110112
logger.info(
111-
f"Status code: {exc.response.status_code!r}, Response Content: {exc.response.content!r}"
113+
f"UserDefinedBackoffException: Rate limit exceeded (HTTP {exc.response.status_code}). Retrying in {sleep_time} seconds."
112114
)
113-
retry_after = exc.backoff
114-
logger.info(f"Retrying. Sleeping for {retry_after} seconds")
115-
time.sleep(retry_after + 1) # extra second to cover any fractions of second
115+
else:
116+
logger.info(
117+
f"UserDefinedBackoffException: Rate limit exceeded. Retrying in {sleep_time} seconds."
118+
)
119+
time.sleep(sleep_time)
116120

117121
def log_give_up(details: Mapping[str, Any]) -> None:
118122
_, exc, _ = sys.exc_info()
119123
if isinstance(exc, RequestException):
120124
logger.error(
121-
f"Max retry limit reached in {details['elapsed']}s. Request: {exc.request}, Response: {exc.response}"
125+
f"Max retry limit reached after {details['elapsed']:.1f}s. Request: {exc.request}, Response: {exc.response}"
122126
)
123127
else:
124128
logger.error("Max retry limit reached for unknown request and response")
125129

130+
# Suppress the backoff library's default log that misleadingly reports interval (0s) instead of actual sleep time
131+
kwargs.pop("logger", None)
132+
126133
return backoff.on_exception( # type: ignore # Decorator function returns a function with a different signature than the input function, so mypy can't infer the type of the returned function
127134
backoff.constant,
128135
UserDefinedBackoffException,
@@ -132,6 +139,7 @@ def log_give_up(details: Mapping[str, Any]) -> None:
132139
jitter=None,
133140
max_tries=max_tries,
134141
max_time=max_time,
142+
logger=None,
135143
**kwargs,
136144
)
137145

0 commit comments

Comments
 (0)