From 2840fb3a7c0f0dd188d8f59411106bc3648decf3 Mon Sep 17 00:00:00 2001 From: mcabrerizo Date: Mon, 10 Apr 2017 18:36:20 +0200 Subject: [PATCH] F #4913: Fix monitor for VMM poll and check that offers the same info by monitor_vms --- .../lib/vcenter_driver/virtual_machine.rb | 156 +++++++++++++++++- src/vmm_mad/remotes/vcenter/poll | 2 +- 2 files changed, 148 insertions(+), 10 deletions(-) diff --git a/src/vmm_mad/remotes/lib/vcenter_driver/virtual_machine.rb b/src/vmm_mad/remotes/lib/vcenter_driver/virtual_machine.rb index 50209070b4..266e6338af 100644 --- a/src/vmm_mad/remotes/lib/vcenter_driver/virtual_machine.rb +++ b/src/vmm_mad/remotes/lib/vcenter_driver/virtual_machine.rb @@ -2329,6 +2329,139 @@ class VirtualMachine < Template # monitoring ############################################################################ + # monitor function used when VMM poll action is called + def monitor_poll_vm + reset_monitor + + @state = state_to_c(self["summary.runtime.powerState"]) + + if @state != VM_STATE[:active] + reset_monitor + return + end + + cpuMhz = self["runtime.host.summary.hardware.cpuMhz"].to_f + + @monitor[:used_memory] = self["summary.quickStats.hostMemoryUsage"] * 1024 + + used_cpu = self["summary.quickStats.overallCpuUsage"].to_f / cpuMhz + used_cpu = (used_cpu * 100).to_s + @monitor[:used_cpu] = sprintf('%.2f', used_cpu).to_s + + # Check for negative values + @monitor[:used_memory] = 0 if @monitor[:used_memory].to_i < 0 + @monitor[:used_cpu] = 0 if @monitor[:used_cpu].to_i < 0 + + guest_ip_addresses = [] + self["guest.net"].each do |net| + net.ipConfig.ipAddress.each do |ip| + guest_ip_addresses << ip.ipAddress + end if net.ipConfig && net.ipConfig.ipAddress + end if self["guest.net"] + + @guest_ip_addresses = guest_ip_addresses.join(',') + + pm = self['_connection'].serviceInstance.content.perfManager + + provider = pm.provider_summary(@item) + + refresh_rate = provider.refreshRate + + if get_vm_id + stats = [] + + if (one_item["MONITORING/LAST_MON"] && one_item["MONITORING/LAST_MON"].to_i != 0 ) + #Real time data stores max 1 hour. 1 minute has 3 samples + interval = (Time.now.to_i - one_item["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( + [@item], + ['net.transmitted','net.bytesRx','net.bytesTx','net.received', + 'virtualDisk.numberReadAveraged','virtualDisk.numberWriteAveraged', + 'virtualDisk.read','virtualDisk.write'], + {interval:refresh_rate, max_samples: max_samples} + ) + else + # First poll, get at least latest 3 minutes = 9 samples + stats = pm.retrieve_stats( + [@item], + ['net.transmitted','net.bytesRx','net.bytesTx','net.received', + 'virtualDisk.numberReadAveraged','virtualDisk.numberWriteAveraged', + 'virtualDisk.read','virtualDisk.write'], + {interval:refresh_rate, max_samples: 9} + ) + end + + if !stats.empty? && !stats.first[1][:metrics].empty? + metrics = stats.first[1][:metrics] + + nettx_kbpersec = 0 + if metrics['net.transmitted'] + metrics['net.transmitted'].each { |sample| + nettx_kbpersec += sample if sample > 0 + } + end + + netrx_kbpersec = 0 + if metrics['net.bytesRx'] + metrics['net.bytesRx'].each { |sample| + netrx_kbpersec += sample if sample > 0 + } + end + + read_kbpersec = 0 + if metrics['virtualDisk.read'] + metrics['virtualDisk.read'].each { |sample| + read_kbpersec += sample if sample > 0 + } + end + + read_iops = 0 + if metrics['virtualDisk.numberReadAveraged'] + metrics['virtualDisk.numberReadAveraged'].each { |sample| + read_iops += sample if sample > 0 + } + end + + write_kbpersec = 0 + if metrics['virtualDisk.write'] + metrics['virtualDisk.write'].each { |sample| + write_kbpersec += sample if sample > 0 + } + end + + write_iops = 0 + if metrics['virtualDisk.numberWriteAveraged'] + metrics['virtualDisk.numberWriteAveraged'].each { |sample| + write_iops += sample if sample > 0 + } + end + + # Accumulate values if present + previous_nettx = @one_item && @one_item["MONITORING/NETTX"] ? @one_item["MONITORING/NETTX"].to_i : 0 + previous_netrx = @one_item && @one_item["MONITORING/NETRX"] ? @one_item["MONITORING/NETRX"].to_i : 0 + previous_diskrdiops = @one_item && @one_item["MONITORING/DISKRDIOPS"] ? @one_item["MONITORING/DISKRDIOPS"].to_i : 0 + previous_diskwriops = @one_item && @one_item["MONITORING/DISKWRIOPS"] ? @one_item["MONITORING/DISKWRIOPS"].to_i : 0 + previous_diskrdbytes = @one_item && @one_item["MONITORING/DISKRDBYTES"] ? @one_item["MONITORING/DISKRDBYTES"].to_i : 0 + previous_diskwrbytes = @one_item && @one_item["MONITORING/DISKWRBYTES"] ? @one_item["MONITORING/DISKWRBYTES"].to_i : 0 + + @monitor[:nettx] = previous_nettx + (nettx_kbpersec * 1024 * refresh_rate).to_i + @monitor[:netrx] = previous_netrx + (netrx_kbpersec * 1024 * refresh_rate).to_i + + @monitor[:diskrdiops] = previous_diskrdiops + read_iops + @monitor[:diskwriops] = previous_diskwriops + write_iops + @monitor[:diskrdbytes] = previous_diskrdbytes + (read_kbpersec * 1024 * refresh_rate).to_i + @monitor[:diskwrbytes] = previous_diskwrbytes + (write_kbpersec * 1024 * refresh_rate).to_i + end + end + end + + # monitor function used when poll action is called for all vms def monitor(stats) reset_monitor @@ -2341,7 +2474,7 @@ class VirtualMachine < Template cpuMhz = @vm_info[:esx_host_cpu] - @monitor[:used_memory] = @vm_info["summary.quickStats.hostMemoryUsage"].to_f * 1024 + @monitor[:used_memory] = @vm_info["summary.quickStats.hostMemoryUsage"].to_i * 1024 used_cpu = @vm_info["summary.quickStats.overallCpuUsage"].to_f / cpuMhz used_cpu = (used_cpu * 100).to_s @@ -2429,7 +2562,7 @@ class VirtualMachine < Template def info return 'STATE=d' if @state == 'd' - guest_ip = @vm_info["guest.ipAddress"] + guest_ip = @vm_info ? @vm_info["guest.ipAddress"] : self["guest.ipAddress"] used_cpu = @monitor[:used_cpu] used_memory = @monitor[:used_memory] @@ -2440,13 +2573,18 @@ class VirtualMachine < Template diskrdiops = @monitor[:diskrdiops] diskwriops = @monitor[:diskwriops] - esx_host = @vm_info[:esx_host_name].to_s - guest_state = @vm_info["guest.guestState"].to_s - vmware_tools = @vm_info["guest.toolsRunningStatus"].to_s - vmtools_ver = @vm_info["guest.toolsVersion"].to_s - vmtools_verst = @vm_info["guest.toolsVersionStatus2"].to_s - rp_name = @vm_info["rp_list"].select { |item| item._ref == self["_ref"]}.first[:name] rescue "" - rp_name = "Resources" if rp_name.empty? + esx_host = @vm_info ? @vm_info[:esx_host_name].to_s : self["runtime.host.name"].to_s + guest_state = @vm_info ? @vm_info["guest.guestState"].to_s : self["guest.guestState"].to_s + vmware_tools = @vm_info ? @vm_info["guest.toolsRunningStatus"].to_s : self["guest.toolsRunningStatus"].to_s + vmtools_ver = @vm_info ? @vm_info["guest.toolsVersion"].to_s : self["guest.toolsVersion"].to_s + vmtools_verst = @vm_info ? @vm_info["guest.toolsVersionStatus2"].to_s : vmtools_verst = self["guest.toolsVersionStatus2"].to_s + + if @vm_info + rp_name = @vm_info[:rp_list].select { |item| item[:ref] == @vm_info["resourcePool"]._ref}.first[:name] rescue "" + rp_name = "Resources" if rp_name.empty? + else + rp_name = self["resourcePool"].name + end str_info = "" diff --git a/src/vmm_mad/remotes/vcenter/poll b/src/vmm_mad/remotes/vcenter/poll index 3673373a53..f4e2160556 100755 --- a/src/vmm_mad/remotes/vcenter/poll +++ b/src/vmm_mad/remotes/vcenter/poll @@ -41,7 +41,7 @@ begin vm = VCenterDriver::VirtualMachine.new_from_ref(vm_ref, vi_client) - vm.monitor + vm.monitor_poll_vm puts vm.info