locust 2.46.2.dev18__tar.gz → 2.46.3__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.46.2.dev18 → locust-2.46.3}/PKG-INFO +1 -1
  2. {locust-2.46.2.dev18 → locust-2.46.3}/locust/_version.py +2 -2
  3. {locust-2.46.2.dev18 → locust-2.46.3}/locust/main.py +5 -2
  4. {locust-2.46.2.dev18 → locust-2.46.3}/locust/opentelemetry.py +18 -1
  5. {locust-2.46.2.dev18 → locust-2.46.3}/locust/runners.py +1 -1
  6. {locust-2.46.2.dev18 → locust-2.46.3}/locust/stats.py +3 -0
  7. {locust-2.46.2.dev18 → locust-2.46.3}/pyproject.toml +2 -2
  8. {locust-2.46.2.dev18 → locust-2.46.3}/.gitignore +0 -0
  9. {locust-2.46.2.dev18 → locust-2.46.3}/LICENSE +0 -0
  10. {locust-2.46.2.dev18 → locust-2.46.3}/README.md +0 -0
  11. {locust-2.46.2.dev18 → locust-2.46.3}/hatch_build.py +0 -0
  12. {locust-2.46.2.dev18 → locust-2.46.3}/locust/__init__.py +0 -0
  13. {locust-2.46.2.dev18 → locust-2.46.3}/locust/__main__.py +0 -0
  14. {locust-2.46.2.dev18 → locust-2.46.3}/locust/argument_parser.py +0 -0
  15. {locust-2.46.2.dev18 → locust-2.46.3}/locust/clients.py +0 -0
  16. {locust-2.46.2.dev18 → locust-2.46.3}/locust/contrib/__init__.py +0 -0
  17. {locust-2.46.2.dev18 → locust-2.46.3}/locust/contrib/csv_request_logger.py +0 -0
  18. {locust-2.46.2.dev18 → locust-2.46.3}/locust/contrib/dns.py +0 -0
  19. {locust-2.46.2.dev18 → locust-2.46.3}/locust/contrib/fasthttp.py +0 -0
  20. {locust-2.46.2.dev18 → locust-2.46.3}/locust/contrib/milvus.py +0 -0
  21. {locust-2.46.2.dev18 → locust-2.46.3}/locust/contrib/mongodb.py +0 -0
  22. {locust-2.46.2.dev18 → locust-2.46.3}/locust/contrib/mqtt.py +0 -0
  23. {locust-2.46.2.dev18 → locust-2.46.3}/locust/contrib/oai.py +0 -0
  24. {locust-2.46.2.dev18 → locust-2.46.3}/locust/contrib/postgres.py +0 -0
  25. {locust-2.46.2.dev18 → locust-2.46.3}/locust/contrib/qdrant.py +0 -0
  26. {locust-2.46.2.dev18 → locust-2.46.3}/locust/contrib/socketio.py +0 -0
  27. {locust-2.46.2.dev18 → locust-2.46.3}/locust/debug.py +0 -0
  28. {locust-2.46.2.dev18 → locust-2.46.3}/locust/dispatch.py +0 -0
  29. {locust-2.46.2.dev18 → locust-2.46.3}/locust/env.py +0 -0
  30. {locust-2.46.2.dev18 → locust-2.46.3}/locust/event.py +0 -0
  31. {locust-2.46.2.dev18 → locust-2.46.3}/locust/exception.py +0 -0
  32. {locust-2.46.2.dev18 → locust-2.46.3}/locust/html.py +0 -0
  33. {locust-2.46.2.dev18 → locust-2.46.3}/locust/input_events.py +0 -0
  34. {locust-2.46.2.dev18 → locust-2.46.3}/locust/log.py +0 -0
  35. {locust-2.46.2.dev18 → locust-2.46.3}/locust/py.typed +0 -0
  36. {locust-2.46.2.dev18 → locust-2.46.3}/locust/rpc/__init__.py +0 -0
  37. {locust-2.46.2.dev18 → locust-2.46.3}/locust/rpc/protocol.py +0 -0
  38. {locust-2.46.2.dev18 → locust-2.46.3}/locust/rpc/zmqrpc.py +0 -0
  39. {locust-2.46.2.dev18 → locust-2.46.3}/locust/shape.py +0 -0
  40. {locust-2.46.2.dev18 → locust-2.46.3}/locust/user/__init__.py +0 -0
  41. {locust-2.46.2.dev18 → locust-2.46.3}/locust/user/inspectuser.py +0 -0
  42. {locust-2.46.2.dev18 → locust-2.46.3}/locust/user/markov_taskset.py +0 -0
  43. {locust-2.46.2.dev18 → locust-2.46.3}/locust/user/sequential_taskset.py +0 -0
  44. {locust-2.46.2.dev18 → locust-2.46.3}/locust/user/task.py +0 -0
  45. {locust-2.46.2.dev18 → locust-2.46.3}/locust/user/users.py +0 -0
  46. {locust-2.46.2.dev18 → locust-2.46.3}/locust/user/wait_time.py +0 -0
  47. {locust-2.46.2.dev18 → locust-2.46.3}/locust/util/__init__.py +0 -0
  48. {locust-2.46.2.dev18 → locust-2.46.3}/locust/util/cache.py +0 -0
  49. {locust-2.46.2.dev18 → locust-2.46.3}/locust/util/date.py +0 -0
  50. {locust-2.46.2.dev18 → locust-2.46.3}/locust/util/deprecation.py +0 -0
  51. {locust-2.46.2.dev18 → locust-2.46.3}/locust/util/directory.py +0 -0
  52. {locust-2.46.2.dev18 → locust-2.46.3}/locust/util/exception_handler.py +0 -0
  53. {locust-2.46.2.dev18 → locust-2.46.3}/locust/util/load_locustfile.py +0 -0
  54. {locust-2.46.2.dev18 → locust-2.46.3}/locust/util/rounding.py +0 -0
  55. {locust-2.46.2.dev18 → locust-2.46.3}/locust/util/timespan.py +0 -0
  56. {locust-2.46.2.dev18 → locust-2.46.3}/locust/util/url.py +0 -0
  57. {locust-2.46.2.dev18 → locust-2.46.3}/locust/web.py +0 -0
  58. {locust-2.46.2.dev18 → locust-2.46.3}/locust/webui/dist/assets/favicon-dark.png +0 -0
  59. {locust-2.46.2.dev18 → locust-2.46.3}/locust/webui/dist/assets/favicon-light.png +0 -0
  60. {locust-2.46.2.dev18 → locust-2.46.3}/locust/webui/dist/assets/graphs-dark.png +0 -0
  61. {locust-2.46.2.dev18 → locust-2.46.3}/locust/webui/dist/assets/graphs-light.png +0 -0
  62. {locust-2.46.2.dev18 → locust-2.46.3}/locust/webui/dist/assets/src-pSlzKFX1.js +0 -0
  63. {locust-2.46.2.dev18 → locust-2.46.3}/locust/webui/dist/assets/terminal.gif +0 -0
  64. {locust-2.46.2.dev18 → locust-2.46.3}/locust/webui/dist/assets/testruns-dark.png +0 -0
  65. {locust-2.46.2.dev18 → locust-2.46.3}/locust/webui/dist/assets/testruns-light.png +0 -0
  66. {locust-2.46.2.dev18 → locust-2.46.3}/locust/webui/dist/auth.html +0 -0
  67. {locust-2.46.2.dev18 → locust-2.46.3}/locust/webui/dist/index.html +0 -0
  68. {locust-2.46.2.dev18 → locust-2.46.3}/locust/webui/dist/report.html +0 -0
  69. {locust-2.46.2.dev18 → locust-2.46.3}/pytest_locust/plugin.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: locust
