Skip to content
Open
Show file tree
Hide file tree
Changes from all 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
3 changes: 3 additions & 0 deletions releasenotes/notes/retrying-label-62a5384cd3a49859.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
---
features:
- "Add optional label to Retrying class to be shown in logs"
19 changes: 18 additions & 1 deletion tenacity/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -79,6 +79,8 @@
from .before_sleep import before_sleep_log # noqa
from .before_sleep import before_sleep_nothing # noqa

from ._utils import get_callback_name

try:
import tornado
except ImportError:
Expand Down Expand Up @@ -199,6 +201,7 @@ def __init__(
reraise: bool = False,
retry_error_cls: t.Type[RetryError] = RetryError,
retry_error_callback: t.Optional[t.Callable[["RetryCallState"], t.Any]] = None,
label: t.Optional[str] = None,
):
self.sleep = sleep
self.stop = stop
Expand All @@ -211,6 +214,7 @@ def __init__(
self._local = threading.local()
self.retry_error_cls = retry_error_cls
self.retry_error_callback = retry_error_callback
self.label = label

def copy(
self,
Expand All @@ -224,6 +228,7 @@ def copy(
reraise: t.Union[bool, object] = _unset,
retry_error_cls: t.Union[t.Type[RetryError], object] = _unset,
retry_error_callback: t.Union[t.Optional[t.Callable[["RetryCallState"], t.Any]], object] = _unset,
label: t.Optional[str] = _unset,
) -> "BaseRetrying":
"""Copy this object with some parameters changed if needed."""
return self.__class__(
Expand All @@ -237,6 +242,7 @@ def copy(
reraise=_first_set(reraise, self.reraise),
retry_error_cls=_first_set(retry_error_cls, self.retry_error_cls),
retry_error_callback=_first_set(retry_error_callback, self.retry_error_callback),
label=_first_set(label, self.label),
)

def __repr__(self) -> str:
Expand All @@ -247,7 +253,8 @@ def __repr__(self) -> str:
f"sleep={self.sleep}, "
f"retry={self.retry}, "
f"before={self.before}, "
f"after={self.after})>"
f"after={self.after}, "
f"label={self.label})>"
)

@property
Expand Down Expand Up @@ -458,6 +465,16 @@ def seconds_since_start(self) -> t.Optional[float]:
return None
return self.outcome_timestamp - self.start_time

@property
def fn_label(self):
if self.retry_object.label is None:
if self.fn is None:
return "<unknown>"
else:
return get_callback_name(self.fn)
else:
return self.retry_object.label

def prepare_for_next_attempt(self) -> None:
self.outcome = None
self.outcome_timestamp = None
Expand Down
8 changes: 2 additions & 6 deletions tenacity/after.py
Original file line number Diff line number Diff line change
Expand Up @@ -36,14 +36,10 @@ def after_log(
"""After call strategy that logs to some logger the finished attempt."""

def log_it(retry_state: "RetryCallState") -> None:
if retry_state.fn is None:
# NOTE(sileht): can't really happen, but we must please mypy
fn_name = "<unknown>"
else:
fn_name = _utils.get_callback_name(retry_state.fn)
label = retry_state.fn_label
logger.log(
log_level,
f"Finished call to '{fn_name}' "
f"Finished call to '{label}' "
f"after {sec_format % retry_state.seconds_since_start}(s), "
f"this was the {_utils.to_ordinal(retry_state.attempt_number)} time calling it.",
)
Expand Down
8 changes: 2 additions & 6 deletions tenacity/before.py
Original file line number Diff line number Diff line change
Expand Up @@ -32,14 +32,10 @@ def before_log(logger: "logging.Logger", log_level: int) -> typing.Callable[["Re
"""Before call strategy that logs to some logger the attempt."""

def log_it(retry_state: "RetryCallState") -> None:
if retry_state.fn is None:
# NOTE(sileht): can't really happen, but we must please mypy
fn_name = "<unknown>"
else:
fn_name = _utils.get_callback_name(retry_state.fn)
label = retry_state.fn_label
logger.log(
log_level,
f"Starting call to '{fn_name}', "
f"Starting call to '{label}', "
f"this is the {_utils.to_ordinal(retry_state.attempt_number)} time calling it.",
)

Expand Down
10 changes: 2 additions & 8 deletions tenacity/before_sleep.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,6 @@

import typing

from tenacity import _utils

if typing.TYPE_CHECKING:
import logging

Expand Down Expand Up @@ -56,15 +54,11 @@ def log_it(retry_state: "RetryCallState") -> None:
verb, value = "returned", retry_state.outcome.result()
local_exc_info = False # exc_info does not apply when no exception

if retry_state.fn is None:
# NOTE(sileht): can't really happen, but we must please mypy
fn_name = "<unknown>"
else:
fn_name = _utils.get_callback_name(retry_state.fn)
label = retry_state.fn_label

logger.log(
log_level,
f"Retrying {fn_name} " f"in {retry_state.next_action.sleep} seconds as it {verb} {value}.",
f"Retrying {label} " f"in {retry_state.next_action.sleep} seconds as it {verb} {value}.",
exc_info=local_exc_info,
)

Expand Down