"""Calc & represent docker stats data.""" from contextlib import suppress class DockerStats(object): """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 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'] if system_delta > 0.0 and cpu_delta > 0.0: self._cpu = (cpu_delta / system_delta) * \ len(stats['cpu_stats']['cpu_usage']['percpu_usage']) * 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 self._cpu @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 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