Only thing which was actually changed was adding several if-else of whetever use stats passed to domain class or use the old method of gathering stats. @stats - statistics dictionary (derived from return value of virConnectGetAllDomainStats). If this dictionary is empty, old methods for gathering statistics shall be used. Signed-off-by: Simon Kobyda <skobyda@xxxxxxxxxx> --- virtManager/domain.py | 176 +++++++++++++++++++++++++----------------- 1 file changed, 106 insertions(+), 70 deletions(-) diff --git a/virtManager/domain.py b/virtManager/domain.py index 5039e7c2..4ac19cf8 100644 --- a/virtManager/domain.py +++ b/virtManager/domain.py @@ -1539,10 +1539,10 @@ class vmmDomain(vmmLibvirtObject): # Stats helpers # ################# - def _sample_cpu_stats(self, info, now): + def _sample_cpu_stats(self, info, now, stats): if not self._enable_cpu_stats: return 0, 0, 0, 0 - if not info: + if not info and not stats: info = self._backend.info() prevCpuTime = 0 @@ -1556,11 +1556,21 @@ class vmmDomain(vmmLibvirtObject): prevTimestamp = self._stats[0]["timestamp"] prevCpuTime = self._stats[0]["cpuTimeAbs"] - if not (info[0] in [libvirt.VIR_DOMAIN_SHUTOFF, + if stats: + state = stats["state.state"] + else: + state = info[0] + if not (state in [libvirt.VIR_DOMAIN_SHUTOFF, libvirt.VIR_DOMAIN_CRASHED]): - guestcpus = info[3] - cpuTime = info[4] - prevCpuTime - cpuTimeAbs = info[4] + if stats: + guestcpus = stats["vcpu.current"] + cpuTime = stats["cpu.time"] - prevCpuTime + cpuTimeAbs = stats["cpu.time"] + else: + guestcpus = info[3] + cpuTime = info[4] - prevCpuTime + cpuTimeAbs = info[4] + hostcpus = self.conn.host_active_processor_count() pcentbase = (((cpuTime) * 100.0) / @@ -1781,7 +1791,7 @@ class vmmDomain(vmmLibvirtObject): # Polling helpers # ################### - def _sample_network_traffic(self): + def _sample_network_traffic(self, stats): rx = 0 tx = 0 if (not self._stats_net_supported or @@ -1790,7 +1800,7 @@ class vmmDomain(vmmLibvirtObject): self._stats_net_skip = [] return rx, tx - for netdev in self.get_interface_devices_norefresh(): + for i, netdev in enumerate(self.get_interface_devices_norefresh()): dev = netdev.target_dev if not dev: continue @@ -1798,28 +1808,32 @@ class vmmDomain(vmmLibvirtObject): if dev in self._stats_net_skip: continue - try: - io = self._backend.interfaceStats(dev) - if io: - rx += io[0] - tx += io[4] - except libvirt.libvirtError as err: - if util.is_error_nosupport(err): - logging.debug("Net stats not supported: %s", err) - self._stats_net_supported = False - else: - logging.error("Error reading net stats for " - "'%s' dev '%s': %s", - self.get_name(), dev, err) - if self.is_active(): - logging.debug("Adding %s to skip list", dev) - self._stats_net_skip.append(dev) + if stats: + rx += stats["net." + str(i) + ".rx.bytes"] + tx += stats["net." + str(i) + ".tx.bytes"] + else: + try: + io = self._backend.interfaceStats(dev) + if io: + rx += io[0] + tx += io[4] + except libvirt.libvirtError as err: + if util.is_error_nosupport(err): + logging.debug("Net stats not supported: %s", err) + self._stats_net_supported = False else: - logging.debug("Aren't running, don't add to skiplist") + logging.error("Error reading net stats for " + "'%s' dev '%s': %s", + self.get_name(), dev, err) + if self.is_active(): + logging.debug("Adding %s to skip list", dev) + self._stats_net_skip.append(dev) + else: + logging.debug("Aren't running, don't add to skiplist") return rx, tx - def _sample_disk_io(self): + def _sample_disk_io(self, stats): rd = 0 wr = 0 if (not self._stats_disk_supported or @@ -1830,17 +1844,22 @@ class vmmDomain(vmmLibvirtObject): # Some drivers support this method for getting all usage at once if not self._summary_disk_stats_skip: - try: - io = self._backend.blockStats('') - if io: - rd = io[1] - wr = io[3] - return rd, wr - except libvirt.libvirtError: - self._summary_disk_stats_skip = True + if stats: + rd = stats["block.0.rd.bytes"] + wr = stats["block.0.wr.bytes"] + return rd, wr + else: + try: + io = self._backend.blockStats('') + if io: + rd = io[1] + wr = io[3] + return rd, wr + except libvirt.libvirtError: + self._summary_disk_stats_skip = True # did not work, iterate over all disks - for disk in self.get_disk_devices_norefresh(): + for i, disk in enumerate(self.get_disk_devices_norefresh()): dev = disk.target if not dev: continue @@ -1848,24 +1867,27 @@ class vmmDomain(vmmLibvirtObject): if dev in self._stats_disk_skip: continue - try: - io = self._backend.blockStats(dev) - if io: - rd += io[1] - wr += io[3] - except libvirt.libvirtError as err: - if util.is_error_nosupport(err): - logging.debug("Disk stats not supported: %s", err) - self._stats_disk_supported = False - else: - logging.error("Error reading disk stats for " - "'%s' dev '%s': %s", - self.get_name(), dev, err) - if self.is_active(): - logging.debug("Adding %s to skip list", dev) - self._stats_disk_skip.append(dev) + if stats: + rd = stats["block." + str(i) + ".rd.bytes"] + wr = stats["block." + str(i) + ".wr.bytes"] + try: + io = self._backend.blockStats(dev) + if io: + rd += io[1] + wr += io[3] + except libvirt.libvirtError as err: + if util.is_error_nosupport(err): + logging.debug("Disk stats not supported: %s", err) + self._stats_disk_supported = False else: - logging.debug("Aren't running, don't add to skiplist") + logging.error("Error reading disk stats for " + "'%s' dev '%s': %s", + self.get_name(), dev, err) + if self.is_active(): + logging.debug("Adding %s to skip list", dev) + self._stats_disk_skip.append(dev) + else: + logging.debug("Aren't running, don't add to skiplist") return rd, wr @@ -1888,7 +1910,7 @@ class vmmDomain(vmmLibvirtObject): except Exception as e: logging.debug("Error setting memstats period: %s", e) - def _sample_mem_stats(self): + def _sample_mem_stats(self, stats): if (not self.mem_stats_supported or not self._enable_mem_stats or not self.is_active()): @@ -1901,15 +1923,22 @@ class vmmDomain(vmmLibvirtObject): curmem = 0 totalmem = 1 - try: - stats = self._backend.memoryStats() - totalmem = stats.get("actual", 1) - curmem = stats.get("rss", 0) + if stats: + totalmem = stats.get("balloon.current", 1) + curmem = stats.get("balloon.rss", 0) + + if "unused" in stats: + curmem = max(0, totalmem - stats.get("unused", totalmem)) + else: + try: + stats = self._backend.memoryStats() + totalmem = stats.get("actual", 1) + curmem = stats.get("rss", 0) - if "unused" in stats: - curmem = max(0, totalmem - stats.get("unused", totalmem)) - except libvirt.libvirtError as err: - logging.error("Error reading mem stats: %s", err) + if "unused" in stats: + curmem = max(0, totalmem - stats.get("unused", totalmem)) + except libvirt.libvirtError as err: + logging.error("Error reading mem stats: %s", err) pcentCurrMem = (curmem / float(totalmem)) * 100 pcentCurrMem = max(0.0, min(pcentCurrMem, 100.0)) @@ -1917,10 +1946,12 @@ class vmmDomain(vmmLibvirtObject): return pcentCurrMem, curmem - def tick(self, stats_update=True): + def tick(self, stats_update=True, stats=None): if (not self._using_events() and not stats_update): return + if stats is None: + stats = [] info = [] dosignal = False @@ -1929,17 +1960,22 @@ class vmmDomain(vmmLibvirtObject): # the latest XML, but other objects probably don't want to do # this since it could be a performance hit. self._invalidate_xml() - info = self._backend.info() - dosignal = self._refresh_status(newstatus=info[0], cansignal=False) + if stats: + dosignal = self._refresh_status(stats["state.state"], cansignal=False) + else: + info = self._backend.info() + dosignal = self._refresh_status(newstatus=info[0], cansignal=False) if stats_update: - self._tick_stats(info) + self._tick_stats(info, stats) if dosignal: self.idle_emit("state-changed") if stats_update: self.idle_emit("resources-sampled") - def _tick_stats(self, info): + def _tick_stats(self, info, stats=None): + if stats is None: + stats = [] expected = self.config.get_stats_history_length() current = len(self._stats) if current > expected: @@ -1947,10 +1983,10 @@ class vmmDomain(vmmLibvirtObject): now = time.time() (cpuTime, cpuTimeAbs, - pcentHostCpu, pcentGuestCpu) = self._sample_cpu_stats(info, now) - pcentCurrMem, curmem = self._sample_mem_stats() - rdBytes, wrBytes = self._sample_disk_io() - rxBytes, txBytes = self._sample_network_traffic() + pcentHostCpu, pcentGuestCpu) = self._sample_cpu_stats(info, now, stats) + pcentCurrMem, curmem = self._sample_mem_stats(stats) + rdBytes, wrBytes = self._sample_disk_io(stats) + rxBytes, txBytes = self._sample_network_traffic(stats) newStats = { "timestamp": now, -- 2.17.1 _______________________________________________ virt-tools-list mailing list virt-tools-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/virt-tools-list