Merge "Don't throw exception when missing metrics" into stable/train

This commit is contained in:
Zuul 2019-10-21 02:07:33 +00:00 committed by Gerrit Code Review
commit e37bbf3be3
7 changed files with 27 additions and 33 deletions

View File

@ -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):

View File

@ -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) if not meters:
except Exception:
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 'available'
else:
return 'not available' return 'not available'
return '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,

View File

@ -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 'available'
else:
return 'not available' return 'not available'
return '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) if not response:
except Exception:
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]
@ -120,7 +121,7 @@ class GnocchiHelper(base.DataSourceBase):
# 1/10 th of actual CFM # 1/10 th of actual CFM
return_value *= 10 return_value *= 10
return return_value return return_value
def get_host_cpu_usage(self, resource, period, aggregate, def get_host_cpu_usage(self, resource, period, aggregate,
granularity=300): granularity=300):

View File

@ -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)

View File

@ -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 'available'
else:
return 'not available' return 'not available'
return '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

View File

@ -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)])

View File

@ -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"""