Source code for nameko_chassis.debug
import textwrap
from typing import List
try:
import rich # noqa
from rich.columns import Columns # noqa
from rich.console import RenderableType # noqa
from rich.panel import Panel # noqa
has_rich = True
except ImportError:
has_rich = False
from .service import ServiceState
[docs]def debug_runner(runner):
"""
Dump debug information about service state to standard output.
Call this method from within nameko backdoor which exposes a ``runner``
local variable.
If rich_ is available, the output will be way prettier than you'd expect :)
.. _rich: https://github.com/willmcgugan/rich
"""
func = debug_state_rich if has_rich else debug_state_simple
for container in runner.containers:
service_state = ServiceState.from_container(container)
func(service_state)
[docs]def debug_state_simple(state: ServiceState) -> None:
"""
Print service state to stdout with some rudimentary formatting.
"""
print(
f"Container for service '{state.service_name}' with {len(state.entrypoints)} entrypoints and {len(state.dependencies)} dependencies"
)
print(f"Running {state.running_workers}/{state.max_workers} worker threads:")
for i, worker_state in enumerate(state.worker_states):
print(
textwrap.dedent(
f"""
------------
Thread #{i}: {worker_state.class_name}.{worker_state.method_name}
Args: {worker_state.args}
Kwargs: {worker_state.kwargs}
Context data: {worker_state.data}
"""
)
)
print("".join(worker_state.stacktrace))
[docs]def debug_state_rich(state: ServiceState) -> None:
"""
Pretty-print service state using rich.
"""
renderables: List[RenderableType] = [
f"""{len(state.entrypoints)} entrypoints
{len(state.dependencies)} dependencies
Running {state.running_workers}/{state.max_workers} worker threads"""
]
for i, worker_state in enumerate(state.worker_states):
formatted_stack = "".join(
f"[bold]{line}[/bold]"
if "site-packages" not in line
else f"[dim]{line}[/dim]"
for line in worker_state.stacktrace
)
renderables.append(
Panel(
f"""
Args: {worker_state.args}
Kwargs: {worker_state.kwargs}
Context data: {worker_state.data}
Traceback:
{formatted_stack}""",
title=f"Thread #{i}: [magenta]{worker_state.class_name}.{worker_state.method_name}[/magenta]",
)
)
rich.print(Panel(Columns(renderables), title=f"[bold]{state.service_name}[/bold]"))