Skip to content

Commit 7965c0f

Browse files
author
AvengerPenguin
committed
Implemented Load Average metric collection.
1 parent 191ac20 commit 7965c0f

File tree

1 file changed

+57
-3
lines changed

1 file changed

+57
-3
lines changed

cloudwatchmon/cli/put_instance_stats.py

Lines changed: 57 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,35 @@ def swap_used(self):
8888
return self.swap_total - self.swap_free
8989

9090

91+
class LoadAverage:
92+
def __init__(self):
93+
load_avg = self.__gather_loadavg_info()
94+
self.loadavg_1min = load_avg['1min']
95+
self.loadavg_5min = load_avg['5min']
96+
self.loadavg_15min = load_avg['15min']
97+
self.loadavg_percpu_1min = load_avg['percpu_1min']
98+
self.loadavg_percpu_5min = load_avg['percpu_5min']
99+
self.loadavg_percpu_15min = load_avg['percpu_15min']
100+
101+
@staticmethod
102+
def __gather_loadavg_info():
103+
loadavg_info = {}
104+
105+
with open('/proc/loadavg') as loadavg:
106+
parsed = loadavg.read().split(' ')
107+
loadavg_info['1min'] = float(parsed[0])
108+
loadavg_info['5min'] = float(parsed[1])
109+
loadavg_info['15min'] = float(parsed[2])
110+
111+
with open('/proc/cpuinfo') as cpuinfo:
112+
cpu_count = cpuinfo.read().count('processor\t:')
113+
loadavg_info['percpu_1min'] = loadavg_info['1min'] / cpu_count
114+
loadavg_info['percpu_5min'] = loadavg_info['5min'] / cpu_count
115+
loadavg_info['percpu_15min'] = loadavg_info['15min'] / cpu_count
116+
117+
return loadavg_info
118+
119+
91120
class Disk:
92121
def __init__(self, mount, file_system, total, used, avail):
93122
self.mount = mount
@@ -243,6 +272,15 @@ def config_parser():
243272
choices=size_units,
244273
help='Specifies units for memory metrics.')
245274

275+
loadavg_group = parser.add_argument_group('load average')
276+
loadavg_group.add_argument('--loadavg',
277+
action='store_true',
278+
help='Report load averages for 1min, 5min and 15min.')
279+
loadavg_group.add_argument('--loadavg-percpu',
280+
action='store_true',
281+
help='Report load averages for 1min, 5min and 15min divided by the number of CPU cores.')
282+
283+
246284
disk_group = parser.add_argument_group('disk metrics')
247285
disk_group.add_argument('--disk-path',
248286
metavar='PATH',
@@ -313,6 +351,17 @@ def add_memory_metrics(args, metrics):
313351
metrics.add_metric('SwapUsed', mem_unit_name,
314352
mem.swap_used() / mem_unit_div)
315353

354+
def add_loadavg_metrics(args, metrics):
355+
loadavg = LoadAverage()
356+
if args.loadavg:
357+
metrics.add_metric('LoadAvg1Min', None, loadavg.loadavg_1min)
358+
metrics.add_metric('LoadAvg5Min', None, loadavg.loadavg_5min)
359+
metrics.add_metric('LoadAvg15Min', None, loadavg.loadavg_15min)
360+
if args.loadavg_percpu:
361+
metrics.add_metric('LoadAvgPerCPU1Min', None, loadavg.loadavg_percpu_1min)
362+
metrics.add_metric('LoadAvgPerCPU5Min', None, loadavg.loadavg_percpu_5min)
363+
metrics.add_metric('LoadAvgPerCPU15Min', None, loadavg.loadavg_percpu_15min)
364+
316365

317366
def get_disk_info(paths):
318367
df_out = [s.split() for s in
@@ -380,6 +429,7 @@ def validate_args(args):
380429
report_mem_data = args.mem_util or args.mem_used or args.mem_avail or \
381430
args.swap_util or args.swap_used
382431
report_disk_data = args.disk_path is not None
432+
report_loadavg_data = args.loadavg or args.loadavg_percpu
383433

384434
if report_disk_data:
385435
if not args.disk_space_util and not args.disk_space_used and \
@@ -396,11 +446,12 @@ def validate_args(args):
396446
raise ValueError('Metrics to report disk space are provided but '
397447
'disk path is not specified.')
398448

399-
if not report_mem_data and not report_disk_data and not args.from_file:
449+
if not report_mem_data and not report_disk_data and not args.from_file and \
450+
not report_loadavg_data:
400451
raise ValueError('No metrics specified for collection and '
401452
'submission to CloudWatch.')
402453

403-
return report_disk_data, report_mem_data
454+
return report_disk_data, report_mem_data, report_loadavg_data
404455

405456

406457
def main():
@@ -418,7 +469,7 @@ def main():
418469
return 0
419470

420471
try:
421-
report_disk_data, report_mem_data = validate_args(args)
472+
report_disk_data, report_mem_data, report_loadavg_data = validate_args(args)
422473

423474
# avoid a storm of calls at the beginning of a minute
424475
if args.from_cron:
@@ -457,6 +508,9 @@ def main():
457508
if report_mem_data:
458509
add_memory_metrics(args, metrics)
459510

511+
if report_loadavg_data:
512+
add_loadavg_metrics(args, metrics)
513+
460514
if report_disk_data:
461515
add_disk_metrics(args, metrics)
462516

0 commit comments

Comments
 (0)