Repository navigation
Make Exeption traceable in lazy listener #635
Description
Activity
- changed the title
[-]Make Exeption traceable in lazy listion[/-][+]Make Exeption traceable in lazy listener[/+]on Apr 20, 2022 - addedenhancementNew feature or requestNew feature or request
on Apr 20, 2022 Hi @jimmymaise, thanks for the feedback. We will look into this. This can be improved in future versions and/or needs to be clearly mentioned in the documents.
We are facing the same issue as @jimmymaise, I think it would be helpful to have the exception traceback (we are using sentry and would love to see what line is causing the issue).
We are also facing this issue; it's often unclear what is causing an exception (or swallowing them entirely).
I'm running into this issue frequently as well. I'd love to see this updated
I'm running into the same issue.
As a workaround, I was able to display the stack trace with the following code.
from concurrent.futures import Executor from functools import wraps from logging import Logger from typing import Callable from slack_bolt.kwargs_injection import build_required_kwargs from slack_bolt.lazy_listener.runner import LazyListenerRunner from slack_bolt.request import BoltRequest from slack_bolt.util.utils import get_arg_names_of_callable def build_runnable_function( func: Callable[..., None], logger: Logger, request: BoltRequest, ) -> Callable[[], None]: arg_names = get_arg_names_of_callable(func) @wraps(func) def request_wired_func_wrapper() -> None: try: func( **build_required_kwargs( logger=logger, required_arg_names=arg_names, request=request, response=None, this_func=func, ) ) except Exception as e: - logger.error(f"Failed to run an internal function ({e})") + logger.exception(f"Failed to run an internal function ({e})") return request_wired_func_wrapper class PatchedThreadLazyListenerRunner(LazyListenerRunner): logger: Logger def __init__( self, logger: Logger, executor: Executor, ): self.logger = logger self.executor = executor def start(self, function: Callable[..., None], request: BoltRequest) -> None: self.executor.submit( build_runnable_function( func=function, logger=self.logger, request=request, ) )app.listener_runner.lazy_listener_runner = PatchedThreadLazyListenerRunner( logger=app._framework_logger, executor=app.listener_runner.listener_executor, )
However, this is a hacky workaround that strongly depends on the internal structure of this framework, so it's not desirable. I would be happy if bolt framework would resolve this issue.
Reacted by Ian ArmstrongWe've been running into this issue as well. Has there been any progress on this issue?
Just stumbled across this issue as well, found a workaround by decorating the functions I use as lazy listeners but would love to see it included in base package 👍
Just stumbled upon the same issue, and I think the fix is quite simple by wrapping the lazy received with try-catch, no?
def process_message(body: dict, client: "WebClient") -> None: try: my_dispatch(body, client) except Exception: logger.exception("process_message failed") raise bolt_app.event("message")(ack=lambda ack: ack(), lazy=[process_message])
(Describe your issue and goal here)
Currently, using lazy listener for FAAS (such as AWS Lambda), it's really difficult to debug. If we have a exception, we just have something like
Failed to run an internal function (Exception ABC)We don't know exactly, what is the error, traceback, error line etc...
So should we have an option to enable the exception traceback or provide some meaningful error information to debug instead of just simply message like that
On the other hand, the document about error handling does not work with lazy listener so we also need to update.
https://slack.dev/bolt-python/concepts#errors
Category (place an
xin each of the[ ])Requirements
Please read the Contributing guidelines and Code of Conduct before creating this issue or pull request. By submitting, you are agreeing to those rules.