locust 2.28.1.dev54__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.
Files changed (332) hide show
  1. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/PKG-INFO +1 -1
  2. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/docs/configuration.rst +12 -3
  3. locust-2.28.1.dev66/docs/extensions.rst +41 -0
  4. locust-2.28.1.dev66/docs/faq.rst +107 -0
  5. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/docs/further-reading.rst +3 -5
  6. locust-2.28.1.dev66/docs/increasing-request-rate.rst +28 -0
  7. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/docs/index.rst +3 -0
  8. locust-2.28.1.dev66/docs/installation.rst +103 -0
  9. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/docs/quickstart.rst +2 -2
  10. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/docs/running-distributed.rst +1 -1
  11. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/docs/running-in-docker.rst +1 -1
  12. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/locust/_version.py +2 -2
  13. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/locust/env.py +6 -0
  14. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/locust/log.py +11 -1
  15. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/locust/runners.py +28 -1
  16. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/locust/test/test_runners.py +119 -40
  17. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/locust/test/test_web.py +19 -1
  18. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/locust/web.py +2 -11
  19. locust-2.28.1.dev66/locust/webui/dist/assets/index-84c63e70.js +250 -0
  20. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/locust/webui/dist/auth.html +1 -1
  21. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/locust/webui/dist/index.html +1 -1
  22. locust-2.28.1.dev66/locust/webui/src/components/LogViewer/LogViewer.tsx +95 -0
  23. locust-2.28.1.dev66/locust/webui/src/components/LogViewer/logUtils.tsx +2 -0
  24. locust-2.28.1.dev66/locust/webui/src/components/LogViewer/tests/LogViewer.test.tsx +55 -0
  25. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/locust/webui/src/components/LogViewer/tests/useLogViewer.test.tsx +8 -5
  26. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/locust/webui/src/components/LogViewer/useLogViewer.ts +14 -8
  27. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/locust/webui/src/components/Tabs/Tabs.constants.tsx +2 -1
  28. locust-2.28.1.dev66/locust/webui/src/constants/logs.ts +1 -0
  29. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/locust/webui/src/redux/slice/logViewer.slice.ts +4 -4
  30. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/locust/webui/src/types/ui.types.ts +4 -1
  31. locust-2.28.1.dev66/locust/webui/src/utils/array.ts +5 -0
  32. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/locust.egg-info/PKG-INFO +1 -1
  33. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/locust.egg-info/SOURCES.txt +7 -0
  34. locust-2.28.1.dev54/docs/installation.rst +0 -39
  35. locust-2.28.1.dev54/locust/webui/src/components/LogViewer/LogViewer.tsx +0 -21
  36. locust-2.28.1.dev54/locust/webui/src/components/LogViewer/tests/LogViewer.test.tsx +0 -20
  37. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/.coveragerc +0 -0
  38. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/.dockerignore +0 -0
  39. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/.git-blame-ignore-revs +0 -0
  40. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/.gitattributes +0 -0
  41. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/.github/CONTRIBUTING.md +0 -0
  42. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/.github/ISSUE_TEMPLATE/bug.yml +0 -0
  43. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  44. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
  45. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/.github/workflows/stale.yml +0 -0
  46. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/.github/workflows/tests.yml +0 -0
  47. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/.gitignore +0 -0
  48. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/.pre-commit-config.yaml +0 -0
  49. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/.readthedocs.yaml +0 -0
  50. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/.vscode/extensions.json +0 -0
  51. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/.vscode/launch.json +0 -0
  52. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/.vscode/launch_locust.json +0 -0
  53. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/.vscode/settings.json +0 -0
  54. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/CHANGELOG.md +0 -0
  55. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/Dockerfile +0 -0
  56. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/LICENSE +0 -0
  57. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/MANIFEST.in +0 -0
  58. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/Makefile +0 -0
  59. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/README.md +0 -0
  60. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/SECURITY.md +0 -0
  61. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/Vagrantfile +0 -0
  62. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/benchmarks/dispatch.py +0 -0
  63. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/docs/_static/theme-overrides.css +0 -0
  64. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/docs/api.rst +0 -0
  65. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/docs/changelog.rst +0 -0
  66. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/docs/conf.py +0 -0
  67. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/docs/custom-load-shape.rst +0 -0
  68. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/docs/developing-locust.rst +0 -0
  69. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/docs/extending-locust.rst +0 -0
  70. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/docs/history.rst +0 -0
  71. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/docs/images/extend_modern_web_ui_cache_stats.png +0 -0
  72. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/docs/images/locust_workers.png +0 -0
  73. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/docs/images/number_of_users.png +0 -0
  74. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/docs/images/response_times.png +0 -0
  75. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/docs/images/total_requests_per_second.png +0 -0
  76. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/docs/images/userclass_picker_example.png +0 -0
  77. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/docs/images/webui-running-statistics.png +0 -0
  78. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/docs/images/webui-splash-screenshot.png +0 -0
  79. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/docs/increase-performance.rst +0 -0
  80. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/docs/logging.rst +0 -0
  81. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/docs/requirements.txt +0 -0
  82. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/docs/retrieving-stats.rst +0 -0
  83. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/docs/running-in-debugger.rst +0 -0
  84. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/docs/running-without-web-ui.rst +0 -0
  85. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/docs/tasksets.rst +0 -0
  86. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/docs/testing-other-systems.rst +0 -0
  87. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/docs/use-as-lib.rst +0 -0
  88. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/docs/what-is-locust.rst +0 -0
  89. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/docs/writing-a-locustfile.rst +0 -0
  90. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/examples/add_command_line_argument.py +0 -0
  91. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/examples/basic.py +0 -0
  92. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/examples/browse_docs_sequence_test.py +0 -0
  93. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/examples/browse_docs_test.py +0 -0
  94. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/examples/custom_messages.py +0 -0
  95. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/examples/custom_shape/double_wave.py +0 -0
  96. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/examples/custom_shape/stages.py +0 -0
  97. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/examples/custom_shape/staging_user_classes.py +0 -0
  98. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/examples/custom_shape/step_load.py +0 -0
  99. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/examples/custom_shape/wait_user_count.py +0 -0
  100. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/examples/custom_wait_function.py +0 -0
  101. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/examples/custom_xmlrpc_client/server.py +0 -0
  102. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/examples/custom_xmlrpc_client/xmlrpc_locustfile.py +0 -0
  103. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/examples/debugging.py +0 -0
  104. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/examples/debugging_advanced.py +0 -0
  105. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/examples/dispatch_test_scripts/locustfile.py +0 -0
  106. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/examples/dispatch_test_scripts/run-disributed-headless.sh +0 -0
  107. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/examples/dispatch_test_scripts/run-disributed-web.sh +0 -0
  108. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/examples/dispatch_test_scripts/run-local-headless.sh +0 -0
  109. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/examples/dispatch_test_scripts/run-local-web.sh +0 -0
  110. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/examples/docker-compose/docker-compose.yml +0 -0
  111. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/examples/dynamic_user_credentials.py +0 -0
  112. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/examples/events.py +0 -0
  113. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/examples/extend_web_ui.py +0 -0
  114. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/examples/fast_http_locust.py +0 -0
  115. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/examples/grpc/grpc_user.py +0 -0
  116. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/examples/grpc/hello.proto +0 -0
  117. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/examples/grpc/hello_pb2.py +0 -0
  118. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/examples/grpc/hello_pb2_grpc.py +0 -0
  119. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/examples/grpc/hello_server.py +0 -0
  120. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/examples/grpc/locustfile.py +0 -0
  121. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/examples/locustfile.py +0 -0
  122. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/examples/manual_stats_reporting.py +0 -0
  123. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/examples/multiple_hosts.py +0 -0
  124. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/examples/nested_inline_tasksets.py +0 -0
  125. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/examples/rest.py +0 -0
  126. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/examples/sdk_session_patching/session_patch_locustfile.py +0 -0
  127. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/examples/semaphore_wait.py +0 -0
  128. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/examples/stop_on_threshold.py +0 -0
  129. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/examples/terraform/aws/README.md +0 -0
  130. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/examples/terraform/aws/data_subnet.tf +0 -0
  131. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/examples/terraform/aws/main.tf +0 -0
  132. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/examples/terraform/aws/output.tf +0 -0
  133. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/examples/terraform/aws/plan/basic.py +0 -0
  134. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/examples/terraform/aws/provisioner.tf +0 -0
  135. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/examples/terraform/aws/variables.tf +0 -0
  136. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/examples/test_data_management.py +0 -0
  137. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/examples/use_as_lib.py +0 -0
  138. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/examples/vagrant/README.md +0 -0
  139. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/examples/vagrant/supervisord.conf +0 -0
  140. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/examples/web_ui_auth.py +0 -0
  141. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/examples/web_ui_cache_stats.py +0 -0
  142. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/examples/worker_index.py +0 -0
  143. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/generate_changelog.py +0 -0
  144. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/locust/__init__.py +0 -0
  145. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/locust/__main__.py +0 -0
  146. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/locust/argument_parser.py +0 -0
  147. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/locust/clients.py +0 -0
  148. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/locust/contrib/__init__.py +0 -0
  149. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/locust/contrib/fasthttp.py +0 -0
  150. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/locust/debug.py +0 -0
  151. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/locust/dispatch.py +0 -0
  152. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/locust/event.py +0 -0
  153. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/locust/exception.py +0 -0
  154. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/locust/html.py +0 -0
  155. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/locust/input_events.py +0 -0
  156. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/locust/main.py +0 -0
  157. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/locust/py.typed +0 -0
  158. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/locust/rpc/__init__.py +0 -0
  159. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/locust/rpc/protocol.py +0 -0
  160. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/locust/rpc/zmqrpc.py +0 -0
  161. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/locust/shape.py +0 -0
  162. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/locust/stats.py +0 -0
  163. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/locust/test/__init__.py +0 -0
  164. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/locust/test/fake_module1_for_env_test.py +0 -0
  165. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/locust/test/fake_module2_for_env_test.py +0 -0
  166. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/locust/test/mock_locustfile.py +0 -0
  167. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/locust/test/mock_logging.py +0 -0
  168. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/locust/test/test_debugging.py +0 -0
  169. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/locust/test/test_dispatch.py +0 -0
  170. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/locust/test/test_env.py +0 -0
  171. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/locust/test/test_fasthttp.py +0 -0
  172. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/locust/test/test_http.py +0 -0
  173. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/locust/test/test_interruptable_task.py +0 -0
  174. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/locust/test/test_load_locustfile.py +0 -0
  175. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/locust/test/test_locust_class.py +0 -0
  176. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/locust/test/test_log.py +0 -0
  177. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/locust/test/test_main.py +0 -0
  178. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/locust/test/test_old_wait_api.py +0 -0
  179. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/locust/test/test_parser.py +0 -0
  180. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/locust/test/test_sequential_taskset.py +0 -0
  181. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/locust/test/test_stats.py +0 -0
  182. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/locust/test/test_tags.py +0 -0
  183. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/locust/test/test_taskratio.py +0 -0
  184. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/locust/test/test_users.py +0 -0
  185. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/locust/test/test_util.py +0 -0
  186. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/locust/test/test_wait_time.py +0 -0
  187. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/locust/test/test_zmqrpc.py +0 -0
  188. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/locust/test/testcases.py +0 -0
  189. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/locust/test/util.py +0 -0
  190. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/locust/user/__init__.py +0 -0
  191. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/locust/user/inspectuser.py +0 -0
  192. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/locust/user/sequential_taskset.py +0 -0
  193. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/locust/user/task.py +0 -0
  194. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/locust/user/users.py +0 -0
  195. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/locust/user/wait_time.py +0 -0
  196. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/locust/util/__init__.py +0 -0
  197. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/locust/util/cache.py +0 -0
  198. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/locust/util/date.py +0 -0
  199. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/locust/util/deprecation.py +0 -0
  200. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/locust/util/exception_handler.py +0 -0
  201. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/locust/util/load_locustfile.py +0 -0
  202. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/locust/util/rounding.py +0 -0
  203. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/locust/util/timespan.py +0 -0
  204. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/locust/webui/.eslintrc +0 -0
  205. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/locust/webui/.gitignore +0 -0
  206. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/locust/webui/.prettierrc +0 -0
  207. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/locust/webui/auth.html +0 -0
  208. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/locust/webui/dev.html +0 -0
  209. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/locust/webui/dist/assets/favicon.ico +0 -0
  210. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/locust/webui/dist/assets/logo.png +0 -0
  211. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/locust/webui/dist/report.html +0 -0
  212. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/locust/webui/index.html +0 -0
  213. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/locust/webui/package.json +0 -0
  214. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/locust/webui/public/assets/favicon.ico +0 -0
  215. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/locust/webui/public/assets/logo.png +0 -0
  216. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/locust/webui/public/report.html +0 -0
  217. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/locust/webui/src/App.test.tsx +0 -0
  218. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/locust/webui/src/App.tsx +0 -0
  219. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/locust/webui/src/components/DataTable/DataTable.test.tsx +0 -0
  220. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/locust/webui/src/components/DataTable/DataTable.tsx +0 -0
  221. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/locust/webui/src/components/ExceptionsTable/ExceptionsTable.tsx +0 -0
  222. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/locust/webui/src/components/FailuresTable/FailuresTable.tsx +0 -0
  223. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/locust/webui/src/components/FallbackRender/FallbackRender.test.tsx +0 -0
  224. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/locust/webui/src/components/FallbackRender/FallbackRender.tsx +0 -0
  225. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/locust/webui/src/components/Form/Form.tsx +0 -0
  226. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/locust/webui/src/components/Form/Select.tsx +0 -0
  227. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/locust/webui/src/components/Form/tests/Form.test.tsx +0 -0
  228. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/locust/webui/src/components/Form/tests/Select.test.tsx +0 -0
  229. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/locust/webui/src/components/Layout/Footer/About.tsx +0 -0
  230. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/locust/webui/src/components/Layout/Footer/Footer.tsx +0 -0
  231. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/locust/webui/src/components/Layout/Layout.tsx +0 -0
  232. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/locust/webui/src/components/Layout/Navbar/DarkLightToggle.tsx +0 -0
  233. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/locust/webui/src/components/Layout/Navbar/Navbar.tsx +0 -0
  234. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/locust/webui/src/components/Layout/Navbar/SwarmMonitor.test.tsx +0 -0
  235. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/locust/webui/src/components/Layout/Navbar/SwarmMonitor.tsx +0 -0
  236. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/locust/webui/src/components/LineChart/LineChart.test.tsx +0 -0
  237. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/locust/webui/src/components/LineChart/LineChart.tsx +0 -0
  238. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/locust/webui/src/components/Modal/Modal.tsx +0 -0
  239. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/locust/webui/src/components/Reports/Reports.test.tsx +0 -0
  240. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/locust/webui/src/components/Reports/Reports.tsx +0 -0
  241. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/locust/webui/src/components/ResponseTimeTable/ResponseTimeTable.test.tsx +0 -0
  242. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/locust/webui/src/components/ResponseTimeTable/ResponseTimeTable.tsx +0 -0
  243. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/locust/webui/src/components/StateButtons/EditButton.tsx +0 -0
  244. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/locust/webui/src/components/StateButtons/NewTestButton.tsx +0 -0
  245. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/locust/webui/src/components/StateButtons/ResetButton.tsx +0 -0
  246. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/locust/webui/src/components/StateButtons/StateButtons.tsx +0 -0
  247. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/locust/webui/src/components/StateButtons/StopButton.tsx +0 -0
  248. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/locust/webui/src/components/StateButtons/tests/ResetButton.test.tsx +0 -0
  249. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/locust/webui/src/components/StateButtons/tests/StateButtons.test.tsx +0 -0
  250. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/locust/webui/src/components/StateButtons/tests/StopButton.test.tsx +0 -0
  251. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/locust/webui/src/components/StatsTable/StatsTable.tsx +0 -0
  252. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/locust/webui/src/components/SwarmCharts/SwarmCharts.tsx +0 -0
  253. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/locust/webui/src/components/SwarmForm/SwarmCustomParameters.tsx +0 -0
  254. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/locust/webui/src/components/SwarmForm/SwarmEditForm.tsx +0 -0
  255. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/locust/webui/src/components/SwarmForm/SwarmForm.tsx +0 -0
  256. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/locust/webui/src/components/SwarmForm/SwarmUserClassPicker.tsx +0 -0
  257. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/locust/webui/src/components/SwarmForm/tests/SwarmCustomParameters.test.tsx +0 -0
  258. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/locust/webui/src/components/SwarmForm/tests/SwarmEditForm.test.tsx +0 -0
  259. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/locust/webui/src/components/SwarmForm/tests/SwarmForm.test.tsx +0 -0
  260. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/locust/webui/src/components/SwarmForm/tests/SwarmUserClassPicker.test.tsx +0 -0
  261. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/locust/webui/src/components/SwarmRatios/SwarmRatios.test.tsx +0 -0
  262. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/locust/webui/src/components/SwarmRatios/SwarmRatios.tsx +0 -0
  263. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/locust/webui/src/components/Table/Table.test.tsx +0 -0
  264. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/locust/webui/src/components/Table/Table.tsx +0 -0
  265. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/locust/webui/src/components/Tabs/Tabs.test.tsx +0 -0
  266. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/locust/webui/src/components/Tabs/Tabs.tsx +0 -0
  267. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/locust/webui/src/components/ViewColumnSelector/ViewColumnSelector.test.tsx +0 -0
  268. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/locust/webui/src/components/ViewColumnSelector/ViewColumnSelector.tsx +0 -0
  269. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/locust/webui/src/components/WorkersTable/WorkersTable.tsx +0 -0
  270. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/locust/webui/src/constants/auth.ts +0 -0
  271. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/locust/webui/src/constants/swarm.ts +0 -0
  272. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/locust/webui/src/constants/theme.ts +0 -0
  273. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/locust/webui/src/global.d.ts +0 -0
  274. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/locust/webui/src/hooks/tests/useNotifications.test.tsx +0 -0
  275. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/locust/webui/src/hooks/tests/useSelecteViewColumns.test.tsx +0 -0
  276. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/locust/webui/src/hooks/tests/useSortByField.test.tsx +0 -0
  277. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/locust/webui/src/hooks/tests/useSwarmUi.test.tsx +0 -0
  278. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/locust/webui/src/hooks/useInterval.ts +0 -0
  279. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/locust/webui/src/hooks/useNotifications.ts +0 -0
  280. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/locust/webui/src/hooks/useSelectViewColumns.ts +0 -0
  281. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/locust/webui/src/hooks/useSortByField.ts +0 -0
  282. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/locust/webui/src/hooks/useSwarmUi.ts +0 -0
  283. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/locust/webui/src/index.tsx +0 -0
  284. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/locust/webui/src/pages/Auth.tsx +0 -0
  285. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/locust/webui/src/pages/Dashboard.tsx +0 -0
  286. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/locust/webui/src/pages/HtmlReport.tsx +0 -0
  287. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/locust/webui/src/pages/tests/Auth.test.tsx +0 -0
  288. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/locust/webui/src/pages/tests/Dashboard.test.tsx +0 -0
  289. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/locust/webui/src/pages/tests/HtmlReport.test.tsx +0 -0
  290. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/locust/webui/src/redux/api/swarm.ts +0 -0
  291. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/locust/webui/src/redux/hooks.ts +0 -0
  292. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/locust/webui/src/redux/slice/notification.slice.ts +0 -0
  293. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/locust/webui/src/redux/slice/root.slice.ts +0 -0
  294. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/locust/webui/src/redux/slice/swarm.slice.ts +0 -0
  295. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/locust/webui/src/redux/slice/tests/ui.slice.test.ts +0 -0
  296. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/locust/webui/src/redux/slice/theme.slice.ts +0 -0
  297. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/locust/webui/src/redux/slice/ui.slice.ts +0 -0
  298. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/locust/webui/src/redux/slice/url.slice.ts +0 -0
  299. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/locust/webui/src/redux/store.ts +0 -0
  300. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/locust/webui/src/redux/utils.ts +0 -0
  301. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/locust/webui/src/styles/theme.ts +0 -0
  302. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/locust/webui/src/test/constants.ts +0 -0
  303. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/locust/webui/src/test/mocks/statsRequest.mock.ts +0 -0
  304. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/locust/webui/src/test/mocks/swarmState.mock.ts +0 -0
  305. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/locust/webui/src/test/setup.ts +0 -0
  306. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/locust/webui/src/test/testUtils.tsx +0 -0
  307. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/locust/webui/src/types/auth.types.ts +0 -0
  308. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/locust/webui/src/types/swarm.types.ts +0 -0
  309. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/locust/webui/src/types/tab.types.ts +0 -0
  310. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/locust/webui/src/types/table.types.ts +0 -0
  311. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/locust/webui/src/utils/date.ts +0 -0
  312. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/locust/webui/src/utils/number.ts +0 -0
  313. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/locust/webui/src/utils/object.ts +0 -0
  314. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/locust/webui/src/utils/string.ts +0 -0
  315. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/locust/webui/src/utils/tests/number.test.ts +0 -0
  316. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/locust/webui/src/utils/tests/object.test.ts +0 -0
  317. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/locust/webui/src/utils/tests/string.test.ts +0 -0
  318. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/locust/webui/src/utils/tests/url.test.ts +0 -0
  319. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/locust/webui/src/utils/url.ts +0 -0
  320. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/locust/webui/tsconfig.json +0 -0
  321. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/locust/webui/vite.config.ts +0 -0
  322. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/locust/webui/vitest.config.ts +0 -0
  323. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/locust/webui/yarn.lock +0 -0
  324. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/locust.egg-info/dependency_links.txt +0 -0
  325. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/locust.egg-info/entry_points.txt +0 -0
  326. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/locust.egg-info/not-zip-safe +0 -0
  327. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/locust.egg-info/requires.txt +0 -0
  328. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/locust.egg-info/top_level.txt +0 -0
  329. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/package.json +0 -0
  330. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/pyproject.toml +0 -0
  331. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/setup.cfg +0 -0
  332. {locust-2.28.1.dev54 → locust-2.28.1.dev66}/tox.ini +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: locust
