throw PollsterPermenantError exception for memory usage meter

For memory usage meter, if it is not supported by libvirt and the
underlying hypervisor being used by libvirt, there is no meaning
to running the pollster again and again and so we should throw
PollsterPermenantError exception, like what l3 cache meter does.

Change-Id: I871841f2ce8f755bdeb2aff3fb063158b5c0650a
Closes-Bug: 1599344
This commit is contained in:
Qiaowei Ren
2016-07-06 10:44:37 +08:00
parent bb35821852
commit b8cc36b5ea
5 changed files with 34 additions and 4 deletions

View File

@@ -16,6 +16,7 @@
from oslo_log import log from oslo_log import log
import ceilometer import ceilometer
from ceilometer.agent import plugin_base
from ceilometer.compute import pollsters from ceilometer.compute import pollsters
from ceilometer.compute.pollsters import util from ceilometer.compute.pollsters import util
from ceilometer.compute.virt import inspector as virt_inspector from ceilometer.compute.virt import inspector as virt_inspector
@@ -52,11 +53,17 @@ class MemoryUsagePollster(pollsters.BaseComputePollster):
'getting samples of %(pollster)s: %(exc)s', 'getting samples of %(pollster)s: %(exc)s',
{'instance_id': instance.id, {'instance_id': instance.id,
'pollster': self.__class__.__name__, 'exc': e}) 'pollster': self.__class__.__name__, 'exc': e})
except virt_inspector.NoDataException as e: except virt_inspector.InstanceNoDataException as e:
LOG.warning(_LW('Cannot inspect data of %(pollster)s for ' LOG.warning(_LW('Cannot inspect data of %(pollster)s for '
'%(instance_id)s, non-fatal reason: %(exc)s'), '%(instance_id)s, non-fatal reason: %(exc)s'),
{'pollster': self.__class__.__name__, {'pollster': self.__class__.__name__,
'instance_id': instance.id, 'exc': e}) 'instance_id': instance.id, 'exc': e})
except virt_inspector.NoDataException as e:
LOG.warning(_LW('Cannot inspect data of %(pollster)s for '
'%(instance_id)s: %(exc)s'),
{'pollster': self.__class__.__name__,
'instance_id': instance.id, 'exc': e})
raise plugin_base.PollsterPermanentError(resources)
except ceilometer.NotImplementedError: except ceilometer.NotImplementedError:
# Selected inspector does not implement this pollster. # Selected inspector does not implement this pollster.
LOG.debug('Obtaining Memory Usage is not implemented for %s', LOG.debug('Obtaining Memory Usage is not implemented for %s',

View File

@@ -187,6 +187,10 @@ class InstanceShutOffException(InspectorException):
pass pass
class InstanceNoDataException(InspectorException):
pass
class NoDataException(InspectorException): class NoDataException(InspectorException):
pass pass

View File

@@ -220,7 +220,7 @@ class LibvirtInspector(virt_inspector.Inspector):
'<name=%(name)s, id=%(id)s>, ' '<name=%(name)s, id=%(id)s>, '
'can not get info from libvirt.') % { 'can not get info from libvirt.') % {
'name': instance_name, 'id': instance.id} 'name': instance_name, 'id': instance.id}
raise virt_inspector.NoDataException(msg) raise virt_inspector.InstanceNoDataException(msg)
# memoryStats might launch an exception if the method is not supported # memoryStats might launch an exception if the method is not supported
# by the underlying hypervisor being used by libvirt. # by the underlying hypervisor being used by libvirt.
except libvirt.libvirtError as e: except libvirt.libvirtError as e:

View File

@@ -16,6 +16,7 @@
import mock import mock
from ceilometer.agent import manager from ceilometer.agent import manager
from ceilometer.agent import plugin_base
from ceilometer.compute.pollsters import memory from ceilometer.compute.pollsters import memory
from ceilometer.compute.virt import inspector as virt_inspector from ceilometer.compute.virt import inspector as virt_inspector
from ceilometer.tests.unit.compute.pollsters import base from ceilometer.tests.unit.compute.pollsters import base
@@ -31,7 +32,7 @@ class TestMemoryPollster(base.TestPollsterBase):
next_value = iter(( next_value = iter((
virt_inspector.MemoryUsageStats(usage=1.0), virt_inspector.MemoryUsageStats(usage=1.0),
virt_inspector.MemoryUsageStats(usage=2.0), virt_inspector.MemoryUsageStats(usage=2.0),
virt_inspector.NoDataException(), virt_inspector.InstanceNoDataException(),
virt_inspector.InstanceShutOffException(), virt_inspector.InstanceShutOffException(),
)) ))
@@ -66,6 +67,24 @@ class TestMemoryPollster(base.TestPollsterBase):
_verify_memory_metering(0, 0, 1) _verify_memory_metering(0, 0, 1)
_verify_memory_metering(0, 0, 0) _verify_memory_metering(0, 0, 0)
@mock.patch('ceilometer.pipeline.setup_pipeline', mock.MagicMock())
def test_get_samples_with_empty_stats(self):
def inspect_memory_usage(instance, duration):
raise virt_inspector.NoDataException()
self.inspector.inspect_memory_usage = mock.Mock(
side_effect=inspect_memory_usage)
mgr = manager.AgentManager()
pollster = memory.MemoryUsagePollster()
def all_samples():
return list(pollster.get_samples(mgr, {}, [self.instance]))
self.assertRaises(plugin_base.PollsterPermanentError,
all_samples)
class TestResidentMemoryPollster(base.TestPollsterBase): class TestResidentMemoryPollster(base.TestPollsterBase):

View File

@@ -336,7 +336,7 @@ class TestLibvirtInspection(base.BaseTestCase):
2, 999999)): 2, 999999)):
with mock.patch.object(self.domain, 'memoryStats', with mock.patch.object(self.domain, 'memoryStats',
return_value={}): return_value={}):
self.assertRaises(virt_inspector.NoDataException, self.assertRaises(virt_inspector.InstanceNoDataException,
self.inspector.inspect_memory_usage, self.inspector.inspect_memory_usage,
self.instance) self.instance)