From 83e91efc06694889f46ab3beec5ff569905d995d Mon Sep 17 00:00:00 2001 From: Peter Giacomo Lombardo Date: Thu, 8 Oct 2020 15:06:18 +0200 Subject: [PATCH 1/2] Diagnostics: Add debug method to dump state --- instana/agent/host.py | 40 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/instana/agent/host.py b/instana/agent/host.py index da3dcbd9..71b98961 100644 --- a/instana/agent/host.py +++ b/instana/agent/host.py @@ -103,6 +103,7 @@ def can_send(self): @return: Boolean """ # Watch for pid change (fork) + self.last_fork_check = datetime.now() current_pid = os.getpid() if self._boot_pid != current_pid: self._boot_pid = current_pid @@ -280,6 +281,45 @@ def handle_agent_tasks(self, task): self.__task_response(task["messageId"], payload) + + def diagnostics(self): + import threading + dt_format = "%Y-%m-%d %H:%M:%S" + + logger.warning("====> Instana Python Language Agent Diagnostics <====") + + logger.warning("----> Agent <----") + logger.warning("is_agent_ready: %s", self.is_agent_ready()) + logger.warning("is_timed_out: %s", self.is_timed_out()) + if self.last_seen is None: + logger.warning("last_seen: None") + else: + logger.warning("last_seen: %s", self.last_seen.strftime(dt_format)) + + if self.announce_data is not None: + logger.warning("announce_data: %s", self.announce_data.__dict__) + else: + logger.warning("announce_data: None") + + logger.warning("Options: %s", self.options.__dict__) + + logger.warning("----> StateMachine <----") + logger.warning("State: %s", self.machine.fsm.current) + + logger.warning("----> Collector <----") + logger.warning("Collector: %s", self.collector) + logger.warning("is_collector_thread_running?: %s", self.collector.is_reporting_thread_running()) + logger.warning("background_report_lock.locked?: %s", self.collector.background_report_lock.locked()) + logger.warning("ready_to_start: %s", self.collector.ready_to_start) + logger.warning("reporting_thread: %s", self.collector.reporting_thread) + logger.warning("report_interval: %s", self.collector.report_interval) + logger.warning("should_send_snapshot_data: %s", self.collector.should_send_snapshot_data()) + logger.warning("spans in queue: %s", self.collector.span_queue.qsize()) + logger.warning("thread_shutdown is_set: %s", self.collector.thread_shutdown.is_set()) + + logger.warning("----> Threads <----") + logger.warning("Threads: %s", threading.enumerate()) + def __task_response(self, message_id, data): """ When the host agent passes us a task and we do it, this function is used to From fc41c1ec8364b3d1591e5f750d2a99bed400f399 Mon Sep 17 00:00:00 2001 From: Peter Giacomo Lombardo Date: Fri, 9 Oct 2020 12:48:03 +0200 Subject: [PATCH 2/2] Wrap diagnostics in exception handler --- instana/agent/host.py | 72 +++++++++++++++++++++++-------------------- 1 file changed, 39 insertions(+), 33 deletions(-) diff --git a/instana/agent/host.py b/instana/agent/host.py index 71b98961..07f2f6d4 100644 --- a/instana/agent/host.py +++ b/instana/agent/host.py @@ -283,42 +283,48 @@ def handle_agent_tasks(self, task): def diagnostics(self): - import threading - dt_format = "%Y-%m-%d %H:%M:%S" + """ + Helper function to dump out state. + """ + try: + import threading + dt_format = "%Y-%m-%d %H:%M:%S" - logger.warning("====> Instana Python Language Agent Diagnostics <====") + logger.warning("====> Instana Python Language Agent Diagnostics <====") - logger.warning("----> Agent <----") - logger.warning("is_agent_ready: %s", self.is_agent_ready()) - logger.warning("is_timed_out: %s", self.is_timed_out()) - if self.last_seen is None: - logger.warning("last_seen: None") - else: - logger.warning("last_seen: %s", self.last_seen.strftime(dt_format)) + logger.warning("----> Agent <----") + logger.warning("is_agent_ready: %s", self.is_agent_ready()) + logger.warning("is_timed_out: %s", self.is_timed_out()) + if self.last_seen is None: + logger.warning("last_seen: None") + else: + logger.warning("last_seen: %s", self.last_seen.strftime(dt_format)) - if self.announce_data is not None: - logger.warning("announce_data: %s", self.announce_data.__dict__) - else: - logger.warning("announce_data: None") - - logger.warning("Options: %s", self.options.__dict__) - - logger.warning("----> StateMachine <----") - logger.warning("State: %s", self.machine.fsm.current) - - logger.warning("----> Collector <----") - logger.warning("Collector: %s", self.collector) - logger.warning("is_collector_thread_running?: %s", self.collector.is_reporting_thread_running()) - logger.warning("background_report_lock.locked?: %s", self.collector.background_report_lock.locked()) - logger.warning("ready_to_start: %s", self.collector.ready_to_start) - logger.warning("reporting_thread: %s", self.collector.reporting_thread) - logger.warning("report_interval: %s", self.collector.report_interval) - logger.warning("should_send_snapshot_data: %s", self.collector.should_send_snapshot_data()) - logger.warning("spans in queue: %s", self.collector.span_queue.qsize()) - logger.warning("thread_shutdown is_set: %s", self.collector.thread_shutdown.is_set()) - - logger.warning("----> Threads <----") - logger.warning("Threads: %s", threading.enumerate()) + if self.announce_data is not None: + logger.warning("announce_data: %s", self.announce_data.__dict__) + else: + logger.warning("announce_data: None") + + logger.warning("Options: %s", self.options.__dict__) + + logger.warning("----> StateMachine <----") + logger.warning("State: %s", self.machine.fsm.current) + + logger.warning("----> Collector <----") + logger.warning("Collector: %s", self.collector) + logger.warning("is_collector_thread_running?: %s", self.collector.is_reporting_thread_running()) + logger.warning("background_report_lock.locked?: %s", self.collector.background_report_lock.locked()) + logger.warning("ready_to_start: %s", self.collector.ready_to_start) + logger.warning("reporting_thread: %s", self.collector.reporting_thread) + logger.warning("report_interval: %s", self.collector.report_interval) + logger.warning("should_send_snapshot_data: %s", self.collector.should_send_snapshot_data()) + logger.warning("spans in queue: %s", self.collector.span_queue.qsize()) + logger.warning("thread_shutdown is_set: %s", self.collector.thread_shutdown.is_set()) + + logger.warning("----> Threads <----") + logger.warning("Threads: %s", threading.enumerate()) + except Exception: + logger.warning("Non-fatal diagnostics exception: ", exc_info=True) def __task_response(self, message_id, data): """