From 3a6c171e9ee24faf5181288b32967dc6d0375d07 Mon Sep 17 00:00:00 2001 From: joaomarcos Date: Fri, 19 Jun 2026 19:05:33 -0300 Subject: [PATCH] fix(gateway): log signal transport response and bubble cron live adapter errors --- cron/scheduler.py | 32 +++++++++++++++++++++++--------- gateway/platforms/signal.py | 1 + 2 files changed, 24 insertions(+), 9 deletions(-) diff --git a/cron/scheduler.py b/cron/scheduler.py index 413b582b125f..0837179b5970 100644 --- a/cron/scheduler.py +++ b/cron/scheduler.py @@ -810,6 +810,7 @@ def _deliver_result(job: dict, content: str, adapters=None, loop=None) -> Option # rooms (e.g. Matrix) where the standalone HTTP path cannot encrypt. runtime_adapter = (adapters or {}).get(platform) delivered = False + target_errors = [] if runtime_adapter is not None and loop is not None and getattr(loop, "is_running", lambda: False)(): send_metadata = {"thread_id": thread_id} if thread_id else None try: @@ -824,18 +825,26 @@ def _deliver_result(job: dict, content: str, adapters=None, loop=None) -> Option ) if future is None: adapter_ok = False + target_errors.append("live adapter event loop scheduling failed") else: try: send_result = future.result(timeout=60) - except TimeoutError: + except TimeoutError as te: future.cancel() + target_errors.append(f"live adapter send timed out: {te}") raise - if send_result and not getattr(send_result, "success", True): - err = getattr(send_result, "error", "unknown") + except Exception as ex: + target_errors.append(f"live adapter send failed: {ex}") + raise + + if send_result is None or not getattr(send_result, "success", True): + err = getattr(send_result, "error", "unknown") if send_result else "no response from adapter" + msg = f"live adapter send to {platform_name}:{chat_id} failed: {err}" logger.warning( - "Job '%s': live adapter send to %s:%s failed (%s), falling back to standalone", - job["id"], platform_name, chat_id, err, + "Job '%s': %s, falling back to standalone", + job["id"], msg, ) + target_errors.append(msg) adapter_ok = False # fall through to standalone path elif ( send_result @@ -867,9 +876,12 @@ def _deliver_result(job: dict, content: str, adapters=None, loop=None) -> Option logger.info("Job '%s': delivered to %s:%s via live adapter", job["id"], platform_name, chat_id) delivered = True except Exception as e: + err_msg = f"live adapter delivery to {platform_name}:{chat_id} failed: {e}" + if not any(err_msg in err for err in target_errors): + target_errors.append(err_msg) logger.warning( - "Job '%s': live adapter delivery to %s:%s failed (%s), falling back to standalone", - job["id"], platform_name, chat_id, e, + "Job '%s': %s, falling back to standalone", + job["id"], err_msg, ) if not delivered: @@ -889,13 +901,15 @@ def _deliver_result(job: dict, content: str, adapters=None, loop=None) -> Option except Exception as e: msg = f"delivery to {platform_name}:{chat_id} failed: {e}" logger.error("Job '%s': %s", job["id"], msg) - delivery_errors.append(msg) + target_errors.extend([msg]) + delivery_errors.extend(target_errors) continue if result and result.get("error"): msg = f"delivery error: {result['error']}" logger.error("Job '%s': %s", job["id"], msg) - delivery_errors.append(msg) + target_errors.extend([msg]) + delivery_errors.extend(target_errors) continue logger.info("Job '%s': delivered to %s:%s", job["id"], platform_name, chat_id) diff --git a/gateway/platforms/signal.py b/gateway/platforms/signal.py index 9a7b93ef936f..2d8b1c33090b 100644 --- a/gateway/platforms/signal.py +++ b/gateway/platforms/signal.py @@ -1024,6 +1024,7 @@ class SignalAdapter(BasePlatformAdapter): else: params["recipient"] = [await self._resolve_recipient(chat_id)] + logger.info("[Signal] Sending response (%d chars) to %s", len(plain_text), chat_id) result = await self._rpc("send", params) if result is not None: