1 """Provide info to system health."""
3 from __future__
import annotations
6 from urllib.parse
import urlparse
11 from ..
import get_instance
12 from ..const
import SupportedDialect
13 from ..core
import Recorder
14 from ..util
import session_scope
15 from .mysql
import db_size_bytes
as mysql_db_size_bytes
16 from .postgresql
import db_size_bytes
as postgresql_db_size_bytes
17 from .sqlite
import db_size_bytes
as sqlite_db_size_bytes
19 DIALECT_TO_GET_SIZE = {
20 SupportedDialect.SQLITE: sqlite_db_size_bytes,
21 SupportedDialect.MYSQL: mysql_db_size_bytes,
22 SupportedDialect.POSTGRESQL: postgresql_db_size_bytes,
30 """Register system health callbacks."""
31 register.async_register_info(system_health_info)
34 def _get_db_stats(instance: Recorder, database_name: str) -> dict[str, Any]:
35 """Get the stats about the database."""
36 db_stats: dict[str, Any] = {}
37 with session_scope(session=instance.get_session(), read_only=
True)
as session:
39 (dialect_name := instance.dialect_name)
40 and (get_size := DIALECT_TO_GET_SIZE.get(dialect_name))
41 and (db_bytes :=
get_size(session, database_name))
43 db_stats[
"estimated_db_size"] = f
"{db_bytes/1024/1024:.2f} MiB"
49 """Get database engine info."""
50 db_engine_info: dict[str, Any] = {}
51 if dialect_name := instance.dialect_name:
52 db_engine_info[
"database_engine"] = dialect_name.value
53 if database_engine := instance.database_engine:
54 db_engine_info[
"database_version"] =
str(database_engine.version)
59 """Get info for the info page."""
62 recorder_runs_manager = instance.recorder_runs_manager
63 database_name = urlparse(instance.db_url).path.lstrip(
"/")
65 db_stats: dict[str, Any] = {}
67 if instance.async_db_ready.done():
68 db_stats = await instance.async_add_executor_job(
69 _get_db_stats, instance, database_name
72 "oldest_recorder_run": recorder_runs_manager.first.start,
73 "current_recorder_run": recorder_runs_manager.current.start,
75 return db_runs | db_stats | db_engine_info
int get_size(list[str] files_list)
dict[str, Any] _async_get_db_engine_info(Recorder instance)
None async_register(HomeAssistant hass, system_health.SystemHealthRegistration register)
dict[str, Any] _get_db_stats(Recorder instance, str database_name)
dict[str, Any] system_health_info(HomeAssistant hass)
Recorder get_instance(HomeAssistant hass)
Generator[Session] session_scope(*HomeAssistant|None hass=None, Session|None session=None, Callable[[Exception], bool]|None exception_filter=None, bool read_only=False)