dashboard/app/sampling.py

29 lines
825 B
Python

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)