locust 2.46.8.dev14__tar.gz → 2.46.8.dev30__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.46.8.dev14 → locust-2.46.8.dev30}/PKG-INFO +1 -1
- {locust-2.46.8.dev14 → locust-2.46.8.dev30}/locust/_version.py +2 -2
- {locust-2.46.8.dev14 → locust-2.46.8.dev30}/locust/contrib/csv_request_logger.py +2 -2
- {locust-2.46.8.dev14 → locust-2.46.8.dev30}/locust/contrib/fasthttp.py +2 -1
- {locust-2.46.8.dev14 → locust-2.46.8.dev30}/locust/html.py +3 -1
- {locust-2.46.8.dev14 → locust-2.46.8.dev30}/locust/main.py +8 -2
- {locust-2.46.8.dev14 → locust-2.46.8.dev30}/locust/opentelemetry.py +6 -2
- {locust-2.46.8.dev14 → locust-2.46.8.dev30}/.gitignore +0 -0
- {locust-2.46.8.dev14 → locust-2.46.8.dev30}/LICENSE +0 -0
- {locust-2.46.8.dev14 → locust-2.46.8.dev30}/README.md +0 -0
- {locust-2.46.8.dev14 → locust-2.46.8.dev30}/hatch_build.py +0 -0
- {locust-2.46.8.dev14 → locust-2.46.8.dev30}/locust/__init__.py +0 -0
- {locust-2.46.8.dev14 → locust-2.46.8.dev30}/locust/__main__.py +0 -0
- {locust-2.46.8.dev14 → locust-2.46.8.dev30}/locust/argument_parser.py +0 -0
- {locust-2.46.8.dev14 → locust-2.46.8.dev30}/locust/clients.py +0 -0
- {locust-2.46.8.dev14 → locust-2.46.8.dev30}/locust/contrib/__init__.py +0 -0
- {locust-2.46.8.dev14 → locust-2.46.8.dev30}/locust/contrib/dns.py +0 -0
- {locust-2.46.8.dev14 → locust-2.46.8.dev30}/locust/contrib/milvus.py +0 -0
- {locust-2.46.8.dev14 → locust-2.46.8.dev30}/locust/contrib/mongodb.py +0 -0
- {locust-2.46.8.dev14 → locust-2.46.8.dev30}/locust/contrib/mqtt.py +0 -0
- {locust-2.46.8.dev14 → locust-2.46.8.dev30}/locust/contrib/oai.py +0 -0
- {locust-2.46.8.dev14 → locust-2.46.8.dev30}/locust/contrib/postgres.py +0 -0
- {locust-2.46.8.dev14 → locust-2.46.8.dev30}/locust/contrib/qdrant.py +0 -0
- {locust-2.46.8.dev14 → locust-2.46.8.dev30}/locust/contrib/socketio.py +0 -0
- {locust-2.46.8.dev14 → locust-2.46.8.dev30}/locust/debug.py +0 -0
- {locust-2.46.8.dev14 → locust-2.46.8.dev30}/locust/dispatch.py +0 -0
- {locust-2.46.8.dev14 → locust-2.46.8.dev30}/locust/env.py +0 -0
- {locust-2.46.8.dev14 → locust-2.46.8.dev30}/locust/event.py +0 -0
- {locust-2.46.8.dev14 → locust-2.46.8.dev30}/locust/exception.py +0 -0
- {locust-2.46.8.dev14 → locust-2.46.8.dev30}/locust/input_events.py +0 -0
- {locust-2.46.8.dev14 → locust-2.46.8.dev30}/locust/log.py +0 -0
- {locust-2.46.8.dev14 → locust-2.46.8.dev30}/locust/py.typed +0 -0
- {locust-2.46.8.dev14 → locust-2.46.8.dev30}/locust/rpc/__init__.py +0 -0
- {locust-2.46.8.dev14 → locust-2.46.8.dev30}/locust/rpc/protocol.py +0 -0
- {locust-2.46.8.dev14 → locust-2.46.8.dev30}/locust/rpc/zmqrpc.py +0 -0
- {locust-2.46.8.dev14 → locust-2.46.8.dev30}/locust/runners.py +0 -0
- {locust-2.46.8.dev14 → locust-2.46.8.dev30}/locust/shape.py +0 -0
- {locust-2.46.8.dev14 → locust-2.46.8.dev30}/locust/stats.py +0 -0
- {locust-2.46.8.dev14 → locust-2.46.8.dev30}/locust/user/__init__.py +0 -0
- {locust-2.46.8.dev14 → locust-2.46.8.dev30}/locust/user/inspectuser.py +0 -0
- {locust-2.46.8.dev14 → locust-2.46.8.dev30}/locust/user/markov_taskset.py +0 -0
- {locust-2.46.8.dev14 → locust-2.46.8.dev30}/locust/user/sequential_taskset.py +0 -0
- {locust-2.46.8.dev14 → locust-2.46.8.dev30}/locust/user/task.py +0 -0
- {locust-2.46.8.dev14 → locust-2.46.8.dev30}/locust/user/users.py +0 -0
- {locust-2.46.8.dev14 → locust-2.46.8.dev30}/locust/user/wait_time.py +0 -0
- {locust-2.46.8.dev14 → locust-2.46.8.dev30}/locust/util/__init__.py +0 -0
- {locust-2.46.8.dev14 → locust-2.46.8.dev30}/locust/util/cache.py +0 -0
- {locust-2.46.8.dev14 → locust-2.46.8.dev30}/locust/util/date.py +0 -0
- {locust-2.46.8.dev14 → locust-2.46.8.dev30}/locust/util/deprecation.py +0 -0
- {locust-2.46.8.dev14 → locust-2.46.8.dev30}/locust/util/directory.py +0 -0
- {locust-2.46.8.dev14 → locust-2.46.8.dev30}/locust/util/exception_handler.py +0 -0
- {locust-2.46.8.dev14 → locust-2.46.8.dev30}/locust/util/load_locustfile.py +0 -0
- {locust-2.46.8.dev14 → locust-2.46.8.dev30}/locust/util/rounding.py +0 -0
- {locust-2.46.8.dev14 → locust-2.46.8.dev30}/locust/util/timespan.py +0 -0
- {locust-2.46.8.dev14 → locust-2.46.8.dev30}/locust/util/url.py +0 -0
- {locust-2.46.8.dev14 → locust-2.46.8.dev30}/locust/web.py +0 -0
- {locust-2.46.8.dev14 → locust-2.46.8.dev30}/locust/webui/dist/assets/favicon-dark.png +0 -0
- {locust-2.46.8.dev14 → locust-2.46.8.dev30}/locust/webui/dist/assets/favicon-light.png +0 -0
- {locust-2.46.8.dev14 → locust-2.46.8.dev30}/locust/webui/dist/assets/graphs-dark.png +0 -0
- {locust-2.46.8.dev14 → locust-2.46.8.dev30}/locust/webui/dist/assets/graphs-light.png +0 -0
- {locust-2.46.8.dev14 → locust-2.46.8.dev30}/locust/webui/dist/assets/src-pSlzKFX1.js +0 -0
- {locust-2.46.8.dev14 → locust-2.46.8.dev30}/locust/webui/dist/assets/terminal.gif +0 -0
- {locust-2.46.8.dev14 → locust-2.46.8.dev30}/locust/webui/dist/assets/testruns-dark.png +0 -0
- {locust-2.46.8.dev14 → locust-2.46.8.dev30}/locust/webui/dist/assets/testruns-light.png +0 -0
- {locust-2.46.8.dev14 → locust-2.46.8.dev30}/locust/webui/dist/auth.html +0 -0
- {locust-2.46.8.dev14 → locust-2.46.8.dev30}/locust/webui/dist/index.html +0 -0
- {locust-2.46.8.dev14 → locust-2.46.8.dev30}/locust/webui/dist/report.html +0 -0
- {locust-2.46.8.dev14 → locust-2.46.8.dev30}/pyproject.toml +0 -0
- {locust-2.46.8.dev14 → locust-2.46.8.dev30}/pytest_locust/plugin.py +0 -0
|
@@ -18,7 +18,7 @@ version_tuple: tuple[int | str, ...]
|
|
|
18
18
|
commit_id: str | None
|
|
19
19
|
__commit_id__: str | None
|
|
20
20
|
|
|
21
|
-
__version__ = version = '2.46.8.
|
|
22
|
-
__version_tuple__ = version_tuple = (2, 46, 8, '
|
|
21
|
+
__version__ = version = '2.46.8.dev30'
|
|
22
|
+
__version_tuple__ = version_tuple = (2, 46, 8, 'dev30')
|
|
23
23
|
|
|
24
24
|
__commit_id__ = commit_id = None
|
|
@@ -149,7 +149,7 @@ class CsvRequestLogger:
|
|
|
149
149
|
*,
|
|
150
150
|
request_type: str,
|
|
151
151
|
name: str,
|
|
152
|
-
response_time: float,
|
|
152
|
+
response_time: float | None,
|
|
153
153
|
response_length: int,
|
|
154
154
|
exception: Any = None,
|
|
155
155
|
response: Any = None,
|
|
@@ -170,7 +170,7 @@ class CsvRequestLogger:
|
|
|
170
170
|
round(ts, 6),
|
|
171
171
|
request_type,
|
|
172
172
|
name,
|
|
173
|
-
round(response_time, 2),
|
|
173
|
+
round(response_time, 2) if response_time is not None else "",
|
|
174
174
|
response_length,
|
|
175
175
|
status_code,
|
|
176
176
|
exc_str,
|
|
@@ -78,6 +78,7 @@ FAILURE_EXCEPTIONS = (
|
|
|
78
78
|
SSLError,
|
|
79
79
|
Timeout,
|
|
80
80
|
HTTPConnectionClosed,
|
|
81
|
+
HTTPParseError,
|
|
81
82
|
zlib.error,
|
|
82
83
|
)
|
|
83
84
|
|
|
@@ -294,7 +295,7 @@ class FastHttpSession:
|
|
|
294
295
|
else:
|
|
295
296
|
try:
|
|
296
297
|
request_meta["response_length"] = len(response.content) if response.content else 0
|
|
297
|
-
except
|
|
298
|
+
except FAILURE_EXCEPTIONS as e:
|
|
298
299
|
request_meta["response_time"] = (time.perf_counter() - start_perf_counter) * 1000
|
|
299
300
|
request_meta["exception"] = e # type: ignore
|
|
300
301
|
if catch_response:
|
|
@@ -21,7 +21,9 @@ def process_html_filename(options) -> None:
|
|
|
21
21
|
}
|
|
22
22
|
for option_term, option_value in option_mapping.items():
|
|
23
23
|
if option_value is not None:
|
|
24
|
-
|
|
24
|
+
# -r is a float option, so a fractional spawn rate must survive the substitution.
|
|
25
|
+
replacement = str(int(option_value)) if float(option_value).is_integer() else str(option_value)
|
|
26
|
+
options.html_file = options.html_file.replace(option_term, replacement)
|
|
25
27
|
|
|
26
28
|
|
|
27
29
|
def render_template_from(file, build_path=DEFAULT_BUILD_PATH, **kwargs):
|
|
@@ -109,8 +109,14 @@ def merge_locustfiles_content(
|
|
|
109
109
|
for _shape_class in shape_classes:
|
|
110
110
|
shape_class_name = type(_shape_class).__name__
|
|
111
111
|
if shape_class_name in available_shape_classes.keys():
|
|
112
|
-
|
|
113
|
-
|
|
112
|
+
previous_path = inspect.getfile(type(available_shape_classes[shape_class_name]))
|
|
113
|
+
new_path = inspect.getfile(type(_shape_class))
|
|
114
|
+
if previous_path == new_path:
|
|
115
|
+
# The same shape class was defined in two locustfiles but one probably imported the other, so we just ignore it
|
|
116
|
+
continue
|
|
117
|
+
else:
|
|
118
|
+
sys.stderr.write(f"Duplicate shape classes: {shape_class_name}\n")
|
|
119
|
+
sys.exit(1)
|
|
114
120
|
|
|
115
121
|
available_shape_classes[shape_class_name] = _shape_class
|
|
116
122
|
|
|
@@ -53,7 +53,9 @@ def setup_opentelemetry(locustfile: str, profile: str | None) -> bool:
|
|
|
53
53
|
|
|
54
54
|
@events.request.add_listener
|
|
55
55
|
def on_request(name, response_time, exception, **kwargs):
|
|
56
|
-
if
|
|
56
|
+
if name in request_names:
|
|
57
|
+
attributes = {"name": name}
|
|
58
|
+
elif len(request_names) < MAX_REQUEST_NAMES:
|
|
57
59
|
request_names.add(name)
|
|
58
60
|
attributes = {"name": name}
|
|
59
61
|
else:
|
|
@@ -62,7 +64,9 @@ def setup_opentelemetry(locustfile: str, profile: str | None) -> bool:
|
|
|
62
64
|
if exception:
|
|
63
65
|
attributes["error.type"] = exception.__class__.__name__
|
|
64
66
|
|
|
65
|
-
|
|
67
|
+
# response_time is None for requests that have no duration (typically async requests)
|
|
68
|
+
if response_time is not None:
|
|
69
|
+
ttlb_histogram.record(response_time / 1000.0, attributes=attributes)
|
|
66
70
|
|
|
67
71
|
@events.init.add_listener
|
|
68
72
|
def on_locust_init(runner, **kwargs):
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|