diff --git a/src/aiowebhooks/sender.py b/src/aiowebhooks/sender.py index 30a5b18..b525ccb 100644 --- a/src/aiowebhooks/sender.py +++ b/src/aiowebhooks/sender.py @@ -141,8 +141,10 @@ class Webhook: except _Retryable as exhausted: return exhausted.result except Exception as error: - # never-raises net: anything else (closed session, bad proxy url, ...) -> failed result - log.warning("webhook send failed unexpectedly on %s: %s", url, error, exc_info=True) + # never-raises net: anything else (closed session, bad proxy url, ...) -> failed result. + # ERROR: an UNEXPECTED failure is swallowed here into a failed result (op failed, result + # lost, a human may need to act) - the lib is the last code that sees this exception. + log.error("webhook send failed unexpectedly on %s: %s", url, error, exc_info=True) return WebhookResult( ok=False, status=None, url=url, attempts=counter[0] or 1, error=f"{type(error).__name__}: {error}", @@ -165,7 +167,8 @@ class Webhook: if pending_wait[0] is not None: wait = pending_wait[0] pending_wait[0] = None - log.warning("webhook 429 on %s; honoring retry_after %.3fs", url, wait) + log.warning("webhook 429 on %s; honoring retry_after %.3fs (attempt %d/%d)", + url, wait, counter[0] + 1, self.max_retries + 1) await asyncio.sleep(wait) counter[0] += 1 attempts = counter[0] @@ -174,9 +177,11 @@ class Webhook: try: proxy_dict = self._proxies.get() except Exception: - # duck-typed provider: any get() error means no proxy available - log.warning("webhook: proxy get() failed; no proxy available", - exc_info=True) + # duck-typed provider: any get() error means no proxy available. + # ERROR: swallowed into a failed result (op failed, result lost) - the + # provider fault vanishes here unless it is logged loudly. + log.error("webhook: proxy get() failed; no proxy available", + exc_info=True) return WebhookResult( ok=False, status=None, url=url, attempts=attempts, error="proxies unavailable", proxy=last_proxy, @@ -209,7 +214,8 @@ class Webhook: if wait is not None: pending_wait[0] = wait else: - log.warning("webhook 429 on %s; no retry_after, backing off", url) + log.warning("webhook 429 on %s; no retry_after, backing off (attempt %d/%d)", + url, attempts, self.max_retries + 1) raise _Retryable(result) if status >= 500: raise _Retryable(result) @@ -241,7 +247,9 @@ class Webhook: self._proxies.burn(proxy) return True except Exception: - log.warning("webhook: proxy burn failed; ending rotation", exc_info=True) + # ERROR: an unexpected provider fault (burn() raising) is swallowed here and ends + # rotation, failing the send - it must be loud, not a quiet WARNING. + log.error("webhook: proxy burn failed; ending rotation", exc_info=True) return False @staticmethod