Don't throw exception when missing metrics
When querying data from datasource, it's possible to miss some data. In this case if we throw an exception, Audit will failed because of the exception. We should remove the exception and give the decision to the strategy. Change-Id: I1b0e6b78b3bba4df9ba16e093b3910aab1de922e Closes-Bug: #1847434
This commit is contained in:
@@ -19,8 +19,6 @@ import time
|
|||||||
from oslo_config import cfg
|
from oslo_config import cfg
|
||||||
from oslo_log import log
|
from oslo_log import log
|
||||||
|
|
||||||
from watcher.common import exception
|
|
||||||
|
|
||||||
CONF = cfg.CONF
|
CONF = cfg.CONF
|
||||||
LOG = log.getLogger(__name__)
|
LOG = log.getLogger(__name__)
|
||||||
|
|
||||||
@@ -79,7 +77,6 @@ class DataSourceBase(object):
|
|||||||
LOG.warning("Retry {0} of {1} while retrieving metrics retry "
|
LOG.warning("Retry {0} of {1} while retrieving metrics retry "
|
||||||
"in {2} seconds".format(i+1, num_retries, timeout))
|
"in {2} seconds".format(i+1, num_retries, timeout))
|
||||||
time.sleep(timeout)
|
time.sleep(timeout)
|
||||||
raise exception.DataSourceNotAvailable(datasource=self.NAME)
|
|
||||||
|
|
||||||
@abc.abstractmethod
|
@abc.abstractmethod
|
||||||
def query_retry_reset(self, exception_instance):
|
def query_retry_reset(self, exception_instance):
|
||||||
|
|||||||
@@ -136,19 +136,18 @@ class CeilometerHelper(base.DataSourceBase):
|
|||||||
|
|
||||||
def list_metrics(self):
|
def list_metrics(self):
|
||||||
"""List the user's meters."""
|
"""List the user's meters."""
|
||||||
try:
|
|
||||||
meters = self.query_retry(f=self.ceilometer.meters.list)
|
meters = self.query_retry(f=self.ceilometer.meters.list)
|
||||||
except Exception:
|
if not meters:
|
||||||
return set()
|
return set()
|
||||||
else:
|
else:
|
||||||
return meters
|
return meters
|
||||||
|
|
||||||
def check_availability(self):
|
def check_availability(self):
|
||||||
try:
|
status = self.query_retry(self.ceilometer.resources.list)
|
||||||
self.query_retry(self.ceilometer.resources.list)
|
if status:
|
||||||
except Exception:
|
|
||||||
return 'not available'
|
|
||||||
return 'available'
|
return 'available'
|
||||||
|
else:
|
||||||
|
return 'not available'
|
||||||
|
|
||||||
def query_sample(self, meter_name, query, limit=1):
|
def query_sample(self, meter_name, query, limit=1):
|
||||||
return self.query_retry(f=self.ceilometer.samples.list,
|
return self.query_retry(f=self.ceilometer.samples.list,
|
||||||
|
|||||||
@@ -52,17 +52,16 @@ class GnocchiHelper(base.DataSourceBase):
|
|||||||
self.gnocchi = self.osc.gnocchi()
|
self.gnocchi = self.osc.gnocchi()
|
||||||
|
|
||||||
def check_availability(self):
|
def check_availability(self):
|
||||||
try:
|
status = self.query_retry(self.gnocchi.status.get)
|
||||||
self.query_retry(self.gnocchi.status.get)
|
if status:
|
||||||
except Exception:
|
|
||||||
return 'not available'
|
|
||||||
return 'available'
|
return 'available'
|
||||||
|
else:
|
||||||
|
return 'not available'
|
||||||
|
|
||||||
def list_metrics(self):
|
def list_metrics(self):
|
||||||
"""List the user's meters."""
|
"""List the user's meters."""
|
||||||
try:
|
|
||||||
response = self.query_retry(f=self.gnocchi.metric.list)
|
response = self.query_retry(f=self.gnocchi.metric.list)
|
||||||
except Exception:
|
if not response:
|
||||||
return set()
|
return set()
|
||||||
else:
|
else:
|
||||||
return set([metric['name'] for metric in response])
|
return set([metric['name'] for metric in response])
|
||||||
@@ -91,8 +90,9 @@ class GnocchiHelper(base.DataSourceBase):
|
|||||||
f=self.gnocchi.resource.search, **kwargs)
|
f=self.gnocchi.resource.search, **kwargs)
|
||||||
|
|
||||||
if not resources:
|
if not resources:
|
||||||
raise exception.ResourceNotFound(name='gnocchi',
|
LOG.warning("The {0} resource {1} could not be "
|
||||||
id=resource_id)
|
"found".format(self.NAME, resource_id))
|
||||||
|
return
|
||||||
|
|
||||||
resource_id = resources[0]['id']
|
resource_id = resources[0]['id']
|
||||||
|
|
||||||
@@ -110,6 +110,7 @@ class GnocchiHelper(base.DataSourceBase):
|
|||||||
statistics = self.query_retry(
|
statistics = self.query_retry(
|
||||||
f=self.gnocchi.metric.get_measures, **kwargs)
|
f=self.gnocchi.metric.get_measures, **kwargs)
|
||||||
|
|
||||||
|
return_value = None
|
||||||
if statistics:
|
if statistics:
|
||||||
# return value of latest measure
|
# return value of latest measure
|
||||||
# measure has structure [time, granularity, value]
|
# measure has structure [time, granularity, value]
|
||||||
|
|||||||
@@ -179,6 +179,9 @@ class GrafanaHelper(base.DataSourceBase):
|
|||||||
kwargs = {k: v for k, v in raw_kwargs.items() if k and v}
|
kwargs = {k: v for k, v in raw_kwargs.items() if k and v}
|
||||||
|
|
||||||
resp = self.query_retry(self._request, **kwargs)
|
resp = self.query_retry(self._request, **kwargs)
|
||||||
|
if not resp:
|
||||||
|
LOG.warning("Datasource {0} is not available.".format(self.NAME))
|
||||||
|
return
|
||||||
|
|
||||||
result = translator.extract_result(resp.content)
|
result = translator.extract_result(resp.content)
|
||||||
|
|
||||||
|
|||||||
@@ -73,11 +73,11 @@ class MonascaHelper(base.DataSourceBase):
|
|||||||
self.monasca = self.osc.monasca()
|
self.monasca = self.osc.monasca()
|
||||||
|
|
||||||
def check_availability(self):
|
def check_availability(self):
|
||||||
try:
|
result = self.query_retry(self.monasca.metrics.list)
|
||||||
self.query_retry(self.monasca.metrics.list)
|
if result:
|
||||||
except Exception:
|
|
||||||
return 'not available'
|
|
||||||
return 'available'
|
return 'available'
|
||||||
|
else:
|
||||||
|
return 'not available'
|
||||||
|
|
||||||
def list_metrics(self):
|
def list_metrics(self):
|
||||||
# TODO(alexchadin): this method should be implemented in accordance to
|
# TODO(alexchadin): this method should be implemented in accordance to
|
||||||
|
|||||||
@@ -19,7 +19,6 @@
|
|||||||
import mock
|
import mock
|
||||||
from oslo_config import cfg
|
from oslo_config import cfg
|
||||||
|
|
||||||
from watcher.common import exception
|
|
||||||
from watcher.decision_engine.datasources import base as datasource
|
from watcher.decision_engine.datasources import base as datasource
|
||||||
from watcher.tests import base
|
from watcher.tests import base
|
||||||
|
|
||||||
@@ -61,9 +60,8 @@ class TestBaseDatasourceHelper(base.BaseTestCase):
|
|||||||
helper = datasource.DataSourceBase()
|
helper = datasource.DataSourceBase()
|
||||||
helper.query_retry_reset = mock.Mock()
|
helper.query_retry_reset = mock.Mock()
|
||||||
|
|
||||||
# Maximum number of retries exceeded query_retry should raise error
|
# Maximum number of retries exceeded query_retry should return None
|
||||||
self.assertRaises(exception.DataSourceNotAvailable,
|
self.assertIsNone(helper.query_retry(f=method))
|
||||||
helper.query_retry, f=method)
|
|
||||||
# query_retry_reset should be called twice
|
# query_retry_reset should be called twice
|
||||||
helper.query_retry_reset.assert_has_calls(
|
helper.query_retry_reset.assert_has_calls(
|
||||||
[mock.call(exc), mock.call(exc)])
|
[mock.call(exc), mock.call(exc)])
|
||||||
|
|||||||
@@ -132,11 +132,7 @@ class TestGrafana(base.BaseTestCase):
|
|||||||
|
|
||||||
t_grafana = grafana.GrafanaHelper(osc=mock.Mock())
|
t_grafana = grafana.GrafanaHelper(osc=mock.Mock())
|
||||||
|
|
||||||
self.assertRaises(
|
self.assertIsNone(t_grafana.get_host_cpu_usage(self.m_compute_node))
|
||||||
exception.DataSourceNotAvailable,
|
|
||||||
t_grafana.get_host_cpu_usage,
|
|
||||||
self.m_compute_node
|
|
||||||
)
|
|
||||||
|
|
||||||
def test_no_metric_raise_error(self):
|
def test_no_metric_raise_error(self):
|
||||||
"""Test raising error when specified meter does not exist"""
|
"""Test raising error when specified meter does not exist"""
|
||||||
|
|||||||
Reference in New Issue
Block a user