locust 2.46.1.dev14__tar.gz → 2.46.2__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.1.dev14 → locust-2.46.2}/PKG-INFO +4 -5
- {locust-2.46.1.dev14 → locust-2.46.2}/locust/_version.py +2 -2
- {locust-2.46.1.dev14 → locust-2.46.2}/locust/stats.py +14 -9
- {locust-2.46.1.dev14 → locust-2.46.2}/pyproject.toml +5 -6
- {locust-2.46.1.dev14 → locust-2.46.2}/.gitignore +0 -0
- {locust-2.46.1.dev14 → locust-2.46.2}/LICENSE +0 -0
- {locust-2.46.1.dev14 → locust-2.46.2}/README.md +0 -0
- {locust-2.46.1.dev14 → locust-2.46.2}/hatch_build.py +0 -0
- {locust-2.46.1.dev14 → locust-2.46.2}/locust/__init__.py +0 -0
- {locust-2.46.1.dev14 → locust-2.46.2}/locust/__main__.py +0 -0
- {locust-2.46.1.dev14 → locust-2.46.2}/locust/argument_parser.py +0 -0
- {locust-2.46.1.dev14 → locust-2.46.2}/locust/clients.py +0 -0
- {locust-2.46.1.dev14 → locust-2.46.2}/locust/contrib/__init__.py +0 -0
- {locust-2.46.1.dev14 → locust-2.46.2}/locust/contrib/csv_request_logger.py +0 -0
- {locust-2.46.1.dev14 → locust-2.46.2}/locust/contrib/dns.py +0 -0
- {locust-2.46.1.dev14 → locust-2.46.2}/locust/contrib/fasthttp.py +0 -0
- {locust-2.46.1.dev14 → locust-2.46.2}/locust/contrib/milvus.py +0 -0
- {locust-2.46.1.dev14 → locust-2.46.2}/locust/contrib/mongodb.py +0 -0
- {locust-2.46.1.dev14 → locust-2.46.2}/locust/contrib/mqtt.py +0 -0
- {locust-2.46.1.dev14 → locust-2.46.2}/locust/contrib/oai.py +0 -0
- {locust-2.46.1.dev14 → locust-2.46.2}/locust/contrib/postgres.py +0 -0
- {locust-2.46.1.dev14 → locust-2.46.2}/locust/contrib/qdrant.py +0 -0
- {locust-2.46.1.dev14 → locust-2.46.2}/locust/contrib/socketio.py +0 -0
- {locust-2.46.1.dev14 → locust-2.46.2}/locust/debug.py +0 -0
- {locust-2.46.1.dev14 → locust-2.46.2}/locust/dispatch.py +0 -0
- {locust-2.46.1.dev14 → locust-2.46.2}/locust/env.py +0 -0
- {locust-2.46.1.dev14 → locust-2.46.2}/locust/event.py +0 -0
- {locust-2.46.1.dev14 → locust-2.46.2}/locust/exception.py +0 -0
- {locust-2.46.1.dev14 → locust-2.46.2}/locust/html.py +0 -0
- {locust-2.46.1.dev14 → locust-2.46.2}/locust/input_events.py +0 -0
- {locust-2.46.1.dev14 → locust-2.46.2}/locust/log.py +0 -0
- {locust-2.46.1.dev14 → locust-2.46.2}/locust/main.py +0 -0
- {locust-2.46.1.dev14 → locust-2.46.2}/locust/opentelemetry.py +0 -0
- {locust-2.46.1.dev14 → locust-2.46.2}/locust/py.typed +0 -0
- {locust-2.46.1.dev14 → locust-2.46.2}/locust/rpc/__init__.py +0 -0
- {locust-2.46.1.dev14 → locust-2.46.2}/locust/rpc/protocol.py +0 -0
- {locust-2.46.1.dev14 → locust-2.46.2}/locust/rpc/zmqrpc.py +0 -0
- {locust-2.46.1.dev14 → locust-2.46.2}/locust/runners.py +0 -0
- {locust-2.46.1.dev14 → locust-2.46.2}/locust/shape.py +0 -0
- {locust-2.46.1.dev14 → locust-2.46.2}/locust/user/__init__.py +0 -0
- {locust-2.46.1.dev14 → locust-2.46.2}/locust/user/inspectuser.py +0 -0
- {locust-2.46.1.dev14 → locust-2.46.2}/locust/user/markov_taskset.py +0 -0
- {locust-2.46.1.dev14 → locust-2.46.2}/locust/user/sequential_taskset.py +0 -0
- {locust-2.46.1.dev14 → locust-2.46.2}/locust/user/task.py +0 -0
- {locust-2.46.1.dev14 → locust-2.46.2}/locust/user/users.py +0 -0
- {locust-2.46.1.dev14 → locust-2.46.2}/locust/user/wait_time.py +0 -0
- {locust-2.46.1.dev14 → locust-2.46.2}/locust/util/__init__.py +0 -0
- {locust-2.46.1.dev14 → locust-2.46.2}/locust/util/cache.py +0 -0
- {locust-2.46.1.dev14 → locust-2.46.2}/locust/util/date.py +0 -0
- {locust-2.46.1.dev14 → locust-2.46.2}/locust/util/deprecation.py +0 -0
- {locust-2.46.1.dev14 → locust-2.46.2}/locust/util/directory.py +0 -0
- {locust-2.46.1.dev14 → locust-2.46.2}/locust/util/exception_handler.py +0 -0
- {locust-2.46.1.dev14 → locust-2.46.2}/locust/util/load_locustfile.py +0 -0
- {locust-2.46.1.dev14 → locust-2.46.2}/locust/util/rounding.py +0 -0
- {locust-2.46.1.dev14 → locust-2.46.2}/locust/util/timespan.py +0 -0
- {locust-2.46.1.dev14 → locust-2.46.2}/locust/util/url.py +0 -0
- {locust-2.46.1.dev14 → locust-2.46.2}/locust/web.py +0 -0
- {locust-2.46.1.dev14 → locust-2.46.2}/locust/webui/dist/assets/favicon-dark.png +0 -0
- {locust-2.46.1.dev14 → locust-2.46.2}/locust/webui/dist/assets/favicon-light.png +0 -0
- {locust-2.46.1.dev14 → locust-2.46.2}/locust/webui/dist/assets/graphs-dark.png +0 -0
- {locust-2.46.1.dev14 → locust-2.46.2}/locust/webui/dist/assets/graphs-light.png +0 -0
- {locust-2.46.1.dev14 → locust-2.46.2}/locust/webui/dist/assets/src-pSlzKFX1.js +0 -0
- {locust-2.46.1.dev14 → locust-2.46.2}/locust/webui/dist/assets/terminal.gif +0 -0
- {locust-2.46.1.dev14 → locust-2.46.2}/locust/webui/dist/assets/testruns-dark.png +0 -0
- {locust-2.46.1.dev14 → locust-2.46.2}/locust/webui/dist/assets/testruns-light.png +0 -0
- {locust-2.46.1.dev14 → locust-2.46.2}/locust/webui/dist/auth.html +0 -0
- {locust-2.46.1.dev14 → locust-2.46.2}/locust/webui/dist/index.html +0 -0
- {locust-2.46.1.dev14 → locust-2.46.2}/locust/webui/dist/report.html +0 -0
- {locust-2.46.1.dev14 → locust-2.46.2}/pytest_locust/plugin.py +0 -0
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: locust
|
|
3
|
-
Version: 2.46.
|
|
3
|
+
Version: 2.46.2
|
|
4
4
|
Summary: Developer-friendly load testing framework
|
|
5
|
-
Project-URL:
|
|
6
|
-
Project-URL:
|
|
7
|
-
Project-URL:
|
|
5
|
+
Project-URL: Homepage, https://locust.cloud/
|
|
6
|
+
Project-URL: Repository, https://github.com/locustio/locust
|
|
7
|
+
Project-URL: Documentation, https://docs.locust.io/
|
|
8
8
|
Author: Jonatan Heyman, Lars Holmberg
|
|
9
9
|
Maintainer: Lars Holmberg, Jonatan Heyman, Andrew Baldwin
|
|
10
10
|
License: MIT
|
|
@@ -39,7 +39,6 @@ Requires-Dist: python-socketio[client]>=5.13.0
|
|
|
39
39
|
Requires-Dist: pywin32; sys_platform == 'win32'
|
|
40
40
|
Requires-Dist: pyzmq>=25.0.0
|
|
41
41
|
Requires-Dist: requests>=2.32.2
|
|
42
|
-
Requires-Dist: tomli>=1.1.0; python_version < '3.11'
|
|
43
42
|
Requires-Dist: typing-extensions>=4.6.0; python_version < '3.12'
|
|
44
43
|
Requires-Dist: werkzeug>=2.0.0
|
|
45
44
|
Provides-Extra: dns
|
|
@@ -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.
|
|
22
|
-
__version_tuple__ = version_tuple = (2, 46,
|
|
21
|
+
__version__ = version = '2.46.2'
|
|
22
|
+
__version_tuple__ = version_tuple = (2, 46, 2)
|
|
23
23
|
|
|
24
24
|
__commit_id__ = commit_id = None
|
|
@@ -113,7 +113,7 @@ response time percentile
|
|
|
113
113
|
"""
|
|
114
114
|
CURRENT_RESPONSE_TIME_PERCENTILE_WINDOW = 10
|
|
115
115
|
|
|
116
|
-
CachedResponseTimes = namedtuple("CachedResponseTimes", ["response_times", "num_requests"])
|
|
116
|
+
CachedResponseTimes = namedtuple("CachedResponseTimes", ["response_times", "num_requests", "num_none_requests"])
|
|
117
117
|
|
|
118
118
|
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]
|
|
119
119
|
|
|
@@ -298,7 +298,7 @@ class StatsEntry:
|
|
|
298
298
|
Represents a single stats entry (name and method)
|
|
299
299
|
"""
|
|
300
300
|
|
|
301
|
-
def __init__(self, stats: RequestStats
|
|
301
|
+
def __init__(self, stats: RequestStats, name: str, method: str, use_response_times_cache: bool = False):
|
|
302
302
|
self.stats = stats
|
|
303
303
|
self.name = name
|
|
304
304
|
""" Name (URL) of this stats entry """
|
|
@@ -450,7 +450,7 @@ class StatsEntry:
|
|
|
450
450
|
|
|
451
451
|
@property
|
|
452
452
|
def current_rps(self) -> float:
|
|
453
|
-
if self.stats
|
|
453
|
+
if self.stats.last_request_timestamp is None:
|
|
454
454
|
return 0
|
|
455
455
|
slice_start_time = max(int(self.stats.last_request_timestamp) - 12, int(self.stats.start_time or 0))
|
|
456
456
|
|
|
@@ -543,9 +543,9 @@ class StatsEntry:
|
|
|
543
543
|
return cast(StatsEntryDict, {key: getattr(self, key, None) for key in StatsEntryDict.__annotations__.keys()})
|
|
544
544
|
|
|
545
545
|
@classmethod
|
|
546
|
-
def unserialize(cls, data: StatsEntryDict) -> StatsEntry:
|
|
546
|
+
def unserialize(cls, data: StatsEntryDict, stats: RequestStats) -> StatsEntry:
|
|
547
547
|
"""Return the unserialzed version of the specified dict"""
|
|
548
|
-
obj = cls(
|
|
548
|
+
obj = cls(stats, data["name"], data["method"])
|
|
549
549
|
valid_keys = StatsEntryDict.__annotations__.keys()
|
|
550
550
|
|
|
551
551
|
for key, value in data.items():
|
|
@@ -604,7 +604,11 @@ class StatsEntry:
|
|
|
604
604
|
|
|
605
605
|
Percent specified in range: 0.0 - 1.0
|
|
606
606
|
"""
|
|
607
|
-
|
|
607
|
+
# response_times only holds non-None samples, so None (async) requests
|
|
608
|
+
# must be excluded from the denominator, just like in avg/median
|
|
609
|
+
return calculate_response_time_percentile(
|
|
610
|
+
self.response_times, self.num_requests - self.num_none_requests, percent
|
|
611
|
+
)
|
|
608
612
|
|
|
609
613
|
def get_current_response_time_percentile(self, percent: float) -> int | None:
|
|
610
614
|
"""
|
|
@@ -644,7 +648,7 @@ class StatsEntry:
|
|
|
644
648
|
# for that timeframe
|
|
645
649
|
return calculate_response_time_percentile(
|
|
646
650
|
diff_response_time_dicts(self.response_times, cached.response_times),
|
|
647
|
-
self.num_requests - cached.num_requests,
|
|
651
|
+
(self.num_requests - self.num_none_requests) - (cached.num_requests - cached.num_none_requests),
|
|
648
652
|
percent,
|
|
649
653
|
)
|
|
650
654
|
# if time was not in response times cache window
|
|
@@ -669,6 +673,7 @@ class StatsEntry:
|
|
|
669
673
|
self.response_times_cache[t] = CachedResponseTimes(
|
|
670
674
|
response_times=copy(self.response_times),
|
|
671
675
|
num_requests=self.num_requests,
|
|
676
|
+
num_none_requests=self.num_none_requests,
|
|
672
677
|
)
|
|
673
678
|
|
|
674
679
|
# We'll use a cache size of CURRENT_RESPONSE_TIME_PERCENTILE_WINDOW + 10 since - in the extreme case -
|
|
@@ -830,7 +835,7 @@ def setup_distributed_stats_event_listeners(events: Events, stats: RequestStats)
|
|
|
830
835
|
|
|
831
836
|
def on_worker_report(client_id: str, data: dict[str, Any]) -> None:
|
|
832
837
|
for stats_data in data["stats"]:
|
|
833
|
-
entry = StatsEntry.unserialize(stats_data)
|
|
838
|
+
entry = StatsEntry.unserialize(stats_data, stats)
|
|
834
839
|
request_key = (entry.name, entry.method)
|
|
835
840
|
if request_key not in stats.entries:
|
|
836
841
|
stats.entries[request_key] = StatsEntry(stats, entry.name, entry.method, use_response_times_cache=True)
|
|
@@ -851,7 +856,7 @@ def setup_distributed_stats_event_listeners(events: Events, stats: RequestStats)
|
|
|
851
856
|
incoming_last if existing.last_seen is None else max(existing.last_seen, incoming_last)
|
|
852
857
|
)
|
|
853
858
|
|
|
854
|
-
stats.total.extend(StatsEntry.unserialize(data["stats_total"]))
|
|
859
|
+
stats.total.extend(StatsEntry.unserialize(data["stats_total"], stats))
|
|
855
860
|
|
|
856
861
|
events.report_to_master.add_listener(on_report_to_master)
|
|
857
862
|
events.worker_report.add_listener(on_worker_report)
|
|
@@ -40,7 +40,6 @@ dependencies = [
|
|
|
40
40
|
"pyzmq>=25.0.0",
|
|
41
41
|
"geventhttpclient>=2.3.1",
|
|
42
42
|
"configargparse>=1.7.1",
|
|
43
|
-
"tomli>=1.1.0; python_version < '3.11'",
|
|
44
43
|
"typing_extensions>=4.6.0; python_version < '3.12'",
|
|
45
44
|
"psutil>=5.9.1",
|
|
46
45
|
"Flask-Login>=0.6.3",
|
|
@@ -66,9 +65,9 @@ otel = [
|
|
|
66
65
|
qdrant = ["qdrant-client>=1.16.2"]
|
|
67
66
|
|
|
68
67
|
[project.urls]
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
68
|
+
Homepage = "https://locust.cloud/"
|
|
69
|
+
Repository = "https://github.com/locustio/locust"
|
|
70
|
+
Documentation = "https://docs.locust.io/"
|
|
72
71
|
|
|
73
72
|
[tool.uv]
|
|
74
73
|
default-groups = ["build", "test", "lint"]
|
|
@@ -76,7 +75,7 @@ default-groups = ["build", "test", "lint"]
|
|
|
76
75
|
[dependency-groups]
|
|
77
76
|
build = ["hatch==1.16.5", "hatch-vcs>=0.4.0"]
|
|
78
77
|
test = [
|
|
79
|
-
"cryptography>=43.0.1,<
|
|
78
|
+
"cryptography>=43.0.1,<49.0.0",
|
|
80
79
|
"pyquery>=2.0.0,<3.0.0",
|
|
81
80
|
"retry>=0.9.2,<1.0.0",
|
|
82
81
|
]
|
|
@@ -203,7 +202,7 @@ reportOptionalMemberAccess = "none"
|
|
|
203
202
|
[tool.hatch.envs.hatch-test]
|
|
204
203
|
default-args = ["locust/test"]
|
|
205
204
|
dependencies = [
|
|
206
|
-
"cryptography>=43.0.1,<
|
|
205
|
+
"cryptography>=43.0.1,<49.0.0",
|
|
207
206
|
"pyquery>=2.0.1,<3.0.0",
|
|
208
207
|
"pytest>=8.3.3,<10",
|
|
209
208
|
"retry>=0.9.2,<1.0.0",
|
|
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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|