diff env/bin/cwutil @ 0:26e78fe6e8c4 draft

"planemo upload commit c699937486c35866861690329de38ec1a5d9f783"
author shellac
date Sat, 02 May 2020 07:14:21 -0400
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/env/bin/cwutil	Sat May 02 07:14:21 2020 -0400
@@ -0,0 +1,140 @@
+#!/Users/pldms/Development/Projects/2020/david-matthews-galaxy/guppy_basecaller/env/bin/python3
+# Author: Chris Moyer <cmoyer@newstex.com>
+# Description: CloudWatch Utility
+# For listing stats, creating alarms, and managing 
+# other CloudWatch aspects
+
+import boto
+cw = boto.connect_cloudwatch()
+
+from datetime import datetime, timedelta
+
+def _parse_time(time_string):
+    """Internal function to parse a time string"""
+
+def _parse_dict(d_string):
+    result = {}
+    if d_string:
+        for d in d_string.split(","):
+            d = d.split(":")
+            result[d[0]] = d[1]
+    return result
+
+def ls(namespace=None):
+    """
+    List metrics, optionally filtering by a specific namespace
+        namespace: Optional Namespace to filter on
+    """
+    print "%-10s %-50s %s" % ("Namespace", "Metric Name", "Dimensions")
+    print "-"*80
+    for m in cw.list_metrics():
+        if namespace is None or namespace.upper() in m.namespace:
+            print "%-10s %-50s %s" % (m.namespace, m.name, m.dimensions)
+
+def stats(namespace, metric_name, dimensions=None, statistics="Average", start_time=None, end_time=None, period=60, unit=None):
+    """
+    Lists the statistics for a specific metric
+        namespace: The namespace to use, usually "AWS/EC2", "AWS/SQS", etc.
+        metric_name: The name of the metric to track, pulled from `ls`
+        dimensions: The dimensions to use, formatted as Name:Value (such as QueueName:myQueue)
+        statistics: The statistics to measure, defaults to "Average"
+             'Minimum', 'Maximum', 'Sum', 'Average', 'SampleCount'
+        start_time: Start time, default to now - 1 day
+        end_time: End time, default to now
+        period: Period/interval for counts, default to 60 minutes
+        unit: Unit to track, default depends on what metric is being tracked
+    """
+
+    # Parse the dimensions
+    dimensions = _parse_dict(dimensions)
+
+    # Parse the times
+    if end_time:
+        end_time = _parse_time(end_time)
+    else:
+        end_time = datetime.utcnow()
+    if start_time:
+        start_time = _parse_time(start_time)
+    else:
+        start_time = datetime.utcnow() - timedelta(days=1)
+            
+    print "%-30s %s" % ('Timestamp', statistics)
+    print "-"*50
+    data = {}
+    for m in cw.get_metric_statistics(int(period), start_time, end_time, metric_name, namespace, statistics, dimensions, unit):
+        data[m['Timestamp']] = m[statistics]
+    keys = data.keys()
+    keys.sort()
+    for k in keys:
+        print "%-30s %s" % (k, data[k])
+
+def put(namespace, metric_name, dimensions=None, value=None, unit=None, statistics=None, timestamp=None):
+    """
+    Publish custom metrics
+        namespace: The namespace to use; values starting with "AWS/" are reserved
+        metric_name: The name of the metric to update
+        dimensions: The dimensions to use, formatted as Name:Value (such as QueueName:myQueue)
+        value: The value to store, mutually exclusive with `statistics`
+        statistics: The statistics to store, mutually exclusive with `value`
+            (must specify all of "Minimum", "Maximum", "Sum", "SampleCount")
+        timestamp: The timestamp of this measurement, default is current server time
+        unit: Unit to track, default depends on what metric is being tracked
+    """
+    
+    def simplify(lst):
+        return lst[0] if len(lst) == 1 else lst
+
+    print cw.put_metric_data(namespace, simplify(metric_name.split(';')),
+        dimensions = simplify(map(_parse_dict, dimensions.split(';'))) if dimensions else None,
+        value = simplify(value.split(';')) if value else None,
+        statistics = simplify(map(_parse_dict, statistics.split(';'))) if statistics else None,
+        timestamp = simplify(timestamp.split(';')) if timestamp else None,
+        unit = simplify(unit.split(';')) if unit else None)
+
+def help(fnc=None):
+    """
+    Print help message, optionally about a specific function
+    """
+    import inspect
+    self = sys.modules['__main__']
+    if fnc:
+        try:
+            cmd = getattr(self, fnc)
+        except:
+            cmd = None
+        if not inspect.isfunction(cmd):
+            print "No function named: %s found" % fnc
+            sys.exit(2)
+        (args, varargs, varkw, defaults) = inspect.getargspec(cmd)
+        print cmd.__doc__
+        print "Usage: %s %s" % (fnc, " ".join([ "[%s]" % a for a in args]))
+    else:
+        print "Usage: cwutil [command]"
+        for cname in dir(self):
+            if not cname.startswith("_") and not cname == "cmd":
+                cmd = getattr(self, cname)
+                if inspect.isfunction(cmd):
+                    doc = cmd.__doc__
+                    print "\t%s - %s" % (cname, doc)
+    sys.exit(1)
+
+
+if __name__ == "__main__":
+    import sys
+    self = sys.modules['__main__']
+    if len(sys.argv) >= 2:
+        try:
+            cmd = getattr(self, sys.argv[1])
+        except:
+            cmd = None
+        args = sys.argv[2:]
+    else:
+        cmd = help
+        args = []
+    if not cmd:
+        cmd = help
+    try:
+        cmd(*args)
+    except TypeError as e:
+        print e
+        help(cmd.__name__)