From cc5030485946053c49107ea1b6d61f00f52057f9 Mon Sep 17 00:00:00 2001 From: Enol Fernandez Date: Fri, 17 Jan 2014 12:28:56 +0100 Subject: [PATCH] Add support for groupby in statistics for API v2 Adds the groupby parameter to list method of Statistics and a new option "-g/--groupby" for the shell. Change-Id: I41cfa076bf73f8c01d4ee71cd70008ea231556c8 Closes-Bug: #1270094 --- ceilometerclient/tests/v2/test_statistics.py | 52 ++++++++++++++++++++ ceilometerclient/v2/shell.py | 8 ++- ceilometerclient/v2/statistics.py | 5 +- 3 files changed, 62 insertions(+), 3 deletions(-) diff --git a/ceilometerclient/tests/v2/test_statistics.py b/ceilometerclient/tests/v2/test_statistics.py index 7d6bf7e..a9649e1 100644 --- a/ceilometerclient/tests/v2/test_statistics.py +++ b/ceilometerclient/tests/v2/test_statistics.py @@ -20,6 +20,7 @@ base_url = '/v2/meters/instance/statistics' qry = ('q.field=resource_id&q.field=source&q.op=&q.op=' '&q.type=&q.type=&q.value=foo&q.value=bar') period = '&period=60' +groupby = '&groupby=resource_id' samples = [ {u'count': 135, u'duration_start': u'2013-02-04T10:51:42', @@ -31,6 +32,30 @@ samples = [ u'avg': 1.0, u'sum': 135.0}, ] +groupby_samples = [ + {u'count': 135, + u'duration_start': u'2013-02-04T10:51:42', + u'min': 1.0, + u'max': 1.0, + u'duration_end': + u'2013-02-05T15:46:09', + u'duration': 1734.0, + u'avg': 1.0, + u'sum': 135.0, + u'groupby': {u'resource_id': u'foo'} + }, + {u'count': 12, + u'duration_start': u'2013-02-04T10:51:42', + u'min': 1.0, + u'max': 1.0, + u'duration_end': + u'2013-02-05T15:46:09', + u'duration': 1734.0, + u'avg': 1.0, + u'sum': 12.0, + u'groupby': {u'resource_id': u'bar'} + }, +] fixtures = { base_url: { @@ -53,6 +78,13 @@ fixtures = { samples ), }, + '%s?%s%s' % (base_url, qry, groupby): + { + 'GET': ( + {}, + groupby_samples + ), + }, } @@ -104,3 +136,23 @@ class StatisticsManagerTest(utils.BaseTestCase): self.assertEqual(self.api.calls, expect) self.assertEqual(len(stats), 1) self.assertEqual(stats[0].count, 135) + + def test_list_by_meter_name_with_groupby(self): + stats = list(self.mgr.list(meter_name='instance', + q=[ + {"field": "resource_id", + "value": "foo"}, + {"field": "source", + "value": "bar"}, + ], + groupby=['resource_id'])) + expect = [ + ('GET', + '%s?%s%s' % (base_url, qry, groupby), {}, None), + ] + self.assertEqual(self.api.calls, expect) + self.assertEqual(len(stats), 2) + self.assertEqual(stats[0].count, 135) + self.assertEqual(stats[1].count, 12) + self.assertEqual(stats[0].groupby.get('resource_id'), 'foo') + self.assertEqual(stats[1].groupby.get('resource_id'), 'bar') diff --git a/ceilometerclient/v2/shell.py b/ceilometerclient/v2/shell.py index 6d861aa..302eac8 100644 --- a/ceilometerclient/v2/shell.py +++ b/ceilometerclient/v2/shell.py @@ -41,11 +41,14 @@ OPERATORS_STRING = dict(gt='>', ge='>=', help='Name of meter to show samples for.') @utils.arg('-p', '--period', metavar='', help='Period in seconds over which to group samples.') +@utils.arg('-g', '--groupby', metavar='', action='append', + help='Field for group aggregation.') def do_statistics(cc, args): '''List the statistics for a meter.''' fields = {'meter_name': args.meter, 'q': options.cli_to_array(args.query), - 'period': args.period} + 'period': args.period, + 'groupby': args.groupby} try: statistics = cc.statistics.list(**fields) except exc.HTTPNotFound: @@ -57,6 +60,9 @@ def do_statistics(cc, args): fields = ['period', 'period_start', 'period_end', 'count', 'min', 'max', 'sum', 'avg', 'duration', 'duration_start', 'duration_end'] + if args.groupby: + field_labels.append('Group By') + fields.append('groupby') utils.print_list(statistics, fields, field_labels) diff --git a/ceilometerclient/v2/statistics.py b/ceilometerclient/v2/statistics.py index 4533af9..a65e69a 100644 --- a/ceilometerclient/v2/statistics.py +++ b/ceilometerclient/v2/statistics.py @@ -23,8 +23,9 @@ class Statistics(base.Resource): class StatisticsManager(base.Manager): resource_class = Statistics - def list(self, meter_name, q=None, period=None): - p = ['period=%s' % period] if period else None + def list(self, meter_name, q=None, period=None, groupby=[]): + p = ['period=%s' % period] if period else [] + p.extend(['groupby=%s' % g for g in groupby] if groupby else []) return self._list(options.build_url( '/v2/meters/' + meter_name + '/statistics', q, p))