diff options
Diffstat (limited to 'ceilometer/objectstore/swift.py')
-rw-r--r-- | ceilometer/objectstore/swift.py | 194 |
1 files changed, 105 insertions, 89 deletions
diff --git a/ceilometer/objectstore/swift.py b/ceilometer/objectstore/swift.py index d4c14d02..d87f9954 100644 --- a/ceilometer/objectstore/swift.py +++ b/ceilometer/objectstore/swift.py @@ -19,12 +19,14 @@ from __future__ import absolute_import +from keystoneclient import exceptions from oslo.config import cfg from oslo.utils import timeutils import six.moves.urllib.parse as urlparse from swiftclient import client as swift from ceilometer.central import plugin +from ceilometer.openstack.common.gettextutils import _ from ceilometer.openstack.common import log from ceilometer import sample @@ -43,30 +45,44 @@ cfg.CONF.register_opts(OPTS) class _Base(plugin.CentralPollster): - CACHE_KEY_TENANT = 'tenants' METHOD = 'head' + _ENDPOINT = None @property def default_discovery(self): - return 'endpoint:object-store' + return 'tenant' @property def CACHE_KEY_METHOD(self): return 'swift.%s_account' % self.METHOD - def _iter_accounts(self, ksclient, cache, endpoint): - key_tenant = '%s-%s' % (endpoint, self.CACHE_KEY_TENANT) - key_method = '%s-%s' % (endpoint, self.CACHE_KEY_METHOD) - if key_tenant not in cache: - cache[key_tenant] = ksclient.tenants.list() - if key_method not in cache: - cache[key_method] = list(self._get_account_info( - ksclient, cache, endpoint)) - return iter(cache[key_method]) - - def _get_account_info(self, ksclient, cache, endpoint): - key_tenant = '%s-%s' % (endpoint, self.CACHE_KEY_TENANT) - for t in cache[key_tenant]: + @staticmethod + def _get_endpoint(ksclient): + # we store the endpoint as a base class attribute, so keystone is + # only ever called once + if _Base._ENDPOINT is None: + try: + endpoint_type = cfg.CONF.service_credentials.os_endpoint_type + endpoint = ksclient.service_catalog.url_for( + service_type='object-store', + endpoint_type=endpoint_type) + _Base._ENDPOINT = endpoint + except exceptions.EndpointNotFound: + LOG.debug(_("Swift endpoint not found")) + return _Base._ENDPOINT + + def _iter_accounts(self, ksclient, cache, tenants): + if self.CACHE_KEY_METHOD not in cache: + cache[self.CACHE_KEY_METHOD] = list(self._get_account_info( + ksclient, tenants)) + return iter(cache[self.CACHE_KEY_METHOD]) + + def _get_account_info(self, ksclient, tenants): + endpoint = self._get_endpoint(ksclient) + if not endpoint: + raise StopIteration() + + for t in tenants: api_method = '%s_account' % self.METHOD yield (t.id, getattr(swift, api_method) (self._neaten_url(endpoint, t.id), @@ -82,58 +98,58 @@ class _Base(plugin.CentralPollster): class ObjectsPollster(_Base): """Iterate over all accounts, using keystone.""" def get_samples(self, manager, cache, resources): - for endpoint in resources: - for tenant, account in self._iter_accounts(manager.keystone, - cache, endpoint): - yield sample.Sample( - name='storage.objects', - type=sample.TYPE_GAUGE, - volume=int(account['x-account-object-count']), - unit='object', - user_id=None, - project_id=tenant, - resource_id=tenant, - timestamp=timeutils.isotime(), - resource_metadata=None, - ) + tenants = resources + for tenant, account in self._iter_accounts(manager.keystone, + cache, tenants): + yield sample.Sample( + name='storage.objects', + type=sample.TYPE_GAUGE, + volume=int(account['x-account-object-count']), + unit='object', + user_id=None, + project_id=tenant, + resource_id=tenant, + timestamp=timeutils.isotime(), + resource_metadata=None, + ) class ObjectsSizePollster(_Base): """Iterate over all accounts, using keystone.""" def get_samples(self, manager, cache, resources): - for endpoint in resources: - for tenant, account in self._iter_accounts(manager.keystone, - cache, endpoint): - yield sample.Sample( - name='storage.objects.size', - type=sample.TYPE_GAUGE, - volume=int(account['x-account-bytes-used']), - unit='B', - user_id=None, - project_id=tenant, - resource_id=tenant, - timestamp=timeutils.isotime(), - resource_metadata=None, - ) + tenants = resources + for tenant, account in self._iter_accounts(manager.keystone, + cache, tenants): + yield sample.Sample( + name='storage.objects.size', + type=sample.TYPE_GAUGE, + volume=int(account['x-account-bytes-used']), + unit='B', + user_id=None, + project_id=tenant, + resource_id=tenant, + timestamp=timeutils.isotime(), + resource_metadata=None, + ) class ObjectsContainersPollster(_Base): """Iterate over all accounts, using keystone.""" def get_samples(self, manager, cache, resources): - for endpoint in resources: - for tenant, account in self._iter_accounts(manager.keystone, - cache, endpoint): - yield sample.Sample( - name='storage.objects.containers', - type=sample.TYPE_GAUGE, - volume=int(account['x-account-container-count']), - unit='container', - user_id=None, - project_id=tenant, - resource_id=tenant, - timestamp=timeutils.isotime(), - resource_metadata=None, - ) + tenants = resources + for tenant, account in self._iter_accounts(manager.keystone, + cache, tenants): + yield sample.Sample( + name='storage.objects.containers', + type=sample.TYPE_GAUGE, + volume=int(account['x-account-container-count']), + unit='container', + user_id=None, + project_id=tenant, + resource_id=tenant, + timestamp=timeutils.isotime(), + resource_metadata=None, + ) class ContainersObjectsPollster(_Base): @@ -142,22 +158,22 @@ class ContainersObjectsPollster(_Base): METHOD = 'get' def get_samples(self, manager, cache, resources): - for endpoint in resources: - for project, account in self._iter_accounts(manager.keystone, - cache, endpoint): - containers_info = account[1] - for container in containers_info: - yield sample.Sample( - name='storage.containers.objects', - type=sample.TYPE_GAUGE, - volume=int(container['count']), - unit='object', - user_id=None, - project_id=project, - resource_id=project + '/' + container['name'], - timestamp=timeutils.isotime(), - resource_metadata=None, - ) + tenants = resources + for tenant, account in self._iter_accounts(manager.keystone, + cache, tenants): + containers_info = account[1] + for container in containers_info: + yield sample.Sample( + name='storage.containers.objects', + type=sample.TYPE_GAUGE, + volume=int(container['count']), + unit='object', + user_id=None, + project_id=tenant, + resource_id=tenant + '/' + container['name'], + timestamp=timeutils.isotime(), + resource_metadata=None, + ) class ContainersSizePollster(_Base): @@ -166,19 +182,19 @@ class ContainersSizePollster(_Base): METHOD = 'get' def get_samples(self, manager, cache, resources): - for endpoint in resources: - for project, account in self._iter_accounts(manager.keystone, - cache, endpoint): - containers_info = account[1] - for container in containers_info: - yield sample.Sample( - name='storage.containers.objects.size', - type=sample.TYPE_GAUGE, - volume=int(container['bytes']), - unit='B', - user_id=None, - project_id=project, - resource_id=project + '/' + container['name'], - timestamp=timeutils.isotime(), - resource_metadata=None, - ) + tenants = resources + for tenant, account in self._iter_accounts(manager.keystone, + cache, tenants): + containers_info = account[1] + for container in containers_info: + yield sample.Sample( + name='storage.containers.objects.size', + type=sample.TYPE_GAUGE, + volume=int(container['bytes']), + unit='B', + user_id=None, + project_id=tenant, + resource_id=tenant + '/' + container['name'], + timestamp=timeutils.isotime(), + resource_metadata=None, + ) |