3
- Version: 2.46.2.dev18
3
+ Version: 2.46.3
4
4
  Summary: Developer-friendly load testing framework
5
5
  Project-URL: Homepage, https://locust.cloud/
6
6
  Project-URL: Repository, https://github.com/locustio/locust
@@ -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.2.dev18'
22
- __version_tuple__ = version_tuple = (2, 46, 2, 'dev18')
21
+ __version__ = version = '2.46.3'
22
+ __version_tuple__ = version_tuple = (2, 46, 3)
23
23
 
24
24
  __commit_id__ = commit_id = None
@@ -438,6 +438,7 @@ See https://github.com/locustio/locust/wiki/Installation#increasing-maximum-numb
438
438
  else:
439
439
  stats_csv_writer = stats.StatsCSV(environment, stats.PERCENTILES_TO_REPORT)
440
440
 
441
+ url = None
441
442
  # start Web UI
442
443
  if not options.headless and not options.worker:
443
444
  protocol = "https" if options.tls_cert and options.tls_key else "http"
@@ -610,8 +611,8 @@ See https://github.com/locustio/locust/wiki/Installation#increasing-maximum-numb
610
611
  if runner.state != "spawning"
611
612
  else logging.warning("Spawning users, can't stop right now")
612
613
  ),
613
- "\r": lambda: webbrowser.open_new_tab(url),
614
- "\n": lambda: webbrowser.open_new_tab(url),
614
+ "\r": lambda: webbrowser.open_new_tab(url) if url else None,
615
+ "\n": lambda: webbrowser.open_new_tab(url) if url else None,
615
616
  },
