Created
October 3, 2017 15:40
-
-
Save Integralist/e4b4e53dd09745b645e10e89fc133f63 to your computer and use it in GitHub Desktop.
[Vegeta + pdsh wrapper for distributed load testing] #distributed #loadtest #performance #vegeta #golang #python
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/env python | |
"""Usage example: | |
./distributed-load-test.py 'GET https://foo.stage.example.com/beep/boop' -r 70 -d 30s -H newsiege01 newsiege02 | |
""" | |
import argparse | |
import sys | |
from typing import List | |
from subprocess import run, Popen, PIPE | |
def parse_args(): | |
p = argparse.ArgumentParser(description='Distributed testing with vegeta and pdash') | |
p.add_argument('target', help='vegeta targer, e.g. "GET https://httpbin.org/get"') | |
p.add_argument('-H', '--hosts', action='store', type=str, nargs='*', | |
default=['newsiege01', 'newsiege02', 'newsiege03'], help='host list') | |
p.add_argument('-r', '--rate', type=int, required=True, | |
help='Request rate, going to be devided evenly across hosts') | |
p.add_argument('-d', '--duration', type=str, required=True, | |
help='Load test duration') | |
p.add_argument('-e', '--executable', type=str, default='/usr/local/bin/vegeta', | |
help='Vegeta executable') | |
p.add_argument('-o', '--output', default='stdout', type=str, | |
help='Output file') | |
p.add_argument('-R', '--reporter', default='text', type=str, | |
help='Reporter [text, json, plot, hist[buckets]]') | |
return p.parse_args() | |
def main(target: str, hosts: List[str], rate: int, duration: str, vegeta: str, | |
output: str, reporter: str): | |
cmd = f"pdsh -b -w '{','.join(hosts)}' 'echo \"{target}\" | vegeta attack -rate={int(rate/len(hosts))} -duration={duration} > result.bin'" | |
pdsh = run(cmd, shell=True, stdout=PIPE, stderr=PIPE) | |
if pdsh.returncode > 0: | |
sys.stderr.write('pdsh failed:') | |
sys.stderr.write(pdsh.stderr) | |
sys.exit(pdsh.returncode) | |
scps = [] | |
for host in hosts: | |
scps.append(Popen(['scp', f'{host}:~/result.bin', f'{host}.bin'], stdout=PIPE, stderr=PIPE)) | |
[scp.communicate() for scp in scps] | |
inputs = ','.join((f'{host}.bin' for host in hosts)) | |
run(f'{vegeta} report -inputs="{inputs}" -output={output} -reporter={reporter}', shell=True) | |
if __name__ == '__main__': | |
args = parse_args() | |
main(args.target, args.hosts, args.rate, args.duration, args.executable, args.output, args.reporter) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment