1
0
mirror of https://github.com/OpenNebula/one.git synced 2025-03-16 22:50:10 +03:00

Improvements

This commit is contained in:
Sergio Vega 2019-01-10 18:01:33 -06:00 committed by Tino Vázquez
parent e3969fd9d6
commit 42a5ca5f2e

View File

@ -49,8 +49,6 @@ module KVM
:domstate => 'virsh --connect LIBVIRT_URI --readonly domstate',
: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',
:domstats => 'virsh --connect LIBVIRT_URI --readonly domstats',
:top => 'top -b -d2 -n 2 -p ',
'LIBVIRT_URI' => 'qemu:///system'
@ -91,7 +89,7 @@ module KVM
xml = dump_xml(one_vm)
values.merge!(get_interface_statistics(one_vm, xml))
values.merge!(get_io_statistics(one_vm, xml))
return values
end
@ -306,102 +304,9 @@ module KVM
`#{virsh(:dumpxml)} '#{vmid}' 2>/dev/null`
end
# Aggregate statics of all VM NICs
# @param the ID of the VM as defined in libvirt
# @param text [nil, String] dumpxml output or nil to execute dumpxml
# @return [Hash] with network stats, by name [symbol] :netrx, :nettx
def self.get_interface_statistics(vmid, text = nil)
text = dump_xml(vmid) if !text
return {} if $?.exitstatus != 0
doc = REXML::Document.new(text)
interfaces = Array.new
doc.elements.each('domain/devices/interface/target') do |ele|
interfaces << ele.attributes["dev"]
end
return {} if interfaces.empty?
values = Hash.new
values[:netrx] = 0
values[:nettx] = 0
interfaces.each do |interface|
text=`#{virsh(:domifstat)} #{vmid} #{interface} 2>/dev/null`
next if $?.exitstatus != 0
text.each_line do |line|
columns = line.split(/\s+/)
case columns[1]
when 'rx_bytes'
values[:netrx] += columns[2].to_i
when 'tx_bytes'
values[:nettx]+=columns[2].to_i
end
end
end
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} 2>/dev/null`
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
def self.get_io_statistics(vmid, text = nil)
#disks=get_disk_names(vmid, text)
#puts "disk = #{disks}"
vm_stats=`#{virsh(:domstats)} #{vmid}`
#if disks && !disks.empty?
values={}
values[:netrx] = 0
values[:nettx] = 0
@ -410,12 +315,24 @@ module KVM
values[:diskrdiops]=0
values[:diskwriops]=0
vm_stats.scan(/rx.bytes=(\d*)/).each { |value| values[:netrx]+=value[0].to_i }
vm_stats.scan(/tx.bytes=(\d*)/).each { |value| values[:nettx]+=value[0].to_i }
vm_stats.scan(/rd.bytes=(\d*)/).each { |value| values[:diskrdbytes]+=value[0].to_i }
vm_stats.scan(/wr.bytes=(\d*)/).each { |value| values[:diskwrbytes]+=value[0].to_i }
vm_stats.scan(/rd.reqs=(\d*)/).each { |value| values[:diskrdiops]+=value[0].to_i }
vm_stats.scan(/wr.reqs=(\d*)/).each { |value| values[:diskwriops]+=value[0].to_i }
vm_stats.each_line do |line|
columns=line.split(/=(\d+)/)
case columns[0]
when /rx.bytes/
values[:netrx]+=columns[1].to_i
when /tx.bytes/
values[:nettx]+=columns[1].to_i
when /rd.bytes/
values[:diskrdbytes]+=columns[1].to_i
when /wr.bytes/
values[:diskwrbytes]+=columns[1].to_i
when /rd.reqs/
values[:diskrdiops]+=columns[1].to_i
when /wr.reqs/
values[:diskwriops]+=columns[1].to_i
end
end
values
end