37
37
import logging
38
38
import sys
39
39
import traceback
40
+ import resource
40
41
import datadog
41
42
42
43
@@ -355,6 +356,9 @@ def __init__(self, topic, rate, conf):
355
356
self .stats_cnt = {'producer' : 0 , 'consumer' : 0 }
356
357
self .start_time = time .time ()
357
358
359
+ self .last_rusage = None
360
+ self .last_rusage_time = None
361
+
358
362
self .logger = logging .getLogger ('soakclient' )
359
363
self .logger .setLevel (logging .DEBUG )
360
364
handler = logging .StreamHandler ()
@@ -430,6 +434,9 @@ def terminate(self):
430
434
self .producer_thread .join ()
431
435
self .consumer_thread .join ()
432
436
437
+ # Final resource usage
438
+ soak .get_rusage ()
439
+
433
440
def init_datadog (self , options ):
434
441
""" Initialize datadog agent """
435
442
datadog .initialize (** options )
@@ -445,6 +452,36 @@ def dd_gauge(self, metric_name, val):
445
452
""" Set datadog metric gauge to val """
446
453
self .dd .gauge (self .DD_PFX + metric_name , val , host = self .hostname )
447
454
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
+
448
485
449
486
if __name__ == '__main__' :
450
487
@@ -486,10 +523,14 @@ def dd_gauge(self, metric_name, val):
486
523
# Create SoakClient
487
524
soak = SoakClient (args .topic , args .rate , conf )
488
525
526
+ # Get initial resource usage
527
+ soak .get_rusage ()
528
+
489
529
# Run until interrupted
490
530
try :
491
531
while soak .run :
492
532
time .sleep (10 )
533
+ soak .get_rusage ()
493
534
494
535
soak .logger .info ("Soak client aborted" )
495
536
0 commit comments