616
617
  )
617
618
  )
@@ -659,6 +660,8 @@ See https://github.com/locustio/locust/wiki/Installation#increasing-maximum-numb
659
660
  stats.print_percentile_stats(runner.stats)
660
661
  stats.print_error_report(runner.stats)
661
662
  environment.events.quit.fire(exit_code=code)
663
+ if stats_csv_writer is not None:
664
+ stats_csv_writer.close_files()
662
665
  sys.exit(code)
663
666
 
664
667
  # install SIGTERM handler
@@ -45,7 +45,8 @@ def setup_opentelemetry(locustfile: str, profile: str | None) -> bool:
45
45
  if metrics_exporters:
46
46
  meter_provider = _setup_meter_provider(resource, metrics_exporters)
47
47
  metrics.set_meter_provider(meter_provider)
48
- ttlb_histogram = metrics.get_meter("locust").create_histogram(
48
+ meter = metrics.get_meter("locust")
49
+ ttlb_histogram = meter.create_histogram(
49
50
  "locust.client.duration", unit="s", description="Time to last byte for requests"
50
51
  )
51
52
 
@@ -62,6 +63,22 @@ def setup_opentelemetry(locustfile: str, profile: str | None) -> bool:
62
63
 
63
64
  ttlb_histogram.record(response_time / 1000.0, attributes=attributes)
64
65
 
66
+ @events.init.add_listener
67
+ def on_locust_init(runner, **kwargs):
68
+ if runner is None:
69
+ return
70
+
71
+ def observe_user_count(options):
72
+ for user_class, count in runner.user_classes_count.items():
73
+ yield metrics.Observation(count, {"user_class": user_class})
74
+
75
+ meter.create_observable_gauge(
76
+ "locust.users.count",
77
+ callbacks=[observe_user_count],
78
+ unit="{user}",
79
+ description="Number of currently running Locust users",
80
+ )
81
+
65
82
  if logs_exporters:
66
83
  logger_provider = _setup_logger_provider(resource, logs_exporters)
67
84
  _logs.set_logger_provider(logger_provider)
@@ -1527,4 +1527,4 @@ def _format_user_classes_count_for_log(user_classes_count: dict[str, int]) -> st
1527
1527
  def _aggregate_dispatched_users(d: dict[str, dict[str, int]]) -> dict[str, int]:
1528
1528
  # TODO: Test it
1529
1529
  user_classes = list(next(iter(d.values())).keys())
1530
- return {u: sum(d[u] for d in d.values()) for u in user_classes}
1530
+ return {u: sum(worker_counts[u] for worker_counts in d.values()) for u in user_classes}
@@ -1101,6 +1101,9 @@ class StatsCSV:
1101
1101
  for exc in self.environment.runner.exceptions.values():
1102
1102
  csv_writer.writerow([exc["count"], exc["msg"], exc["traceback"], ", ".join(exc["nodes"])])
1103
1103
 
1104
+ def close_files(self) -> None:
1105
+ pass
1106
+
1104
1107
 
1105
1108
  class StatsCSVFileWriter(StatsCSV):
1106
1109
  """Write statistics to CSV files"""
@@ -75,7 +75,7 @@ default-groups = ["build", "test", "lint"]
75
75
  [dependency-groups]
76
76
  build = ["hatch==1.16.5", "hatch-vcs>=0.4.0"]
77
77
  test = [
78
- "cryptography>=43.0.1,<47.0.0",
78
+ "cryptography>=43.0.1,<49.0.0",
79
79
  "pyquery>=2.0.0,<3.0.0",
80
80
  "retry>=0.9.2,<1.0.0",
81
81
  ]
@@ -202,7 +202,7 @@ reportOptionalMemberAccess = "none"
202
202
  [tool.hatch.envs.hatch-test]
203
203
  default-args = ["locust/test"]
204
204
  dependencies = [
205
- "cryptography>=43.0.1,<47.0.0",
205
+ "cryptography>=43.0.1,<49.0.0",
206
206
  "pyquery>=2.0.1,<3.0.0",
207
207
  "pytest>=8.3.3,<10",
208
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