diff --git a/src/vmm_mad/remotes/vcenter/vcenter_driver.rb b/src/vmm_mad/remotes/vcenter/vcenter_driver.rb index c671e3f976..ca4a744fb2 100644 --- a/src/vmm_mad/remotes/vcenter/vcenter_driver.rb +++ b/src/vmm_mad/remotes/vcenter/vcenter_driver.rb @@ -1987,6 +1987,7 @@ class VCenterVm provider = pm.provider_summary [@vm].first refresh_rate = provider.refreshRate + max_samples = 0 vmid = -1 extraconfig_vmid = @vm.config.extraConfig.select{|val| @@ -2006,57 +2007,56 @@ class VCenterVm one_vm = OpenNebula::VirtualMachine.new_with_id(vmid, OpenNebula::Client.new) one_vm.info stats = [] + previous_nettx = 0 + previous_netrx = 0 + if one_vm["MONITORING/NETTX"] + previous_nettx = one_vm["MONITORING/NETTX"].to_i + end + if one_vm["MONITORING/NETRX"] + previous_netrx = one_vm["MONITORING/NETRX"].to_i + end if(one_vm["MONITORING/LAST_MON"] && one_vm["MONITORING/LAST_MON"].to_i != 0 ) #Real time data stores max 1 hour. 1 minute has 3 samples interval = (Time.now.to_i - one_vm["MONITORING/LAST_MON"].to_i) - #If last poll was more than hour ago get 3 minutes, #else calculate how many samples since last poll - samples = interval > 3600 ? 9 : (interval / refresh_rate) + 1 - max_samples = samples > 0 ? samples : 1 - - stats = pm.retrieve_stats( - [@vm], - ['net.transmitted','net.bytesRx','net.bytesTx','net.received', - 'virtualDisk.numberReadAveraged','virtualDisk.numberWriteAveraged', - 'virtualDisk.read','virtualDisk.write'], - {interval:refresh_rate, max_samples: max_samples} - ) + max_samples = interval > 3600 ? 9 : (interval / refresh_rate) + 1 else # First poll, get at least latest 3 minutes = 9 samples - stats = pm.retrieve_stats( - [@vm], - ['net.transmitted','net.bytesRx','net.bytesTx','net.received', - 'virtualDisk.numberReadAveraged','virtualDisk.numberWriteAveraged', - 'virtualDisk.read','virtualDisk.write'], - {interval:refresh_rate, max_samples: 9} - ) + max_samples = 9 end + stats = pm.retrieve_stats( + [@vm], + ['net.transmitted','net.bytesRx','net.bytesTx','net.received', + 'virtualDisk.numberReadAveraged','virtualDisk.numberWriteAveraged', + 'virtualDisk.read','virtualDisk.write'], + {interval:refresh_rate, max_samples: max_samples} + ) + + if stats.empty? || stats.first[1][:metrics].empty? - @nettx = 0 - @netrx = 0 + @nettx = 0 + previous_nettx + @netrx = 0 + previous_netrx @diskrdbytes = 0 @diskwrbytes = 0 @diskrdiops = 0 @diskwriops = 0 else metrics = stats.first[1][:metrics] - nettx_kbpersec = 0 - if metrics['net.transmitted'] - metrics['net.transmitted'].each { |sample| - nettx_kbpersec += sample - } - end - netrx_kbpersec = 0 - if metrics['net.bytesRx'] - metrics['net.bytesRx'].each { |sample| - netrx_kbpersec += sample - } - end + (0..max_samples-1).each { |index| + tx = [0] + rx = [0] + tx << metrics['net.transmitted'][index] if metrics['net.transmitted'] + tx << metrics['net.bytesTx'][index] if metrics['net.bytesTx'] + rx << metrics['net.received'][index] if metrics['net.received'] + rx << metrics['net.bytesRx'][index] if metrics['net.bytesRx'] + nettx_kbpersec += tx.max + netrx_kbpersec += rx.max + } read_kbpersec = 0 if metrics['virtualDisk.read'] @@ -2086,8 +2086,8 @@ class VCenterVm } end - @nettx = (nettx_kbpersec * 1024 * refresh_rate).to_i - @netrx = (netrx_kbpersec * 1024 * refresh_rate).to_i + @nettx = (nettx_kbpersec * 1000 * refresh_rate).to_i + previous_nettx + @netrx = (netrx_kbpersec * 1000 * refresh_rate).to_i + previous_netrx @diskrdiops = read_iops @diskwriops = write_iops