Merge "Add memory swap metric"

This commit is contained in:
Jenkins 2017-07-24 18:27:55 +00:00 committed by Gerrit Code Review
commit 88f1051c0f
9 changed files with 83 additions and 1 deletions

View File

@ -51,6 +51,18 @@ class MemoryResidentPollster(InstanceStatsPollster):
sample_stats_key = 'memory_resident'
class MemorySwapInPollster(InstanceStatsPollster):
sample_name = 'memory.swap.in'
sample_unit = 'MB'
sample_stats_key = 'memory_swap_in'
class MemorySwapOutPollster(InstanceStatsPollster):
sample_name = 'memory.swap.out'
sample_unit = 'MB'
sample_stats_key = 'memory_swap_out'
class PerfCPUCyclesPollster(InstanceStatsPollster):
sample_name = 'perf.cpu.cycles'
sample_stats_key = 'cpu_cycles'

View File

@ -45,6 +45,8 @@ class InstanceStats(object):
'cpu_l3_cache_usage', # cachesize: Amount of CPU L3 cache used
'memory_usage', # usage: Amount of memory used
'memory_resident', #
'memory_swap_in', # memory swap in
'memory_swap_out', # memory swap out
'memory_bandwidth_total', # total: total system bandwidth from one
# level of cache
'memory_bandwidth_local', # local: bandwidth of memory traffic for a

View File

@ -161,6 +161,7 @@ class LibvirtInspector(virt_inspector.Inspector):
domain = self._get_domain_not_shut_off_or_raise(instance)
memory_used = memory_resident = None
memory_swap_in = memory_swap_out = None
memory_stats = domain.memoryStats()
# Stat provided from libvirt is in KB, converting it to MB.
if 'available' in memory_stats and 'unused' in memory_stats:
@ -168,6 +169,9 @@ class LibvirtInspector(virt_inspector.Inspector):
memory_stats['unused']) / units.Ki
if 'rss' in memory_stats:
memory_resident = memory_stats['rss'] / units.Ki
if 'swap_in' in memory_stats and 'swap_out' in memory_stats:
memory_swap_in = memory_stats['swap_in'] / units.Ki
memory_swap_out = memory_stats['swap_out'] / units.Ki
# TODO(sileht): stats also have the disk/vnic info
# we could use that instead of the old method for Queen
@ -198,6 +202,8 @@ class LibvirtInspector(virt_inspector.Inspector):
cpu_time=cpu_time,
memory_usage=memory_used,
memory_resident=memory_resident,
memory_swap_in=memory_swap_in,
memory_swap_out=memory_swap_out,
cpu_cycles=stats.get("perf.cpu_cycles"),
instructions=stats.get("perf.instructions"),
cache_references=stats.get("perf.cache_references"),

View File

@ -37,6 +37,8 @@ resources:
- 'memory'
- 'memory.usage'
- 'memory.resident'
- 'memory.swap.in'
- 'memory.swap.out'
- 'memory.bandwidth.total'
- 'memory.bandwidth.local'
- 'vcpus'

View File

@ -103,6 +103,52 @@ class TestResidentMemoryPollster(base.TestPollsterBase):
_verify_resident_memory_metering(0, 0, 0)
class TestMemorySwapPollster(base.TestPollsterBase):
@mock.patch('ceilometer.pipeline.setup_pipeline', mock.MagicMock())
def test_get_samples(self):
self._mock_inspect_instance(
virt_inspector.InstanceStats(memory_swap_in=1.0,
memory_swap_out=2.0),
virt_inspector.InstanceStats(memory_swap_in=3.0,
memory_swap_out=4.0),
)
mgr = manager.AgentManager(0, self.CONF)
def _check_memory_swap_in(expected_swap_in):
pollster = instance_stats.MemorySwapInPollster(self.CONF)
samples = list(pollster.get_samples(mgr, {}, [self.instance]))
self.assertEqual(1, len(samples))
self.assertEqual(set(['memory.swap.in']),
set([s.name for s in samples]))
self.assertEqual(expected_swap_in, samples[0].volume)
def _check_memory_swap_out(expected_swap_out):
pollster = instance_stats.MemorySwapOutPollster(self.CONF)
samples = list(pollster.get_samples(mgr, {}, [self.instance]))
self.assertEqual(1, len(samples))
self.assertEqual(set(['memory.swap.out']),
set([s.name for s in samples]))
self.assertEqual(expected_swap_out, samples[0].volume)
_check_memory_swap_in(1.0)
_check_memory_swap_out(4.0)
@mock.patch('ceilometer.pipeline.setup_pipeline', mock.MagicMock())
def test_get_samples_with_empty_stats(self):
self._mock_inspect_instance(virt_inspector.NoDataException())
mgr = manager.AgentManager(0, self.CONF)
pollster = instance_stats.MemorySwapInPollster(self.CONF)
def all_samples():
return list(pollster.get_samples(mgr, {}, [self.instance]))
self.assertRaises(plugin_base.PollsterPermanentError, all_samples)
class TestMemoryBandwidthPollster(base.TestPollsterBase):
@mock.patch('ceilometer.pipeline.setup_pipeline', mock.MagicMock())

