Skip to content

Commit 4d9ebbb

Browse files
committed
Add optional label to BaseRetrying class
If label is set it will be used instead of a function name in before_sleep_log
1 parent 3100582 commit 4d9ebbb

File tree

5 files changed

+27
-21
lines changed

5 files changed

+27
-21
lines changed
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
---
2+
features:
3+
- "Add optional label to Retrying class to be shown in logs"

tenacity/__init__.py

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,8 @@
7979
from .before_sleep import before_sleep_log # noqa
8080
from .before_sleep import before_sleep_nothing # noqa
8181

82+
from ._utils import get_callback_name
83+
8284
try:
8385
import tornado
8486
except ImportError:
@@ -199,6 +201,7 @@ def __init__(
199201
reraise: bool = False,
200202
retry_error_cls: t.Type[RetryError] = RetryError,
201203
retry_error_callback: t.Optional[t.Callable[["RetryCallState"], t.Any]] = None,
204+
label: t.Optional[str] = None,
202205
):
203206
self.sleep = sleep
204207
self.stop = stop
@@ -211,6 +214,7 @@ def __init__(
211214
self._local = threading.local()
212215
self.retry_error_cls = retry_error_cls
213216
self.retry_error_callback = retry_error_callback
217+
self.label = label
214218

215219
def copy(
216220
self,
@@ -224,6 +228,7 @@ def copy(
224228
reraise: t.Union[bool, object] = _unset,
225229
retry_error_cls: t.Union[t.Type[RetryError], object] = _unset,
226230
retry_error_callback: t.Union[t.Optional[t.Callable[["RetryCallState"], t.Any]], object] = _unset,
231+
label: t.Optional[str] = _unset,
227232
) -> "BaseRetrying":
228233
"""Copy this object with some parameters changed if needed."""
229234
return self.__class__(
@@ -237,6 +242,7 @@ def copy(
237242
reraise=_first_set(reraise, self.reraise),
238243
retry_error_cls=_first_set(retry_error_cls, self.retry_error_cls),
239244
retry_error_callback=_first_set(retry_error_callback, self.retry_error_callback),
245+
label=_first_set(label, self.label),
240246
)
241247

242248
def __repr__(self) -> str:
@@ -247,7 +253,8 @@ def __repr__(self) -> str:
247253
f"sleep={self.sleep}, "
248254
f"retry={self.retry}, "
249255
f"before={self.before}, "
250-
f"after={self.after})>"
256+
f"after={self.after}, "
257+
f"label={self.label})>"
251258
)
252259

253260
@property
@@ -458,6 +465,16 @@ def seconds_since_start(self) -> t.Optional[float]:
458465
return None
459466
return self.outcome_timestamp - self.start_time
460467

468+
@property
469+
def fn_label(self):
470+
if self.retry_object.label is None:
471+
if self.fn is None:
472+
return "<unknown>"
473+
else:
474+
return get_callback_name(self.fn)
475+
else:
476+
return self.retry_object.label
477+
461478
def prepare_for_next_attempt(self) -> None:
462479
self.outcome = None
463480
self.outcome_timestamp = None

tenacity/after.py

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -36,14 +36,10 @@ def after_log(
3636
"""After call strategy that logs to some logger the finished attempt."""
3737

3838
def log_it(retry_state: "RetryCallState") -> None:
39-
if retry_state.fn is None:
40-
# NOTE(sileht): can't really happen, but we must please mypy
41-
fn_name = "<unknown>"
42-
else:
43-
fn_name = _utils.get_callback_name(retry_state.fn)
39+
label = retry_state.fn_label
4440
logger.log(
4541
log_level,
46-
f"Finished call to '{fn_name}' "
42+
f"Finished call to '{label}' "
4743
f"after {sec_format % retry_state.seconds_since_start}(s), "
4844
f"this was the {_utils.to_ordinal(retry_state.attempt_number)} time calling it.",
4945
)

tenacity/before.py

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -32,14 +32,10 @@ def before_log(logger: "logging.Logger", log_level: int) -> typing.Callable[["Re
3232
"""Before call strategy that logs to some logger the attempt."""
3333

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

tenacity/before_sleep.py

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,6 @@
1616

1717
import typing
1818

19-
from tenacity import _utils
20-
2119
if typing.TYPE_CHECKING:
2220
import logging
2321

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

59-
if retry_state.fn is None:
60-
# NOTE(sileht): can't really happen, but we must please mypy
61-
fn_name = "<unknown>"
62-
else:
63-
fn_name = _utils.get_callback_name(retry_state.fn)
57+
label = retry_state.fn_label
6458

6559
logger.log(
6660
log_level,
67-
f"Retrying {fn_name} " f"in {retry_state.next_action.sleep} seconds as it {verb} {value}.",
61+
f"Retrying {label} " f"in {retry_state.next_action.sleep} seconds as it {verb} {value}.",
6862
exc_info=local_exc_info,
6963
)
7064

0 commit comments

Comments
 (0)