From a46863fab0b16c873eb8bfd8ddb607eb735563c0 Mon Sep 17 00:00:00 2001 From: Javi Fontan Date: Mon, 31 Oct 2016 18:37:15 +0100 Subject: [PATCH] F 2921: get disk IO information from kvm probes --- src/vmm_mad/remotes/kvm/poll | 49 ++++++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) diff --git a/src/vmm_mad/remotes/kvm/poll b/src/vmm_mad/remotes/kvm/poll index ee56cdbda6..3c7222da79 100755 --- a/src/vmm_mad/remotes/kvm/poll +++ b/src/vmm_mad/remotes/kvm/poll @@ -49,6 +49,7 @@ module KVM :list => 'virsh --connect LIBVIRT_URI --readonly list', :dumpxml => 'virsh --connect LIBVIRT_URI --readonly dumpxml', :domifstat => 'virsh --connect LIBVIRT_URI --readonly domifstat', + :domblkstat => 'virsh --connect LIBVIRT_URI --readonly domblkstat', :top => 'top -b -d2 -n 2 -p ', 'LIBVIRT_URI' => 'qemu:///system' } @@ -154,6 +155,8 @@ module KVM vm[:name] = uuid end + values.merge!(get_diskio_statistics(name, xml)) + vms_info[vm[:name]] = values end @@ -322,6 +325,52 @@ module KVM values end + def self.get_disk_names(vmid, text = nil) + text = dump_xml(vmid) if !text + + doc=REXML::Document.new(text) + disks = [] + doc.elements.each('domain/devices/disk/target') do |ele| + disks << ele.attributes["dev"] + end + + disks + end + + def self.get_diskio_statistics(vmid, text = nil) + disks=get_disk_names(vmid, text) + + if disks && !disks.empty? + values={} + values[:diskrdbytes]=0 + values[:diskwrbytes]=0 + values[:diskrdiops]=0 + values[:diskwriops]=0 + + disks.each do |disk| + text=`#{virsh(:domblkstat)} #{vmid} #{disk}` + + text.each_line do |line| + columns=line.split(/\s+/) + case columns[1] + when 'rd_bytes' + values[:diskrdbytes]+=columns[2].to_i + when 'wr_bytes' + values[:diskwrbytes]+=columns[2].to_i + when 'rd_req' + values[:diskrdiops]+=columns[2].to_i + when 'wr_req' + values[:diskwriops]+=columns[2].to_i + end + end + end + + values + else + {} + end + end + # Translate libvirt state to Opennebula monitor state # @param state [String] libvirt state # @return [String] OpenNebula state