locust 2.27.0__tar.gz → 2.27.1.dev10__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.27.0 → locust-2.27.1.dev10}/CHANGELOG.md +25 -1
- {locust-2.27.0 → locust-2.27.1.dev10}/MANIFEST.in +0 -2
- {locust-2.27.0/locust.egg-info → locust-2.27.1.dev10}/PKG-INFO +1 -1
- {locust-2.27.0 → locust-2.27.1.dev10}/docs/configuration.rst +0 -2
- {locust-2.27.0 → locust-2.27.1.dev10}/docs/developing-locust.rst +1 -1
- locust-2.27.0/examples/extend_modern_web_ui.py → locust-2.27.1.dev10/examples/extend_web_ui.py +0 -2
- {locust-2.27.0 → locust-2.27.1.dev10}/locust/_version.py +2 -2
- {locust-2.27.0 → locust-2.27.1.dev10}/locust/argument_parser.py +13 -16
- {locust-2.27.0 → locust-2.27.1.dev10}/locust/env.py +0 -2
- locust-2.27.1.dev10/locust/html.py +111 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/locust/log.py +2 -1
- {locust-2.27.0 → locust-2.27.1.dev10}/locust/main.py +8 -12
- {locust-2.27.0 → locust-2.27.1.dev10}/locust/stats.py +3 -10
- {locust-2.27.0 → locust-2.27.1.dev10}/locust/test/test_fasthttp.py +6 -4
- {locust-2.27.0 → locust-2.27.1.dev10}/locust/test/test_main.py +6 -15
- {locust-2.27.0 → locust-2.27.1.dev10}/locust/test/test_web.py +53 -199
- {locust-2.27.0 → locust-2.27.1.dev10}/locust/web.py +18 -56
- {locust-2.27.0 → locust-2.27.1.dev10/locust.egg-info}/PKG-INFO +1 -1
- {locust-2.27.0 → locust-2.27.1.dev10}/locust.egg-info/SOURCES.txt +1 -30
- {locust-2.27.0 → locust-2.27.1.dev10}/pyproject.toml +1 -3
- locust-2.27.0/examples/extend_web_ui/extend.py +0 -142
- locust-2.27.0/examples/extend_web_ui/static/custom-stats-table.css +0 -49
- locust-2.27.0/examples/extend_web_ui/static/extend.js +0 -54
- locust-2.27.0/examples/extend_web_ui/templates/extend.html +0 -52
- locust-2.27.0/locust/html.py +0 -157
- locust-2.27.0/locust/static/chart.js +0 -133
- locust-2.27.0/locust/static/css/application.css +0 -491
- locust-2.27.0/locust/static/css/application.css.map +0 -1
- locust-2.27.0/locust/static/css/tables.css +0 -74
- locust-2.27.0/locust/static/css/tables.css.map +0 -1
- locust-2.27.0/locust/static/echarts.common.min.js +0 -22
- locust-2.27.0/locust/static/img/logo.png +0 -0
- locust-2.27.0/locust/static/img/ui-screenshot-charts.png +0 -0
- locust-2.27.0/locust/static/img/ui-screenshot-start-test.png +0 -0
- locust-2.27.0/locust/static/img/ui-screenshot-stats.png +0 -0
- locust-2.27.0/locust/static/img/ui-screenshot-workers.png +0 -0
- locust-2.27.0/locust/static/jquery-1.11.3.min.js +0 -5
- locust-2.27.0/locust/static/jquery.jqote2.min.js +0 -14
- locust-2.27.0/locust/static/jquery.tools.min.js +0 -17
- locust-2.27.0/locust/static/locust.js +0 -324
- locust-2.27.0/locust/static/sass/_base.sass +0 -27
- locust-2.27.0/locust/static/sass/_mixins.sass +0 -3
- locust-2.27.0/locust/static/sass/application.sass +0 -320
- locust-2.27.0/locust/static/sass/tables.sass +0 -61
- locust-2.27.0/locust/static/tasks.js +0 -48
- locust-2.27.0/locust/static/vintage.js +0 -35
- locust-2.27.0/locust/templates/index.html +0 -370
- locust-2.27.0/locust/templates/report.html +0 -265
- locust-2.27.0/locust/templates/stats_data.html +0 -10
- locust-2.27.0/locust/webui/public/assets/favicon.ico +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/.coveragerc +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/.dockerignore +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/.git-blame-ignore-revs +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/.gitattributes +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/.github/CONTRIBUTING.md +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/.github/ISSUE_TEMPLATE/bug.yml +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/.github/workflows/stale.yml +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/.github/workflows/tests.yml +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/.gitignore +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/.pre-commit-config.yaml +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/.readthedocs.yaml +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/.vscode/extensions.json +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/.vscode/launch.json +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/.vscode/launch_locust.json +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/.vscode/settings.json +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/Dockerfile +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/LICENSE +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/Makefile +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/README +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/README.md +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/SECURITY.md +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/Vagrantfile +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/benchmarks/dispatch.py +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/docs/_static/theme-overrides.css +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/docs/api.rst +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/docs/changelog.rst +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/docs/conf.py +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/docs/custom-load-shape.rst +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/docs/extending-locust.rst +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/docs/further-reading.rst +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/docs/history.rst +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/docs/images/extend_modern_web_ui_cache_stats.png +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/docs/images/locust_workers.png +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/docs/images/number_of_users.png +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/docs/images/response_times.png +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/docs/images/total_requests_per_second.png +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/docs/images/userclass_picker_example.png +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/docs/images/webui-running-statistics.png +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/docs/images/webui-splash-screenshot.png +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/docs/increase-performance.rst +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/docs/index.rst +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/docs/installation.rst +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/docs/logging.rst +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/docs/quickstart.rst +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/docs/requirements.txt +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/docs/retrieving-stats.rst +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/docs/running-distributed.rst +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/docs/running-in-debugger.rst +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/docs/running-in-docker.rst +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/docs/running-without-web-ui.rst +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/docs/tasksets.rst +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/docs/testing-other-systems.rst +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/docs/use-as-lib.rst +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/docs/what-is-locust.rst +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/docs/writing-a-locustfile.rst +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/examples/add_command_line_argument.py +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/examples/basic.py +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/examples/browse_docs_sequence_test.py +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/examples/browse_docs_test.py +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/examples/custom_messages.py +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/examples/custom_shape/double_wave.py +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/examples/custom_shape/stages.py +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/examples/custom_shape/staging_user_classes.py +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/examples/custom_shape/step_load.py +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/examples/custom_shape/wait_user_count.py +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/examples/custom_wait_function.py +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/examples/custom_xmlrpc_client/server.py +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/examples/custom_xmlrpc_client/xmlrpc_locustfile.py +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/examples/debugging.py +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/examples/debugging_advanced.py +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/examples/docker-compose/docker-compose.yml +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/examples/dynamic_user_credentials.py +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/examples/events.py +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/examples/fast_http_locust.py +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/examples/grpc/grpc_user.py +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/examples/grpc/hello.proto +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/examples/grpc/hello_pb2.py +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/examples/grpc/hello_pb2_grpc.py +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/examples/grpc/hello_server.py +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/examples/grpc/locustfile.py +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/examples/locustfile.py +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/examples/manual_stats_reporting.py +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/examples/multiple_hosts.py +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/examples/nested_inline_tasksets.py +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/examples/rest.py +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/examples/sdk_session_patching/session_patch_locustfile.py +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/examples/semaphore_wait.py +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/examples/stop_on_threshold.py +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/examples/terraform/aws/README.md +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/examples/terraform/aws/data_subnet.tf +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/examples/terraform/aws/main.tf +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/examples/terraform/aws/output.tf +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/examples/terraform/aws/plan/basic.py +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/examples/terraform/aws/provisioner.tf +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/examples/terraform/aws/variables.tf +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/examples/test_data_management.py +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/examples/use_as_lib.py +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/examples/vagrant/README.md +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/examples/vagrant/supervisord.conf +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/examples/web_ui_auth.py +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/examples/web_ui_cache_stats.py +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/examples/worker_index.py +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/generate_changelog.py +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/locust/__init__.py +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/locust/__main__.py +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/locust/clients.py +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/locust/contrib/__init__.py +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/locust/contrib/fasthttp.py +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/locust/debug.py +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/locust/dispatch.py +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/locust/event.py +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/locust/exception.py +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/locust/input_events.py +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/locust/py.typed +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/locust/rpc/__init__.py +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/locust/rpc/protocol.py +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/locust/rpc/zmqrpc.py +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/locust/runners.py +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/locust/shape.py +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/locust/test/__init__.py +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/locust/test/fake_module1_for_env_test.py +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/locust/test/fake_module2_for_env_test.py +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/locust/test/mock_locustfile.py +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/locust/test/mock_logging.py +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/locust/test/test_debugging.py +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/locust/test/test_dispatch.py +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/locust/test/test_env.py +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/locust/test/test_http.py +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/locust/test/test_interruptable_task.py +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/locust/test/test_load_locustfile.py +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/locust/test/test_locust_class.py +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/locust/test/test_log.py +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/locust/test/test_old_wait_api.py +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/locust/test/test_parser.py +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/locust/test/test_runners.py +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/locust/test/test_sequential_taskset.py +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/locust/test/test_stats.py +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/locust/test/test_tags.py +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/locust/test/test_taskratio.py +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/locust/test/test_users.py +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/locust/test/test_util.py +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/locust/test/test_wait_time.py +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/locust/test/test_zmqrpc.py +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/locust/test/testcases.py +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/locust/test/util.py +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/locust/user/__init__.py +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/locust/user/inspectuser.py +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/locust/user/sequential_taskset.py +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/locust/user/task.py +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/locust/user/users.py +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/locust/user/wait_time.py +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/locust/util/__init__.py +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/locust/util/cache.py +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/locust/util/deprecation.py +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/locust/util/exception_handler.py +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/locust/util/load_locustfile.py +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/locust/util/rounding.py +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/locust/util/timespan.py +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/.eslintrc +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/.gitignore +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/.prettierrc +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/auth.html +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/dev.html +0 -0
- {locust-2.27.0/locust/static/img → locust-2.27.1.dev10/locust/webui/dist/assets}/favicon.ico +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/dist/assets/index-941b6e82.js +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/dist/assets/logo.png +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/dist/auth.html +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/dist/index.html +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/dist/report.html +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/index.html +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/package.json +0 -0
- {locust-2.27.0/locust/webui/dist → locust-2.27.1.dev10/locust/webui/public}/assets/favicon.ico +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/public/assets/logo.png +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/public/report.html +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/src/App.test.tsx +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/src/App.tsx +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/src/components/DataTable/DataTable.test.tsx +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/src/components/DataTable/DataTable.tsx +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/src/components/ExceptionsTable/ExceptionsTable.tsx +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/src/components/FailuresTable/FailuresTable.tsx +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/src/components/FallbackRender/FallbackRender.test.tsx +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/src/components/FallbackRender/FallbackRender.tsx +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/src/components/Form/Form.tsx +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/src/components/Form/Select.tsx +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/src/components/Form/tests/Form.test.tsx +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/src/components/Form/tests/Select.test.tsx +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/src/components/Layout/Footer/About.tsx +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/src/components/Layout/Footer/Footer.tsx +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/src/components/Layout/Layout.tsx +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/src/components/Layout/Navbar/DarkLightToggle.tsx +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/src/components/Layout/Navbar/Navbar.tsx +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/src/components/Layout/Navbar/SwarmMonitor.test.tsx +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/src/components/Layout/Navbar/SwarmMonitor.tsx +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/src/components/LineChart/LineChart.test.tsx +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/src/components/LineChart/LineChart.tsx +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/src/components/LogViewer/LogViewer.tsx +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/src/components/LogViewer/tests/LogViewer.test.tsx +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/src/components/LogViewer/tests/useLogViewer.test.tsx +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/src/components/LogViewer/useLogViewer.ts +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/src/components/Modal/Modal.tsx +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/src/components/Reports/Reports.test.tsx +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/src/components/Reports/Reports.tsx +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/src/components/ResponseTimeTable/ResponseTimeTable.test.tsx +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/src/components/ResponseTimeTable/ResponseTimeTable.tsx +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/src/components/StateButtons/EditButton.tsx +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/src/components/StateButtons/NewTestButton.tsx +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/src/components/StateButtons/ResetButton.tsx +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/src/components/StateButtons/StateButtons.tsx +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/src/components/StateButtons/StopButton.tsx +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/src/components/StateButtons/tests/ResetButton.test.tsx +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/src/components/StateButtons/tests/StateButtons.test.tsx +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/src/components/StateButtons/tests/StopButton.test.tsx +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/src/components/StatsTable/StatsTable.tsx +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/src/components/SwarmCharts/SwarmCharts.tsx +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/src/components/SwarmForm/SwarmCustomParameters.tsx +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/src/components/SwarmForm/SwarmEditForm.tsx +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/src/components/SwarmForm/SwarmForm.tsx +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/src/components/SwarmForm/SwarmUserClassPicker.tsx +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/src/components/SwarmForm/tests/SwarmCustomParameters.test.tsx +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/src/components/SwarmForm/tests/SwarmEditForm.test.tsx +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/src/components/SwarmForm/tests/SwarmForm.test.tsx +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/src/components/SwarmForm/tests/SwarmUserClassPicker.test.tsx +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/src/components/SwarmRatios/SwarmRatios.test.tsx +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/src/components/SwarmRatios/SwarmRatios.tsx +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/src/components/Table/Table.test.tsx +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/src/components/Table/Table.tsx +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/src/components/Tabs/Tabs.constants.tsx +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/src/components/Tabs/Tabs.test.tsx +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/src/components/Tabs/Tabs.tsx +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/src/components/ViewColumnSelector/ViewColumnSelector.test.tsx +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/src/components/ViewColumnSelector/ViewColumnSelector.tsx +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/src/components/WorkersTable/WorkersTable.tsx +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/src/constants/auth.ts +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/src/constants/swarm.ts +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/src/constants/theme.ts +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/src/global.d.ts +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/src/hooks/tests/useNotifications.test.tsx +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/src/hooks/tests/useSelecteViewColumns.test.tsx +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/src/hooks/tests/useSortByField.test.tsx +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/src/hooks/tests/useSwarmUi.test.tsx +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/src/hooks/useInterval.ts +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/src/hooks/useNotifications.ts +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/src/hooks/useSelectViewColumns.ts +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/src/hooks/useSortByField.ts +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/src/hooks/useSwarmUi.ts +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/src/index.tsx +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/src/pages/Auth.tsx +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/src/pages/Dashboard.tsx +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/src/pages/HtmlReport.tsx +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/src/pages/tests/Auth.test.tsx +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/src/pages/tests/Dashboard.test.tsx +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/src/pages/tests/HtmlReport.test.tsx +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/src/redux/api/swarm.ts +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/src/redux/hooks.ts +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/src/redux/slice/logViewer.slice.ts +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/src/redux/slice/notification.slice.ts +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/src/redux/slice/root.slice.ts +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/src/redux/slice/swarm.slice.ts +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/src/redux/slice/tests/ui.slice.test.ts +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/src/redux/slice/theme.slice.ts +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/src/redux/slice/ui.slice.ts +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/src/redux/slice/url.slice.ts +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/src/redux/store.ts +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/src/redux/utils.ts +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/src/styles/theme.ts +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/src/test/constants.ts +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/src/test/mocks/statsRequest.mock.ts +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/src/test/mocks/swarmState.mock.ts +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/src/test/setup.ts +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/src/test/testUtils.tsx +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/src/types/auth.types.ts +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/src/types/swarm.types.ts +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/src/types/tab.types.ts +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/src/types/table.types.ts +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/src/types/ui.types.ts +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/src/utils/number.ts +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/src/utils/object.ts +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/src/utils/string.ts +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/src/utils/tests/number.test.ts +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/src/utils/tests/object.test.ts +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/src/utils/tests/string.test.ts +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/src/utils/tests/url.test.ts +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/src/utils/url.ts +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/tsconfig.json +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/vite.config.ts +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/vitest.config.ts +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/locust/webui/yarn.lock +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/locust.egg-info/dependency_links.txt +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/locust.egg-info/entry_points.txt +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/locust.egg-info/not-zip-safe +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/locust.egg-info/requires.txt +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/locust.egg-info/top_level.txt +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/package.json +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/scripts/locustfile.py +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/scripts/run-disributed-headless.sh +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/scripts/run-disributed-web.sh +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/scripts/run-local-headless.sh +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/scripts/run-local-web.sh +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/setup.cfg +0 -0
- {locust-2.27.0 → locust-2.27.1.dev10}/tox.ini +0 -0
@@ -1,6 +1,31 @@
|
|
1
1
|
# Detailed changelog
|
2
2
|
The most important changes can also be found in [the documentation](https://docs.locust.io/en/latest/changelog.html).
|
3
3
|
|
4
|
+
## [2.27.0](https://github.com/locustio/locust/tree/2.27.0) (2024-05-06)
|
5
|
+
|
6
|
+
[Full Changelog](https://github.com/locustio/locust/compare/2.26.0...2.27.0)
|
7
|
+
|
8
|
+
**Fixed bugs:**
|
9
|
+
|
10
|
+
- User Classes with Empty Tasks Results in TypeError: 'NoneType' object is not iterable [\#2694](https://github.com/locustio/locust/issues/2694)
|
11
|
+
|
12
|
+
**Closed issues:**
|
13
|
+
|
14
|
+
- Why defining run\_time on worker node raises an error [\#2683](https://github.com/locustio/locust/issues/2683)
|
15
|
+
|
16
|
+
**Merged pull requests:**
|
17
|
+
|
18
|
+
- annotate return types of a few functions to enable more mypy check [\#2702](https://github.com/locustio/locust/pull/2702) ([tdadela](https://github.com/tdadela))
|
19
|
+
- refactor\(WindowsKeyPoller\): change implementation of captured\_chars [\#2701](https://github.com/locustio/locust/pull/2701) ([tdadela](https://github.com/tdadela))
|
20
|
+
- refactor: replace deprecated utcfromtimestamp function [\#2700](https://github.com/locustio/locust/pull/2700) ([tdadela](https://github.com/tdadela))
|
21
|
+
- Use deque for tasks in taskset instead of plain list [\#2698](https://github.com/locustio/locust/pull/2698) ([cyberw](https://github.com/cyberw))
|
22
|
+
- fix: Ensure locust does not crash when an User class has no task [\#2696](https://github.com/locustio/locust/pull/2696) ([hangonlyra](https://github.com/hangonlyra))
|
23
|
+
- Fix various spelling errors using codespell [\#2687](https://github.com/locustio/locust/pull/2687) ([cyberw](https://github.com/cyberw))
|
24
|
+
- Dispatch/user distribution calculation using Kullback-Leibler divergence [\#2686](https://github.com/locustio/locust/pull/2686) ([tdadela](https://github.com/tdadela))
|
25
|
+
- Allow worker process to run with --run-time specified, just log a warning about it being ignored [\#2685](https://github.com/locustio/locust/pull/2685) ([Sawiq](https://github.com/Sawiq))
|
26
|
+
- Small cleanup: mypy type-ignore and dev deps [\#2684](https://github.com/locustio/locust/pull/2684) ([tdadela](https://github.com/tdadela))
|
27
|
+
- Simplify how locustfiles are found \(using -f\). Don’t automatically append .py [\#2655](https://github.com/locustio/locust/pull/2655) ([DennisKrone](https://github.com/DennisKrone))
|
28
|
+
|
4
29
|
## [2.26.0](https://github.com/locustio/locust/tree/2.26.0) (2024-04-18)
|
5
30
|
|
6
31
|
[Full Changelog](https://github.com/locustio/locust/compare/2.25.0...2.26.0)
|
@@ -35,7 +60,6 @@ The most important changes can also be found in [the documentation](https://docs
|
|
35
60
|
- Add an example that displays cache stats using the new UI. [\#2669](https://github.com/locustio/locust/pull/2669) ([obriat](https://github.com/obriat))
|
36
61
|
- Update User Classes in Distributed Mode [\#2666](https://github.com/locustio/locust/pull/2666) ([andrewbaldwin44](https://github.com/andrewbaldwin44))
|
37
62
|
- fix\(dispatch\): UserClasses weight distribution with gcd [\#2663](https://github.com/locustio/locust/pull/2663) ([llirrikk](https://github.com/llirrikk))
|
38
|
-
- chore: fix some comments [\#2659](https://github.com/locustio/locust/pull/2659) ([JohnEndson](https://github.com/JohnEndson))
|
39
63
|
- Fix issue with concurrent custom messages and docs [\#2654](https://github.com/locustio/locust/pull/2654) ([cyberw](https://github.com/cyberw))
|
40
64
|
- Add functionality to run listener functions for `custom_messages` concurrently [\#2650](https://github.com/locustio/locust/pull/2650) ([samuelspagl](https://github.com/samuelspagl))
|
41
65
|
- \[Modern UI\] Escape HTML Entities correctly in Exceptions Table [\#2648](https://github.com/locustio/locust/pull/2648) ([andrewbaldwin44](https://github.com/andrewbaldwin44))
|
@@ -272,7 +272,5 @@ The list of statistics parameters that can be modified is:
|
|
272
272
|
+-------------------------------------------+--------------------------------------------------------------------------------------+
|
273
273
|
| PERCENTILES_TO_CHART | List of response time percentiles in the screen of chart for UI |
|
274
274
|
+-------------------------------------------+--------------------------------------------------------------------------------------+
|
275
|
-
| MODERN_UI_PERCENTILES_TO_CHART | List of response time percentiles in the screen of chart for the UI |
|
276
|
-
+-------------------------------------------+--------------------------------------------------------------------------------------+
|
277
275
|
| PERCENTILES_TO_STATISTICS | List of response time percentiles in the screen of statistics for UI |
|
278
276
|
+-------------------------------------------+--------------------------------------------------------------------------------------+
|
@@ -90,7 +90,7 @@ Then the documentation should be build and available at ``docs/_build/index.html
|
|
90
90
|
Making changes to Locust's Web UI
|
91
91
|
=================================
|
92
92
|
|
93
|
-
The
|
93
|
+
The Web UI is built using React and Typescript
|
94
94
|
|
95
95
|
Setup
|
96
96
|
-----
|
locust-2.27.0/examples/extend_modern_web_ui.py → locust-2.27.1.dev10/examples/extend_web_ui.py
RENAMED
@@ -92,8 +92,6 @@ def locust_init(environment, **kwargs):
|
|
92
92
|
"""
|
93
93
|
# ensure the template_args are up to date before using them
|
94
94
|
environment.web_ui.update_template_args()
|
95
|
-
# set the static paths to use the modern ui
|
96
|
-
environment.web_ui.set_static_modern_ui()
|
97
95
|
|
98
96
|
return render_template(
|
99
97
|
"index.html",
|
@@ -12,5 +12,5 @@ __version__: str
|
|
12
12
|
__version_tuple__: VERSION_TUPLE
|
13
13
|
version_tuple: VERSION_TUPLE
|
14
14
|
|
15
|
-
__version__ = version = '2.27.
|
16
|
-
__version_tuple__ = version_tuple = (2, 27,
|
15
|
+
__version__ = version = '2.27.1.dev10'
|
16
|
+
__version_tuple__ = version_tuple = (2, 27, 1, 'dev10')
|
@@ -32,6 +32,16 @@ version = locust.__version__
|
|
32
32
|
DEFAULT_CONFIG_FILES = ("~/.locust.conf", "locust.conf", "pyproject.toml")
|
33
33
|
|
34
34
|
|
35
|
+
# Clean up downloaded locustfile on exit
|
36
|
+
def exit_handler(filename) -> None:
|
37
|
+
try:
|
38
|
+
os.remove(filename)
|
39
|
+
except FileNotFoundError:
|
40
|
+
pass # when multiple workers are running on the same machine, another one may already have deleted it
|
41
|
+
except PermissionError:
|
42
|
+
pass # this happens occasionally on windows on GH, maybe for the same reason?
|
43
|
+
|
44
|
+
|
35
45
|
class LocustArgumentParser(configargparse.ArgumentParser):
|
36
46
|
"""Drop-in replacement for `configargparse.ArgumentParser` that adds support for
|
37
47
|
optionally exclude arguments from the UI.
|
@@ -170,14 +180,7 @@ def download_locustfile_from_url(url: str) -> str:
|
|
170
180
|
with open(os.path.join(tempfile.gettempdir(), url.rsplit("/", 1)[-1]), "w") as locustfile:
|
171
181
|
locustfile.write(response.text)
|
172
182
|
|
173
|
-
|
174
|
-
def exit_handler():
|
175
|
-
try:
|
176
|
-
os.remove(locustfile.name)
|
177
|
-
except FileNotFoundError:
|
178
|
-
pass # this is normal when multiple workers are running on the same machine
|
179
|
-
|
180
|
-
atexit.register(exit_handler)
|
183
|
+
atexit.register(exit_handler, locustfile.name)
|
181
184
|
return locustfile.name
|
182
185
|
|
183
186
|
|
@@ -263,13 +266,7 @@ def download_locustfile_from_master(master_host: str, master_port: int) -> str:
|
|
263
266
|
with open(os.path.join(tempfile.gettempdir(), filename), "w", encoding="utf-8") as locustfile:
|
264
267
|
locustfile.write(msg.data["contents"])
|
265
268
|
|
266
|
-
|
267
|
-
try:
|
268
|
-
os.remove(locustfile.name)
|
269
|
-
except FileNotFoundError:
|
270
|
-
pass # this is normal when multiple workers are running on the same machine
|
271
|
-
|
272
|
-
atexit.register(exit_handler)
|
269
|
+
atexit.register(exit_handler, locustfile.name)
|
273
270
|
|
274
271
|
tempclient.close()
|
275
272
|
return locustfile.name
|
@@ -500,7 +497,7 @@ def setup_parser_arguments(parser):
|
|
500
497
|
"--legacy-ui",
|
501
498
|
default=False,
|
502
499
|
action="store_true",
|
503
|
-
help=
|
500
|
+
help=configargparse.SUPPRESS,
|
504
501
|
env_var="LOCUST_LEGACY_UI",
|
505
502
|
)
|
506
503
|
|
@@ -166,7 +166,6 @@ class Environment:
|
|
166
166
|
stats_csv_writer: StatsCSV | None = None,
|
167
167
|
delayed_start=False,
|
168
168
|
userclass_picker_is_active=False,
|
169
|
-
modern_ui=False,
|
170
169
|
) -> WebUI:
|
171
170
|
"""
|
172
171
|
Creates a :class:`WebUI <locust.web.WebUI>` instance for this Environment and start running the web server
|
@@ -193,7 +192,6 @@ class Environment:
|
|
193
192
|
stats_csv_writer=stats_csv_writer,
|
194
193
|
delayed_start=delayed_start,
|
195
194
|
userclass_picker_is_active=userclass_picker_is_active,
|
196
|
-
modern_ui=modern_ui,
|
197
195
|
)
|
198
196
|
return self.web_ui
|
199
197
|
|
@@ -0,0 +1,111 @@
|
|
1
|
+
import datetime
|
2
|
+
import glob
|
3
|
+
import os
|
4
|
+
import pathlib
|
5
|
+
from html import escape
|
6
|
+
from itertools import chain
|
7
|
+
from json import dumps
|
8
|
+
|
9
|
+
from jinja2 import Environment, FileSystemLoader
|
10
|
+
|
11
|
+
from . import stats as stats_module
|
12
|
+
from .runners import STATE_STOPPED, STATE_STOPPING, MasterRunner
|
13
|
+
from .stats import sort_stats
|
14
|
+
from .user.inspectuser import get_ratio
|
15
|
+
|
16
|
+
PERCENTILES_FOR_HTML_REPORT = [0.50, 0.6, 0.7, 0.8, 0.9, 0.95, 0.99, 1.0]
|
17
|
+
ROOT_PATH = os.path.dirname(os.path.abspath(__file__))
|
18
|
+
BUILD_PATH = os.path.join(ROOT_PATH, "webui", "dist")
|
19
|
+
STATIC_PATH = os.path.join(BUILD_PATH, "assets")
|
20
|
+
|
21
|
+
|
22
|
+
def render_template(file, **kwargs):
|
23
|
+
env = Environment(loader=FileSystemLoader(BUILD_PATH), extensions=["jinja2.ext.do"])
|
24
|
+
template = env.get_template(file)
|
25
|
+
return template.render(**kwargs)
|
26
|
+
|
27
|
+
|
28
|
+
def get_html_report(
|
29
|
+
environment,
|
30
|
+
show_download_link=True,
|
31
|
+
theme="",
|
32
|
+
):
|
33
|
+
stats = environment.runner.stats
|
34
|
+
|
35
|
+
start_ts = stats.start_time
|
36
|
+
start_time = datetime.datetime.fromtimestamp(start_ts, tz=datetime.timezone.utc).strftime("%Y-%m-%d %H:%M:%S")
|
37
|
+
|
38
|
+
if end_ts := stats.last_request_timestamp:
|
39
|
+
end_time = datetime.datetime.fromtimestamp(end_ts, tz=datetime.timezone.utc).strftime("%Y-%m-%d %H:%M:%S")
|
40
|
+
else:
|
41
|
+
end_time = start_time
|
42
|
+
|
43
|
+
host = None
|
44
|
+
if environment.host:
|
45
|
+
host = environment.host
|
46
|
+
elif environment.runner.user_classes:
|
47
|
+
all_hosts = {l.host for l in environment.runner.user_classes}
|
48
|
+
if len(all_hosts) == 1:
|
49
|
+
host = list(all_hosts)[0]
|
50
|
+
|
51
|
+
requests_statistics = list(chain(sort_stats(stats.entries), [stats.total]))
|
52
|
+
failures_statistics = sort_stats(stats.errors)
|
53
|
+
exceptions_statistics = [
|
54
|
+
{**exc, "nodes": ", ".join(exc["nodes"])} for exc in environment.runner.exceptions.values()
|
55
|
+
]
|
56
|
+
|
57
|
+
history = stats.history
|
58
|
+
|
59
|
+
static_js = []
|
60
|
+
js_files = [os.path.basename(filepath) for filepath in glob.glob(os.path.join(STATIC_PATH, "*.js"))]
|
61
|
+
|
62
|
+
for js_file in js_files:
|
63
|
+
path = os.path.join(STATIC_PATH, js_file)
|
64
|
+
static_js.append("// " + js_file + "\n")
|
65
|
+
with open(path, encoding="utf8") as f:
|
66
|
+
static_js.append(f.read())
|
67
|
+
static_js.extend(["", ""])
|
68
|
+
|
69
|
+
is_distributed = isinstance(environment.runner, MasterRunner)
|
70
|
+
user_spawned = (
|
71
|
+
environment.runner.reported_user_classes_count if is_distributed else environment.runner.user_classes_count
|
72
|
+
)
|
73
|
+
|
74
|
+
if environment.runner.state in [STATE_STOPPED, STATE_STOPPING]:
|
75
|
+
user_spawned = environment.runner.final_user_classes_count
|
76
|
+
|
77
|
+
task_data = {
|
78
|
+
"per_class": get_ratio(environment.user_classes, user_spawned, False),
|
79
|
+
"total": get_ratio(environment.user_classes, user_spawned, True),
|
80
|
+
}
|
81
|
+
|
82
|
+
return render_template(
|
83
|
+
"report.html",
|
84
|
+
template_args={
|
85
|
+
"is_report": True,
|
86
|
+
"requests_statistics": [stat.to_dict(escape_string_values=True) for stat in requests_statistics],
|
87
|
+
"failures_statistics": [stat.to_dict() for stat in failures_statistics],
|
88
|
+
"exceptions_statistics": [stat for stat in exceptions_statistics],
|
89
|
+
"response_time_statistics": [
|
90
|
+
{
|
91
|
+
"name": escape(stat.name),
|
92
|
+
"method": escape(stat.method or ""),
|
93
|
+
**{
|
94
|
+
str(percentile): stat.get_response_time_percentile(percentile)
|
95
|
+
for percentile in PERCENTILES_FOR_HTML_REPORT
|
96
|
+
},
|
97
|
+
}
|
98
|
+
for stat in requests_statistics
|
99
|
+
],
|
100
|
+
"start_time": start_time,
|
101
|
+
"end_time": end_time,
|
102
|
+
"host": escape(str(host)),
|
103
|
+
"history": history,
|
104
|
+
"show_download_link": show_download_link,
|
105
|
+
"locustfile": escape(str(environment.locustfile)),
|
106
|
+
"tasks": task_data,
|
107
|
+
"percentiles_to_chart": stats_module.PERCENTILES_TO_CHART,
|
108
|
+
},
|
109
|
+
theme=theme,
|
110
|
+
static_js="\n".join(static_js),
|
111
|
+
)
|
@@ -1,8 +1,9 @@
|
|
1
1
|
import logging
|
2
2
|
import logging.config
|
3
|
+
import re
|
3
4
|
import socket
|
4
5
|
|
5
|
-
HOSTNAME = socket.gethostname()
|
6
|
+
HOSTNAME = re.sub(r"\..*", "", socket.gethostname())
|
6
7
|
|
7
8
|
# Global flag that we set to True if any unhandled exception occurs in a greenlet
|
8
9
|
# Used by main.py to set the process return code to non-zero
|
@@ -128,12 +128,8 @@ def main():
|
|
128
128
|
available_user_classes[key] = value
|
129
129
|
available_user_tasks[key] = value.tasks or {}
|
130
130
|
|
131
|
-
if len(stats.PERCENTILES_TO_CHART)
|
132
|
-
logging.error("stats.PERCENTILES_TO_CHART parameter should be
|
133
|
-
sys.exit(1)
|
134
|
-
|
135
|
-
if len(stats.MODERN_UI_PERCENTILES_TO_CHART) > 6:
|
136
|
-
logging.error("stats.MODERN_UI_PERCENTILES_TO_CHART parameter should be a maximum of 6 parameters \n")
|
131
|
+
if len(stats.PERCENTILES_TO_CHART) > 6:
|
132
|
+
logging.error("stats.PERCENTILES_TO_CHART parameter should be a maximum of 6 parameters \n")
|
137
133
|
sys.exit(1)
|
138
134
|
|
139
135
|
def is_valid_percentile(parameter):
|
@@ -183,7 +179,8 @@ def main():
|
|
183
179
|
options.spawn_rate = options.hatch_rate
|
184
180
|
|
185
181
|
if options.legacy_ui:
|
186
|
-
sys.stderr.write("[
|
182
|
+
sys.stderr.write("[REMOVED] The legacy UI has been removed. Remove this flag to use the new UI")
|
183
|
+
sys.exit(1)
|
187
184
|
|
188
185
|
# setup logging
|
189
186
|
if not options.skip_log_setup:
|
@@ -480,7 +477,6 @@ See https://github.com/locustio/locust/wiki/Installation#increasing-maximum-numb
|
|
480
477
|
stats_csv_writer=stats_csv_writer,
|
481
478
|
delayed_start=True,
|
482
479
|
userclass_picker_is_active=options.class_picker,
|
483
|
-
modern_ui=not options.legacy_ui,
|
484
480
|
)
|
485
481
|
else:
|
486
482
|
web_ui = None
|
@@ -654,8 +650,8 @@ See https://github.com/locustio/locust/wiki/Installation#increasing-maximum-numb
|
|
654
650
|
logger.info("Got SIGTERM signal")
|
655
651
|
shutdown()
|
656
652
|
|
657
|
-
def save_html_report(
|
658
|
-
html_report = get_html_report(environment, show_download_link=False
|
653
|
+
def save_html_report():
|
654
|
+
html_report = get_html_report(environment, show_download_link=False)
|
659
655
|
logger.info("writing html report to file: %s", options.html_file)
|
660
656
|
with open(options.html_file, "w", encoding="utf-8") as file:
|
661
657
|
file.write(html_report)
|
@@ -671,10 +667,10 @@ See https://github.com/locustio/locust/wiki/Installation#increasing-maximum-numb
|
|
671
667
|
|
672
668
|
main_greenlet.join()
|
673
669
|
if options.html_file:
|
674
|
-
save_html_report(
|
670
|
+
save_html_report()
|
675
671
|
except KeyboardInterrupt:
|
676
672
|
if options.html_file:
|
677
|
-
save_html_report(
|
673
|
+
save_html_report()
|
678
674
|
except Exception:
|
679
675
|
raise
|
680
676
|
shutdown()
|
@@ -126,8 +126,7 @@ CachedResponseTimes = namedtuple("CachedResponseTimes", ["response_times", "num_
|
|
126
126
|
PERCENTILES_TO_REPORT = [0.50, 0.66, 0.75, 0.80, 0.90, 0.95, 0.98, 0.99, 0.999, 0.9999, 1.0]
|
127
127
|
|
128
128
|
PERCENTILES_TO_STATISTICS = [0.95, 0.99]
|
129
|
-
PERCENTILES_TO_CHART = [0.
|
130
|
-
MODERN_UI_PERCENTILES_TO_CHART = [0.95]
|
129
|
+
PERCENTILES_TO_CHART = [0.95]
|
131
130
|
|
132
131
|
|
133
132
|
class RequestStatsAdditionError(Exception):
|
@@ -695,9 +694,7 @@ class StatsEntry:
|
|
695
694
|
"current_rps": self.current_rps,
|
696
695
|
"current_fail_per_sec": self.current_fail_per_sec,
|
697
696
|
"median_response_time": self.median_response_time,
|
698
|
-
|
699
|
-
"ninety_ninth_response_time": self.get_response_time_percentile(0.99), # for legacy ui
|
700
|
-
**response_time_percentiles, # for modern ui
|
697
|
+
**response_time_percentiles,
|
701
698
|
"avg_content_length": self.avg_content_length,
|
702
699
|
}
|
703
700
|
|
@@ -920,7 +917,7 @@ def stats_history(runner: Runner) -> None:
|
|
920
917
|
current_response_time_percentiles = {
|
921
918
|
f"response_time_percentile_{percentile}": stats.total.get_current_response_time_percentile(percentile)
|
922
919
|
or 0
|
923
|
-
for percentile in
|
920
|
+
for percentile in PERCENTILES_TO_CHART
|
924
921
|
}
|
925
922
|
|
926
923
|
r = {
|
@@ -928,10 +925,6 @@ def stats_history(runner: Runner) -> None:
|
|
928
925
|
"time": datetime.datetime.now(tz=datetime.timezone.utc).strftime("%H:%M:%S"),
|
929
926
|
"current_rps": stats.total.current_rps or 0,
|
930
927
|
"current_fail_per_sec": stats.total.current_fail_per_sec or 0,
|
931
|
-
"response_time_percentile_1": stats.total.get_current_response_time_percentile(PERCENTILES_TO_CHART[0])
|
932
|
-
or 0,
|
933
|
-
"response_time_percentile_2": stats.total.get_current_response_time_percentile(PERCENTILES_TO_CHART[1])
|
934
|
-
or 0,
|
935
928
|
"total_avg_response_time": stats.total.avg_response_time,
|
936
929
|
"user_count": runner.user_count or 0,
|
937
930
|
}
|
@@ -11,6 +11,7 @@ from tempfile import NamedTemporaryFile
|
|
11
11
|
|
12
12
|
import gevent
|
13
13
|
from geventhttpclient.client import HTTPClientPool
|
14
|
+
from pyquery import PyQuery as pq
|
14
15
|
|
15
16
|
from .testcases import LocustTestCase, WebserverTestCase
|
16
17
|
from .util import create_tls_cert
|
@@ -777,7 +778,8 @@ class TestFastHttpSsl(LocustTestCase):
|
|
777
778
|
|
778
779
|
def test_ssl_request_insecure(self):
|
779
780
|
s = FastHttpSession(self.environment, "https://127.0.0.1:%i" % self.web_port, insecure=True, user=None)
|
780
|
-
|
781
|
-
|
782
|
-
|
783
|
-
self.
|
781
|
+
response = s.get("/")
|
782
|
+
d = pq(response.content.decode("utf-8"))
|
783
|
+
|
784
|
+
self.assertEqual(200, response.status_code)
|
785
|
+
self.assertIn('"users": null', str(d))
|
@@ -219,9 +219,8 @@ class StandaloneIntegrationTests(ProcessIntegrationTest):
|
|
219
219
|
content=textwrap.dedent(
|
220
220
|
"""
|
221
221
|
from locust import User, task, constant, events
|
222
|
-
from locust
|
223
|
-
PERCENTILES_TO_CHART
|
224
|
-
PERCENTILES_TO_CHART[1] = 0.4
|
222
|
+
from locust import stats
|
223
|
+
stats.PERCENTILES_TO_CHART = [0.9, 0.4]
|
225
224
|
class TestUser(User):
|
226
225
|
wait_time = constant(3)
|
227
226
|
@task
|
@@ -274,8 +273,8 @@ class StandaloneIntegrationTests(ProcessIntegrationTest):
|
|
274
273
|
content=textwrap.dedent(
|
275
274
|
"""
|
276
275
|
from locust import User, task, constant, events
|
277
|
-
from locust
|
278
|
-
PERCENTILES_TO_CHART
|
276
|
+
from locust import stats
|
277
|
+
stats.PERCENTILES_TO_CHART = [1.2]
|
279
278
|
class TestUser(User):
|
280
279
|
wait_time = constant(3)
|
281
280
|
@task
|
@@ -728,7 +727,6 @@ class StandaloneIntegrationTests(ProcessIntegrationTest):
|
|
728
727
|
"locust",
|
729
728
|
"-f",
|
730
729
|
mocked.file_path,
|
731
|
-
"--legacy-ui",
|
732
730
|
"--web-port",
|
733
731
|
str(port),
|
734
732
|
"--autostart",
|
@@ -795,7 +793,6 @@ class StandaloneIntegrationTests(ProcessIntegrationTest):
|
|
795
793
|
"locust",
|
796
794
|
"-f",
|
797
795
|
f"{mocked1.file_path},{mocked2}",
|
798
|
-
"--legacy-ui",
|
799
796
|
"--web-port",
|
800
797
|
str(port),
|
801
798
|
"--autostart",
|
@@ -1115,7 +1112,6 @@ class StandaloneIntegrationTests(ProcessIntegrationTest):
|
|
1115
1112
|
"locust",
|
1116
1113
|
"-f",
|
1117
1114
|
mocked.file_path,
|
1118
|
-
"--legacy-ui",
|
1119
1115
|
"--host",
|
1120
1116
|
"https://test.com/",
|
1121
1117
|
"--run-time",
|
@@ -1138,16 +1134,11 @@ class StandaloneIntegrationTests(ProcessIntegrationTest):
|
|
1138
1134
|
|
1139
1135
|
# make sure title appears in the report
|
1140
1136
|
_, locustfile = os.path.split(mocked.file_path)
|
1141
|
-
self.assertIn(
|
1142
|
-
self.assertIn(f"<p>Script: <span>{locustfile}</span></p>", html_report_content)
|
1137
|
+
self.assertIn(locustfile, html_report_content)
|
1143
1138
|
|
1144
1139
|
# make sure host appears in the report
|
1145
1140
|
self.assertIn("https://test.com/", html_report_content)
|
1146
|
-
|
1147
|
-
# make sure the charts container appears in the report
|
1148
|
-
self.assertIn("charts-container", html_report_content)
|
1149
|
-
|
1150
|
-
self.assertNotIn("Download the Report", html_report_content, "Download report link found in HTML content")
|
1141
|
+
self.assertIn('"show_download_link": false', html_report_content)
|
1151
1142
|
|
1152
1143
|
def test_run_with_userclass_picker(self):
|
1153
1144
|
with temporary_file(content=MOCK_LOCUSTFILE_CONTENT_A) as file1:
|