[pkg-eucalyptus-commits] [SCM] managing cloud instances for Eucalyptus branch, master, updated. 3.0.0-alpha3-257-g1da8e3a
Garrett Holmstrom
gholms at fedoraproject.org
Sun Jun 16 02:30:46 UTC 2013
The following commit has been merged in the master branch:
commit 150208c9b8da0d6f561795a22d849baaf323dc82
Author: Garrett Holmstrom <gholms at fedoraproject.org>
Date: Thu Mar 21 17:51:50 2013 -0700
Implement GetMetricStatistics
Fixes TOOLS-263
diff --git a/bin/euwatch-get-stats b/bin/euwatch-get-stats
new file mode 100755
index 0000000..67ed062
--- /dev/null
+++ b/bin/euwatch-get-stats
@@ -0,0 +1,6 @@
+#!/usr/bin/python -tt
+
+import euca2ools.commands.monitoring.getmetricstatistics
+
+if __name__ == '__main__':
+ euca2ools.commands.monitoring.getmetricstatistics.GetMetricStatistics.run()
diff --git a/euca2ools/commands/monitoring/getmetricstatistics.py b/euca2ools/commands/monitoring/getmetricstatistics.py
new file mode 100644
index 0000000..db70a9d
--- /dev/null
+++ b/euca2ools/commands/monitoring/getmetricstatistics.py
@@ -0,0 +1,108 @@
+# Software License Agreement (BSD License)
+#
+# Copyright (c) 2013, Eucalyptus Systems, Inc.
+# All rights reserved.
+#
+# Redistribution and use of this software in source and binary forms, with or
+# without modification, are permitted provided that the following conditions
+# are met:
+#
+# Redistributions of source code must retain the above
+# copyright notice, this list of conditions and the
+# following disclaimer.
+#
+# Redistributions in binary form must reproduce the above
+# copyright notice, this list of conditions and the
+# following disclaimer in the documentation and/or other
+# materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+# POSSIBILITY OF SUCH DAMAGE.
+
+import datetime
+from euca2ools.commands.argtypes import delimited_list
+from euca2ools.commands.monitoring import CloudWatchRequest
+from euca2ools.commands.monitoring.argtypes import cloudwatch_dimension
+from requestbuilder import Arg
+from requestbuilder.exceptions import ArgumentError
+from requestbuilder.mixins import TabifyingCommand
+from requestbuilder.response import PaginatedResponse
+
+
+class GetMetricStatistics(CloudWatchRequest, TabifyingCommand):
+ DESCRIPTION = "Show a metric's statistics"
+ ARGS = [Arg('MetricName', metavar='METRIC',
+ help='name of the metric to get statistics for (required)'),
+ Arg('-n', '--namespace', dest='Namespace',
+ help="the metric's namespace (required)"),
+ Arg('-s', '--statistics', dest='Statistics.member', required=True,
+ metavar='STAT1,STAT2,...', type=delimited_list(','),
+ help='the metric statistics to show (at least 1 required)'),
+ Arg('--dimensions', dest='Dimensions.member',
+ metavar='KEY1=VALUE1,KEY2=VALUE2,...',
+ type=delimited_list(',', item_type=cloudwatch_dimension),
+ help='the dimensions of the metric to show'),
+ Arg('--start-time', dest='StartTime',
+ metavar='YYYY-MM-DDThh:mm:ssZ', help='''earliest time to
+ retrieve data points for (default: one hour ago)'''),
+ Arg('--end-time', dest='EndTime',
+ metavar='YYYY-MM-DDThh:mm:ssZ', help='''latest time to retrieve
+ data points for (default: now)'''),
+ Arg('--period', dest='Period', metavar='SECONDS', type=int,
+ help='''granularity of the returned data points (must be a
+ multiple of 60)'''),
+ Arg('--unit', dest='Unit', help='unit the metric is reported in')]
+ LIST_TAGS = ['Datapoints']
+
+ def configure(self):
+ CloudWatchRequest.configure(self)
+ if self.args.get('period'):
+ if self.args['period'] <= 0:
+ raise ArgumentError(
+ 'argument --period: value must be positive')
+ elif self.args['period'] % 60 != 0:
+ raise ArgumentError(
+ 'argument --period: value must be a multiple of 60')
+
+ def main(self):
+ now = datetime.datetime.now()
+ then = now - datetime.timedelta(hours=1)
+ if not self.args.get('StartTime'):
+ self.params['StartTime'] = then.strftime('%Y-%m-%dT%H:%M:%SZ')
+ if not self.args.get('EndTime'):
+ self.params['EndTime'] = now.strftime('%Y-%m-%dT%H:%M:%SZ')
+
+ return PaginatedResponse(self, (None,), ('Datapoints,'))
+
+ def prepare_for_page(self, page):
+ self.params['NextToken'] = page
+
+ def get_next_page(self, response):
+ return response.get('NextToken') or None
+
+ def print_result(self, result):
+ points = []
+ for point in result.get('Datapoints', []):
+ timestamp = point.get('Timestamp', '')
+ try:
+ parsed = datetime.datetime.strptime(timestamp,
+ '%Y-%m-%dT%H:%M:%SZ')
+ timestamp = parsed.strftime('%Y-%m-%d %H:%M:%S')
+ except ValueError:
+ # We'll just print it verbatim
+ pass
+ points.append((timestamp, point.get('SampleCount'),
+ point.get('Average'), point.get('Sum'),
+ point.get('Minimum'), point.get('Maximum'),
+ point.get('Unit')))
+ for point in sorted(points):
+ print self.tabify(point)
--
managing cloud instances for Eucalyptus
More information about the pkg-eucalyptus-commits
mailing list