Locust.io如何实现含动态ID的接口按端点名称聚合统计输出
Locust动态路径参数请求聚合实现方法
Locust默认使用完整请求路径作为统计聚合的分组Key,路径中携带动态ID时会导致同规则接口被拆分为多条统计项,可通过以下两种方案实现聚合:
方案一:单接口指定name参数(最简单通用)
在发起子资源POST请求时,显式指定name参数,Locust会直接使用该参数值作为统计分组依据,忽略实际路径中的动态ID差异。
示例代码如下:
# 第一步:发起父资源创建请求 create_resp = self.client.post("/v1/foo/bar", json={"xxx": "xxx"}) parent_id = create_resp.json()["id"] # 第二步:发起子资源请求时指定name参数 upload_resp = self.client.post( url=f"/v1/foo/bar/{parent_id}/upload", name="/v1/foo/bar/{id}/upload", # 固定聚合用的路径占位符 json={"file": "xxx"} )
配置完成后所有子资源请求都会聚合到/v1/foo/bar/{id}/upload这一条统计条目下。
方案二:全局钩子批量处理(适合多类动态路径接口)
如果项目中存在大量带动态参数的接口,不想逐个添加name参数,可以通过pre_request全局钩子批量匹配路径并替换为占位符:
from locust import HttpUser, task, events import re # 全局请求预处理钩子 @events.pre_request.add_listener def handle_dynamic_path(request_type, request, **kwargs): # 匹配符合/v1/foo/bar/{数字ID}/upload规则的路径 if re.match(r"^/v1/foo/bar/\d+/upload$", request.path): # 替换为统一占位符路径作为统计Key request.name = "/v1/foo/bar/{id}/upload" class TestUser(HttpUser): @task def test_workflow(self): # 业务代码和原来保持一致,无需额外修改 create_resp = self.client.post("/v1/foo/bar", json={"xxx": "xxx"}) parent_id = create_resp.json()["id"] self.client.post(f"/v1/foo/bar/{parent_id}/upload", json={"file": "xxx"})
以上两种方案对Web端、CLI输出的统计结果均生效。
内容的提问来源于stack exchange,提问作者Rodney S. Foley
相关产品推荐
相关产品推荐

