From 073afc842fb6a3d0d7e22b374d8396d4c921bbee Mon Sep 17 00:00:00 2001
From: Athanasius <Athanasius@miggy.org>
Date: Thu, 24 Nov 2022 14:09:57 +0000
Subject: [PATCH] eddn: New `--trace-on plugins.eddn.send` & other logging
 tweaks

* In case of apparent issues, have a `--trace-on` to better see what's (not)
  happening.

  All the old DBEUG logging, even if commented out, is now under this.
* Also added some INFO level logging for the legacy replay.jsonl conversion,
  as it should be one-time per user.
* Some additional DEBUG logging for closing down.
---
 plugins/eddn.py | 42 ++++++++++++++++++++++++++++++++++--------
 1 file changed, 34 insertions(+), 8 deletions(-)

diff --git a/plugins/eddn.py b/plugins/eddn.py
index 805f45cf..366f29f3 100644
--- a/plugins/eddn.py
+++ b/plugins/eddn.py
@@ -175,6 +175,10 @@ class EDDNSender:
 
         self.queue_processing = Lock()
         # Initiate retry/send-now timer
+        logger.trace_if(
+            "plugin.eddn.send",
+            f"First queue run scheduled for {self.eddn.REPLAY_STARTUP_DELAY}ms from now"
+        )
         self.eddn.parent.after(self.eddn.REPLAY_STARTUP_DELAY, self.queue_check_and_send, True)
 
     def sqlite_queue_v1(self) -> sqlite3.Connection:
@@ -227,6 +231,9 @@ class EDDNSender:
                 db_conn.close()
                 raise e
 
+        else:
+            logger.info("New `eddn_queue-v1.db` created")
+
         # We return only the connection, so tidy up
         db.close()
 
@@ -237,6 +244,7 @@ class EDDNSender:
         filename = config.app_dir_path / 'replay.jsonl'
         try:
             with open(filename, 'r+', buffering=1) as replay_file:
+                logger.info("Converting legacy `replay.jsonl` to `eddn_queue-v1.db`")
                 for line in replay_file:
                     cmdr, msg = json.loads(line)
                     self.add_message(cmdr, msg)
@@ -247,15 +255,18 @@ class EDDNSender:
         finally:
             # Best effort at removing the file/contents
             # NB: The legacy code assumed it could write to the file.
+            logger.info("Converson` to `eddn_queue-v1.db` complete, removing `replay.jsonl`")
             replay_file = open(filename, 'w')  # Will truncate
             replay_file.close()
             os.unlink(filename)
 
     def close(self) -> None:
         """Clean up any resources."""
+        logger.debug('Closing db cursor.')
         if self.db:
             self.db.close()
 
+        logger.debug('Closing db connection.')
         if self.db_conn:
             self.db_conn.close()
 
@@ -277,6 +288,7 @@ class EDDNSender:
         :param msg: The full, transmission-ready, EDDN message.
         :return: ID of the successfully inserted row.
         """
+        logger.trace_if("plugin.eddn.send", f"Message for {msg['$schemaRef']=}")
         # Cater for legacy replay.json messages
         if 'header' not in msg:
             msg['header'] = {
@@ -315,6 +327,7 @@ class EDDNSender:
             # Can't possibly be a valid row id
             return -1
 
+        logger.trace_if("plugin.eddn.send", f"Message for {msg['$schemaRef']=} recorded, id={self.db.lastrowid}")
         return self.db.lastrowid or -1
 
     def delete_message(self, row_id: int) -> None:
@@ -323,6 +336,7 @@ class EDDNSender:
 
         :param row_id: id of message to be deleted.
         """
