GitLab运行gatling-grpc示例报错:grpc.health.v1.Health/Check未实现
解决GitLab环境中gatling-grpc示例的UNIMPLEMENTED健康检查错误
问题描述
本地运行phisgr提供的gatling-grpc示例时一切正常,但在GitLab CI环境中运行GrpcExample(使用示例自带的本地服务器)时,反复出现以下错误:
io.grpc.StatusRuntimeException: UNIMPLEMENTED: Method not found: grpc.health.v1.Health/Check
原因分析
- gatling-grpc默认预热机制:gatling-grpc组件默认会在测试启动前发送一个gRPC健康检查请求(
grpc.health.v1.Health/Check)作为预热,确保连接正常。 - 示例服务器未实现健康检查:该示例自带的本地服务器没有实现gRPC官方的健康检查服务,本地运行时可能因环境特性未触发报错,但GitLab CI环境中该检查被严格执行。
- 服务器启动时序问题:GitLab CI环境中,gatling测试可能在示例服务器完全启动前就发起了预热请求,导致请求找不到对应方法。
解决方案
方案1:禁用预热健康检查
直接修改Simulation类中的gRPC协议配置,关闭默认的预热请求:
val grpcProtocol = grpc(managedChannelBuilder("localhost", port).usePlaintext()) .warmUpCall = None
此方法最简单,直接跳过预热检查,适用于不需要健康检查的测试场景。
方案2:为示例服务器添加健康检查服务实现
如果需要保留预热机制,可以给示例的gRPC服务器添加健康检查服务:
- 确保项目引入gRPC健康检查依赖(根据构建工具调整)
- 在服务器启动代码中注册健康检查服务:
// Scala示例 import io.grpc.protobuf.services.HealthServiceImpl val server = ServerBuilder.forPort(port) .addService(new YourExampleServiceImpl()) .addService(HealthServiceImpl.newInstance()) .build() .start()
这样服务器就能正常响应grpc.health.v1.Health/Check请求,预热检查即可通过。
方案3:确保服务器完全启动后再执行测试
在GitLab CI的运行脚本中添加等待逻辑,确认服务器就绪后再启动gatling测试:
# GitLab CI 脚本片段 # 启动服务器后台运行 java -jar your-example-server.jar & SERVER_PID=$! # 轮询等待服务器端口就绪 until nc -z localhost 50051; do echo "等待服务器启动..." sleep 1 done # 执行gatling测试 sbt gatling:test # 测试完成后停止服务器 kill $SERVER_PID
此方法解决了时序问题,避免因服务器未完全启动导致的预热失败。
内容的提问来源于stack exchange,提问作者tester11203
相关产品推荐
相关产品推荐

