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:
parent
513f0da17b
commit
a57fa80054
@ -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')
|
||||
|
@ -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')
|
||||
|
@ -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"
|
||||
|
@ -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, [
|
||||
|
Loading…
x
Reference in New Issue
Block a user