Skip to content

Commit 73c8e0d

Browse files
authored
Merge branch 'master' into enh/open-template-info
2 parents 07639ec + cb35a6e commit 73c8e0d

File tree

5 files changed

+72
-26
lines changed

5 files changed

+72
-26
lines changed
Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,26 @@
1+
import logging
2+
13
from fastapi import FastAPI
24
from models_library.api_schemas_dynamic_sidecar.telemetry import DiskUsage
35
from pydantic import validate_call
46
from servicelib.rabbitmq import RPCRouter
57

68
from ...modules.system_monitor import get_disk_usage_monitor
79

10+
_logger = logging.getLogger(__name__)
11+
812
router = RPCRouter()
913

1014

1115
@router.expose()
1216
@validate_call(config={"arbitrary_types_allowed": True})
1317
async def update_disk_usage(app: FastAPI, *, usage: dict[str, DiskUsage]) -> None:
14-
get_disk_usage_monitor(app).set_disk_usage_for_path(usage)
18+
disk_usage_monitor = get_disk_usage_monitor(app)
19+
20+
if disk_usage_monitor is None:
21+
_logger.warning(
22+
"Disk usage monitor not initialized, could not update disk usage"
23+
)
24+
return
25+
26+
disk_usage_monitor.set_disk_usage_for_path(usage)

services/dynamic-sidecar/src/simcore_service_dynamic_sidecar/core/application.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -183,9 +183,9 @@ def create_app():
183183
setup_background_log_fetcher(app)
184184
setup_resource_tracking(app)
185185
setup_notifications(app)
186-
setup_system_monitor(app)
187186

188187
setup_mounted_fs(app)
188+
setup_system_monitor(app)
189189
setup_inputs(app)
190190
setup_outputs(app)
191191

services/dynamic-sidecar/src/simcore_service_dynamic_sidecar/modules/system_monitor/_disk_usage.py

Lines changed: 28 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,8 @@ class DiskUsageMonitor:
7878

7979
@cached_property
8080
def _monitored_paths_set(self) -> set[Path]:
81+
if not self.monitored_paths:
82+
return set()
8183
return set.union(*self.monitored_paths.values())
8284

8385
@cached_property
@@ -137,7 +139,7 @@ async def _publish_disk_usage(self, usage: dict[MountPathCategory, DiskUsage]):
137139
self.app, user_id=self.user_id, node_id=self.node_id, usage=usage
138140
)
139141

140-
async def _monitor(self) -> None:
142+
async def get_disk_usage(self) -> dict[MountPathCategory, DiskUsage]:
141143
measured_disk_usage = await self._get_measured_disk_usage()
142144

143145
local_disk_usage = self._get_local_disk_usage(measured_disk_usage)
@@ -167,12 +169,14 @@ async def _monitor(self) -> None:
167169
msg = f"Could not assign {disk_usage=} for {folder_names=}"
168170
raise RuntimeError(msg)
169171

170-
supported_usage = {k: v for k, v in usage.items() if k in _SUPPORTED_ITEMS}
172+
return {k: v for k, v in usage.items() if k in _SUPPORTED_ITEMS}
171173

174+
async def _monitor(self) -> None:
175+
disk_usage = await self.get_disk_usage()
172176
# notify only when usage changes
173-
if self._last_usage != supported_usage:
174-
await self._publish_disk_usage(supported_usage)
175-
self._last_usage = supported_usage
177+
if self._last_usage != disk_usage:
178+
await self._publish_disk_usage(disk_usage)
179+
self._last_usage = disk_usage
176180

177181
async def setup(self) -> None:
178182
self._monitor_task = create_periodic_task(
@@ -202,25 +206,30 @@ def _get_monitored_paths(app: FastAPI) -> dict[MountPathCategory, set[Path]]:
202206
}
203207

204208

