Skip to content

Not able to log "retry_success", only if retry was triggered #531

Description

@vasu228114

PROBLEM:
Trying to generate success message only if retry got triggered.
Able to generate the warning properly, but not success if retry happened
Using the following code:

import random
import logging
from tenacity import retry, wait_fixed, stop_after_attempt, before_sleep, RetryCallState, retry_if_exception_type

logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')

def my_before_sleep(retry_state: RetryCallState):
    if retry_state.outcome.failed:
        # If it failed, don't do anything special here; before_sleep handles warnings.
        logging.warning(
        f"Retrying '{retry_state.fn.__name__}' for the {retry_state.attempt_number} time "
        f"after {retry_state.outcome.exception()}..."
        )
        return retry_state.outcome.result # Return the exception for tenacity to handle
    else:
        # THIS ELSE IS NOT WORKING, AS EXPECTED
        logging.info(
        f"'{retry_state.fn.__name__}' completed successfully after retries "
        f"(attempt {retry_state.attempt_number}). Result: {retry_state.outcome.result}"
        )

def my_after_execute(retry_state: RetryCallState):
    """
    Callback function executed after each attempt, regardless of success or failure.
    Checks if the function succeeded AND if retries previously occurred.
    """
    if not retry_state.outcome.failed:
        # IF THE ABOVE ELSE IS NOT SUPPOSED TO WORK, EVEN THIS IF CONDITION IS NOT WORKING.
        logging.info(
        f"'{retry_state.fn.__name__}' completed successfully after retries "
        f"(attempt {retry_state.attempt_number}). Result: {retry_state.outcome.result}"
        )
    return retry_state.outcome.result # Return the actual result for tenacity to propagate

@retry(
    wait=wait_fixed(1),
    stop=stop_after_attempt(3),
    retry=retry_if_exception_type(ValueError),
    before_sleep=my_before_sleep,
    after=my_after_execute,
    reraise=True
)
def might_fail_function(prob):
    # Simulate success or failure
    current_prob = random.random()
    if current_prob < prob:
        logging.info("Function failed on this attempt.")
        logging.info(f"current prob: {current_prob}")
        raise ValueError("Simulated failure")
    else:
        logging.info("Function succeeded on this attempt.")
        logging.info(f"current prob: {current_prob}")
        return "Operation Completed!"

logging.info("Attempt 1: Should fail initially and then succeed with retries") 
# fail the function in 1st try and then succeed (THIS PART IS NOT WORKING)
might_fail_function(0.5) 
logging.info('-' * 50)

LOG:
Expecting the log to generate success message either through custom after callback, or through custom before_sleep callback. But none of that is working, as you can see the simulation Attempt 1:

Collecting tenacity
Downloading tenacity-9.1.2-py3-none-any.whl.metadata (1.2 kB)
Downloading tenacity-9.1.2-py3-none-any.whl (28 kB)
Installing collected packages: tenacity
Successfully installed tenacity-9.1.2

[notice] A new release of pip is available: 24.2 -> 25.1.1
[notice] To update, run: python.exe -m pip install --upgrade pip
2025-06-29 12:45:17,638 - INFO - Attempt 1: Should fail initially and then succeed with retries
2025-06-29 12:45:17,638 - INFO - Function failed on this attempt.
2025-06-29 12:45:17,640 - INFO - current prob: 0.16599903411725936
2025-06-29 12:45:17,641 - WARNING - Retrying 'might_fail_function' for the 1 time after Simulated failure...
2025-06-29 12:45:18,643 - INFO - Function succeeded on this attempt.
2025-06-29 12:45:18,643 - INFO - current prob: 0.7810787153522702

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions