mirror of
https://github.com/virt-manager/virt-manager.git
synced 2025-01-05 09:17:57 +03:00
Hook up new global stats enable/disable work.
This commit is contained in:
parent
b17442a876
commit
0d6708edac
@ -827,29 +827,40 @@ class vmmDetails(gobject.GObject):
|
||||
def _rx_tx_text(rx, tx, unit):
|
||||
return '<span color="#82003B">%(rx)d %(unit)s in</span>\n<span color="#295C45">%(tx)d %(unit)s out</span>' % locals()
|
||||
|
||||
self.window.get_widget("overview-cpu-usage-text").set_text("%d %%" % self.vm.cpu_time_percentage())
|
||||
vm_memory = self.vm.current_memory()
|
||||
host_memory = self.vm.get_connection().host_memory_size()
|
||||
self.window.get_widget("overview-memory-usage-text").set_text("%d MB of %d MB" % \
|
||||
(int(round(vm_memory/1024.0)), \
|
||||
int(round(host_memory/1024.0))))
|
||||
cpu_txt = _("Disabled")
|
||||
mem_txt = _("Disabled")
|
||||
dsk_txt = _("Disabled")
|
||||
net_txt = _("Disabled")
|
||||
|
||||
self.cpu_usage_graph.set_property("data_array", self.vm.cpu_time_vector())
|
||||
self.memory_usage_graph.set_property("data_array", self.vm.current_memory_vector())
|
||||
if self.config.get_stats_enable_cpu_poll():
|
||||
cpu_txt = "%d %%" % self.vm.cpu_time_percentage()
|
||||
|
||||
if self.config.is_vmlist_network_traffic_visible():
|
||||
text = _rx_tx_text(self.vm.network_rx_rate(), self.vm.network_tx_rate(), "KBytes/s")
|
||||
self.network_traffic_graph.set_property("data_array", self.vm.network_traffic_vector())
|
||||
else:
|
||||
text = "sampling\ndisabled"
|
||||
self.window.get_widget("overview-network-traffic-text").set_markup(text)
|
||||
if self.config.get_stats_enable_mem_poll():
|
||||
vm_memory = self.vm.current_memory()
|
||||
host_memory = self.vm.get_connection().host_memory_size()
|
||||
mem_txt = "%d MB of %d MB" % (int(round(vm_memory/1024.0)),
|
||||
int(round(host_memory/1024.0)))
|
||||
if self.config.get_stats_enable_disk_poll():
|
||||
dsk_txt = _rx_tx_text(self.vm.disk_read_rate(),
|
||||
self.vm.disk_write_rate(), "KBytes/s")
|
||||
|
||||
if self.config.is_vmlist_disk_io_visible():
|
||||
text = _rx_tx_text(self.vm.disk_read_rate(), self.vm.disk_write_rate(), "KBytes/s")
|
||||
self.disk_io_graph.set_property("data_array", self.vm.disk_io_vector())
|
||||
else:
|
||||
text = "sampling\ndisabled"
|
||||
self.window.get_widget("overview-disk-usage-text").set_markup(text)
|
||||
if self.config.get_stats_enable_net_poll():
|
||||
net_txt = _rx_tx_text(self.vm.network_rx_rate(),
|
||||
self.vm.network_tx_rate(), "KBytes/s")
|
||||
|
||||
self.window.get_widget("overview-cpu-usage-text").set_text(cpu_txt)
|
||||
self.window.get_widget("overview-memory-usage-text").set_text(mem_txt)
|
||||
self.window.get_widget("overview-network-traffic-text").set_markup(net_txt)
|
||||
self.window.get_widget("overview-disk-usage-text").set_markup(dsk_txt)
|
||||
|
||||
self.cpu_usage_graph.set_property("data_array",
|
||||
self.vm.cpu_time_vector())
|
||||
self.memory_usage_graph.set_property("data_array",
|
||||
self.vm.current_memory_vector())
|
||||
self.disk_io_graph.set_property("data_array",
|
||||
self.vm.disk_io_vector())
|
||||
self.network_traffic_graph.set_property("data_array",
|
||||
self.vm.network_traffic_vector())
|
||||
|
||||
def refresh_config_cpu(self):
|
||||
self.window.get_widget("state-host-cpus").set_text("%d" % self.vm.get_connection().host_active_processor_count())
|
||||
|
@ -52,14 +52,22 @@ class vmmDomain(gobject.GObject):
|
||||
self._update_status()
|
||||
self.xml = None
|
||||
|
||||
self._mem_stats = None
|
||||
self._cpu_stats = None
|
||||
self._network_traffic = None
|
||||
self.config.on_vmlist_network_traffic_visible_changed(self.toggle_sample_network_traffic)
|
||||
self.toggle_sample_network_traffic()
|
||||
|
||||
self._disk_io = None
|
||||
self.config.on_vmlist_disk_io_visible_changed(self.toggle_sample_disk_io)
|
||||
|
||||
self.config.on_stats_enable_mem_poll_changed(self.toggle_sample_mem_stats)
|
||||
self.config.on_stats_enable_cpu_poll_changed(self.toggle_sample_cpu_stats)
|
||||
self.config.on_stats_enable_net_poll_changed(self.toggle_sample_network_traffic)
|
||||
self.config.on_stats_enable_disk_poll_changed(self.toggle_sample_disk_io)
|
||||
|
||||
self.toggle_sample_mem_stats()
|
||||
self.toggle_sample_cpu_stats()
|
||||
self.toggle_sample_network_traffic()
|
||||
self.toggle_sample_disk_io()
|
||||
|
||||
|
||||
def get_xml(self):
|
||||
if self.xml is None:
|
||||
self.xml = self.vm.XMLDesc(0)
|
||||
@ -161,6 +169,47 @@ class vmmDomain(gobject.GObject):
|
||||
self.lastStatus = status
|
||||
self.emit("status-changed", status)
|
||||
|
||||
def _sample_mem_stats_dummy(self, ignore):
|
||||
return 0, 0
|
||||
|
||||
def _sample_mem_stats(self, info):
|
||||
pcentCurrMem = info[2] * 100.0 / self.connection.host_memory_size()
|
||||
pcentMaxMem = info[1] * 100.0 / self.connection.host_memory_size()
|
||||
return pcentCurrMem, pcentMaxMem
|
||||
|
||||
def _sample_cpu_stats_dummy(self, ignore, ignore1):
|
||||
return 0, 0, 0
|
||||
|
||||
def _sample_cpu_stats(self, info, now):
|
||||
prevCpuTime = 0
|
||||
prevTimestamp = 0
|
||||
if len(self.record) > 0:
|
||||
prevTimestamp = self.record[0]["timestamp"]
|
||||
prevCpuTime = self.record[0]["cpuTimeAbs"]
|
||||
|
||||
cpuTime = 0
|
||||
cpuTimeAbs = 0
|
||||
pcentCpuTime = 0
|
||||
if not (info[0] in [libvirt.VIR_DOMAIN_SHUTOFF,
|
||||
libvirt.VIR_DOMAIN_CRASHED]):
|
||||
cpuTime = info[4] - prevCpuTime
|
||||
cpuTimeAbs = info[4]
|
||||
|
||||
pcentCpuTime = ((cpuTime) * 100.0 /
|
||||
(((now - prevTimestamp)*1000.0*1000.0*1000.0) *
|
||||
self.connection.host_active_processor_count()))
|
||||
# Due to timing diffs between getting wall time & getting
|
||||
# the domain's time, its possible to go a tiny bit over
|
||||
# 100% utilization. This freaks out users of the data, so
|
||||
# we hard limit it.
|
||||
if pcentCpuTime > 100.0:
|
||||
pcentCpuTime = 100.0
|
||||
# Enforce >= 0 just in case
|
||||
if pcentCpuTime < 0.0:
|
||||
pcentCpuTime = 0.0
|
||||
|
||||
return cpuTime, cpuTimeAbs, pcentCpuTime
|
||||
|
||||
def _sample_network_traffic_dummy(self):
|
||||
return 0, 0
|
||||
|
||||
@ -208,6 +257,7 @@ class vmmDomain(gobject.GObject):
|
||||
def tick(self, now):
|
||||
if self.connection.get_state() != self.connection.STATE_ACTIVE:
|
||||
return
|
||||
|
||||
# Clear cached XML
|
||||
self.xml = None
|
||||
info = self.vm.info()
|
||||
@ -216,30 +266,6 @@ class vmmDomain(gobject.GObject):
|
||||
if current > expected:
|
||||
del self.record[expected:current]
|
||||
|
||||
prevCpuTime = 0
|
||||
prevTimestamp = 0
|
||||
if len(self.record) > 0:
|
||||
prevTimestamp = self.record[0]["timestamp"]
|
||||
prevCpuTime = self.record[0]["cpuTimeAbs"]
|
||||
|
||||
cpuTime = 0
|
||||
cpuTimeAbs = 0
|
||||
pcentCpuTime = 0
|
||||
if not(info[0] in [libvirt.VIR_DOMAIN_SHUTOFF, libvirt.VIR_DOMAIN_CRASHED]):
|
||||
cpuTime = info[4] - prevCpuTime
|
||||
cpuTimeAbs = info[4]
|
||||
|
||||
pcentCpuTime = (cpuTime) * 100.0 / ((now - prevTimestamp)*1000.0*1000.0*1000.0*self.connection.host_active_processor_count())
|
||||
# Due to timing diffs between getting wall time & getting
|
||||
# the domain's time, its possible to go a tiny bit over
|
||||
# 100% utilization. This freaks out users of the data, so
|
||||
# we hard limit it.
|
||||
if pcentCpuTime > 100.0:
|
||||
pcentCpuTime = 100.0
|
||||
# Enforce >= 0 just in case
|
||||
if pcentCpuTime < 0.0:
|
||||
pcentCpuTime = 0.0
|
||||
|
||||
# Xen reports complete crap for Dom0 max memory
|
||||
# (ie MAX_LONG) so lets clamp it to the actual
|
||||
# physical RAM in machine which is the effective
|
||||
@ -248,9 +274,8 @@ class vmmDomain(gobject.GObject):
|
||||
if self.get_id() == 0:
|
||||
info[1] = self.connection.host_memory_size()
|
||||
|
||||
pcentCurrMem = info[2] * 100.0 / self.connection.host_memory_size()
|
||||
pcentMaxMem = info[1] * 100.0 / self.connection.host_memory_size()
|
||||
|
||||
cpuTime, cpuTimeAbs, pcentCpuTime = self._cpu_stats(info, now)
|
||||
pcentCurrMem, pcentMaxMem = self._mem_stats(info)
|
||||
rdBytes, wrBytes = self._disk_io()
|
||||
rxBytes, txBytes = self._network_traffic()
|
||||
|
||||
@ -271,7 +296,6 @@ class vmmDomain(gobject.GObject):
|
||||
|
||||
self.record.insert(0, newStats)
|
||||
nSamples = 5
|
||||
#nSamples = len(self.record)
|
||||
if nSamples > len(self.record):
|
||||
nSamples = len(self.record)
|
||||
|
||||
@ -1073,8 +1097,23 @@ class vmmDomain(gobject.GObject):
|
||||
# Invalidate cached xml
|
||||
self.xml = None
|
||||
|
||||
def toggle_sample_network_traffic(self, ignore1=None, ignore2=None, ignore3=None, ignore4=None):
|
||||
if self.config.is_vmlist_network_traffic_visible():
|
||||
def toggle_sample_cpu_stats(self, ignore1=None, ignore2=None,
|
||||
ignore3=None, ignore4=None):
|
||||
if self.config.get_stats_enable_cpu_poll():
|
||||
self._cpu_stats = self._sample_cpu_stats
|
||||
else:
|
||||
self._cpu_stats = self._sample_cpu_stats_dummy
|
||||
|
||||
def toggle_sample_mem_stats(self, ignore1=None, ignore2=None,
|
||||
ignore3=None, ignore4=None):
|
||||
if self.config.get_stats_enable_mem_poll():
|
||||
self._mem_stats = self._sample_mem_stats
|
||||
else:
|
||||
self._mem_stats = self._sample_mem_stats_dummy
|
||||
|
||||
def toggle_sample_network_traffic(self, ignore1=None, ignore2=None,
|
||||
ignore3=None, ignore4=None):
|
||||
if self.config.get_stats_enable_net_poll():
|
||||
if len(self.record) > 1:
|
||||
# resample the current value before calculating the rate in
|
||||
# self.tick() otherwise we'd get a huge spike when switching
|
||||
@ -1086,8 +1125,9 @@ class vmmDomain(gobject.GObject):
|
||||
else:
|
||||
self._network_traffic = self._sample_network_traffic_dummy
|
||||
|
||||
def toggle_sample_disk_io(self, ignore1=None, ignore2=None, ignore3=None, ignore4=None):
|
||||
if self.config.is_vmlist_disk_io_visible():
|
||||
def toggle_sample_disk_io(self, ignore1=None, ignore2=None,
|
||||
ignore3=None, ignore4=None):
|
||||
if self.config.get_stats_enable_disk_poll():
|
||||
if len(self.record) > 1:
|
||||
# resample the current value before calculating the rate in
|
||||
# self.tick() otherwise we'd get a huge spike when switching
|
||||
|
@ -136,6 +136,17 @@ class vmmManager(gobject.GObject):
|
||||
self.window.get_widget("menu_view_disk_io").set_active(self.config.is_vmlist_disk_io_visible())
|
||||
self.window.get_widget("menu_view_network_traffic").set_active(self.config.is_vmlist_network_traffic_visible())
|
||||
|
||||
# Register callbacks with the global stats enable/disable values
|
||||
# that disable the associated vmlist widgets if reporting is disabled
|
||||
self.config.on_stats_enable_disk_poll_changed(self.enable_polling,
|
||||
VMLIST_SORT_DISK_IO)
|
||||
self.config.on_stats_enable_net_poll_changed(self.enable_polling,
|
||||
VMLIST_SORT_NETWORK_USAGE)
|
||||
self.config.on_stats_enable_cpu_poll_changed(self.enable_polling,
|
||||
VMLIST_SORT_CPU_USAGE)
|
||||
self.config.on_stats_enable_mem_poll_changed(self.enable_polling,
|
||||
VMLIST_SORT_MEMORY_USAGE)
|
||||
|
||||
self.window.get_widget("vm-view").set_active(0)
|
||||
|
||||
self.vmmenu_icons = {}
|
||||
@ -292,6 +303,19 @@ class vmmManager(gobject.GObject):
|
||||
self.vm_selected(None)
|
||||
self.window.get_widget("vm-list").get_selection().connect("changed", self.vm_selected)
|
||||
|
||||
# Initialize stat polling columns based on global polling
|
||||
# preferences (we want signal handlers for this)
|
||||
for typ, init_val in \
|
||||
[ (VMLIST_SORT_DISK_IO,
|
||||
self.config.get_stats_enable_disk_poll()),
|
||||
(VMLIST_SORT_NETWORK_USAGE,
|
||||
self.config.get_stats_enable_net_poll()),
|
||||
(VMLIST_SORT_CPU_USAGE,
|
||||
self.config.get_stats_enable_cpu_poll()),
|
||||
(VMLIST_SORT_MEMORY_USAGE,
|
||||
self.config.get_stats_enable_mem_poll())]:
|
||||
self.enable_polling(None, None, init_val, typ)
|
||||
|
||||
# store any error message from the restore-domain callback
|
||||
self.domain_restore_error = ""
|
||||
|
||||
@ -981,6 +1005,27 @@ class vmmManager(gobject.GObject):
|
||||
col = vmlist.get_column(COL_CPU)
|
||||
col.set_visible(self.config.is_vmlist_cpu_usage_visible())
|
||||
|
||||
def enable_polling(self, ignore1, ignore2, conf_entry, userdata):
|
||||
if userdata == VMLIST_SORT_CPU_USAGE:
|
||||
widgn = "menu_view_cpu_usage"
|
||||
elif userdata == VMLIST_SORT_MEMORY_USAGE:
|
||||
widgn = "menu_view_memory_usage"
|
||||
elif userdata == VMLIST_SORT_DISK_IO:
|
||||
widgn = "menu_view_disk_io"
|
||||
elif userdata == VMLIST_SORT_NETWORK_USAGE:
|
||||
widgn = "menu_view_network_traffic"
|
||||
widget = self.window.get_widget(widgn)
|
||||
|
||||
if conf_entry and (conf_entry == True or \
|
||||
conf_entry.get_value().get_bool()):
|
||||
widget.set_sensitive(True)
|
||||
widget.set_tooltip_text("")
|
||||
else:
|
||||
if widget.get_active():
|
||||
widget.set_active(False)
|
||||
widget.set_sensitive(False)
|
||||
widget.set_tooltip_text(_("Disabled in preferences dialog."))
|
||||
|
||||
def toggle_virtual_cpus_visible_conf(self, menu):
|
||||
self.config.set_vmlist_virtual_cpus_visible(menu.get_active())
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user