205-
def get_disk_usage_monitor(app: FastAPI) -> DiskUsageMonitor:
206-
disk_usage_monitor: DiskUsageMonitor = app.state.disk_usage_monitor
207-
return disk_usage_monitor
209+
def create_disk_usage_monitor(app: FastAPI) -> DiskUsageMonitor:
210+
settings: ApplicationSettings = app.state.settings
211+
return DiskUsageMonitor(
212+
app,
213+
user_id=settings.DY_SIDECAR_USER_ID,
214+
node_id=settings.DY_SIDECAR_NODE_ID,
215+
interval=settings.DYNAMIC_SIDECAR_TELEMETRY_DISK_USAGE_MONITOR_INTERVAL,
216+
monitored_paths=_get_monitored_paths(app),
217+
dy_volumes_mount_dir=settings.DYNAMIC_SIDECAR_DY_VOLUMES_MOUNT_DIR,
218+
)
219+
220+
221+
def get_disk_usage_monitor(app: FastAPI) -> DiskUsageMonitor | None:
222+
if hasattr(app.state, "disk_usage_monitor"):
223+
disk_usage_monitor: DiskUsageMonitor = app.state.disk_usage_monitor
224+
return disk_usage_monitor
225+
return None
208226

209227

210228
def setup_disk_usage(app: FastAPI) -> None:
211229
async def on_startup() -> None:
212230
with log_context(_logger, logging.INFO, "setup disk monitor"):
213-
settings: ApplicationSettings = app.state.settings
214-
215-
app.state.disk_usage_monitor = disk_usage_monitor = DiskUsageMonitor(
216-
app,
217-
user_id=settings.DY_SIDECAR_USER_ID,
218-
node_id=settings.DY_SIDECAR_NODE_ID,
219-
interval=settings.DYNAMIC_SIDECAR_TELEMETRY_DISK_USAGE_MONITOR_INTERVAL,
220-
monitored_paths=_get_monitored_paths(app),
221-
dy_volumes_mount_dir=settings.DYNAMIC_SIDECAR_DY_VOLUMES_MOUNT_DIR,
222-
)
223-
await disk_usage_monitor.setup()
231+
app.state.disk_usage_monitor = create_disk_usage_monitor(app)
232+
await app.state.disk_usage_monitor.setup()
224233

225234
async def on_shutdown() -> None:
226235
with log_context(_logger, logging.INFO, "shutdown disk monitor"):

services/dynamic-sidecar/src/simcore_service_dynamic_sidecar/modules/system_monitor/_setup.py

Lines changed: 29 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,17 +4,42 @@
44
from servicelib.logging_utils import log_context
55

66
from ...core.settings import SystemMonitorSettings
7-
from ._disk_usage import setup_disk_usage
7+
from ._disk_usage import (
8+
create_disk_usage_monitor,
9+
get_disk_usage_monitor,
10+
setup_disk_usage,
11+
)
812

913
_logger = logging.getLogger(__name__)
1014

1115

16+
async def _display_current_disk_usage(app: FastAPI) -> None:
17+
disk_usage_monitor = get_disk_usage_monitor(app)
18+
if disk_usage_monitor is None:
19+
disk_usage_monitor = create_disk_usage_monitor(app)
20+
21+
disk_usage = await disk_usage_monitor.get_disk_usage()
22+
for name, entry in disk_usage.items():
23+
_logger.info(
24+
"Disk usage for '%s': total=%s, free=%s, used=%s, used_percent=%s",
25+
name,
26+
entry.total.human_readable(),
27+
entry.free.human_readable(),
28+
entry.used.human_readable(),
29+
entry.used_percent,
30+
)
31+
32+
1233
def setup_system_monitor(app: FastAPI) -> None:
1334
with log_context(_logger, logging.INFO, "setup system monitor"):
1435
settings: SystemMonitorSettings = app.state.settings.SYSTEM_MONITOR_SETTINGS
1536

16-
if not settings.DY_SIDECAR_SYSTEM_MONITOR_TELEMETRY_ENABLE:
37+
if settings.DY_SIDECAR_SYSTEM_MONITOR_TELEMETRY_ENABLE:
38+
setup_disk_usage(app)
39+
else:
1740
_logger.warning("system monitor disabled")
18-
return
1941

20-
setup_disk_usage(app)
42+
async def on_startup() -> None:
43+
await _display_current_disk_usage(app)
44+
45+
app.add_event_handler("startup", on_startup)

services/dynamic-sidecar/tests/unit/test_modules_notifier.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,7 @@ async def app(
8787
) -> AsyncIterable[FastAPI]:
8888
mocker.patch(
8989
"simcore_service_dynamic_sidecar.modules.system_monitor._disk_usage._get_monitored_paths",
90-
return_value=[],
90+
return_value={},
9191
)
9292

9393
async with LifespanManager(app):

0 commit comments

Comments
 (0)