From 149120b749ee548cd904af2f45ea2675f79e8c9c Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Sun, 19 May 2024 21:52:28 -1000 Subject: [PATCH] Add setup time detail to diagnostics (#117766) --- .../components/diagnostics/__init__.py | 21 +++++++++---------- homeassistant/setup.py | 8 +++++++ tests/components/diagnostics/test_init.py | 2 ++ tests/test_setup.py | 5 +++++ 4 files changed, 25 insertions(+), 11 deletions(-) diff --git a/homeassistant/components/diagnostics/__init__.py b/homeassistant/components/diagnostics/__init__.py index 6c70e0dc110..481c02bad68 100644 --- a/homeassistant/components/diagnostics/__init__.py +++ b/homeassistant/components/diagnostics/__init__.py @@ -24,6 +24,7 @@ from homeassistant.helpers.json import ( from homeassistant.helpers.system_info import async_get_system_info from homeassistant.helpers.typing import ConfigType from homeassistant.loader import async_get_custom_components, async_get_integration +from homeassistant.setup import async_get_domain_setup_times from homeassistant.util.json import format_unserializable_data from .const import DOMAIN, REDACTED, DiagnosticsSubType, DiagnosticsType @@ -178,17 +179,15 @@ async def _async_get_json_file_response( "version": cc_obj.version, "requirements": cc_obj.requirements, } + payload = { + "home_assistant": hass_sys_info, + "custom_components": custom_components, + "integration_manifest": integration.manifest, + "setup_times": async_get_domain_setup_times(hass, domain), + "data": data, + } try: - json_data = json.dumps( - { - "home_assistant": hass_sys_info, - "custom_components": custom_components, - "integration_manifest": integration.manifest, - "data": data, - }, - indent=2, - cls=ExtendedJSONEncoder, - ) + json_data = json.dumps(payload, indent=2, cls=ExtendedJSONEncoder) except TypeError: _LOGGER.error( "Failed to serialize to JSON: %s/%s%s. Bad data at %s", @@ -197,7 +196,7 @@ async def _async_get_json_file_response( f"/{DiagnosticsSubType.DEVICE.value}/{sub_id}" if sub_id is not None else "", - format_unserializable_data(find_paths_unserializable_data(data)), + format_unserializable_data(find_paths_unserializable_data(payload)), ) return web.Response(status=HTTPStatus.INTERNAL_SERVER_ERROR) diff --git a/homeassistant/setup.py b/homeassistant/setup.py index 728fc0a3b77..89848c1488e 100644 --- a/homeassistant/setup.py +++ b/homeassistant/setup.py @@ -811,3 +811,11 @@ def async_get_setup_timings(hass: core.HomeAssistant) -> dict[str, float]: domain_timings[domain] = total_top_level + group_max return domain_timings + + +@callback +def async_get_domain_setup_times( + hass: core.HomeAssistant, domain: str +) -> Mapping[str | None, dict[SetupPhases, float]]: + """Return timing data for each integration.""" + return _setup_times(hass).get(domain, {}) diff --git a/tests/components/diagnostics/test_init.py b/tests/components/diagnostics/test_init.py index dff71d9edbf..5704131aa23 100644 --- a/tests/components/diagnostics/test_init.py +++ b/tests/components/diagnostics/test_init.py @@ -93,6 +93,7 @@ async def test_download_diagnostics( assert await _get_diagnostics_for_config_entry(hass, hass_client, config_entry) == { "home_assistant": hass_sys_info, + "setup_times": {}, "custom_components": { "test": { "documentation": "http://example.com", @@ -256,6 +257,7 @@ async def test_download_diagnostics( "requirements": [], }, "data": {"device": "info"}, + "setup_times": {}, } diff --git a/tests/test_setup.py b/tests/test_setup.py index 50dd8bba6c5..27d4b32d32f 100644 --- a/tests/test_setup.py +++ b/tests/test_setup.py @@ -1102,6 +1102,11 @@ async def test_async_get_setup_timings(hass) -> None: "sensor": 1, "filter": 2, } + assert setup.async_get_domain_setup_times(hass, "filter") == { + "123456": { + setup.SetupPhases.PLATFORM_SETUP: 2, + }, + } async def test_setup_config_entry_from_yaml(