Include message in captured tracebacks (#85196)

This matches the formatting of tracebacks from exceptions.

(cherry picked from commit 359173c006)
pull/85255/head
Matt Clay 7 months ago committed by Matt Davis
parent 3207e55ca2
commit 457b40d659

@ -30,7 +30,7 @@ def is_traceback_enabled(event: TracebackEvent) -> bool:
return _is_traceback_enabled(event) return _is_traceback_enabled(event)
def maybe_capture_traceback(event: TracebackEvent) -> str | None: def maybe_capture_traceback(msg: str, event: TracebackEvent) -> str | None:
""" """
Optionally capture a traceback for the current call stack, formatted as a string, if the specified traceback event is enabled. Optionally capture a traceback for the current call stack, formatted as a string, if the specified traceback event is enabled.
Frames marked with the `_skip_stackwalk` local are omitted. Frames marked with the `_skip_stackwalk` local are omitted.
@ -46,6 +46,7 @@ def maybe_capture_traceback(event: TracebackEvent) -> str | None:
# DTFIX-FUTURE: rewrite target-side tracebacks to point at controller-side paths? # DTFIX-FUTURE: rewrite target-side tracebacks to point at controller-side paths?
tb_lines.append('Traceback (most recent call last):\n') tb_lines.append('Traceback (most recent call last):\n')
tb_lines.extend(traceback.format_stack(frame_info.frame)) tb_lines.extend(traceback.format_stack(frame_info.frame))
tb_lines.append(f'Message: {msg}\n')
else: else:
tb_lines.append('(frame not found)\n') # pragma: nocover tb_lines.append('(frame not found)\n') # pragma: nocover

@ -1534,7 +1534,7 @@ class AnsibleModule(object):
exception=_messages.ErrorSummary( exception=_messages.ErrorSummary(
event=_messages.Event( event=_messages.Event(
msg=msg, msg=msg,
formatted_traceback=_traceback.maybe_capture_traceback(_traceback.TracebackEvent.ERROR), formatted_traceback=_traceback.maybe_capture_traceback(msg, _traceback.TracebackEvent.ERROR),
chain=_messages.EventChain( chain=_messages.EventChain(
msg_reason=_errors.MSG_REASON_DIRECT_CAUSE, msg_reason=_errors.MSG_REASON_DIRECT_CAUSE,
traceback_reason="The above exception was the direct cause of the following error:", traceback_reason="The above exception was the direct cause of the following error:",
@ -1554,7 +1554,7 @@ class AnsibleModule(object):
elif exception is _UNSET and (current_exception := t.cast(t.Optional[BaseException], sys.exc_info()[1])): elif exception is _UNSET and (current_exception := t.cast(t.Optional[BaseException], sys.exc_info()[1])):
formatted_traceback = _traceback.maybe_extract_traceback(current_exception, _traceback.TracebackEvent.ERROR) formatted_traceback = _traceback.maybe_extract_traceback(current_exception, _traceback.TracebackEvent.ERROR)
else: else:
formatted_traceback = _traceback.maybe_capture_traceback(_traceback.TracebackEvent.ERROR) formatted_traceback = _traceback.maybe_capture_traceback(msg, _traceback.TracebackEvent.ERROR)
if formatted_traceback: if formatted_traceback:
kwargs.update(exception=formatted_traceback) kwargs.update(exception=formatted_traceback)

@ -33,7 +33,7 @@ def warn(
event=_messages.Event( event=_messages.Event(
msg=warning, msg=warning,
help_text=help_text, help_text=help_text,
formatted_traceback=_traceback.maybe_capture_traceback(_traceback.TracebackEvent.WARNING), formatted_traceback=_traceback.maybe_capture_traceback(warning, _traceback.TracebackEvent.WARNING),
), ),
) )
@ -79,7 +79,7 @@ def deprecate(
event=_messages.Event( event=_messages.Event(
msg=msg, msg=msg,
help_text=help_text, help_text=help_text,
formatted_traceback=_traceback.maybe_capture_traceback(_traceback.TracebackEvent.DEPRECATED), formatted_traceback=_traceback.maybe_capture_traceback(msg, _traceback.TracebackEvent.DEPRECATED),
), ),
version=version, version=version,
date=date, date=date,

@ -38,7 +38,7 @@ def deprecate_value(
date=date, date=date,
version=version, version=version,
deprecator=_deprecator.get_best_deprecator(deprecator=deprecator, collection_name=collection_name), deprecator=_deprecator.get_best_deprecator(deprecator=deprecator, collection_name=collection_name),
formatted_traceback=_traceback.maybe_capture_traceback(_traceback.TracebackEvent.DEPRECATED_VALUE), formatted_traceback=_traceback.maybe_capture_traceback(msg, _traceback.TracebackEvent.DEPRECATED_VALUE),
) )
return deprecated.tag(value) return deprecated.tag(value)

@ -1468,7 +1468,7 @@ class ActionBase(ABC, _AnsiblePluginInfoMixin):
event = _messages.Event( event = _messages.Event(
msg=msg, msg=msg,
formatted_traceback=_traceback.maybe_capture_traceback(_traceback.TracebackEvent.ERROR), formatted_traceback=_traceback.maybe_capture_traceback(msg, _traceback.TracebackEvent.ERROR),
events=tuple(error.event for error in errors) if errors else None, events=tuple(error.event for error in errors) if errors else None,
) )

@ -699,7 +699,7 @@ class Display(metaclass=Singleton):
help_text=help_text, help_text=help_text,
obj=obj, obj=obj,
deprecator=_deprecator.get_best_deprecator(deprecator=deprecator, collection_name=collection_name), deprecator=_deprecator.get_best_deprecator(deprecator=deprecator, collection_name=collection_name),
formatted_traceback=_traceback.maybe_capture_traceback(_traceback.TracebackEvent.DEPRECATED), formatted_traceback=_traceback.maybe_capture_traceback(msg, _traceback.TracebackEvent.DEPRECATED),
) )
def _deprecated_with_plugin_info( def _deprecated_with_plugin_info(
@ -801,7 +801,7 @@ class Display(metaclass=Singleton):
msg=msg, msg=msg,
help_text=help_text, help_text=help_text,
formatted_source_context=formatted_source_context, formatted_source_context=formatted_source_context,
formatted_traceback=_traceback.maybe_capture_traceback(_traceback.TracebackEvent.WARNING), formatted_traceback=_traceback.maybe_capture_traceback(msg, _traceback.TracebackEvent.WARNING),
), ),
) )
@ -886,7 +886,7 @@ class Display(metaclass=Singleton):
if msg: if msg:
event = _messages.Event( event = _messages.Event(
msg=msg, msg=msg,
formatted_traceback=_traceback.maybe_capture_traceback(_traceback.TracebackEvent.WARNING), formatted_traceback=_traceback.maybe_capture_traceback(msg, _traceback.TracebackEvent.WARNING),
chain=_messages.EventChain( chain=_messages.EventChain(
msg_reason=_errors.MSG_REASON_DIRECT_CAUSE, msg_reason=_errors.MSG_REASON_DIRECT_CAUSE,
traceback_reason="The above exception was the direct cause of the following warning:", traceback_reason="The above exception was the direct cause of the following warning:",
@ -918,7 +918,7 @@ class Display(metaclass=Singleton):
else: else:
event = _messages.Event( event = _messages.Event(
msg=msg, msg=msg,
formatted_traceback=_traceback.maybe_capture_traceback(_traceback.TracebackEvent.ERROR), formatted_traceback=_traceback.maybe_capture_traceback(msg, _traceback.TracebackEvent.ERROR),
) )
error = _messages.ErrorSummary( error = _messages.ErrorSummary(

Loading…
Cancel
Save