@@ -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+
91120class 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
317366def 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
406457def 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