From b612ea8b5d1be44f0c69218050829c0cf39dfef8 Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Mon, 19 Apr 2021 01:47:40 -1000 Subject: [PATCH] Add new services to the profiler (#17492) Co-authored-by: Martin Hjelmare Co-authored-by: Franck Nijhof --- source/_integrations/profiler.markdown | 43 ++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git a/source/_integrations/profiler.markdown b/source/_integrations/profiler.markdown index 4f24526ffa2..d271ec0e6b0 100644 --- a/source/_integrations/profiler.markdown +++ b/source/_integrations/profiler.markdown @@ -73,3 +73,46 @@ Stop logging the growth of objects in memory. | `type` | no | The type of object to dump to the log. When `start_log_objects` highlights the growth of a collection of objects in memory, this service can help investigate. The `repr` of each object that matches `type` will be logged. + +### Service `profiler.log_thread_frames` + +To help discover run away threads, why the executor is overloaded, or other threading problems, the current frames for each running thread will be logged when this service is called. + +An example is below: + +```txt +[homeassistant.components.profiler] Thread [SyncWorker_6]: File "/usr/local/lib/python3.8/threading.py", line 890, in _bootstrap + self._bootstrap_inner() + File "/usr/local/lib/python3.8/threading.py", line 932, in _bootstrap_inner + self.run() + File "/usr/local/lib/python3.8/threading.py", line 870, in run + self._target(*self._args, **self._kwargs) + File "/usr/local/lib/python3.8/concurrent/futures/thread.py", line 80, in _worker + work_item.run() + File "/usr/local/lib/python3.8/concurrent/futures/thread.py", line 57, in run + result = self.fn(*self.args, **self.kwargs) + File "/usr/src/homeassistant/homeassistant/components/samsungtv/media_player.py", line 139, in update + self._state = STATE_ON if self._bridge.is_on() else STATE_OFF + File "/usr/src/homeassistant/homeassistant/components/samsungtv/bridge.py", line 72, in is_on + return self._get_remote() is not None + File "/usr/src/homeassistant/homeassistant/components/samsungtv/bridge.py", line 274, in _get_remote + self._remote.open() + File "/usr/local/lib/python3.8/site-packages/samsungtvws/remote.py", line 146, in open + self.connection = websocket.create_connection( + File "/usr/local/lib/python3.8/site-packages/websocket/_core.py", line 511, in create_connection + websock.connect(url, **options) + File "/usr/local/lib/python3.8/site-packages/websocket/_core.py", line 219, in connect + self.sock, addrs = connect(url, self.sock_opt, proxy_info(**options), + File "/usr/local/lib/python3.8/site-packages/websocket/_http.py", line 120, in connect + sock = _open_socket(addrinfo_list, options.sockopt, options.timeout) + File "/usr/local/lib/python3.8/site-packages/websocket/_http.py", line 170, in _open_socket + sock.connect(address) +``` + +### Service `profiler.log_event_loop_scheduled` + +Log what is scheduled in the event loop. This can be helpful in tracking down integrations that do not stop listeners when Home Assistant stops or do not have sufficient locking to avoid scheduling updates before the previous update is finished. + +Each upcoming scheduled item is logged similar to the below example: + +`[homeassistant.components.profiler] Scheduled: .run_action(>>) at /usr/src/homeassistant/homeassistant/helpers/event.py:1175>`