Merge "metric: add support for groupby in aggregation"
This commit is contained in:
commit
1dbe4e2cde
|
@ -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
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue