Source code for swh.webhooks.svix_retry
# Copyright (C) 2024 The Software Heritage developers
# See the AUTHORS file at the top-level directory of this distribution
# License: GNU General Public License version 3, or any later version
# See top-level LICENSE file for more information
import logging
from httpx import ConnectError, TimeoutException
from svix.internal.openapi_client.errors import UnexpectedStatus
from tenacity import retry
from tenacity.before_sleep import before_sleep_log
from tenacity.retry import retry_if_exception
from tenacity.stop import stop_after_attempt
from tenacity.wait import wait_exponential
SVIX_RETRY_WAIT_EXP_BASE = 10
SVIX_RETRY_MAX_ATTEMPTS = 3
logger = logging.getLogger(__name__)
[docs]
def is_retryable_exception(exception):
return isinstance(exception, (ConnectError, TimeoutException, UnexpectedStatus))
[docs]
def svix_retry():
"""Enable to retry a call to the Svix API in case of temporary network failure."""
return retry(
retry=retry_if_exception(is_retryable_exception),
wait=wait_exponential(exp_base=SVIX_RETRY_WAIT_EXP_BASE),
stop=stop_after_attempt(max_attempt_number=SVIX_RETRY_MAX_ATTEMPTS),
before_sleep=before_sleep_log(logger, logging.DEBUG),
reraise=True,
)