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.
Files changed (69) hide show
  1. {locust-2.44.1.dev20 → locust-2.44.1.dev34}/PKG-INFO +4 -2
  2. {locust-2.44.1.dev20 → locust-2.44.1.dev34}/README.md +3 -1
  3. {locust-2.44.1.dev20 → locust-2.44.1.dev34}/locust/_version.py +2 -2
  4. {locust-2.44.1.dev20 → locust-2.44.1.dev34}/locust/main.py +1 -1
  5. {locust-2.44.1.dev20 → locust-2.44.1.dev34}/locust/opentelemetry.py +69 -3
  6. {locust-2.44.1.dev20 → locust-2.44.1.dev34}/.gitignore +0 -0
  7. {locust-2.44.1.dev20 → locust-2.44.1.dev34}/LICENSE +0 -0
  8. {locust-2.44.1.dev20 → locust-2.44.1.dev34}/hatch_build.py +0 -0
  9. {locust-2.44.1.dev20 → locust-2.44.1.dev34}/locust/__init__.py +0 -0
  10. {locust-2.44.1.dev20 → locust-2.44.1.dev34}/locust/__main__.py +0 -0
  11. {locust-2.44.1.dev20 → locust-2.44.1.dev34}/locust/argument_parser.py +0 -0
  12. {locust-2.44.1.dev20 → locust-2.44.1.dev34}/locust/clients.py +0 -0
  13. {locust-2.44.1.dev20 → locust-2.44.1.dev34}/locust/contrib/__init__.py +0 -0
  14. {locust-2.44.1.dev20 → locust-2.44.1.dev34}/locust/contrib/csv_request_logger.py +0 -0
  15. {locust-2.44.1.dev20 → locust-2.44.1.dev34}/locust/contrib/dns.py +0 -0
  16. {locust-2.44.1.dev20 → locust-2.44.1.dev34}/locust/contrib/fasthttp.py +0 -0
  17. {locust-2.44.1.dev20 → locust-2.44.1.dev34}/locust/contrib/milvus.py +0 -0
  18. {locust-2.44.1.dev20 → locust-2.44.1.dev34}/locust/contrib/mongodb.py +0 -0
  19. {locust-2.44.1.dev20 → locust-2.44.1.dev34}/locust/contrib/mqtt.py +0 -0
  20. {locust-2.44.1.dev20 → locust-2.44.1.dev34}/locust/contrib/oai.py +0 -0
  21. {locust-2.44.1.dev20 → locust-2.44.1.dev34}/locust/contrib/postgres.py +0 -0
  22. {locust-2.44.1.dev20 → locust-2.44.1.dev34}/locust/contrib/qdrant.py +0 -0
  23. {locust-2.44.1.dev20 → locust-2.44.1.dev34}/locust/contrib/socketio.py +0 -0
  24. {locust-2.44.1.dev20 → locust-2.44.1.dev34}/locust/debug.py +0 -0
  25. {locust-2.44.1.dev20 → locust-2.44.1.dev34}/locust/dispatch.py +0 -0
  26. {locust-2.44.1.dev20 → locust-2.44.1.dev34}/locust/env.py +0 -0
  27. {locust-2.44.1.dev20 → locust-2.44.1.dev34}/locust/event.py +0 -0
  28. {locust-2.44.1.dev20 → locust-2.44.1.dev34}/locust/exception.py +0 -0
  29. {locust-2.44.1.dev20 → locust-2.44.1.dev34}/locust/html.py +0 -0
  30. {locust-2.44.1.dev20 → locust-2.44.1.dev34}/locust/input_events.py +0 -0
  31. {locust-2.44.1.dev20 → locust-2.44.1.dev34}/locust/log.py +0 -0
  32. {locust-2.44.1.dev20 → locust-2.44.1.dev34}/locust/py.typed +0 -0
  33. {locust-2.44.1.dev20 → locust-2.44.1.dev34}/locust/rpc/__init__.py +0 -0
  34. {locust-2.44.1.dev20 → locust-2.44.1.dev34}/locust/rpc/protocol.py +0 -0
  35. {locust-2.44.1.dev20 → locust-2.44.1.dev34}/locust/rpc/zmqrpc.py +0 -0
  36. {locust-2.44.1.dev20 → locust-2.44.1.dev34}/locust/runners.py +0 -0
  37. {locust-2.44.1.dev20 → locust-2.44.1.dev34}/locust/shape.py +0 -0
  38. {locust-2.44.1.dev20 → locust-2.44.1.dev34}/locust/stats.py +0 -0
  39. {locust-2.44.1.dev20 → locust-2.44.1.dev34}/locust/user/__init__.py +0 -0
  40. {locust-2.44.1.dev20 → locust-2.44.1.dev34}/locust/user/inspectuser.py +0 -0
  41. {locust-2.44.1.dev20 → locust-2.44.1.dev34}/locust/user/markov_taskset.py +0 -0
  42. {locust-2.44.1.dev20 → locust-2.44.1.dev34}/locust/user/sequential_taskset.py +0 -0
  43. {locust-2.44.1.dev20 → locust-2.44.1.dev34}/locust/user/task.py +0 -0
  44. {locust-2.44.1.dev20 → locust-2.44.1.dev34}/locust/user/users.py +0 -0
  45. {locust-2.44.1.dev20 → locust-2.44.1.dev34}/locust/user/wait_time.py +0 -0
  46. {locust-2.44.1.dev20 → locust-2.44.1.dev34}/locust/util/__init__.py +0 -0
  47. {locust-2.44.1.dev20 → locust-2.44.1.dev34}/locust/util/cache.py +0 -0
  48. {locust-2.44.1.dev20 → locust-2.44.1.dev34}/locust/util/date.py +0 -0
  49. {locust-2.44.1.dev20 → locust-2.44.1.dev34}/locust/util/deprecation.py +0 -0
  50. {locust-2.44.1.dev20 → locust-2.44.1.dev34}/locust/util/directory.py +0 -0
  51. {locust-2.44.1.dev20 → locust-2.44.1.dev34}/locust/util/exception_handler.py +0 -0
  52. {locust-2.44.1.dev20 → locust-2.44.1.dev34}/locust/util/load_locustfile.py +0 -0
  53. {locust-2.44.1.dev20 → locust-2.44.1.dev34}/locust/util/rounding.py +0 -0
  54. {locust-2.44.1.dev20 → locust-2.44.1.dev34}/locust/util/timespan.py +0 -0
  55. {locust-2.44.1.dev20 → locust-2.44.1.dev34}/locust/util/url.py +0 -0
  56. {locust-2.44.1.dev20 → locust-2.44.1.dev34}/locust/web.py +0 -0
  57. {locust-2.44.1.dev20 → locust-2.44.1.dev34}/locust/webui/dist/assets/favicon-dark.png +0 -0
  58. {locust-2.44.1.dev20 → locust-2.44.1.dev34}/locust/webui/dist/assets/favicon-light.png +0 -0
  59. {locust-2.44.1.dev20 → locust-2.44.1.dev34}/locust/webui/dist/assets/graphs-dark.png +0 -0
  60. {locust-2.44.1.dev20 → locust-2.44.1.dev34}/locust/webui/dist/assets/graphs-light.png +0 -0
  61. {locust-2.44.1.dev20 → locust-2.44.1.dev34}/locust/webui/dist/assets/src-lBIzfjkZ.js +0 -0
  62. {locust-2.44.1.dev20 → locust-2.44.1.dev34}/locust/webui/dist/assets/terminal.gif +0 -0
  63. {locust-2.44.1.dev20 → locust-2.44.1.dev34}/locust/webui/dist/assets/testruns-dark.png +0 -0
  64. {locust-2.44.1.dev20 → locust-2.44.1.dev34}/locust/webui/dist/assets/testruns-light.png +0 -0
  65. {locust-2.44.1.dev20 → locust-2.44.1.dev34}/locust/webui/dist/auth.html +0 -0
  66. {locust-2.44.1.dev20 → locust-2.44.1.dev34}/locust/webui/dist/index.html +0 -0
  67. {locust-2.44.1.dev20 → locust-2.44.1.dev34}/locust/webui/dist/report.html +0 -0
  68. {locust-2.44.1.dev20 → locust-2.44.1.dev34}/pyproject.toml +0 -0
  69. {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.dev20
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://marketplace.visualstudio.com/items?itemName=ms-azure-load-testing.microsoft-testing) that uses [Copilot](https://github.com/features/copilot) to help you create and run Locust tests.
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
+ [![Youtube video](https://img.youtube.com/vi/J4pIBwocmvE/maxresdefault.jpg)](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://marketplace.visualstudio.com/items?itemName=ms-azure-load-testing.microsoft-testing) that uses [Copilot](https://github.com/features/copilot) to help you create and run Locust tests.
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
+ [![Youtube video](https://img.youtube.com/vi/J4pIBwocmvE/maxresdefault.jpg)](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.dev20'
22
- __version_tuple__ = version_tuple = (2, 44, 1, 'dev20')
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
@@ -180,7 +180,7 @@ def main():
180
180
  start_message = f"Starting Locust {version}"
181
181
 
182
182
  if options.otel:
183
- if setup_opentelemetry():
183
+ if setup_opentelemetry(options.locustfile, options.profile):
184
184
  start_message += ", OpenTelemetry enabled"
185
185
 
186
186
  children = []
@@ -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