From f20baa6ebd75e5a55ec1d3755ef4c61b83fd5924 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vin=C3=ADcius=20Zavam?= Date: Sun, 20 Jan 2019 12:54:30 +0000 Subject: [NEW] benchmarks/py-locust: Python utility for doing distributed load tests Locust is an easy-to-use, distributed, user load testing tool. It is intended for load-testing web sites (or other systems) and figuring out how many concurrent users a system can handle. The behavior of each locust (or test user if you will) is defined by you and the swarming process is monitored from a web UI in real-time. This will help you battle test and identify bottlenecks in your code before letting real users in. WWW: https://locust.io/ Approved by: araujo (mentor), rene (mentor) Sponsored by: cleverbridge AG Differential Revision: https://reviews.freebsd.org/D18895 --- .../py-locust/files/extra-EXAMPLES-events.py | 69 ++++++++++++++++++++++ 1 file changed, 69 insertions(+) create mode 100644 benchmarks/py-locust/files/extra-EXAMPLES-events.py (limited to 'benchmarks/py-locust/files/extra-EXAMPLES-events.py') diff --git a/benchmarks/py-locust/files/extra-EXAMPLES-events.py b/benchmarks/py-locust/files/extra-EXAMPLES-events.py new file mode 100644 index 000000000000..7b1de7fafee2 --- /dev/null +++ b/benchmarks/py-locust/files/extra-EXAMPLES-events.py @@ -0,0 +1,69 @@ +# -*- coding: utf-8 -*- + +""" +This is an example of a locustfile that uses Locust's built in event hooks to +track the sum of the content-length header in all successful HTTP responses +""" + +from locust import HttpLocust, TaskSet, events, task, web + + +class MyTaskSet(TaskSet): + @task(2) + def index(l): + l.client.get("/") + + @task(1) + def stats(l): + l.client.get("/stats/requests") + +class WebsiteUser(HttpLocust): + host = "http://127.0.0.1:8089" + min_wait = 2000 + max_wait = 5000 + task_set = MyTaskSet + + +""" +We need somewhere to store the stats. + +On the master node stats will contain the aggregated sum of all content-lengths, +while on the slave nodes this will be the sum of the content-lengths since the +last stats report was sent to the master +""" +stats = {"content-length":0} + +def on_request_success(request_type, name, response_time, response_length): + """ + Event handler that get triggered on every successful request + """ + stats["content-length"] += response_length + +def on_report_to_master(client_id, data): + """ + This event is triggered on the slave instances every time a stats report is + to be sent to the locust master. It will allow us to add our extra content-length + data to the dict that is being sent, and then we clear the local stats in the slave. + """ + data["content-length"] = stats["content-length"] + stats["content-length"] = 0 + +def on_slave_report(client_id, data): + """ + This event is triggered on the master instance when a new stats report arrives + from a slave. Here we just add the content-length to the master's aggregated + stats dict. + """ + stats["content-length"] += data["content-length"] + +# Hook up the event listeners +events.request_success += on_request_success +events.report_to_master += on_report_to_master +events.slave_report += on_slave_report + +@web.app.route("/content-length") +def total_content_length(): + """ + Add a route to the Locust web app, where we can see the total content-length + """ + return "Total content-length recieved: %i" % stats["content-length"] -- cgit v1.2.3