3
- Version: 2.28.1.dev54
3
+ Version: 2.28.1.dev66
4
4
  Summary: Developer-friendly load testing framework
5
5
  License: MIT
6
6
  Project-URL: Homepage, https://github.com/locustio/locust
@@ -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
+ +-------------------------------------------+--------------------------------------------------------------------------------------+
@@ -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
- The `Locust wiki <https://github.com/locustio/locust/wiki/>`_ serves as a community maintained knowledgebase for Locust, augmenting the official documentation.
5
+ - :ref:`extensions`.
6
6
 
7
- - `Extensions <https://github.com/locustio/locust/wiki/Extensions>`_ Third party extensions and tools
7
+ - An unmaintained list of Locust `articles, blog posts, reviews, and walkthroughs <https://github.com/orgs/locustio/discussions/2752>`_.
8
8
 
9
- - `Articles <https://github.com/locustio/locust/wiki/Articles>`_ Blog posts with reviews & walkthroughs of how to run Locust in various use cases
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 need some help digging into server side problems, or you're having trouble generating enough load to saturate your system, take a look at the `Locust FAQ <https://github.com/locustio/locust/wiki/FAQ#increase-my-request-raterps>`_.
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: ```locust --help`` or check :ref:`configuration`.
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 `something else <https://github.com/locustio/locust/wiki/FAQ#increase-my-request-raterps>`_.
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
  ==============
@@ -38,4 +38,4 @@ official Locust docker image as a base image::
38
38
  Running Locust using Kubernetes
39
39
  ===============================
40
40
 
41
- See [Extensions](https://github.com/locustio/locust/wiki/Extensions#helm) in the wiki.
41
+ See :ref:`Helm charts for Locust <helm>`
@@ -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.dev54'
16
- __version_tuple__ = version_tuple = (2, 28, 1, 'dev54')
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))