Properly filter Ceilometer statistics for charts

We used to filter by image_id for roles, back when we had different
images for different roles. As we are now using the same image for
all the roles, that way of filtering does not work any longer. We
need to filter by instance UUIDs instead.

Change-Id: Ie4f26a29beaaf67aa3b36bb82961b491d31c95a0
This commit is contained in:
Ana Krivokapic 2015-06-26 17:15:43 +02:00
parent 513f0da17b
commit a57fa80054
4 changed files with 38 additions and 32 deletions

View File

@ -179,15 +179,21 @@ class PerformanceView(base.TemplateView):
node_uuid = kwargs.get('node_uuid', None)
if node_uuid:
node = api.node.Node.get(request, node_uuid)
instance_uuid = node.instance_uuid
instance_uuids = [node.instance_uuid]
else:
# Aggregated stats for all nodes
instance_uuid = None
instance_uuids = []
json_output = metering_utils.get_nodes_stats(
request, node_uuid, instance_uuid, image_uuid=None, meter=meter,
date_options=date_options, date_from=date_from, date_to=date_to,
stats_attr=stats_attr, barchart=barchart)
request=request,
node_uuid=node_uuid,
instance_uuids=instance_uuids,
meter=meter,
date_options=date_options,
date_from=date_from,
date_to=date_to,
stats_attr=stats_attr,
barchart=barchart)
return django.http.HttpResponse(
json.dumps(json_output), content_type='application/json')

View File

@ -168,21 +168,24 @@ class PerformanceView(base.TemplateView, views.RoleMixin, views.StackMixin):
stats_attr = request.GET.get('stats_attr', 'avg')
barchart = bool(request.GET.get('barchart'))
plan = api.tuskar.Plan.get_the_plan(self.request)
role = self.get_role(None)
role.image(plan)
role = self.get_role()
stack = self.get_stack()
instances = stack.resources(role=role, with_joins=True)
try:
image = role.image(plan)
image_uuid = image.id
except AttributeError:
json_output = None
else:
if instances:
instance_uuids = [i.physical_resource_id for i in instances]
json_output = metering_utils.get_nodes_stats(
request, node_uuid=None, instance_uuid=None,
image_uuid=image_uuid, meter=meter, date_options=date_options,
date_from=date_from, date_to=date_to, stats_attr=stats_attr,
barchart=barchart, group_by='image_id')
request=request,
node_uuid=None,
instance_uuids=instance_uuids,
meter=meter,
date_options=date_options,
date_from=date_from,
date_to=date_to,
stats_attr=stats_attr,
barchart=barchart)
else:
json_output = None
return http.HttpResponse(json.dumps(json_output),
content_type='application/json')

View File

@ -177,13 +177,13 @@ def create_json_output(series, barchart, unit, date_from, date_to):
return json_output
def get_nodes_stats(request, node_uuid, instance_uuid, image_uuid, meter,
def get_nodes_stats(request, node_uuid, instance_uuids, meter,
date_options=None, date_from=None, date_to=None,
stats_attr=None, barchart=None, group_by=None):
series = []
meter_list, unit = get_meter_list_and_unit(request, meter)
if instance_uuid or image_uuid:
if instance_uuids:
if 'ipmi' in meter:
# For IPMI metrics, a resource ID is made of node UUID concatenated
# with the metric description. E.g:
@ -199,17 +199,12 @@ def get_nodes_stats(request, node_uuid, instance_uuid, image_uuid, meter,
else:
# For SNMP metrics, a resource ID matches exactly the UUID of the
# associated instance
if group_by == "image_id":
query = {}
image_query = [{"field": "metadata.%s" % group_by,
"op": "eq",
"value": image_uuid}]
query[instance_uuid] = image_query
else:
query = [{'field': 'resource_id',
'op': 'eq',
'value': instance_uuid}]
queries = [query]
queries = [
[{'field': 'resource_id',
'op': 'eq',
'value': instance_uuid}]
for instance_uuid in instance_uuids
]
else:
# query will be aggregated across all resources
group_by = "all"

View File

@ -288,7 +288,9 @@ class MeteringTests(helpers.TestCase):
return_value=('from date', 'to date'),
):
ret = metering.get_nodes_stats(
request, node_uuid='abc', instance_uuid='def', image_uuid=None,
request=request,
node_uuid='abc',
instance_uuids=['def'],
meter='foo.bar')
self.assertEqual(ret, '')
self.assertEqual(create_json_output.call_args_list, [