locust 2.28.1.dev49__tar.gz → 2.28.1.dev66__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/PKG-INFO +1 -1
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/docs/configuration.rst +12 -3
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/docs/developing-locust.rst +12 -10
- locust-2.28.1.dev66/docs/extensions.rst +41 -0
- locust-2.28.1.dev66/docs/faq.rst +107 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/docs/further-reading.rst +3 -5
- locust-2.28.1.dev66/docs/increasing-request-rate.rst +28 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/docs/index.rst +3 -0
- locust-2.28.1.dev66/docs/installation.rst +103 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/docs/quickstart.rst +2 -2
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/docs/running-distributed.rst +1 -1
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/docs/running-in-docker.rst +1 -1
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/locust/_version.py +2 -2
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/locust/env.py +6 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/locust/log.py +11 -1
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/locust/runners.py +28 -1
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/locust/test/test_runners.py +119 -40
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/locust/test/test_web.py +19 -1
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/locust/web.py +2 -11
- locust-2.28.1.dev66/locust/webui/dist/assets/index-84c63e70.js +250 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/locust/webui/dist/auth.html +1 -1
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/locust/webui/dist/index.html +1 -1
- locust-2.28.1.dev66/locust/webui/src/components/LogViewer/LogViewer.tsx +95 -0
- locust-2.28.1.dev66/locust/webui/src/components/LogViewer/logUtils.tsx +2 -0
- locust-2.28.1.dev66/locust/webui/src/components/LogViewer/tests/LogViewer.test.tsx +55 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/locust/webui/src/components/LogViewer/tests/useLogViewer.test.tsx +8 -5
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/locust/webui/src/components/LogViewer/useLogViewer.ts +14 -8
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/locust/webui/src/components/Tabs/Tabs.constants.tsx +2 -1
- locust-2.28.1.dev66/locust/webui/src/constants/logs.ts +1 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/locust/webui/src/redux/slice/logViewer.slice.ts +4 -4
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/locust/webui/src/types/ui.types.ts +4 -1
- locust-2.28.1.dev66/locust/webui/src/utils/array.ts +5 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/locust.egg-info/PKG-INFO +1 -1
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/locust.egg-info/SOURCES.txt +7 -0
- locust-2.28.1.dev49/docs/installation.rst +0 -39
- locust-2.28.1.dev49/locust/webui/src/components/LogViewer/LogViewer.tsx +0 -21
- locust-2.28.1.dev49/locust/webui/src/components/LogViewer/tests/LogViewer.test.tsx +0 -20
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/.coveragerc +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/.dockerignore +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/.git-blame-ignore-revs +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/.gitattributes +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/.github/CONTRIBUTING.md +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/.github/ISSUE_TEMPLATE/bug.yml +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/.github/workflows/stale.yml +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/.github/workflows/tests.yml +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/.gitignore +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/.pre-commit-config.yaml +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/.readthedocs.yaml +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/.vscode/extensions.json +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/.vscode/launch.json +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/.vscode/launch_locust.json +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/.vscode/settings.json +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/CHANGELOG.md +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/Dockerfile +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/LICENSE +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/MANIFEST.in +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/Makefile +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/README.md +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/SECURITY.md +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/Vagrantfile +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/benchmarks/dispatch.py +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/docs/_static/theme-overrides.css +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/docs/api.rst +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/docs/changelog.rst +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/docs/conf.py +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/docs/custom-load-shape.rst +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/docs/extending-locust.rst +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/docs/history.rst +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/docs/images/extend_modern_web_ui_cache_stats.png +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/docs/images/locust_workers.png +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/docs/images/number_of_users.png +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/docs/images/response_times.png +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/docs/images/total_requests_per_second.png +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/docs/images/userclass_picker_example.png +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/docs/images/webui-running-statistics.png +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/docs/images/webui-splash-screenshot.png +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/docs/increase-performance.rst +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/docs/logging.rst +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/docs/requirements.txt +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/docs/retrieving-stats.rst +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/docs/running-in-debugger.rst +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/docs/running-without-web-ui.rst +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/docs/tasksets.rst +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/docs/testing-other-systems.rst +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/docs/use-as-lib.rst +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/docs/what-is-locust.rst +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/docs/writing-a-locustfile.rst +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/examples/add_command_line_argument.py +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/examples/basic.py +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/examples/browse_docs_sequence_test.py +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/examples/browse_docs_test.py +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/examples/custom_messages.py +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/examples/custom_shape/double_wave.py +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/examples/custom_shape/stages.py +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/examples/custom_shape/staging_user_classes.py +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/examples/custom_shape/step_load.py +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/examples/custom_shape/wait_user_count.py +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/examples/custom_wait_function.py +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/examples/custom_xmlrpc_client/server.py +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/examples/custom_xmlrpc_client/xmlrpc_locustfile.py +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/examples/debugging.py +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/examples/debugging_advanced.py +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/examples/dispatch_test_scripts/locustfile.py +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/examples/dispatch_test_scripts/run-disributed-headless.sh +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/examples/dispatch_test_scripts/run-disributed-web.sh +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/examples/dispatch_test_scripts/run-local-headless.sh +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/examples/dispatch_test_scripts/run-local-web.sh +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/examples/docker-compose/docker-compose.yml +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/examples/dynamic_user_credentials.py +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/examples/events.py +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/examples/extend_web_ui.py +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/examples/fast_http_locust.py +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/examples/grpc/grpc_user.py +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/examples/grpc/hello.proto +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/examples/grpc/hello_pb2.py +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/examples/grpc/hello_pb2_grpc.py +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/examples/grpc/hello_server.py +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/examples/grpc/locustfile.py +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/examples/locustfile.py +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/examples/manual_stats_reporting.py +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/examples/multiple_hosts.py +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/examples/nested_inline_tasksets.py +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/examples/rest.py +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/examples/sdk_session_patching/session_patch_locustfile.py +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/examples/semaphore_wait.py +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/examples/stop_on_threshold.py +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/examples/terraform/aws/README.md +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/examples/terraform/aws/data_subnet.tf +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/examples/terraform/aws/main.tf +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/examples/terraform/aws/output.tf +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/examples/terraform/aws/plan/basic.py +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/examples/terraform/aws/provisioner.tf +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/examples/terraform/aws/variables.tf +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/examples/test_data_management.py +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/examples/use_as_lib.py +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/examples/vagrant/README.md +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/examples/vagrant/supervisord.conf +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/examples/web_ui_auth.py +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/examples/web_ui_cache_stats.py +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/examples/worker_index.py +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/generate_changelog.py +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/locust/__init__.py +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/locust/__main__.py +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/locust/argument_parser.py +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/locust/clients.py +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/locust/contrib/__init__.py +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/locust/contrib/fasthttp.py +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/locust/debug.py +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/locust/dispatch.py +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/locust/event.py +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/locust/exception.py +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/locust/html.py +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/locust/input_events.py +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/locust/main.py +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/locust/py.typed +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/locust/rpc/__init__.py +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/locust/rpc/protocol.py +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/locust/rpc/zmqrpc.py +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/locust/shape.py +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/locust/stats.py +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/locust/test/__init__.py +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/locust/test/fake_module1_for_env_test.py +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/locust/test/fake_module2_for_env_test.py +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/locust/test/mock_locustfile.py +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/locust/test/mock_logging.py +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/locust/test/test_debugging.py +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/locust/test/test_dispatch.py +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/locust/test/test_env.py +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/locust/test/test_fasthttp.py +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/locust/test/test_http.py +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/locust/test/test_interruptable_task.py +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/locust/test/test_load_locustfile.py +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/locust/test/test_locust_class.py +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/locust/test/test_log.py +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/locust/test/test_main.py +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/locust/test/test_old_wait_api.py +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/locust/test/test_parser.py +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/locust/test/test_sequential_taskset.py +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/locust/test/test_stats.py +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/locust/test/test_tags.py +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/locust/test/test_taskratio.py +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/locust/test/test_users.py +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/locust/test/test_util.py +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/locust/test/test_wait_time.py +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/locust/test/test_zmqrpc.py +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/locust/test/testcases.py +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/locust/test/util.py +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/locust/user/__init__.py +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/locust/user/inspectuser.py +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/locust/user/sequential_taskset.py +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/locust/user/task.py +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/locust/user/users.py +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/locust/user/wait_time.py +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/locust/util/__init__.py +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/locust/util/cache.py +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/locust/util/date.py +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/locust/util/deprecation.py +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/locust/util/exception_handler.py +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/locust/util/load_locustfile.py +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/locust/util/rounding.py +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/locust/util/timespan.py +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/locust/webui/.eslintrc +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/locust/webui/.gitignore +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/locust/webui/.prettierrc +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/locust/webui/auth.html +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/locust/webui/dev.html +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/locust/webui/dist/assets/favicon.ico +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/locust/webui/dist/assets/logo.png +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/locust/webui/dist/report.html +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/locust/webui/index.html +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/locust/webui/package.json +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/locust/webui/public/assets/favicon.ico +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/locust/webui/public/assets/logo.png +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/locust/webui/public/report.html +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/locust/webui/src/App.test.tsx +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/locust/webui/src/App.tsx +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/locust/webui/src/components/DataTable/DataTable.test.tsx +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/locust/webui/src/components/DataTable/DataTable.tsx +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/locust/webui/src/components/ExceptionsTable/ExceptionsTable.tsx +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/locust/webui/src/components/FailuresTable/FailuresTable.tsx +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/locust/webui/src/components/FallbackRender/FallbackRender.test.tsx +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/locust/webui/src/components/FallbackRender/FallbackRender.tsx +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/locust/webui/src/components/Form/Form.tsx +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/locust/webui/src/components/Form/Select.tsx +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/locust/webui/src/components/Form/tests/Form.test.tsx +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/locust/webui/src/components/Form/tests/Select.test.tsx +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/locust/webui/src/components/Layout/Footer/About.tsx +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/locust/webui/src/components/Layout/Footer/Footer.tsx +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/locust/webui/src/components/Layout/Layout.tsx +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/locust/webui/src/components/Layout/Navbar/DarkLightToggle.tsx +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/locust/webui/src/components/Layout/Navbar/Navbar.tsx +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/locust/webui/src/components/Layout/Navbar/SwarmMonitor.test.tsx +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/locust/webui/src/components/Layout/Navbar/SwarmMonitor.tsx +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/locust/webui/src/components/LineChart/LineChart.test.tsx +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/locust/webui/src/components/LineChart/LineChart.tsx +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/locust/webui/src/components/Modal/Modal.tsx +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/locust/webui/src/components/Reports/Reports.test.tsx +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/locust/webui/src/components/Reports/Reports.tsx +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/locust/webui/src/components/ResponseTimeTable/ResponseTimeTable.test.tsx +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/locust/webui/src/components/ResponseTimeTable/ResponseTimeTable.tsx +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/locust/webui/src/components/StateButtons/EditButton.tsx +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/locust/webui/src/components/StateButtons/NewTestButton.tsx +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/locust/webui/src/components/StateButtons/ResetButton.tsx +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/locust/webui/src/components/StateButtons/StateButtons.tsx +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/locust/webui/src/components/StateButtons/StopButton.tsx +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/locust/webui/src/components/StateButtons/tests/ResetButton.test.tsx +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/locust/webui/src/components/StateButtons/tests/StateButtons.test.tsx +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/locust/webui/src/components/StateButtons/tests/StopButton.test.tsx +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/locust/webui/src/components/StatsTable/StatsTable.tsx +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/locust/webui/src/components/SwarmCharts/SwarmCharts.tsx +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/locust/webui/src/components/SwarmForm/SwarmCustomParameters.tsx +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/locust/webui/src/components/SwarmForm/SwarmEditForm.tsx +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/locust/webui/src/components/SwarmForm/SwarmForm.tsx +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/locust/webui/src/components/SwarmForm/SwarmUserClassPicker.tsx +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/locust/webui/src/components/SwarmForm/tests/SwarmCustomParameters.test.tsx +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/locust/webui/src/components/SwarmForm/tests/SwarmEditForm.test.tsx +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/locust/webui/src/components/SwarmForm/tests/SwarmForm.test.tsx +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/locust/webui/src/components/SwarmForm/tests/SwarmUserClassPicker.test.tsx +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/locust/webui/src/components/SwarmRatios/SwarmRatios.test.tsx +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/locust/webui/src/components/SwarmRatios/SwarmRatios.tsx +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/locust/webui/src/components/Table/Table.test.tsx +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/locust/webui/src/components/Table/Table.tsx +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/locust/webui/src/components/Tabs/Tabs.test.tsx +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/locust/webui/src/components/Tabs/Tabs.tsx +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/locust/webui/src/components/ViewColumnSelector/ViewColumnSelector.test.tsx +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/locust/webui/src/components/ViewColumnSelector/ViewColumnSelector.tsx +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/locust/webui/src/components/WorkersTable/WorkersTable.tsx +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/locust/webui/src/constants/auth.ts +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/locust/webui/src/constants/swarm.ts +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/locust/webui/src/constants/theme.ts +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/locust/webui/src/global.d.ts +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/locust/webui/src/hooks/tests/useNotifications.test.tsx +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/locust/webui/src/hooks/tests/useSelecteViewColumns.test.tsx +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/locust/webui/src/hooks/tests/useSortByField.test.tsx +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/locust/webui/src/hooks/tests/useSwarmUi.test.tsx +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/locust/webui/src/hooks/useInterval.ts +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/locust/webui/src/hooks/useNotifications.ts +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/locust/webui/src/hooks/useSelectViewColumns.ts +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/locust/webui/src/hooks/useSortByField.ts +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/locust/webui/src/hooks/useSwarmUi.ts +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/locust/webui/src/index.tsx +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/locust/webui/src/pages/Auth.tsx +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/locust/webui/src/pages/Dashboard.tsx +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/locust/webui/src/pages/HtmlReport.tsx +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/locust/webui/src/pages/tests/Auth.test.tsx +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/locust/webui/src/pages/tests/Dashboard.test.tsx +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/locust/webui/src/pages/tests/HtmlReport.test.tsx +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/locust/webui/src/redux/api/swarm.ts +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/locust/webui/src/redux/hooks.ts +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/locust/webui/src/redux/slice/notification.slice.ts +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/locust/webui/src/redux/slice/root.slice.ts +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/locust/webui/src/redux/slice/swarm.slice.ts +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/locust/webui/src/redux/slice/tests/ui.slice.test.ts +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/locust/webui/src/redux/slice/theme.slice.ts +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/locust/webui/src/redux/slice/ui.slice.ts +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/locust/webui/src/redux/slice/url.slice.ts +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/locust/webui/src/redux/store.ts +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/locust/webui/src/redux/utils.ts +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/locust/webui/src/styles/theme.ts +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/locust/webui/src/test/constants.ts +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/locust/webui/src/test/mocks/statsRequest.mock.ts +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/locust/webui/src/test/mocks/swarmState.mock.ts +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/locust/webui/src/test/setup.ts +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/locust/webui/src/test/testUtils.tsx +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/locust/webui/src/types/auth.types.ts +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/locust/webui/src/types/swarm.types.ts +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/locust/webui/src/types/tab.types.ts +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/locust/webui/src/types/table.types.ts +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/locust/webui/src/utils/date.ts +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/locust/webui/src/utils/number.ts +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/locust/webui/src/utils/object.ts +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/locust/webui/src/utils/string.ts +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/locust/webui/src/utils/tests/number.test.ts +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/locust/webui/src/utils/tests/object.test.ts +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/locust/webui/src/utils/tests/string.test.ts +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/locust/webui/src/utils/tests/url.test.ts +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/locust/webui/src/utils/url.ts +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/locust/webui/tsconfig.json +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/locust/webui/vite.config.ts +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/locust/webui/vitest.config.ts +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/locust/webui/yarn.lock +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/locust.egg-info/dependency_links.txt +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/locust.egg-info/entry_points.txt +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/locust.egg-info/not-zip-safe +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/locust.egg-info/requires.txt +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/locust.egg-info/top_level.txt +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/package.json +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/pyproject.toml +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/setup.cfg +0 -0
- {locust-2.28.1.dev49 → locust-2.28.1.dev66}/tox.ini +0 -0
@@ -191,9 +191,6 @@ With the following file structure:
|
|
191
191
|
The Web UI will display:
|
192
192
|
|
193
193
|
.. image:: images/userclass_picker_example.png
|
194
|
-
:width: 200
|
195
|
-
|
196
|
-
|
|
197
194
|
|
198
195
|
The class picker additionally allows for disabling individual User tasks, changing the weight or fixed count, and configuring the host.
|
199
196
|
|
@@ -274,3 +271,15 @@ The list of statistics parameters that can be modified is:
|
|
274
271
|
+-------------------------------------------+--------------------------------------------------------------------------------------+
|
275
272
|
| PERCENTILES_TO_STATISTICS | List of response time percentiles in the screen of statistics for UI |
|
276
273
|
+-------------------------------------------+--------------------------------------------------------------------------------------+
|
274
|
+
|
275
|
+
Customization of additional static variables
|
276
|
+
============================================
|
277
|
+
|
278
|
+
This table lists the constants that are set within locust and may be overridden.
|
279
|
+
|
280
|
+
+-------------------------------------------+--------------------------------------------------------------------------------------+
|
281
|
+
| Parameter name | Purpose |
|
282
|
+
+-------------------------------------------+--------------------------------------------------------------------------------------+
|
283
|
+
| locust.runners.WORKER_LOG_REPORT_INTERVAL | Interval for how frequently worker logs are reported to master. Can be disabled |
|
284
|
+
| | by setting to a negative number |
|
285
|
+
+-------------------------------------------+--------------------------------------------------------------------------------------+
|
@@ -1,8 +1,8 @@
|
|
1
1
|
.. _developing-locust:
|
2
2
|
|
3
|
-
|
4
|
-
Developing Locust
|
5
|
-
|
3
|
+
=================================
|
4
|
+
Developing and Documenting Locust
|
5
|
+
=================================
|
6
6
|
|
7
7
|
You want to contribute to Locust? Great! Here is a list of `open bugs/feature requests <https://github.com/locustio/locust/issues>`_.
|
8
8
|
|
@@ -72,19 +72,21 @@ You can validate the whole project using tox:
|
|
72
72
|
Build documentation
|
73
73
|
===================
|
74
74
|
|
75
|
-
The documentation source is in the `docs/ <https://github.com/locustio/locust/tree/master/docs/>`_ directory. To build the documentation you
|
75
|
+
The documentation source is in the `docs/ <https://github.com/locustio/locust/tree/master/docs/>`_ directory. To build the documentation you'll need to `Install Locust for development`_ then
|
76
76
|
|
77
|
-
|
77
|
+
#. Install the documentation requirements:
|
78
78
|
|
79
|
-
|
79
|
+
.. code-block:: console
|
80
80
|
|
81
|
-
|
81
|
+
$ pip3 install -r docs/requirements.txt
|
82
82
|
|
83
|
-
|
83
|
+
#. Build the documentation locally:
|
84
|
+
|
85
|
+
.. code-block:: console
|
84
86
|
|
85
|
-
|
87
|
+
$ make build_docs
|
86
88
|
|
87
|
-
|
89
|
+
View your generated documentation by opening ``docs/_build/index.html``.
|
88
90
|
|
89
91
|
|
90
92
|
Making changes to Locust's Web UI
|
@@ -0,0 +1,41 @@
|
|
1
|
+
.. _extensions:
|
2
|
+
|
3
|
+
======================
|
4
|
+
Third party extensions
|
5
|
+
======================
|
6
|
+
|
7
|
+
Support for load testing other protocols, reporting etc
|
8
|
+
-------------------------------------------------------
|
9
|
+
|
10
|
+
- `locust-plugins <https://github.com/SvenskaSpel/locust-plugins/>`__
|
11
|
+
|
12
|
+
- request logging & graphing
|
13
|
+
- new protocols like websockets, selenium/webdriver, http users that
|
14
|
+
load html page resources
|
15
|
+
- readers (ways to get test data into your tests)
|
16
|
+
- wait time (custom wait time functions)
|
17
|
+
- debug (support for running a single user in the debugger)
|
18
|
+
- checks (adds command line parameters to set locust exit code based
|
19
|
+
on requests/s, error percentage and average response times)
|
20
|
+
|
21
|
+
Automate distributed runs over SSH
|
22
|
+
----------------------------------
|
23
|
+
|
24
|
+
- `locust-swarm <https://github.com/SvenskaSpel/locust-swarm/>`__
|
25
|
+
|
26
|
+
Automatically translate a browser recording (HAR-file) to a locustfile
|
27
|
+
----------------------------------------------------------------------
|
28
|
+
|
29
|
+
- `har2locust <https://github.com/SvenskaSpel/har2locust>`__
|
30
|
+
|
31
|
+
Workers written in other languages than Python
|
32
|
+
----------------------------------------------
|
33
|
+
|
34
|
+
A Locust master and a Locust worker communicate by exchanging
|
35
|
+
`msgpack <http://msgpack.org/>`__ messages, which is supported by many
|
36
|
+
languages. So, you can write your User tasks in any languages you like.
|
37
|
+
For convenience, some libraries do the job as a worker runner. They run
|
38
|
+
your User tasks, and report to master regularly.
|
39
|
+
|
40
|
+
- `Boomer <https://github.com/myzhan/boomer/>`__ - Go
|
41
|
+
- `Locust4j <https://github.com/myzhan/locust4j>`__ - Java
|
@@ -0,0 +1,107 @@
|
|
1
|
+
.. _faq:
|
2
|
+
|
3
|
+
===
|
4
|
+
FAQ
|
5
|
+
===
|
6
|
+
|
7
|
+
How do I…
|
8
|
+
|
9
|
+
..
|
10
|
+
|
11
|
+
Note: Hatch rate/ramp up does not change peak load, it only changes
|
12
|
+
how fast you get there (people keep asking about this for some
|
13
|
+
reason).
|
14
|
+
|
15
|
+
Resolve errors that occur during load (error 5xx, Connection aborted, Connection reset by peer, etc)
|
16
|
+
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
17
|
+
|
18
|
+
Check your server logs. If it works at low load then it is almost
|
19
|
+
certainly not a Locust issue, but an issue with the system you are
|
20
|
+
testing.
|
21
|
+
|
22
|
+
Clear cookies, to make the next task iteration seem like a new user to my system under test
|
23
|
+
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
24
|
+
|
25
|
+
Call ``self.client.cookies.clear()`` at the end of your task.
|
26
|
+
|
27
|
+
Control headers or other things about my HTTP requests
|
28
|
+
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
29
|
+
|
30
|
+
Locust’s client in ``HttpUser`` inherits from
|
31
|
+
`requests <https://requests.readthedocs.io/en/master/>`__ and the
|
32
|
+
vast majority of parameters and methods for requests should just work
|
33
|
+
with Locust. Check out the docs and Stack Overflow answers for
|
34
|
+
requests first and then ask on Stack Overflow for additional Locust
|
35
|
+
specific help if necessary.
|
36
|
+
|
37
|
+
Create a Locust file based on a recorded browser session
|
38
|
+
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
39
|
+
|
40
|
+
Try using `Transformer <https://transformer.readthedocs.io/>`__
|
41
|
+
|
42
|
+
How to run a Docker container of Locust in Windows Subsystem for Linux (Windows 10 users)?
|
43
|
+
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
44
|
+
|
45
|
+
If you use WSL on a Windows computer, then you need one extra step
|
46
|
+
than the `“docker run …”
|
47
|
+
command <https://docs.locust.io/en/stable/running-locust-docker.html>`__:
|
48
|
+
copy your locusttest1.py to a folder in a Windows path on your WSL
|
49
|
+
and mount that folder instead of your normal WSL folder:
|
50
|
+
|
51
|
+
::
|
52
|
+
|
53
|
+
$ mkdir /c/Users/[YOUR_Windows_USER]/Documents/Locust/
|
54
|
+
$ cp ~/path/to/locusttest1.py /c/Users/[YOUR_Windows_USER]/Documents/Locust/
|
55
|
+
$ docker run -p 8089:8089 -v /c/Users/[YOUR_Windows_USER]/Documents/Locust/:/mnt/locust locustio/locust:1.3.1 -f /mnt/locust/locusttest1.py
|
56
|
+
|
57
|
+
How to run locust on custom endpoint
|
58
|
+
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
59
|
+
|
60
|
+
Prefix the the endpoint to all ``@app.route`` definitions in
|
61
|
+
``locust/web.py`` file & also change as follows (where ``/locust`` is
|
62
|
+
new endpoint)
|
63
|
+
|
64
|
+
``app = Flask(__name__, static_url_path='/locust')``
|
65
|
+
|
66
|
+
Change the entries of static content location in file
|
67
|
+
``locust/templates/index.html``.
|
68
|
+
|
69
|
+
Eg:
|
70
|
+
``<link rel="shortcut icon" href="{{ url_for('static', filename='img/favicon.ico') }}" type="image/x-icon"/>``
|
71
|
+
|
72
|
+
Locust web UI doesn’t show my tasks running, says 0 RPS
|
73
|
+
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
74
|
+
|
75
|
+
Locust only knows what you’re doing when you tell it. There are `Event
|
76
|
+
Hooks <https://docs.locust.io/en/stable/api.html#events>`__ that you use
|
77
|
+
to tell Locust what’s going on in your code. If you use Locust’s
|
78
|
+
``HttpUser`` and then use ``self.client`` to make http calls, the proper
|
79
|
+
events are normally fired for you automatically, making less work for
|
80
|
+
you unless you want to override the default events.
|
81
|
+
|
82
|
+
If you use the plain ``User`` or use ``HttpUser`` and you’re not using
|
83
|
+
``self.client`` to make http calls, Locust will not fire events for you.
|
84
|
+
You will have to fire events yourself. See `the Locust
|
85
|
+
docs <https://docs.locust.io/en/stable/testing-other-systems.html>`__
|
86
|
+
for examples.
|
87
|
+
|
88
|
+
HTML Report is filled up with failed requests for long running tests
|
89
|
+
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
90
|
+
|
91
|
+
https://github.com/locustio/locust/issues/2328
|
92
|
+
|
93
|
+
Other questions and issues
|
94
|
+
~~~~~~~~~~~~~~~~~~~~~~~~~~
|
95
|
+
|
96
|
+
`Check the list of issues (a lot of questions/misunderstandings are
|
97
|
+
filed as
|
98
|
+
issues) <https://github.com/locustio/locust/issues?q=is%3Aissue%20>`__
|
99
|
+
|
100
|
+
Add things that you ran into and solved here! Anyone with a GitHub
|
101
|
+
account can contribute!
|
102
|
+
|
103
|
+
If you have questions about Locust that are not answered here, please
|
104
|
+
check
|
105
|
+
`StackOverflow <https://stackoverflow.com/questions/tagged/locust>`__,
|
106
|
+
or post your question there. This wiki is not for asking questions but
|
107
|
+
for answering them :)
|
@@ -2,13 +2,11 @@
|
|
2
2
|
Further reading / knowledgebase
|
3
3
|
===============================
|
4
4
|
|
5
|
-
|
5
|
+
- :ref:`extensions`.
|
6
6
|
|
7
|
-
- `
|
7
|
+
- An unmaintained list of Locust `articles, blog posts, reviews, and walkthroughs <https://github.com/orgs/locustio/discussions/2752>`_.
|
8
8
|
|
9
|
-
-
|
10
|
-
|
11
|
-
- `Frequently Asked Questions <https://github.com/locustio/locust/wiki/FAQ>`_ Common questions about Locust answered here
|
9
|
+
- :ref:`Common questions and answers about Locust <faq>`.
|
12
10
|
|
13
11
|
You'll also find a lot of answers on `stackoverflow <https://stackoverflow.com/questions/tagged/locust?sort=MostVotes>`_, for example:
|
14
12
|
|
@@ -0,0 +1,28 @@
|
|
1
|
+
.. _increaserr:
|
2
|
+
|
3
|
+
===========================
|
4
|
+
Increasing the request rate
|
5
|
+
===========================
|
6
|
+
|
7
|
+
Increase the number of requests per second using a combination of the following steps:
|
8
|
+
|
9
|
+
#. Increase the number of users. To fully utilize your target system you may need a lot of simultaneous users, especially if each request takes a long time to complete.
|
10
|
+
|
11
|
+
#. If response times are unexpectedly high and/or increasing as the number of users go up, then you have probably saturated the system you are testing and need to dig into why. This is not really a Locust problem, but here are some things you may want to check:
|
12
|
+
|
13
|
+
- resource utilization (e.g. CPU, memory & network. Check these metrics on the locust side as well)
|
14
|
+
- configuration (e.g. max threads for your web server)
|
15
|
+
- back end response times (e.g. DB)
|
16
|
+
- client side DNS performance/flood protection (Locust will normally make at least one DNS Request per User)
|
17
|
+
|
18
|
+
#. If Locust prints a warning about high CPU usage (``WARNING/root: CPU usage above 90%! ...``) try the following:
|
19
|
+
|
20
|
+
- Run Locust `distributed <https://docs.locust.io/en/stable/running-locust-distributed.html>`__ to utilize multiple cores & multiple machines
|
21
|
+
- Try switching to `FastHttpUser <https://docs.locust.io/en/stable/increase-performance.html#increase-performance>`__ to reduce CPU usage
|
22
|
+
- Check to see that there are no strange/infinite loops in your code
|
23
|
+
|
24
|
+
#. If you are using a custom client (not HttpUser or FastHttpUser), make sure any client library you are using is gevent-friendly otherwise it will block the entire Python process (essentially limiting you to one user per worker)
|
25
|
+
|
26
|
+
.. note::
|
27
|
+
|
28
|
+
Hatch rate/ramp up does not change peak load, it only changes how fast you get there.
|
@@ -30,6 +30,7 @@ Running your Locust tests
|
|
30
30
|
:maxdepth: 1
|
31
31
|
|
32
32
|
configuration
|
33
|
+
increasing-request-rate
|
33
34
|
running-distributed
|
34
35
|
running-in-debugger
|
35
36
|
running-in-docker
|
@@ -49,6 +50,7 @@ Other functionalities
|
|
49
50
|
extending-locust
|
50
51
|
logging
|
51
52
|
use-as-lib
|
53
|
+
extensions
|
52
54
|
|
53
55
|
|
54
56
|
Further reading / knowledgebase
|
@@ -59,6 +61,7 @@ Further reading / knowledgebase
|
|
59
61
|
|
60
62
|
developing-locust
|
61
63
|
further-reading
|
64
|
+
faq
|
62
65
|
|
63
66
|
|
64
67
|
API
|
@@ -0,0 +1,103 @@
|
|
1
|
+
.. _installation:
|
2
|
+
|
3
|
+
Installation
|
4
|
+
============
|
5
|
+
|
6
|
+
0. `Install Python <https://docs.python-guide.org/starting/installation/>`_ (3.9 or later)
|
7
|
+
|
8
|
+
1. Install the package (check `Troubleshooting Installation`_ if the installation fails)
|
9
|
+
|
10
|
+
.. code-block:: console
|
11
|
+
|
12
|
+
$ pip3 install locust
|
13
|
+
|
14
|
+
2. Validate your installation
|
15
|
+
|
16
|
+
.. code-block:: console
|
17
|
+
:substitutions:
|
18
|
+
|
19
|
+
$ locust -V
|
20
|
+
locust |version| from /usr/local/lib/python3.10/site-packages/locust (python 3.10.6)
|
21
|
+
|
22
|
+
3. Done! Now you can :ref:`create your first test <quickstart>`
|
23
|
+
|
24
|
+
|
25
|
+
Pre-release builds
|
26
|
+
------------------
|
27
|
+
|
28
|
+
If you need the latest and greatest version of Locust and cannot wait for the next release, you can install a dev build like this:
|
29
|
+
|
30
|
+
.. code-block:: console
|
31
|
+
|
32
|
+
$ pip3 install -U --pre locust
|
33
|
+
|
34
|
+
Pre-release builds are published every time a branch/PR is merged into master.
|
35
|
+
|
36
|
+
Install for development
|
37
|
+
-----------------------
|
38
|
+
|
39
|
+
If you want to modify Locust, or contribute to the project, see :ref:`developing-locust`.
|
40
|
+
|
41
|
+
Troubleshooting installation
|
42
|
+
----------------------------
|
43
|
+
|
44
|
+
|
45
|
+
.. contents:: Some solutions for common installation issues
|
46
|
+
:depth: 1
|
47
|
+
:local:
|
48
|
+
:backlinks: none
|
49
|
+
|
50
|
+
|
51
|
+
psutil/\_psutil_common.c:9:10: fatal error: Python.h: No such file or directory
|
52
|
+
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
53
|
+
|
54
|
+
`Answered in Stackoverflow thread 63440765 <https://stackoverflow.com/questions/63440765/locust-installation-error-using-pip3-error-command-errored-out-with-exit-statu>`_
|
55
|
+
|
56
|
+
ERROR: Failed building wheel for xxx
|
57
|
+
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
58
|
+
|
59
|
+
While Locust itself is a pure Python package, it has some dependencies
|
60
|
+
(e.g. gevent and geventhttpclient) that are compiled from C code. Pretty
|
61
|
+
much all common platforms have binary packages on PyPi, but sometimes
|
62
|
+
there is a new release that doesn't, or you are running on some exotic
|
63
|
+
platform. You have two options:
|
64
|
+
|
65
|
+
- (on macos) Install xcode: ``xcode-select --install``
|
66
|
+
- Use ``pip install --prefer-binary locust`` to select a pre-compiled
|
67
|
+
version of packages even if there is a more recent version available
|
68
|
+
as source.
|
69
|
+
- Try googling the error message for the specific package that failed
|
70
|
+
(not Locust), ensure you have the appropriate build tools installed
|
71
|
+
etc.
|
72
|
+
|
73
|
+
Windows
|
74
|
+
~~~~~~~
|
75
|
+
|
76
|
+
`Answered in Stackoverflow thread 61592069 <https://stackoverflow.com/questions/61592069/locust-is-not-installing-on-my-windows-10-for-load-testing>`_
|
77
|
+
|
78
|
+
Installation works, but the ``locust`` command is not found
|
79
|
+
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
80
|
+
|
81
|
+
When running pip, did you get a warning saying ``The script locust is installed in '...' which is not on PATH``?
|
82
|
+
|
83
|
+
Add that directory to your PATH environment variable.
|
84
|
+
|
85
|
+
Increasing Maximum Number of Open Files Limit
|
86
|
+
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
87
|
+
|
88
|
+
Every User/HTTP connection from Locust opens a new file (technically
|
89
|
+
a file descriptor). Many operating systems by default set a low limit
|
90
|
+
for the maximum number of files that can be open at the same time.
|
91
|
+
Locust will try to adjust this automatically for you, but in a lot of
|
92
|
+
cases your operating system will not allow it (in which case you will
|
93
|
+
get a warning in the log). Instead you will have to do it manually.
|
94
|
+
|
95
|
+
How to do this depends on your operating system, but you might find
|
96
|
+
some useful information here:
|
97
|
+
https://www.tecmint.com/increase-set-open-file-limits-in-linux/ and
|
98
|
+
practical examples
|
99
|
+
https://www.ibm.com/support/knowledgecenter/SS8NLW_11.0.2/com.ibm.discovery.es.in.doc/iiysiulimits.html
|
100
|
+
|
101
|
+
For systemd-based systems (e.g. Debian/Ubuntu) different limits are
|
102
|
+
used for graphical login sessions. See
|
103
|
+
https://unix.stackexchange.com/a/443467 for additional settings.
|
@@ -56,7 +56,7 @@ The following screenshots show what it might look like when running this test us
|
|
56
56
|
|
57
57
|
If your response times are *not* increasing then add even more users until you find the service's breaking point, or celebrate that your service is already performant enough for your expected load.
|
58
58
|
|
59
|
-
If you
|
59
|
+
If you're having trouble generating enough load to saturate your system, take a look at :ref:`increaserr`.
|
60
60
|
|
61
61
|
Direct command line usage / headless
|
62
62
|
====================================
|
@@ -89,7 +89,7 @@ To run Locust distributed across multiple Python processes or machines, you star
|
|
89
89
|
with the ``--master`` command line parameter, and then any number of Locust worker processes using the ``--worker``
|
90
90
|
command line parameter. See :ref:`running-distributed` for more info.
|
91
91
|
|
92
|
-
To see all available options type:
|
92
|
+
To see all available options type: ``locust --help`` or check :ref:`configuration`.
|
93
93
|
|
94
94
|
Next steps
|
95
95
|
==========
|
@@ -18,7 +18,7 @@ To simplify startup, you can use the ``--processes`` flag. It will launch a mast
|
|
18
18
|
.. note::
|
19
19
|
There is almost no limit to how many Users you can run per worker. Locust/gevent can run thousands or even tens of thousands of Users per process just fine, as long as their total request rate (RPS) is not too high.
|
20
20
|
|
21
|
-
If Locust *is* getting close to running out of CPU resources, it will log a warning. If there is no warning but you are still unable to generate the expected load, then the problem must be
|
21
|
+
If Locust *is* getting close to running out of CPU resources, it will log a warning. If there is no warning but you are still unable to generate the expected load, then the problem must be :ref:`increaserr`.
|
22
22
|
|
23
23
|
Single machine
|
24
24
|
==============
|
@@ -12,5 +12,5 @@ __version__: str
|
|
12
12
|
__version_tuple__: VERSION_TUPLE
|
13
13
|
version_tuple: VERSION_TUPLE
|
14
14
|
|
15
|
-
__version__ = version = '2.28.1.
|
16
|
-
__version_tuple__ = version_tuple = (2, 28, 1, '
|
15
|
+
__version__ = version = '2.28.1.dev66'
|
16
|
+
__version_tuple__ = version_tuple = (2, 28, 1, 'dev66')
|
@@ -99,6 +99,8 @@ class Environment:
|
|
99
99
|
"""List of the available Tasks per User Classes to pick from in the Task Picker"""
|
100
100
|
self.dispatcher_class = dispatcher_class
|
101
101
|
"""A user dispatcher class that decides how users are spawned, default :class:`UsersDispatcher <locust.dispatch.UsersDispatcher>`"""
|
102
|
+
self.worker_logs: dict[str, list[str]] = {}
|
103
|
+
"""Captured logs from all connected workers"""
|
102
104
|
|
103
105
|
self._remove_user_classes_with_weight_zero()
|
104
106
|
self._validate_user_class_name_uniqueness()
|
@@ -209,6 +211,10 @@ class Environment:
|
|
209
211
|
if key == "tasks":
|
210
212
|
user_class.tasks = [task for task in user_tasks if task.__name__ in value]
|
211
213
|
|
214
|
+
def update_worker_logs(self, worker_log_report):
|
215
|
+
if worker_log_report.get("worker_id", None):
|
216
|
+
self.worker_logs[worker_log_report.get("worker_id")] = worker_log_report.get("logs", [])
|
217
|
+
|
212
218
|
def _filter_tasks_by_tags(self) -> None:
|
213
219
|
"""
|
214
220
|
Filter the tasks on all the user_classes recursively, according to the tags and
|
@@ -2,6 +2,7 @@ import logging
|
|
2
2
|
import logging.config
|
3
3
|
import re
|
4
4
|
import socket
|
5
|
+
from collections import deque
|
5
6
|
|
6
7
|
HOSTNAME = re.sub(r"\..*", "", socket.gethostname())
|
7
8
|
|
@@ -13,7 +14,7 @@ unhandled_greenlet_exception = False
|
|
13
14
|
class LogReader(logging.Handler):
|
14
15
|
def __init__(self):
|
15
16
|
super().__init__()
|
16
|
-
self.logs =
|
17
|
+
self.logs = deque(maxlen=500)
|
17
18
|
|
18
19
|
def emit(self, record):
|
19
20
|
self.logs.append(self.format(record))
|
@@ -75,6 +76,15 @@ def setup_logging(loglevel, logfile=None):
|
|
75
76
|
logging.config.dictConfig(LOGGING_CONFIG)
|
76
77
|
|
77
78
|
|
79
|
+
def get_logs():
|
80
|
+
log_reader_handler = [handler for handler in logging.getLogger("root").handlers if handler.name == "log_reader"]
|
81
|
+
|
82
|
+
if log_reader_handler:
|
83
|
+
return list(log_reader_handler[0].logs)
|
84
|
+
|
85
|
+
return []
|
86
|
+
|
87
|
+
|
78
88
|
def greenlet_exception_logger(logger, level=logging.CRITICAL):
|
79
89
|
"""
|
80
90
|
Return a function that can be used as argument to Greenlet.link_exception() that will log the
|
@@ -39,7 +39,7 @@ from gevent.pool import Group
|
|
39
39
|
from . import argument_parser
|
40
40
|
from .dispatch import UsersDispatcher
|
41
41
|
from .exception import RPCError, RPCReceiveError, RPCSendError
|
42
|
-
from .log import greenlet_exception_logger
|
42
|
+
from .log import get_logs, greenlet_exception_logger
|
43
43
|
from .rpc import (
|
44
44
|
Message,
|
45
45
|
rpc,
|
@@ -66,6 +66,7 @@ STATE_INIT, STATE_SPAWNING, STATE_RUNNING, STATE_CLEANUP, STATE_STOPPING, STATE_
|
|
66
66
|
"missing",
|
67
67
|
]
|
68
68
|
WORKER_REPORT_INTERVAL = 3.0
|
69
|
+
WORKER_LOG_REPORT_INTERVAL = 10
|
69
70
|
CPU_MONITOR_INTERVAL = 5.0
|
70
71
|
CPU_WARNING_THRESHOLD = 90
|
71
72
|
HEARTBEAT_INTERVAL = 1
|
@@ -1116,6 +1117,8 @@ class MasterRunner(DistributedRunner):
|
|
1116
1117
|
# a worker finished spawning (this happens multiple times during rampup)
|
1117
1118
|
self.clients[msg.node_id].state = STATE_RUNNING
|
1118
1119
|
self.clients[msg.node_id].user_classes_count = msg.data["user_classes_count"]
|
1120
|
+
elif msg.type == "logs":
|
1121
|
+
self.environment.update_worker_logs(msg.data)
|
1119
1122
|
elif msg.type == "quit":
|
1120
1123
|
if msg.node_id in self.clients:
|
1121
1124
|
client = self.clients[msg.node_id]
|
@@ -1212,6 +1215,7 @@ class WorkerRunner(DistributedRunner):
|
|
1212
1215
|
self.client_id = socket.gethostname() + "_" + uuid4().hex
|
1213
1216
|
self.master_host = master_host
|
1214
1217
|
self.master_port = master_port
|
1218
|
+
self.logs: list[str] = []
|
1215
1219
|
self.worker_cpu_warning_emitted = False
|
1216
1220
|
self._users_dispatcher: UsersDispatcher | None = None
|
1217
1221
|
self.client = rpc.Client(master_host, master_port, self.client_id)
|
@@ -1220,6 +1224,7 @@ class WorkerRunner(DistributedRunner):
|
|
1220
1224
|
self.greenlet.spawn(self.heartbeat).link_exception(greenlet_exception_handler)
|
1221
1225
|
self.greenlet.spawn(self.heartbeat_timeout_checker).link_exception(greenlet_exception_handler)
|
1222
1226
|
self.greenlet.spawn(self.stats_reporter).link_exception(greenlet_exception_handler)
|
1227
|
+
self.greenlet.spawn(self.logs_reporter).link_exception(greenlet_exception_handler)
|
1223
1228
|
|
1224
1229
|
# register listener that adds the current number of spawned users to the report that is sent to the master node
|
1225
1230
|
def on_report_to_master(client_id: str, data: dict[str, Any]):
|
@@ -1417,6 +1422,25 @@ class WorkerRunner(DistributedRunner):
|
|
1417
1422
|
logger.error(f"Temporary connection lost to master server: {e}, will retry later.")
|
1418
1423
|
gevent.sleep(WORKER_REPORT_INTERVAL)
|
1419
1424
|
|
1425
|
+
def logs_reporter(self) -> None:
|
1426
|
+
if WORKER_LOG_REPORT_INTERVAL < 0:
|
1427
|
+
return
|
1428
|
+
|
1429
|
+
while True:
|
1430
|
+
current_logs = get_logs()
|
1431
|
+
|
1432
|
+
if (len(current_logs) - len(self.logs)) > 10:
|
1433
|
+
logger.warning(
|
1434
|
+
"The worker attempted to send more than 10 log lines in one interval. Further log sending was disabled for this worker."
|
1435
|
+
)
|
1436
|
+
self._send_logs(get_logs())
|
1437
|
+
break
|
1438
|
+
if len(current_logs) > len(self.logs):
|
1439
|
+
self._send_logs(current_logs)
|
1440
|
+
|
1441
|
+
self.logs = current_logs
|
1442
|
+
gevent.sleep(WORKER_LOG_REPORT_INTERVAL)
|
1443
|
+
|
1420
1444
|
def send_message(self, msg_type: str, data: dict[str, Any] | None = None, client_id: str | None = None) -> None:
|
1421
1445
|
"""
|
1422
1446
|
Sends a message to master node
|
@@ -1433,6 +1457,9 @@ class WorkerRunner(DistributedRunner):
|
|
1433
1457
|
self.environment.events.report_to_master.fire(client_id=self.client_id, data=data)
|
1434
1458
|
self.client.send(Message("stats", data, self.client_id))
|
1435
1459
|
|
1460
|
+
def _send_logs(self, current_logs) -> None:
|
1461
|
+
self.send_message("logs", {"worker_id": self.client_id, "logs": current_logs})
|
1462
|
+
|
1436
1463
|
def connect_to_master(self):
|
1437
1464
|
self.retry += 1
|
1438
1465
|
self.client.send(Message("client_ready", __version__, self.client_id))
|