3737import logging
3838import sys
3939import traceback
40+ import resource
4041import datadog
4142
4243
@@ -355,6 +356,9 @@ def __init__(self, topic, rate, conf):
355356 self .stats_cnt = {'producer' : 0 , 'consumer' : 0 }
356357 self .start_time = time .time ()
357358
359+ self .last_rusage = None
360+ self .last_rusage_time = None
361+
358362 self .logger = logging .getLogger ('soakclient' )
359363 self .logger .setLevel (logging .DEBUG )
360364 handler = logging .StreamHandler ()
@@ -430,6 +434,9 @@ def terminate(self):
430434 self .producer_thread .join ()
431435 self .consumer_thread .join ()
432436
437+ # Final resource usage
438+ soak .get_rusage ()
439+
433440 def init_datadog (self , options ):
434441 """ Initialize datadog agent """
435442 datadog .initialize (** options )
@@ -445,6 +452,36 @@ def dd_gauge(self, metric_name, val):
445452 """ Set datadog metric gauge to val """
446453 self .dd .gauge (self .DD_PFX + metric_name , val , host = self .hostname )
447454
455+ def calc_rusage_deltas (self , curr , prev , elapsed ):
456+ """ Calculate deltas between previous and current resource usage """
457+
458+ # User CPU %
459+ user_cpu = ((curr .ru_utime - prev .ru_utime ) / elapsed ) * 100.0
460+ self .dd_gauge ("cpu.user" , user_cpu )
461+
462+ # System CPU %
463+ sys_cpu = ((curr .ru_stime - prev .ru_stime ) / elapsed ) * 100.0
464+ self .dd_gauge ("cpu.system" , sys_cpu )
465+
466+ # Max RSS memory (monotonic)
467+ max_rss = curr .ru_maxrss / 1024.0
468+ self .dd_gauge ("memory.rss.max" , max_rss )
469+
470+ self .logger .info ("User CPU: {:.1f}%, System CPU: {:.1f}%, MaxRSS {:.3f}MiB" .format (
471+ user_cpu , sys_cpu , max_rss ))
472+
473+ def get_rusage (self ):
474+ """ Get resource usage and calculate CPU load, etc """
475+ ru = resource .getrusage (resource .RUSAGE_SELF )
476+ now = time .time ()
477+
478+ if self .last_rusage is not None :
479+ self .calc_rusage_deltas (ru , self .last_rusage ,
480+ now - self .last_rusage_time )
481+
482+ self .last_rusage = ru
483+ self .last_rusage_time = now
484+
448485
449486if __name__ == '__main__' :
450487
@@ -486,10 +523,14 @@ def dd_gauge(self, metric_name, val):
486523 # Create SoakClient
487524 soak = SoakClient (args .topic , args .rate , conf )
488525
526+ # Get initial resource usage
527+ soak .get_rusage ()
528+
489529 # Run until interrupted
490530 try :
491531 while soak .run :
492532 time .sleep (10 )
533+ soak .get_rusage ()
493534
494535 soak .logger .info ("Soak client aborted" )
495536
0 commit comments