如何在Gatling的HTML报告中用服务端执行时间替换默认统计耗时
Gatling自定义服务端执行时间统计操作流程
以下是完整操作步骤,适配Gatling 3.x及以上版本:
1. 提取响应中的服务端执行时长
在请求的校验规则中,从响应体提取出接口返回的服务端执行时长字段,转换为数值类型后存入会话变量,示例代码如下(以JSON响应的server_cost字段为例):
http("测试业务接口") .post("/api/your/interface") .body(StringBody("""{"testParam": "xxx"}""")) .check(jsonPath("$.server_cost").ofType[Long].saveAs("serverExecTime"))
2. 编写自定义耗时上报逻辑
Gatling默认统计的是请求从发出到全量接收响应的端到端耗时,要替换该统计值,需要手动向Gatling的统计模块上报自定义的耗时数据,实现代码如下:
import io.gatling.core.Predef._ import io.gatling.http.Predef._ import io.gatling.core.result.message.{OK, KO, Status} import io.gatling.core.result.writer.DataWriterClient // 自定义统计上报函数 val reportByServerTime = exec(session => { // 取出之前存入会话的服务端执行时长 val serverExecTime = session("serverExecTime").as[Long] // 手动上报统计数据,将耗时替换为服务端返回值 DataWriterClient.writeRequestData( session = session, requestName = "测试业务接口", // 和你实际的请求名称保持一致 requestGroups = Nil, status = OK, // 请求失败时可改为KO,同时传入错误信息 startTimestamp = 0, endTimestamp = serverExecTime, // 统计时会直接取end-start作为耗时,这里直接赋值为服务端返回的时长即可 errors = Nil, groupHierarchy = None ) session })
3. 关闭原请求的默认统计
为了避免默认统计和自定义统计重复上报,需要给原请求增加静默配置,关闭其默认统计能力:
http("测试业务接口") .post("/api/your/interface") .body(StringBody("""{"testParam": "xxx"}""")) .check(jsonPath("$.server_cost").ofType[Long].saveAs("serverExecTime")) .silent // 新增该行,关闭默认统计
4. 组装场景执行压测
在压测场景中,先执行请求,再执行自定义上报函数即可,示例场景配置:
val scn = scenario("自定义耗时统计压测场景") .exec( http("测试业务接口") .post("/api/your/interface") .body(StringBody("""{"testParam": "xxx"}""")) .check(jsonPath("$.server_cost").ofType[Long].saveAs("serverExecTime")) .silent ) .exec(reportByServerTime) // 在请求后执行上报逻辑 setUp(scn.inject(atOnceUsers(10))).protocols(httpProtocol)
执行压测后生成的HTML报告,所有耗时统计都会使用你上报的服务端实际执行时间,效果如下:
注意:如果存在部分接口未返回服务端执行时长的情况,可自行添加判断逻辑,未获取到服务端时长时可以选择用默认端到端耗时上报,或者设置固定兜底值。
内容的提问来源于stack exchange,提问作者NoNoNo
相关产品推荐
相关产品推荐

