verify gnocchi connection before processing

currently we create a client on initialisation but never verify that
the client has a connection. this creates a lot of errors in logs
because gnocchi isn't started yet.

this patch verfies the connection before it begins processing data by
calling gnocchi on initialisation.

DocImpact
Closes-Bug: #1489949
Change-Id: Ie3b7d966f068611e3fb60089b724f1a4c02f771e
This commit is contained in:
gordon chung 2015-12-04 13:11:58 -05:00
parent 6d8848ee22
commit 152aa1af01
4 changed files with 35 additions and 2 deletions

View File

@ -37,6 +37,19 @@ OPTS = [
] ]
cfg.CONF.register_opts(OPTS) cfg.CONF.register_opts(OPTS)
STORAGE_OPTS = [
cfg.IntOpt('max_retries',
default=10,
deprecated_group='database',
help='Maximum number of connection retries during startup. '
'Set to -1 to specify an infinite retry count.'),
cfg.IntOpt('retry_interval',
default=10,
deprecated_group='database',
help='Interval (in seconds) between retries of connection.'),
]
cfg.CONF.register_opts(STORAGE_OPTS, group='storage')
def _load_dispatcher_manager(dispatcher_type): def _load_dispatcher_manager(dispatcher_type):
namespace = 'ceilometer.dispatcher.%s' % dispatcher_type namespace = 'ceilometer.dispatcher.%s' % dispatcher_type

View File

@ -24,6 +24,7 @@ from keystoneauth1 import session as ka_session
from oslo_config import cfg from oslo_config import cfg
from oslo_log import log from oslo_log import log
import requests import requests
import retrying
import six import six
from stevedore import extension from stevedore import extension
@ -197,6 +198,20 @@ class GnocchiDispatcher(dispatcher.MeterDispatcherBase):
self._gnocchi_resource_lock = threading.Lock() self._gnocchi_resource_lock = threading.Lock()
self._gnocchi = GnocchiClient(conf) self._gnocchi = GnocchiClient(conf)
# Convert retry_interval secs to msecs for retry decorator
retries = conf.storage.max_retries
@retrying.retry(wait_fixed=conf.storage.retry_interval * 1000,
stop_max_attempt_number=(retries if retries >= 0
else None))
def _get_connection():
self._gnocchi.capabilities.list()
try:
_get_connection()
except Exception:
LOG.error(_LE('Failed to connect to Gnocchi.'))
raise
@staticmethod @staticmethod
def _get_config_file(conf, config_file): def _get_config_file(conf, config_file):

View File

@ -122,6 +122,7 @@ def list_opts():
ceilometer.nova_client.SERVICE_OPTS, ceilometer.nova_client.SERVICE_OPTS,
ceilometer.objectstore.rgw.SERVICE_OPTS, ceilometer.objectstore.rgw.SERVICE_OPTS,
ceilometer.objectstore.swift.SERVICE_OPTS,)), ceilometer.objectstore.swift.SERVICE_OPTS,)),
('storage', ceilometer.dispatcher.STORAGE_OPTS),
('vmware', ceilometer.compute.virt.vmware.inspector.OPTS), ('vmware', ceilometer.compute.virt.vmware.inspector.OPTS),
('xenapi', ceilometer.compute.virt.xenapi.inspector.OPTS), ('xenapi', ceilometer.compute.virt.xenapi.inspector.OPTS),
] ]

View File

@ -35,6 +35,7 @@ from ceilometer.tests import base
load_tests = testscenarios.load_tests_apply_scenarios load_tests = testscenarios.load_tests_apply_scenarios
@mock.patch('gnocchiclient.v1.client.Client', mock.Mock())
class DispatcherTest(base.BaseTestCase): class DispatcherTest(base.BaseTestCase):
def setUp(self): def setUp(self):
@ -313,8 +314,11 @@ class DispatcherWorkflowTest(base.BaseTestCase,
resource_id = self.sample['resource_id'] # .replace("/", "%2F"), resource_id = self.sample['resource_id'] # .replace("/", "%2F"),
metric_name = self.sample['counter_name'] metric_name = self.sample['counter_name']
expected_calls = [mock.call.metric.add_measures( expected_calls = [
metric_name, self.measures_attributes, resource_id)] mock.call.capabilities.list(),
mock.call.metric.add_measures(metric_name,
self.measures_attributes,
resource_id)]
add_measures_side_effect = [] add_measures_side_effect = []