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
This commit is contained in:
Luka Peschke 2018-02-12 10:59:09 +01:00
parent 9afc3472ea
commit a111d36b1a
1 changed files with 16 additions and 42 deletions

View File

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