diff --git a/tools/proxy_benchmark.py b/tools/proxy_benchmark.py new file mode 100644 index 0000000000000000000000000000000000000000..85cf26822f760b9f26d8f0bc4f9d60e4963881c0 --- /dev/null +++ b/tools/proxy_benchmark.py @@ -0,0 +1,65 @@ +# Copyright (C) 2017-2019 Savoir-faire Linux Inc. +# Author: Vsevolod Ivanov <vsevolod.ivanov@savoirfairelinux.com> +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see <https://www.gnu.org/licenses/>. +# +# Run with: locust -f proxy_benchmark.py --host http://127.0.0.1:8080 + +from locust import HttpLocust, TaskSet +from random import randint +import urllib.request +import base64 +import json + +words_url = "http://svnweb.freebsd.org/csrg/share/dict/words?view=co&content-type=text/plain" +words_resp = urllib.request.urlopen(words_url) +words = words_resp.read().decode().splitlines() + +headers = {'content-type': 'application/json'} + +def rand_list_value(mylist): + return mylist[randint(0, len(mylist) - 1)] + +def put_key(l): + key = rand_list_value(words) + val = rand_list_value(words) + print("Put/get: key={} value={}".format(key, val)) + data = base64.b64encode(val.encode()).decode() + print("Base64 encoding: value={} encoded={}".format(val, data)) + l.client.post("/" + key, data=json.dumps({"data": data}), + headers=headers, catch_response=True) + +def get_key(l): + key = rand_list_value(words) + print("Get: key={}".format(key)) + l.client.get("/" + key) + +def get_stats(l): + l.client.get("/stats") + +class UserBehavior(TaskSet): + tasks = {get_key: 1, put_key: 1} + + def on_start(self): + put_key(self) + get_key(self) + + def on_stop(self): + get_stats() + +class WebsiteUser(HttpLocust): + task_set = UserBehavior + min_wait = 5000 + max_wait = 9000 + print("Initiate the benchmark at http://127.0.0.1:8089/")