mirror of
https://github.com/home-assistant/supervisor.git
synced 2025-06-23 18:36:29 +00:00
108 lines
3.1 KiB
Python
108 lines
3.1 KiB
Python
"""Calc and represent docker stats data."""
|
|
from contextlib import suppress
|
|
|
|
|
|
class DockerStats:
|
|
"""Hold stats data from container inside."""
|
|
|
|
def __init__(self, stats):
|
|
"""Initialize Docker stats."""
|
|
self._cpu = 0.0
|
|
self._network_rx = 0
|
|
self._network_tx = 0
|
|
self._blk_read = 0
|
|
self._blk_write = 0
|
|
|
|
try:
|
|
self._memory_usage = stats["memory_stats"]["usage"]
|
|
self._memory_limit = stats["memory_stats"]["limit"]
|
|
except KeyError:
|
|
self._memory_usage = 0
|
|
self._memory_limit = 0
|
|
|
|
# Calculate percent usage
|
|
if self._memory_limit != 0:
|
|
self._memory_percent = self._memory_usage / self._memory_limit * 100.0
|
|
else:
|
|
self._memory_percent = 0
|
|
|
|
with suppress(KeyError):
|
|
self._calc_cpu_percent(stats)
|
|
|
|
with suppress(KeyError):
|
|
self._calc_network(stats["networks"])
|
|
|
|
with suppress(KeyError):
|
|
self._calc_block_io(stats["blkio_stats"])
|
|
|
|
def _calc_cpu_percent(self, stats):
|
|
"""Calculate CPU percent."""
|
|
cpu_delta = (
|
|
stats["cpu_stats"]["cpu_usage"]["total_usage"]
|
|
- stats["precpu_stats"]["cpu_usage"]["total_usage"]
|
|
)
|
|
system_delta = (
|
|
stats["cpu_stats"]["system_cpu_usage"]
|
|
- stats["precpu_stats"]["system_cpu_usage"]
|
|
)
|
|
online_cpu = stats["cpu_stats"]["online_cpus"]
|
|
|
|
if online_cpu == 0.0:
|
|
online_cpu = len(stats["cpu_stats"]["cpu_usage"]["percpu_usage"])
|
|
if system_delta > 0.0 and cpu_delta > 0.0:
|
|
self._cpu = (cpu_delta / system_delta) * online_cpu * 100.0
|
|
|
|
def _calc_network(self, networks):
|
|
"""Calculate Network IO stats."""
|
|
for _, stats in networks.items():
|
|
self._network_rx += stats["rx_bytes"]
|
|
self._network_tx += stats["tx_bytes"]
|
|
|
|
def _calc_block_io(self, blkio):
|
|
"""Calculate block IO stats."""
|
|
for stats in blkio["io_service_bytes_recursive"]:
|
|
if stats["op"] == "Read":
|
|
self._blk_read += stats["value"]
|
|
elif stats["op"] == "Write":
|
|
self._blk_write += stats["value"]
|
|
|
|
@property
|
|
def cpu_percent(self):
|
|
"""Return CPU percent."""
|
|
return round(self._cpu, 2)
|
|
|
|
@property
|
|
def memory_usage(self):
|
|
"""Return memory usage."""
|
|
return self._memory_usage
|
|
|
|
@property
|
|
def memory_limit(self):
|
|
"""Return memory limit."""
|
|
return self._memory_limit
|
|
|
|
@property
|
|
def memory_percent(self):
|
|
"""Return memory usage in percent."""
|
|
return round(self._memory_percent, 2)
|
|
|
|
@property
|
|
def network_rx(self):
|
|
"""Return network rx stats."""
|
|
return self._network_rx
|
|
|
|
@property
|
|
def network_tx(self):
|
|
"""Return network rx stats."""
|
|
return self._network_tx
|
|
|
|
@property
|
|
def blk_read(self):
|
|
"""Return block IO read stats."""
|
|
return self._blk_read
|
|
|
|
@property
|
|
def blk_write(self):
|
|
"""Return block IO write stats."""
|
|
return self._blk_write
|