aboutsummaryrefslogtreecommitdiffstats
path: root/test/bench/benchmark.py
blob: 8d2080886974bc699c26f186177cc2cfcb105a4c (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
import asyncio
import cProfile
from mitmproxy import ctx


class Benchmark:
    """
        A simple profiler addon.
    """
    def __init__(self):
        self.pr = cProfile.Profile()
        self.started = False

    async def procs(self):
        ctx.log.error("starting benchmark")
        backend = await asyncio.create_subprocess_exec("devd", "-q", "-p", "10001", ".")
        traf = await asyncio.create_subprocess_exec(
            "wrk",
            "-c50",
            "-d5s",
            "http://localhost:%s/benchmark.py" % ctx.master.server.address[1],
            stdout=asyncio.subprocess.PIPE
        )
        stdout, _ = await traf.communicate()
        open(ctx.options.benchmark_save_path + ".bench", mode="wb").write(stdout)
        ctx.log.error(stdout.decode("ascii"))
        backend.kill()
        ctx.master.shutdown()

    def load(self, loader):
        loader.add_option(
            "benchmark_save_path",
            str,
            "/tmp/profile",
            "Destination for the .prof and and .bench result files"
        )
        ctx.options.update(
            mode="reverse:http://devd.io:10001",
        )
        self.pr.enable()

    def running(self):
        if not self.started:
            self.started = True
            asyncio.get_event_loop().create_task(self.procs())

    def done(self):
        self.pr.dump_stats(ctx.options.benchmark_save_path + ".prof")


addons = [Benchmark()]