View File

@ -55,7 +55,9 @@ class TestLibvirtInspection(base.BaseTestCase):
domain.info.return_value = (0, 0, 0, 2, 999999)
domain.memoryStats.return_value = {'available': 51200,
'unused': 25600,
'rss': 30000}
'rss': 30000,
'swap_in': 5120,
'swap_out': 8192}
conn = mock.Mock()
conn.lookupByUUIDString.return_value = domain
conn.domainListGetStats.return_value = [({}, {
@ -82,6 +84,8 @@ class TestLibvirtInspection(base.BaseTestCase):
self.assertEqual(90112, stats.cpu_l3_cache_usage)
self.assertEqual(25600 / units.Ki, stats.memory_usage)
self.assertEqual(30000 / units.Ki, stats.memory_resident)
self.assertEqual(5120 / units.Ki, stats.memory_swap_in)
self.assertEqual(8192 / units.Ki, stats.memory_swap_out)
self.assertEqual(1892352, stats.memory_bandwidth_total)
self.assertEqual(1802240, stats.memory_bandwidth_local)
self.assertEqual(7259361, stats.cpu_cycles)
@ -406,6 +410,8 @@ class TestLibvirtInspection(base.BaseTestCase):
stats = self.inspector.inspect_instance(self.instance, None)
self.assertIsNone(stats.memory_usage)
self.assertIsNone(stats.memory_resident)
self.assertIsNone(stats.memory_swap_in)
self.assertIsNone(stats.memory_swap_out)
def test_inspect_perf_events_libvirt_less_than_2_3_0(self):
domain = mock.Mock()

View File

@ -529,6 +529,7 @@ class DispatcherWorkflowTest(base.BaseTestCase,
metric_names=[
'disk.root.size', 'disk.ephemeral.size',
'memory', 'vcpus', 'memory.usage', 'memory.resident',
'memory.swap.in', 'memory.swap.out',
'memory.bandwidth.total', 'memory.bandwidth.local',
'cpu', 'cpu.delta', 'cpu_util', 'vcpus', 'disk.read.requests',
'cpu_l3_cache', 'perf.cpu.cycles', 'perf.instructions',

View File

@ -0,0 +1,5 @@
---
features:
- Add memory swap metric for VM, including 'memory.swap.in' and
'memory.swap.out'.

View File

@ -115,6 +115,8 @@ ceilometer.poll.compute =
network.outgoing.packets.error = ceilometer.compute.pollsters.net:OutgoingErrorsPollster
memory.usage = ceilometer.compute.pollsters.instance_stats:MemoryUsagePollster
memory.resident = ceilometer.compute.pollsters.instance_stats:MemoryResidentPollster
memory.swap.in = ceilometer.compute.pollsters.instance_stats:MemorySwapInPollster
memory.swap.out = ceilometer.compute.pollsters.instance_stats:MemorySwapOutPollster
memory.bandwidth.total = ceilometer.compute.pollsters.instance_stats:MemoryBandwidthTotalPollster
memory.bandwidth.local = ceilometer.compute.pollsters.instance_stats:MemoryBandwidthLocalPollster
disk.capacity = ceilometer.compute.pollsters.disk:CapacityPollster