import asyncio import time from app.collect import cpu, disks, gpu, mem, power from app.state import HistoryStore def _collect() -> dict[str, float | int | None]: sample: dict[str, float | int | None] = {} sample.update(cpu.sample()) sample.update(mem.sample()) sample.update(gpu.sample()) sample.update(power.sample()) return sample async def sampler_loop(store: HistoryStore, sample_interval: float) -> None: cpu.prime() prev_disk = disks.counters() prev_t = time.monotonic() while True: await asyncio.sleep(sample_interval) sample = await asyncio.to_thread(_collect) now = time.monotonic() dt = now - prev_t sample.update(disks.rates(prev_disk, dt)) prev_disk = disks.counters() prev_t = now store.record(sample)