From e3f0d92e62e64a819ab08aaa88668a1858f9daa6 Mon Sep 17 00:00:00 2001 From: Xavi Date: Tue, 5 Mar 2024 07:59:34 +0100 Subject: [PATCH 1/8] Abstract the Janitor reporting. New except for TimeOut the server --- mastofeed/runners/listener.py | 33 ++++++++++++++++++++++++--------- 1 file changed, 24 insertions(+), 9 deletions(-) diff --git a/mastofeed/runners/listener.py b/mastofeed/runners/listener.py index 4a50389..48a4662 100644 --- a/mastofeed/runners/listener.py +++ b/mastofeed/runners/listener.py @@ -7,6 +7,7 @@ from mastofeed.runners.runner_protocol import RunnerProtocol from definitions import ROOT_DIR import logging +from urllib3.exceptions import ReadTimeoutError class Listener(RunnerProtocol): @@ -31,17 +32,19 @@ def run(self) -> None: # Set the listener for the Streaming for User stuff mastodon_instance.stream_user(mention_listener) + + except ReadTimeoutError as e: + # Yeah, the servers may give a Timeout from time to time. + # How important is that? + self._notify_through_janitor(e) + # Log the error in a smaller way + self._logger.error(f"Server Timeout: {e}") + # Let's try an infinite loop + self.run() except Exception as e: - if self._config.get("janitor.active", False): - remote_url = self._config.get("janitor.remote_url") - if remote_url is not None and not self._config.get("publisher.dry_run"): - app_name = self._config.get("app.name") - Janitor(remote_url).error( - message="```\n" + full_stack() + "\n```", - summary=f"MastoFeed Listener [{app_name}] failed: {e}" - ) - + self._notify_through_janitor(e) + # Log the exception self._logger.exception(e) # Let's try an infinite loop self.run() @@ -55,6 +58,18 @@ def _get_default_mastodon_instance(self, named_account="default"): base_path=ROOT_DIR ) + def _notify_through_janitor(self, e): + is_janitor_active = self._config.get("janitor.active", False) + is_dry_run = self._config.get("publisher.dry_run", True) + remote_url = self._config.get("janitor.remote_url", None) + + if is_janitor_active and not is_dry_run and remote_url is not None: + app_name = self._config.get("app.name") + Janitor(remote_url).error( + message="```\n" + full_stack() + "\n```", + summary=f"MastoFeed Listener [{app_name}] failed: {e}" + ) + if __name__ == '__main__': Listener().run() From 035ca6fdb4bffaa39d97b90ca1c05f200233cf5b Mon Sep 17 00:00:00 2001 From: Xavi Date: Tue, 5 Mar 2024 08:05:11 +0100 Subject: [PATCH 2/8] format --- mastofeed/runners/listener.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mastofeed/runners/listener.py b/mastofeed/runners/listener.py index 48a4662..d60dee1 100644 --- a/mastofeed/runners/listener.py +++ b/mastofeed/runners/listener.py @@ -32,7 +32,7 @@ def run(self) -> None: # Set the listener for the Streaming for User stuff mastodon_instance.stream_user(mention_listener) - + except ReadTimeoutError as e: # Yeah, the servers may give a Timeout from time to time. # How important is that? From d01189e020d062a1db9f915bd15b6cfcc02e7aef Mon Sep 17 00:00:00 2001 From: Xavi Date: Tue, 5 Mar 2024 08:06:28 +0100 Subject: [PATCH 3/8] changelog --- CHANGELOG.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index aaba013..ef18e62 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,4 +5,8 @@ ### Added - Make Log rotation as default ([#5](https://github.com/XaviArnaus/masto-feed/pull/5)) -- Initial code, copied from the last [Mastodon Echo Bot](https://github.com/XaviArnaus/mastodon-echo-bot/) Unreleased 2.0.0 code \ No newline at end of file +- Initial code, copied from the last [Mastodon Echo Bot](https://github.com/XaviArnaus/mastodon-echo-bot/) Unreleased 2.0.0 code + +### Fixed + +- Server TimeOut makes the Listener to crash ([#7](https://github.com/XaviArnaus/masto-feed/pull/7)) \ No newline at end of file From c6c119919d3897955ab7dd4dff8d7d333305626c Mon Sep 17 00:00:00 2001 From: Xavi Date: Tue, 5 Mar 2024 08:36:06 +0100 Subject: [PATCH 4/8] Apply the Janitor abstraction to Main as well --- mastofeed/runners/main.py | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/mastofeed/runners/main.py b/mastofeed/runners/main.py index 2edb9c4..b1ddc6d 100644 --- a/mastofeed/runners/main.py +++ b/mastofeed/runners/main.py @@ -145,16 +145,20 @@ def run(self) -> None: self._publisher.publish_all_from_queue() except Exception as e: - if self._config.get("janitor.active", False): - remote_url = self._config.get("janitor.remote_url") - if remote_url is not None and not self._config.get("publisher.dry_run"): - app_name = self._config.get("app.name") - Janitor(remote_url).error( - message="```\n" + full_stack() + "\n```", - summary=f"MastoFeed Main [{app_name}] failed: {e}" - ) - + self._notify_through_janitor(e) self._logger.exception(e) + + def _notify_through_janitor(self, e): + is_janitor_active = self._config.get("janitor.active", False) + is_dry_run = self._config.get("publisher.dry_run", True) + remote_url = self._config.get("janitor.remote_url", None) + + if is_janitor_active and not is_dry_run and remote_url is not None: + app_name = self._config.get("app.name") + Janitor(remote_url).error( + message="```\n" + full_stack() + "\n```", + summary=f"MastoFeed Main [{app_name}] failed: {e}" + ) def load_active_parsers(self) -> dict: """Get the list of parsers that are active""" From b3608ea6789c94e328f1c2aead1b8e6dbe9f97ee Mon Sep 17 00:00:00 2001 From: Xavi Date: Tue, 5 Mar 2024 10:26:21 +0100 Subject: [PATCH 5/8] Format --- mastofeed/runners/main.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mastofeed/runners/main.py b/mastofeed/runners/main.py index b1ddc6d..6be0fe3 100644 --- a/mastofeed/runners/main.py +++ b/mastofeed/runners/main.py @@ -147,7 +147,7 @@ def run(self) -> None: except Exception as e: self._notify_through_janitor(e) self._logger.exception(e) - + def _notify_through_janitor(self, e): is_janitor_active = self._config.get("janitor.active", False) is_dry_run = self._config.get("publisher.dry_run", True) From 49e3174e249c34f8935bbefdf009e584916b251b Mon Sep 17 00:00:00 2001 From: Xavi Date: Wed, 6 Mar 2024 08:47:21 +0100 Subject: [PATCH 6/8] Commenting the Timeout except... seems like all crashes are silenced --- mastofeed/runners/listener.py | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/mastofeed/runners/listener.py b/mastofeed/runners/listener.py index d60dee1..29a0281 100644 --- a/mastofeed/runners/listener.py +++ b/mastofeed/runners/listener.py @@ -33,14 +33,14 @@ def run(self) -> None: # Set the listener for the Streaming for User stuff mastodon_instance.stream_user(mention_listener) - except ReadTimeoutError as e: - # Yeah, the servers may give a Timeout from time to time. - # How important is that? - self._notify_through_janitor(e) - # Log the error in a smaller way - self._logger.error(f"Server Timeout: {e}") - # Let's try an infinite loop - self.run() + # except ReadTimeoutError as e: + # # Yeah, the servers may give a Timeout from time to time. + # # How important is that? + # self._notify_through_janitor(e) + # # Log the error in a smaller way + # self._logger.error(f"Server Timeout: {e}") + # # Let's try an infinite loop + # self.run() except Exception as e: self._notify_through_janitor(e) From 64733eb74f5c546c2c1d0b26f16172b917fac611 Mon Sep 17 00:00:00 2001 From: Xavi Date: Wed, 6 Mar 2024 09:52:35 +0100 Subject: [PATCH 7/8] Uncommenting the except, crashes are shown, but the issue is not fixed --- mastofeed/runners/listener.py | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/mastofeed/runners/listener.py b/mastofeed/runners/listener.py index 29a0281..d60dee1 100644 --- a/mastofeed/runners/listener.py +++ b/mastofeed/runners/listener.py @@ -33,14 +33,14 @@ def run(self) -> None: # Set the listener for the Streaming for User stuff mastodon_instance.stream_user(mention_listener) - # except ReadTimeoutError as e: - # # Yeah, the servers may give a Timeout from time to time. - # # How important is that? - # self._notify_through_janitor(e) - # # Log the error in a smaller way - # self._logger.error(f"Server Timeout: {e}") - # # Let's try an infinite loop - # self.run() + except ReadTimeoutError as e: + # Yeah, the servers may give a Timeout from time to time. + # How important is that? + self._notify_through_janitor(e) + # Log the error in a smaller way + self._logger.error(f"Server Timeout: {e}") + # Let's try an infinite loop + self.run() except Exception as e: self._notify_through_janitor(e) From 266f93250f0b0474f7e01b435f69db34bc7f4064 Mon Sep 17 00:00:00 2001 From: Xavi Date: Thu, 7 Mar 2024 09:18:11 +0100 Subject: [PATCH 8/8] Trying to capture the MastodonReadTimeout --- mastofeed/runners/listener.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mastofeed/runners/listener.py b/mastofeed/runners/listener.py index d60dee1..2084f3a 100644 --- a/mastofeed/runners/listener.py +++ b/mastofeed/runners/listener.py @@ -7,7 +7,7 @@ from mastofeed.runners.runner_protocol import RunnerProtocol from definitions import ROOT_DIR import logging -from urllib3.exceptions import ReadTimeoutError +from mastodon.Mastodon import MastodonReadTimeout class Listener(RunnerProtocol): @@ -33,7 +33,7 @@ def run(self) -> None: # Set the listener for the Streaming for User stuff mastodon_instance.stream_user(mention_listener) - except ReadTimeoutError as e: + except MastodonReadTimeout as e: # Yeah, the servers may give a Timeout from time to time. # How important is that? self._notify_through_janitor(e)