Merge "metric: add support for groupby in aggregation"

This commit is contained in:
Jenkins 2016-04-19 06:28:39 +00:00 committed by Gerrit Code Review
commit 1dbe4e2cde
3 changed files with 42 additions and 2 deletions

View File

@ -241,6 +241,28 @@ class MetricClientTest(base.ClientTestBase):
'timestamp': '2015-03-06T14:34:12+00:00',
'value': '12.0'}], measures)
# MEASURES AGGREGATION GROUPBY
result = self.gnocchi(
'measures', params=("aggregation "
"--groupby project_id "
"--groupby user_id "
"--query \"id='metric-res'\" "
"--resource-type \"generic\" "
"-m metric-name "
"--aggregation mean "
"--needed-overlap 0 "
"--start 2015-03-06T14:32:00 "
"--stop 2015-03-06T14:36:00"))
measures = self.parser.listing(result)
self.assertEqual([{'group': 'project_id: None, user_id: None',
'granularity': '1.0',
'timestamp': '2015-03-06T14:33:57+00:00',
'value': '43.11'},
{'group': 'project_id: None, user_id: None',
'granularity': '1.0',
'timestamp': '2015-03-06T14:34:12+00:00',
'value': '12.0'}], measures)
# BATCHING
measures = json.dumps({'metric-res': {'metric-name': [{
'timestamp': '2015-03-06T14:34:12', 'value': 12

View File

@ -193,7 +193,8 @@ class MetricManager(base.Manager):
def aggregation(self, metrics, query=None,
start=None, stop=None, aggregation=None,
needed_overlap=None, resource_type="generic"):
needed_overlap=None, resource_type="generic",
groupby=None):
"""Get measurements of a aggregated metrics
:param metrics: IDs of metric or metric name
@ -208,6 +209,8 @@ class MetricManager(base.Manager):
:type aggregation: str
:param resource_type: type of resource for the query
:type resource_type: str
:param groupby: list of attribute to group by
:type groupby: list
See Gnocchi REST API documentation for the format
of *query dictionary*
@ -220,7 +223,8 @@ class MetricManager(base.Manager):
stop = stop.isoformat()
params = dict(start=start, stop=stop, aggregation=aggregation,
needed_overlap=needed_overlap)
needed_overlap=needed_overlap,
groupby=groupby)
if query is None:
for metric in metrics:
self._ensure_metric_is_uuid(metric)

View File

@ -222,6 +222,9 @@ class CliMeasuresAggregation(lister.Lister):
utils.add_query_argument("--query", parser)
parser.add_argument("--resource-type", default="generic",
help="Resource type to query"),
parser.add_argument("--groupby",
action='append',
help="Attribute to use to group resources"),
return parser
def take_action(self, parsed_args):
@ -238,5 +241,16 @@ class CliMeasuresAggregation(lister.Lister):
stop=parsed_args.stop,
needed_overlap=parsed_args.needed_overlap,
resource_type=parsed_args.resource_type,
groupby=parsed_args.groupby,
)
if parsed_args.groupby:
ms = []
for g in measures:
group_name = ", ".join("%s: %s" % (k, g['group'][k])
for k in sorted(g['group']))
for m in g['measures']:
i = [group_name]
i.extend(m)
ms.append(i)
return ('group',) + self.COLS, ms
return self.COLS, measures