我怎样才能让蝗虫根据另一个 API 的响应停止负载测试?

How can I get locust to stop load testing based on response from another API?

我们计划使用 Locust 对一系列 API 进行负载测试。所以我们有一组 APIs,我们将使用 SequentialTask​​Set 在蝗虫上顺序调用。默认情况下,如果不手动停止它会 运行 无限期,或者我可以在命令行中设置一个计时器在预定义的时间间隔后停止。但我们计划做的是,我们会逐渐增加并发用户的数量。然后,我们计划每 5 分钟左右调用一次单独的 API,这将使我们在托管顺序 API 的服务器上消耗内存。如果消耗的内存值达到阈值,我们希望 locust 脚本自动停止。我试着阅读文档,但找不到我们将如何去做这件事。有什么建议吗?

我们目前的基本代码:

import json

class UserBehavior(SequentialTaskSet):

    @task
    def api_call(self):

        with self.client.get('/test_api') as response:
            print(response)

class WebsiteUser(HttpUser):
    tasks = [UserBehavior]
    wait_time = between(2, 10)```

在用户中你可以调用

self.environment.runner.quit()

在分布式 运行 中,这只会关闭特定的 worker,因此它并不完美。

如果您不想 运行 签入用户,您可以创建自己的 greenlet,在后台检查您的指标(该示例检查蝗虫统计值,但您可以调用 API那里)

https://docs.locust.io/en/stable/extending-locust.html#run-a-background-greenlet

from locust import events
from locust.runners import STATE_STOPPING, STATE_STOPPED, STATE_CLEANUP, WorkerRunner

def checker(environment):
    while not environment.runner.state in [STATE_STOPPING, STATE_STOPPED, STATE_CLEANUP]:
        time.sleep(1)
        if environment.runner.stats.total.fail_ratio > 0.2:
            print(f"fail ratio was {environment.runner.stats.total.fail_ratio}, quitting")
            environment.runner.quit()
            return


@events.init.add_listener
def on_locust_init(environment, **_kwargs):
    # only run this on master & standalone
    if not isinstance(environment.runner, WorkerRunner):
        gevent.spawn(checker, environment)