summaryrefslogtreecommitdiff
path: root/scripts/profiling/util.py
blob: adf1de8c1cd17725acd7954858180fb391c93c6f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
import re
import psutil
import time
import threading
import argparse
import pytz
import datetime


class ValidateUserHandle(argparse.Action):
    def __call__(self, parser, namespace, values, option_string=None):
        m = re.compile('^([^@]+)@([^@]+\.[^@]+)$')
        res = m.match(values)
        if res == None:
            parser.error('User handle should have the form user@provider.')
        setattr(namespace, 'username', res.groups()[0])
        setattr(namespace, 'provider', res.groups()[1])


class StatsLogger(threading.Thread):

    def __init__(self, name, fname, procs=[], interval=0.01):
        threading.Thread.__init__(self)
        self._stopped = True
        self._name = name
        self._fname = fname
        self._procs = self._find_procs(procs)
        self._interval = interval

    def _find_procs(self, procs):
        return filter(lambda p: p.name in procs, psutil.process_iter())

    def run(self):
        self._stopped = False
        with open(self._fname, 'w') as f:
            self._start = time.time()
            f.write(self._make_header())
            while self._stopped is False:
                f.write('%s %s\n' %
                    (self._make_general_stats(), self._make_proc_stats()))
                time.sleep(self._interval)
            f.write(self._make_footer())

    def _make_general_stats(self):
        now = time.time()
        stats = []
        stats.append("%f" % (now - self._start))   # elapsed time
        stats.append("%f" % psutil.cpu_percent())  # total cpu
        stats.append("%f" % psutil.phymem_usage().percent)  # total memory
        return ' '.join(stats)

    def _make_proc_stats(self):
        stats = []
        for p in self._procs:
            stats.append('%f' % p.get_cpu_percent())     # proc cpu
            stats.append('%f' % p.get_memory_percent())  # proc memory
        return ' '.join(stats)

    def _make_header(self):
        header = []
        header.append('# test_name: %s' % self._name)
        header.append('# start_time: %s' %  datetime.datetime.now(pytz.utc))
        header.append(
            '# elapsed_time total_cpu total_memory proc_cpu proc_memory ')
        return '\n'.join(header) + '\n'

    def _make_footer(self):
        footer = []
        footer.append('# end_time: %s' % datetime.datetime.now(pytz.utc))
        return '\n'.join(footer)

    def stop(self):
        self._stopped = True