Hyper-V: Adds memory metrics implementation

This change targets compute nodes that run on
Windows Hyper-v / Server 2012 or Windows 8 or newer.

It retrieves the memory usage associated with the given
instance and returns a MemoryUsageStats object containing
the value.

This change is particularly useful for compute nodes
that have dynamic memory enabled in nova.conf.

DocImpact

Implements: blueprint hyper-v-memory-metrics

Change-Id: I6496133c3c49ebcc37873004ed58f4d37dbbdd9c
This commit is contained in:
Simona Iuliana Toader 2014-07-07 18:46:57 +03:00
parent cdddf83227
commit 10c3e3eb94
5 changed files with 47 additions and 1 deletions

View File

@ -45,6 +45,11 @@ class HyperVInspector(virt_inspector.Inspector):
return virt_inspector.CPUStats(number=cpu_count, time=cpu_time)
def inspect_memory_usage(self, instance, duration=None):
instance_name = util.instance_name(instance)
usage = self._utils.get_memory_metrics(instance_name)
return virt_inspector.MemoryUsageStats(usage=usage)
def inspect_vnics(self, instance):
instance_name = util.instance_name(instance)
for vnic_metrics in self._utils.get_vnic_metrics(instance_name):

View File

@ -41,6 +41,7 @@ class UtilsV2(object):
_VIRTUAL_SYSTEM_TYPE_REALIZED = 'Microsoft:Hyper-V:System:Realized'
_PROC_SETTING = 'Msvm_ProcessorSettingData'
_MEMORY_SETTING = "Msvm_MemorySettingData"
_SYNTH_ETH_PORT = 'Msvm_SyntheticEthernetPortSettingData'
_ETH_PORT_ALLOC = 'Msvm_EthernetPortAllocationSettingData'
_PORT_ACL_SET_DATA = 'Msvm_EthernetSwitchPortAclSettingData'
@ -50,6 +51,7 @@ class UtilsV2(object):
_BASE_METRICS_VALUE = 'Msvm_BaseMetricValue'
_CPU_METRIC_NAME = 'Aggregated Average CPU Utilization'
_MEMORY_METRIC_NAME = 'Aggregated Average Memory Utilization'
_NET_IN_METRIC_NAME = 'Filtered Incoming Network Traffic'
_NET_OUT_METRIC_NAME = 'Filtered Outgoing Network Traffic'
# Disk metrics are supported from Hyper-V 2012 R2
@ -94,6 +96,15 @@ class UtilsV2(object):
int(cpu_sd.VirtualQuantity),
long(vm.OnTimeInMilliseconds))
def get_memory_metrics(self, vm_name):
vm = self._lookup_vm(vm_name)
memory_def = self._get_metric_def(self._MEMORY_METRIC_NAME)
metric_memory = self._get_metrics(vm, memory_def)
memory_usage = 0
if metric_memory:
memory_usage = long(metric_memory[0].MetricValue)
return memory_usage
def get_vnic_metrics(self, vm_name):
vm = self._lookup_vm(vm_name)
ports = self._get_vm_resources(vm, self._ETH_PORT_ALLOC)

View File

@ -54,6 +54,14 @@ class TestHyperVInspection(base.BaseTestCase):
self.assertEqual(fake_cpu_count, cpu_stats.number)
self.assertEqual(fake_cpu_time, cpu_stats.time)
@mock.patch('ceilometer.compute.virt.hyperv.utilsv2.UtilsV2.'
'get_memory_metrics')
def test_inspect_memory_usage(self, mock_get_memory_metrics):
fake_usage = self._inspector._utils.get_memory_metrics.return_value
usage = self._inspector.inspect_memory_usage(
mock.sentinel.FAKE_INSTANCE, mock.sentinel.FAKE_DURATION)
self.assertEqual(fake_usage, usage.usage)
def test_inspect_vnics(self):
fake_instance_name = 'fake_instance_name'
fake_rx_mb = 1000

View File

@ -33,6 +33,28 @@ class TestUtilsV2(base.BaseTestCase):
super(TestUtilsV2, self).setUp()
@mock.patch.object(utilsv2.UtilsV2, '_get_metrics')
@mock.patch.object(utilsv2.UtilsV2, '_get_metric_def')
@mock.patch.object(utilsv2.UtilsV2, '_lookup_vm')
def test_get_memory_metrics(self, mock_lookup_vm, mock_get_metric_def,
mock_get_metrics):
mock_vm = mock_lookup_vm.return_value
mock_metric_def = mock_get_metric_def.return_value
metric_memory = mock.MagicMock()
metric_memory.MetricValue = 3
mock_get_metrics.return_value = [metric_memory]
response = self._utils.get_memory_metrics(mock.sentinel._FAKE_INSTANCE)
mock_lookup_vm.assert_called_once_with(mock.sentinel._FAKE_INSTANCE)
mock_get_metric_def.assert_called_once_with(
self._utils._MEMORY_METRIC_NAME)
mock_get_metrics.assert_called_once_with(mock_vm, mock_metric_def)
self.assertEqual(3, response)
def test_get_host_cpu_info(self):
_fake_clock_speed = 1000
_fake_cpu_count = 2

View File

@ -71,7 +71,7 @@ Name Type* Unit Resource Origin** Support**
instance g instance inst ID both 1, 2, 3, 4 Existence of instance
instance:<type> g instance inst ID both 1, 2, 3, 4 Existence of instance <type> (openstack types)
memory g MB inst ID n 1, 2 Volume of RAM allocated
memory.usage g MB inst ID p 1, 3, 4 Volume of RAM used
memory.usage g MB inst ID p 1, 2, 3, 4 Volume of RAM used
cpu c ns inst ID p 1, 2 CPU time used
cpu_util g % inst ID p 1, 2, 3, 4 Average CPU utilisation
vcpus g vcpu inst ID n 1, 2 Number of VCPUs