From eb05a6eddd41f43690f7dd48d7273598eb3749fa Mon Sep 17 00:00:00 2001 From: Konrad Dysput Date: Mon, 30 Sep 2024 16:47:01 +0200 Subject: [PATCH] Wait for events in the queue (#24) # Why Feedback from our users - in the server app it's fine to just wait a second for events to send if the application doesn't end with an unhandled exception. This change allows the setup a timeout for the queue to clean up on the application exit. Thanks to this we can see all reports from our demo, or we're using if someone is testing us with a simple script, the data is in Backtrace --------- Co-authored-by: Sebastian Alex --- backtracepython/client.py | 9 ++++++++- backtracepython/report_queue.py | 13 +++++-------- 2 files changed, 13 insertions(+), 9 deletions(-) diff --git a/backtracepython/client.py b/backtracepython/client.py index 7d1b587..e034946 100644 --- a/backtracepython/client.py +++ b/backtracepython/client.py @@ -1,3 +1,4 @@ +import atexit import sys from backtracepython.attributes.attribute_manager import attribute_manager @@ -89,6 +90,7 @@ def initialize( context_line_count=200, collect_source_code=True, disable_global_handler=False, + exit_timeout=4, ): globs.endpoint = construct_submission_url(endpoint, token) globs.debug_backtrace = debug_backtrace @@ -102,6 +104,7 @@ def initialize( ignore_ssl_certificate, globs.debug_backtrace, ), + exit_timeout, ( SourceCodeHandler(tab_width, context_line_count) if collect_source_code @@ -113,6 +116,9 @@ def initialize( globs.next_except_hook = sys.excepthook sys.excepthook = bt_except_hook + if exit_timeout > 0: + atexit.register(finalize) + def construct_submission_url(endpoint, token): if "submit.backtrace.io" in endpoint or token is None: @@ -132,7 +138,8 @@ def construct_submission_url(endpoint, token): def finalize(): if globs.handler is None: return - globs.handler.dispose() + globs.handler.finish() + globs.handler = None def send_last_exception(**kwargs): diff --git a/backtracepython/report_queue.py b/backtracepython/report_queue.py index a42048d..a29201a 100644 --- a/backtracepython/report_queue.py +++ b/backtracepython/report_queue.py @@ -8,9 +8,10 @@ class ReportQueue: - def __init__(self, request_handler, source_code_handler=None): + def __init__(self, request_handler, exit_timeout, source_code_handler=None): self.request_handler = request_handler self.source_code_handler = source_code_handler + self.exit_timeout = exit_timeout # report submission tasks queue self.report_queue = queue.Queue() @@ -41,12 +42,8 @@ def process(self, report, attachments): self.source_code_handler.collect(report) self.request_handler.send(report, attachments) - def __del__(self): - self.dispose() - - def dispose(self): + def finish(self): # Put a sentinel value to stop the worker thread - self.active = False self.report_queue.put_nowait(None) - self.report_queue.join() - self.worker_thread.join() + self.worker_thread.join(timeout=self.exit_timeout) + self.active = False