locust 2.44.1.dev20__tar.gz → 2.44.1.dev34__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.44.1.dev20 → locust-2.44.1.dev34}/PKG-INFO +4 -2
- {locust-2.44.1.dev20 → locust-2.44.1.dev34}/README.md +3 -1
- {locust-2.44.1.dev20 → locust-2.44.1.dev34}/locust/_version.py +2 -2
- {locust-2.44.1.dev20 → locust-2.44.1.dev34}/locust/main.py +1 -1
- {locust-2.44.1.dev20 → locust-2.44.1.dev34}/locust/opentelemetry.py +69 -3
- {locust-2.44.1.dev20 → locust-2.44.1.dev34}/.gitignore +0 -0
- {locust-2.44.1.dev20 → locust-2.44.1.dev34}/LICENSE +0 -0
- {locust-2.44.1.dev20 → locust-2.44.1.dev34}/hatch_build.py +0 -0
- {locust-2.44.1.dev20 → locust-2.44.1.dev34}/locust/__init__.py +0 -0
- {locust-2.44.1.dev20 → locust-2.44.1.dev34}/locust/__main__.py +0 -0
- {locust-2.44.1.dev20 → locust-2.44.1.dev34}/locust/argument_parser.py +0 -0
- {locust-2.44.1.dev20 → locust-2.44.1.dev34}/locust/clients.py +0 -0
- {locust-2.44.1.dev20 → locust-2.44.1.dev34}/locust/contrib/__init__.py +0 -0
- {locust-2.44.1.dev20 → locust-2.44.1.dev34}/locust/contrib/csv_request_logger.py +0 -0
- {locust-2.44.1.dev20 → locust-2.44.1.dev34}/locust/contrib/dns.py +0 -0
- {locust-2.44.1.dev20 → locust-2.44.1.dev34}/locust/contrib/fasthttp.py +0 -0
- {locust-2.44.1.dev20 → locust-2.44.1.dev34}/locust/contrib/milvus.py +0 -0
- {locust-2.44.1.dev20 → locust-2.44.1.dev34}/locust/contrib/mongodb.py +0 -0
- {locust-2.44.1.dev20 → locust-2.44.1.dev34}/locust/contrib/mqtt.py +0 -0
- {locust-2.44.1.dev20 → locust-2.44.1.dev34}/locust/contrib/oai.py +0 -0
- {locust-2.44.1.dev20 → locust-2.44.1.dev34}/locust/contrib/postgres.py +0 -0
- {locust-2.44.1.dev20 → locust-2.44.1.dev34}/locust/contrib/qdrant.py +0 -0
- {locust-2.44.1.dev20 → locust-2.44.1.dev34}/locust/contrib/socketio.py +0 -0
- {locust-2.44.1.dev20 → locust-2.44.1.dev34}/locust/debug.py +0 -0
- {locust-2.44.1.dev20 → locust-2.44.1.dev34}/locust/dispatch.py +0 -0
- {locust-2.44.1.dev20 → locust-2.44.1.dev34}/locust/env.py +0 -0
- {locust-2.44.1.dev20 → locust-2.44.1.dev34}/locust/event.py +0 -0
- {locust-2.44.1.dev20 → locust-2.44.1.dev34}/locust/exception.py +0 -0
- {locust-2.44.1.dev20 → locust-2.44.1.dev34}/locust/html.py +0 -0
- {locust-2.44.1.dev20 → locust-2.44.1.dev34}/locust/input_events.py +0 -0
- {locust-2.44.1.dev20 → locust-2.44.1.dev34}/locust/log.py +0 -0
- {locust-2.44.1.dev20 → locust-2.44.1.dev34}/locust/py.typed +0 -0
- {locust-2.44.1.dev20 → locust-2.44.1.dev34}/locust/rpc/__init__.py +0 -0
- {locust-2.44.1.dev20 → locust-2.44.1.dev34}/locust/rpc/protocol.py +0 -0
- {locust-2.44.1.dev20 → locust-2.44.1.dev34}/locust/rpc/zmqrpc.py +0 -0
- {locust-2.44.1.dev20 → locust-2.44.1.dev34}/locust/runners.py +0 -0
- {locust-2.44.1.dev20 → locust-2.44.1.dev34}/locust/shape.py +0 -0
- {locust-2.44.1.dev20 → locust-2.44.1.dev34}/locust/stats.py +0 -0
- {locust-2.44.1.dev20 → locust-2.44.1.dev34}/locust/user/__init__.py +0 -0
- {locust-2.44.1.dev20 → locust-2.44.1.dev34}/locust/user/inspectuser.py +0 -0
- {locust-2.44.1.dev20 → locust-2.44.1.dev34}/locust/user/markov_taskset.py +0 -0
- {locust-2.44.1.dev20 → locust-2.44.1.dev34}/locust/user/sequential_taskset.py +0 -0
- {locust-2.44.1.dev20 → locust-2.44.1.dev34}/locust/user/task.py +0 -0
- {locust-2.44.1.dev20 → locust-2.44.1.dev34}/locust/user/users.py +0 -0
- {locust-2.44.1.dev20 → locust-2.44.1.dev34}/locust/user/wait_time.py +0 -0
- {locust-2.44.1.dev20 → locust-2.44.1.dev34}/locust/util/__init__.py +0 -0
- {locust-2.44.1.dev20 → locust-2.44.1.dev34}/locust/util/cache.py +0 -0
- {locust-2.44.1.dev20 → locust-2.44.1.dev34}/locust/util/date.py +0 -0
- {locust-2.44.1.dev20 → locust-2.44.1.dev34}/locust/util/deprecation.py +0 -0
- {locust-2.44.1.dev20 → locust-2.44.1.dev34}/locust/util/directory.py +0 -0
- {locust-2.44.1.dev20 → locust-2.44.1.dev34}/locust/util/exception_handler.py +0 -0
- {locust-2.44.1.dev20 → locust-2.44.1.dev34}/locust/util/load_locustfile.py +0 -0
- {locust-2.44.1.dev20 → locust-2.44.1.dev34}/locust/util/rounding.py +0 -0
- {locust-2.44.1.dev20 → locust-2.44.1.dev34}/locust/util/timespan.py +0 -0
- {locust-2.44.1.dev20 → locust-2.44.1.dev34}/locust/util/url.py +0 -0
- {locust-2.44.1.dev20 → locust-2.44.1.dev34}/locust/web.py +0 -0
- {locust-2.44.1.dev20 → locust-2.44.1.dev34}/locust/webui/dist/assets/favicon-dark.png +0 -0
- {locust-2.44.1.dev20 → locust-2.44.1.dev34}/locust/webui/dist/assets/favicon-light.png +0 -0
- {locust-2.44.1.dev20 → locust-2.44.1.dev34}/locust/webui/dist/assets/graphs-dark.png +0 -0
- {locust-2.44.1.dev20 → locust-2.44.1.dev34}/locust/webui/dist/assets/graphs-light.png +0 -0
- {locust-2.44.1.dev20 → locust-2.44.1.dev34}/locust/webui/dist/assets/src-lBIzfjkZ.js +0 -0
- {locust-2.44.1.dev20 → locust-2.44.1.dev34}/locust/webui/dist/assets/terminal.gif +0 -0
- {locust-2.44.1.dev20 → locust-2.44.1.dev34}/locust/webui/dist/assets/testruns-dark.png +0 -0
- {locust-2.44.1.dev20 → locust-2.44.1.dev34}/locust/webui/dist/assets/testruns-light.png +0 -0
- {locust-2.44.1.dev20 → locust-2.44.1.dev34}/locust/webui/dist/auth.html +0 -0
- {locust-2.44.1.dev20 → locust-2.44.1.dev34}/locust/webui/dist/index.html +0 -0
- {locust-2.44.1.dev20 → locust-2.44.1.dev34}/locust/webui/dist/report.html +0 -0
- {locust-2.44.1.dev20 → locust-2.44.1.dev34}/pyproject.toml +0 -0
- {locust-2.44.1.dev20 → locust-2.44.1.dev34}/pytest_locust/plugin.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: locust
|
|
3
|
-
Version: 2.44.1.
|
|
3
|
+
Version: 2.44.1.dev34
|
|
4
4
|
Summary: Developer-friendly load testing framework
|
|
5
5
|
Project-URL: homepage, https://locust.io/
|
|
6
6
|
Project-URL: repository, https://github.com/locustio/locust
|
|
@@ -144,7 +144,9 @@ Locust's code base is intentionally kept small and doesn't solve everything out
|
|
|
144
144
|
|
|
145
145
|
## VS Code extension
|
|
146
146
|
|
|
147
|
-
Microsoft has built an excellent [VS Code extension](https://
|
|
147
|
+
Microsoft has built an excellent [VS Code extension](https://learn.microsoft.com/azure/app-testing/load-testing/quickstart-create-run-load-tests-from-visual-studio-code) that uses [Copilot](https://github.com/features/copilot) to help you create and run Locust tests. Here's a video to get you started:
|
|
148
|
+
|
|
149
|
+
[](https://youtu.be/J4pIBwocmvE)
|
|
148
150
|
|
|
149
151
|
## Azure Load Testing
|
|
150
152
|
|
|
@@ -84,7 +84,9 @@ Locust's code base is intentionally kept small and doesn't solve everything out
|
|
|
84
84
|
|
|
85
85
|
## VS Code extension
|
|
86
86
|
|
|
87
|
-
Microsoft has built an excellent [VS Code extension](https://
|
|
87
|
+
Microsoft has built an excellent [VS Code extension](https://learn.microsoft.com/azure/app-testing/load-testing/quickstart-create-run-load-tests-from-visual-studio-code) that uses [Copilot](https://github.com/features/copilot) to help you create and run Locust tests. Here's a video to get you started:
|
|
88
|
+
|
|
89
|
+
[](https://youtu.be/J4pIBwocmvE)
|
|
88
90
|
|
|
89
91
|
## Azure Load Testing
|
|
90
92
|
|
|
@@ -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.44.1.
|
|
22
|
-
__version_tuple__ = version_tuple = (2, 44, 1, '
|
|
21
|
+
__version__ = version = '2.44.1.dev34'
|
|
22
|
+
__version_tuple__ = version_tuple = (2, 44, 1, 'dev34')
|
|
23
23
|
|
|
24
24
|
__commit_id__ = commit_id = None
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import logging
|
|
2
2
|
import os
|
|
3
|
+
import socket
|
|
3
4
|
from urllib.parse import urlparse
|
|
4
5
|
|
|
5
6
|
from ._version import __version__
|
|
@@ -7,9 +8,9 @@ from ._version import __version__
|
|
|
7
8
|
logger = logging.getLogger(__name__)
|
|
8
9
|
|
|
9
10
|
|
|
10
|
-
def setup_opentelemetry() -> bool:
|
|
11
|
+
def setup_opentelemetry(locustfile: str, profile: str | None) -> bool:
|
|
11
12
|
try:
|
|
12
|
-
from opentelemetry import metrics, trace
|
|
13
|
+
from opentelemetry import _logs, metrics, trace
|
|
13
14
|
from opentelemetry.sdk.resources import Resource
|
|
14
15
|
except ImportError:
|
|
15
16
|
logger.error("OpenTelemetry SDK is not installed, opentelemetry not enabled. Run 'pip install locust[otel]'")
|
|
@@ -17,8 +18,9 @@ def setup_opentelemetry() -> bool:
|
|
|
17
18
|
|
|
18
19
|
traces_exporters = {e.strip().lower() for e in os.getenv("OTEL_TRACES_EXPORTER", "otlp").split(",") if e.strip()}
|
|
19
20
|
metrics_exporters = {e.strip().lower() for e in os.getenv("OTEL_METRICS_EXPORTER", "otlp").split(",") if e.strip()}
|
|
21
|
+
logs_exporters = {e.strip().lower() for e in os.getenv("OTEL_LOGS_EXPORTER", "otlp").split(",") if e.strip()}
|
|
20
22
|
|
|
21
|
-
if traces_exporters == {"none"} and metrics_exporters == {"none"}:
|
|
23
|
+
if traces_exporters == {"none"} and metrics_exporters == {"none"} and logs_exporters == {"none"}:
|
|
22
24
|
logger.info("No OpenTelemetry exporters configured, opentelemetry not enabled")
|
|
23
25
|
return False
|
|
24
26
|
|
|
@@ -26,6 +28,9 @@ def setup_opentelemetry() -> bool:
|
|
|
26
28
|
{
|
|
27
29
|
"service.name": os.getenv("OTEL_SERVICE_NAME", "locust"),
|
|
28
30
|
"service.version": __version__,
|
|
31
|
+
"host.name": socket.gethostname(),
|
|
32
|
+
"filename": locustfile,
|
|
33
|
+
"profile": profile or "",
|
|
29
34
|
}
|
|
30
35
|
)
|
|
31
36
|
|
|
@@ -37,6 +42,10 @@ def setup_opentelemetry() -> bool:
|
|
|
37
42
|
meter_provider = _setup_meter_provider(resource, metrics_exporters)
|
|
38
43
|
metrics.set_meter_provider(meter_provider)
|
|
39
44
|
|
|
45
|
+
if logs_exporters:
|
|
46
|
+
logger_provider = _setup_logger_provider(resource, logs_exporters)
|
|
47
|
+
_logs.set_logger_provider(logger_provider)
|
|
48
|
+
|
|
40
49
|
_setup_auto_instrumentation()
|
|
41
50
|
|
|
42
51
|
logger.debug("OpenTelemetry configured!")
|
|
@@ -139,6 +148,63 @@ def _setup_meter_provider(resource, metrics_exporters):
|
|
|
139
148
|
return MeterProvider(resource=resource, metric_readers=metric_readers)
|
|
140
149
|
|
|
141
150
|
|
|
151
|
+
def _setup_logger_provider(resource, logs_exporters):
|
|
152
|
+
from opentelemetry.sdk._logs import LoggerProvider, LoggingHandler
|
|
153
|
+
from opentelemetry.sdk._logs.export import (
|
|
154
|
+
BatchLogRecordProcessor,
|
|
155
|
+
ConsoleLogRecordExporter,
|
|
156
|
+
SimpleLogRecordProcessor,
|
|
157
|
+
)
|
|
158
|
+
|
|
159
|
+
logger_provider = LoggerProvider(resource=resource)
|
|
160
|
+
|
|
161
|
+
for exporter in logs_exporters:
|
|
162
|
+
if exporter == "otlp":
|
|
163
|
+
protocol = (
|
|
164
|
+
os.getenv("OTEL_EXPORTER_OTLP_LOGS_PROTOCOL", os.getenv("OTEL_EXPORTER_OTLP_PROTOCOL", "grpc"))
|
|
165
|
+
.lower()
|
|
166
|
+
.strip()
|
|
167
|
+
)
|
|
168
|
+
try:
|
|
169
|
+
if protocol == "grpc":
|
|
170
|
+
from opentelemetry.exporter.otlp.proto.grpc._log_exporter import OTLPLogExporter
|
|
171
|
+
elif protocol == "http/protobuf" or protocol == "http":
|
|
172
|
+
from opentelemetry.exporter.otlp.proto.http._log_exporter import OTLPLogExporter
|
|
173
|
+
else:
|
|
174
|
+
logger.warning(
|
|
175
|
+
f"Unknown OpenTelemetry otlp exporter protocol '{protocol}'. Use 'grpc' or 'http/protobuf'"
|
|
176
|
+
)
|
|
177
|
+
continue
|
|
178
|
+
except ImportError:
|
|
179
|
+
logger.warning(
|
|
180
|
+
f"OpenTelemetry otlp exporter for '{protocol}' is not available. Please install the required package: opentelemetry-exporter-otlp-proto-{'grpc' if protocol == 'grpc' else 'http'}"
|
|
181
|
+
)
|
|
182
|
+
continue
|
|
183
|
+
|
|
184
|
+
logger_provider.add_log_record_processor(BatchLogRecordProcessor(OTLPLogExporter()))
|
|
185
|
+
logger.debug("Configured logs exporter: otlp")
|
|
186
|
+
|
|
187
|
+
elif exporter == "console":
|
|
188
|
+
logger_provider.add_log_record_processor(SimpleLogRecordProcessor(ConsoleLogRecordExporter()))
|
|
189
|
+
logger.debug("Configured logs exporter: console")
|
|
190
|
+
|
|
191
|
+
elif exporter == "none":
|
|
192
|
+
continue
|
|
193
|
+
|
|
194
|
+
else:
|
|
195
|
+
logger.warning(f"Unknown logs exporter '{exporter}'. Ignored")
|
|
196
|
+
|
|
197
|
+
# set up logging bridge
|
|
198
|
+
otel_handler = LoggingHandler(logger_provider=logger_provider)
|
|
199
|
+
otel_handler.name = "opentelemetry"
|
|
200
|
+
logging.getLogger().addHandler(otel_handler)
|
|
201
|
+
# locust loggers are configured with propagate=False, so they need this handler explicitly.
|
|
202
|
+
logging.getLogger("locust").addHandler(otel_handler)
|
|
203
|
+
logging.getLogger("locust.stats_logger").addHandler(otel_handler)
|
|
204
|
+
|
|
205
|
+
return logger_provider
|
|
206
|
+
|
|
207
|
+
|
|
142
208
|
def _setup_auto_instrumentation():
|
|
143
209
|
try:
|
|
144
210
|
import requests
|
|
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
|