Mercurial > repos > guerler > springsuite
comparison planemo/bin/cwutil @ 0:d30785e31577 draft
"planemo upload commit 6eee67778febed82ddd413c3ca40b3183a3898f1"
author | guerler |
---|---|
date | Fri, 31 Jul 2020 00:18:57 -0400 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:d30785e31577 |
---|---|
1 #!/Users/guerler/spring/springsuite/planemo/bin/python3 | |
2 # Author: Chris Moyer <cmoyer@newstex.com> | |
3 # Description: CloudWatch Utility | |
4 # For listing stats, creating alarms, and managing | |
5 # other CloudWatch aspects | |
6 | |
7 import boto | |
8 cw = boto.connect_cloudwatch() | |
9 | |
10 from datetime import datetime, timedelta | |
11 | |
12 def _parse_time(time_string): | |
13 """Internal function to parse a time string""" | |
14 | |
15 def _parse_dict(d_string): | |
16 result = {} | |
17 if d_string: | |
18 for d in d_string.split(","): | |
19 d = d.split(":") | |
20 result[d[0]] = d[1] | |
21 return result | |
22 | |
23 def ls(namespace=None): | |
24 """ | |
25 List metrics, optionally filtering by a specific namespace | |
26 namespace: Optional Namespace to filter on | |
27 """ | |
28 print "%-10s %-50s %s" % ("Namespace", "Metric Name", "Dimensions") | |
29 print "-"*80 | |
30 for m in cw.list_metrics(): | |
31 if namespace is None or namespace.upper() in m.namespace: | |
32 print "%-10s %-50s %s" % (m.namespace, m.name, m.dimensions) | |
33 | |
34 def stats(namespace, metric_name, dimensions=None, statistics="Average", start_time=None, end_time=None, period=60, unit=None): | |
35 """ | |
36 Lists the statistics for a specific metric | |
37 namespace: The namespace to use, usually "AWS/EC2", "AWS/SQS", etc. | |
38 metric_name: The name of the metric to track, pulled from `ls` | |
39 dimensions: The dimensions to use, formatted as Name:Value (such as QueueName:myQueue) | |
40 statistics: The statistics to measure, defaults to "Average" | |
41 'Minimum', 'Maximum', 'Sum', 'Average', 'SampleCount' | |
42 start_time: Start time, default to now - 1 day | |
43 end_time: End time, default to now | |
44 period: Period/interval for counts, default to 60 minutes | |
45 unit: Unit to track, default depends on what metric is being tracked | |
46 """ | |
47 | |
48 # Parse the dimensions | |
49 dimensions = _parse_dict(dimensions) | |
50 | |
51 # Parse the times | |
52 if end_time: | |
53 end_time = _parse_time(end_time) | |
54 else: | |
55 end_time = datetime.utcnow() | |
56 if start_time: | |
57 start_time = _parse_time(start_time) | |
58 else: | |
59 start_time = datetime.utcnow() - timedelta(days=1) | |
60 | |
61 print "%-30s %s" % ('Timestamp', statistics) | |
62 print "-"*50 | |
63 data = {} | |
64 for m in cw.get_metric_statistics(int(period), start_time, end_time, metric_name, namespace, statistics, dimensions, unit): | |
65 data[m['Timestamp']] = m[statistics] | |
66 keys = data.keys() | |
67 keys.sort() | |
68 for k in keys: | |
69 print "%-30s %s" % (k, data[k]) | |
70 | |
71 def put(namespace, metric_name, dimensions=None, value=None, unit=None, statistics=None, timestamp=None): | |
72 """ | |
73 Publish custom metrics | |
74 namespace: The namespace to use; values starting with "AWS/" are reserved | |
75 metric_name: The name of the metric to update | |
76 dimensions: The dimensions to use, formatted as Name:Value (such as QueueName:myQueue) | |
77 value: The value to store, mutually exclusive with `statistics` | |
78 statistics: The statistics to store, mutually exclusive with `value` | |
79 (must specify all of "Minimum", "Maximum", "Sum", "SampleCount") | |
80 timestamp: The timestamp of this measurement, default is current server time | |
81 unit: Unit to track, default depends on what metric is being tracked | |
82 """ | |
83 | |
84 def simplify(lst): | |
85 return lst[0] if len(lst) == 1 else lst | |
86 | |
87 print cw.put_metric_data(namespace, simplify(metric_name.split(';')), | |
88 dimensions = simplify(map(_parse_dict, dimensions.split(';'))) if dimensions else None, | |
89 value = simplify(value.split(';')) if value else None, | |
90 statistics = simplify(map(_parse_dict, statistics.split(';'))) if statistics else None, | |
91 timestamp = simplify(timestamp.split(';')) if timestamp else None, | |
92 unit = simplify(unit.split(';')) if unit else None) | |
93 | |
94 def help(fnc=None): | |
95 """ | |
96 Print help message, optionally about a specific function | |
97 """ | |
98 import inspect | |
99 self = sys.modules['__main__'] | |
100 if fnc: | |
101 try: | |
102 cmd = getattr(self, fnc) | |
103 except: | |
104 cmd = None | |
105 if not inspect.isfunction(cmd): | |
106 print "No function named: %s found" % fnc | |
107 sys.exit(2) | |
108 (args, varargs, varkw, defaults) = inspect.getargspec(cmd) | |
109 print cmd.__doc__ | |
110 print "Usage: %s %s" % (fnc, " ".join([ "[%s]" % a for a in args])) | |
111 else: | |
112 print "Usage: cwutil [command]" | |
113 for cname in dir(self): | |
114 if not cname.startswith("_") and not cname == "cmd": | |
115 cmd = getattr(self, cname) | |
116 if inspect.isfunction(cmd): | |
117 doc = cmd.__doc__ | |
118 print "\t%s - %s" % (cname, doc) | |
119 sys.exit(1) | |
120 | |
121 | |
122 if __name__ == "__main__": | |
123 import sys | |
124 self = sys.modules['__main__'] | |
125 if len(sys.argv) >= 2: | |
126 try: | |
127 cmd = getattr(self, sys.argv[1]) | |
128 except: | |
129 cmd = None | |
130 args = sys.argv[2:] | |
131 else: | |
132 cmd = help | |
133 args = [] | |
134 if not cmd: | |
135 cmd = help | |
136 try: | |
137 cmd(*args) | |
138 except TypeError as e: | |
139 print e | |
140 help(cmd.__name__) |