+        logger.trace_if("plugin.eddn.send", f"Deleting message with {row_id=}")
         self.db.execute(
             """
             DELETE FROM messages WHERE id = :row_id
@@ -338,6 +352,7 @@ class EDDNSender:
         :param id:
         :return:
         """
+        logger.trace_if("plugin.eddn.send", f"Sending message with {id=}")
         self.db.execute(
             """
             SELECT * FROM messages WHERE id = :row_id
@@ -373,6 +388,7 @@ class EDDNSender:
         :param msg: Fully formed, string, message.
         :return: `True` for "now remove this message from the queue"
         """
+        logger.trace_if("plugin.eddn.send", "Sending message")
         should_return, new_data = killswitch.check_killswitch('plugins.eddn.send', json.loads(msg))
         if should_return:
             logger.warning('eddn.send has been disabled via killswitch. Returning.')
@@ -432,27 +448,31 @@ class EDDNSender:
 
         return False
 
-    def queue_check_and_send(self, reschedule: bool = False) -> None:
+    def queue_check_and_send(self, reschedule: bool = False) -> None:  # noqa: CCR001
         """
         Check if we should be sending queued messages, and send if we should.
 
         :param reschedule: Boolean indicating if we should call `after()` again.
         """
-        logger.debug("Called")
+        logger.trace_if("plugin.eddn.send", "Called")
         # Mutex in case we're already processing
         if not self.queue_processing.acquire(blocking=False):
-            logger.debug("Couldn't obtain mutex")
+            logger.trace_if("plugin.eddn.send", "Couldn't obtain mutex")
             if reschedule:
+                logger.trace_if("plugin.eddn.send", f"Next run scheduled for {self.eddn.REPLAY_PERIOD}ms from now")
                 self.eddn.parent.after(self.eddn.REPLAY_PERIOD, self.queue_check_and_send, reschedule)
 
+            else:
+                logger.trace_if("plugin.eddn.send", "NO next run scheduled (there should be another one already set)")
+
             return
 
-        # logger.debug("Obtained mutex")
+        logger.trace_if("plugin.eddn.send", "Obtained mutex")
         # Used to indicate if we've rescheduled at the faster rate already.
         have_rescheduled = False
         # We send either if docked or 'Delay sending until docked' not set
         if this.docked or not (config.get_int('output') & config.OUT_EDDN_DELAY):
-            # logger.debug("Should send")
+            logger.trace_if("plugin.eddn.send", "Should send")
             # We need our own cursor here, in case the semantics of
             # tk `after()` could allow this to run in the middle of other
             # database usage.
@@ -488,18 +508,21 @@ class EDDNSender:
                         #   is bad", i.e. an EDDN Gateway problem.  Thus, in that case
                         #   we do *NOT* schedule attempting the next message.
                         # Always re-schedule as this is only a "Don't hammer EDDN" delay
+                        logger.trace_if("plugin.eddn.send", f"Next run scheduled for {self.eddn.REPLAY_DELAY}ms from "
+                                                            "now")
                         self.eddn.parent.after(self.eddn.REPLAY_DELAY, self.queue_check_and_send, reschedule)
                         have_rescheduled = True
 
                 db_cursor.close()
 
-        # else:
-        #    logger.debug("Should NOT send")
+        else:
+            logger.trace_if("plugin.eddn.send", "Should NOT send")
 
         self.queue_processing.release()
-        # logger.debug("Mutex released")
+        logger.trace_if("plugin.eddn.send", "Mutex released")
         if reschedule and not have_rescheduled:
             # Set us up to run again per the configured period
+            logger.trace_if("plugin.eddn.send", f"Next run scheduled for {self.eddn.REPLAY_PERIOD}ms from now")
             self.eddn.parent.after(self.eddn.REPLAY_PERIOD, self.queue_check_and_send, reschedule)
 
     def _log_response(
@@ -935,6 +958,7 @@ class EDDN:
             # 'Station data'
             if config.get_int('output') & config.OUT_EDDN_SEND_STATION_DATA:
                 # And user has 'station data' configured to be sent
+                logger.trace_if("plugin.eddn.send", "Recording/sending 'station' message")
                 if 'header' not in msg:
                     msg['header'] = self.standard_header()
 
@@ -944,12 +968,14 @@ class EDDN:
 
         elif config.get_int('output') & config.OUT_EDDN_SEND_NON_STATION:
             # Any data that isn't 'station' is configured to be sent
+            logger.trace_if("plugin.eddn.send", "Recording 'non-station' message")
             if 'header' not in msg:
                 msg['header'] = self.standard_header()
 
             msg_id = self.sender.add_message(cmdr, msg)
             if this.docked or not (config.get_int('output') & config.OUT_EDDN_DELAY):
                 # No delay in sending configured, so attempt immediately
+                logger.trace_if("plugin.eddn.send", "Sending 'non-station' message")
                 self.sender.send_message_by_id(msg_id)
 
     def standard_header(