import asyncio import time from app.collect import cpu, disks, gpu, mem, power from app.sample import Sample from app.state import HistoryStore def _collect() -> Sample: sample = Sample() cpu.fill(sample) mem.fill(sample) gpu.fill(sample) power.fill(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.io_read, sample.io_write = disks.rates(prev_disk, dt) prev_disk = disks.counters() prev_t = now store.record(sample)