From a111d36b1aab5b738bf63df35b64658b698fa1f8 Mon Sep 17 00:00:00 2001 From: Luka Peschke Date: Mon, 12 Feb 2018 10:59:09 +0100 Subject: [PATCH] Use metric dimensions as metadata in monasca collector With this change, a metric's dimensions are used instead of the measurement's metadata for storage informations. This allows the collector to provide more metadata and increases its performance (less requests on the monasca API are made). Change-Id: I1ecfe4929308718f9c448c5235634888dd456f3f --- cloudkitty/collector/monasca.py | 58 +++++++++------------------------ 1 file changed, 16 insertions(+), 42 deletions(-) diff --git a/cloudkitty/collector/monasca.py b/cloudkitty/collector/monasca.py index 3f0cc7dc..d486c7c6 100644 --- a/cloudkitty/collector/monasca.py +++ b/cloudkitty/collector/monasca.py @@ -146,14 +146,13 @@ class MonascaCollector(collector.BaseCollector): start = ck_utils.dt2ts(ck_utils.get_month_start()) end = ck_utils.dt2ts(ck_utils.get_month_end()) + try: - resource_id = self.active_resources(resource_type, start, - end, None)[0] + resource = self.active_resources(resource_type, start, + end, None)[0] except IndexError: - resource_id = '' - metadata = self._get_resource_metadata(resource_type, start, - end, resource_id) - info['metadata'] = metadata.keys() + resource = {} + info['metadata'] = resource.get('dimensions', {}).keys() try: service_metrics = METRICS_CONF['services_metrics'][resource_type] @@ -181,31 +180,6 @@ class MonascaCollector(collector.BaseCollector): tmp = cls(**args) return tmp._get_metadata(resource_type, transformers) - def _get_resource_metadata(self, resource_type, start, end, resource_id): - try: - meter = METRICS_CONF['services_objects'].get(resource_type) - # NOTE(mc): deprecated except part kept for backward compatibility. - except KeyError: - LOG.warning('Error when trying to use yaml metrology conf.') - LOG.warning('Fallback on the deprecated oslo config method.') - meter = self.retrieve_mappings.get(resource_type) - - if not meter: - return {} - measurements = self._conn.metrics.list_measurements( - name=meter, - start_time=ck_utils.ts2dt(start), - end_time=ck_utils.ts2dt(end), - merge_metrics=True, - dimensions={'resource_id': resource_id}, - ) - try: - # Getting the last measurement of given period - metadata = measurements[-1]['measurements'][-1][2] - except (KeyError, IndexError): - metadata = {} - return metadata - def _get_resource_qty(self, meter, start, end, resource_id, statistics): # NOTE(lukapeschke) the period trick is used to aggregate # the measurements @@ -254,19 +228,19 @@ class MonascaCollector(collector.BaseCollector): if project_id: dimensions['project_id'] = project_id dimensions.update(kwargs) - resources = self._conn.metrics.list(name=meter, - **dimensions) - resource_ids = [] + resources = self._conn.metrics.list(name=meter, dimensions=dimensions) + output = [] for resource in resources: try: resource_id = resource['dimensions']['resource_id'] - if (resource_id not in resource_ids + if (resource_id not in + [item['dimensions']['resource_id'] for item in output] and self._is_resource_active(meter, resource_id, start, end)): - resource_ids.append(resource_id) + output.append(resource) except KeyError: continue - return resource_ids + return output def _expand_metrics(self, resource, resource_id, mappings, start, end, resource_type): @@ -318,14 +292,13 @@ class MonascaCollector(collector.BaseCollector): self.default_unit ) - active_resource_ids = self.active_resources( + active_resources = self.active_resources( resource_type, start, end, project_id ) resource_data = [] - for resource_id in active_resource_ids: - data = self._get_resource_metadata(resource_type, start, - end, resource_id) - + for resource in active_resources: + resource_id = resource['dimensions']['resource_id'] + data = resource['dimensions'] try: mappings = METRICS_CONF['services_metrics'][resource_type] # NOTE(mc): deprecated except part kept for backward compatibility. @@ -353,6 +326,7 @@ class MonascaCollector(collector.BaseCollector): msg = 'Fallback on the deprecated oslo config method' LOG.warning(msg) resource_qty = data[self.retrieve_mappings[resource_type]] + resource_qty = data[resource_qty] resource = self.t_cloudkitty.format_item(data, unit, resource_qty) resource['desc']['resource_id'] = resource_id