我有一个简单的 rpc 调用,配置了重试,该调用应该会失败并出现错误 UNAVAILABLE。在日志中的 DEBUG 级别,我可以看到该请求已按其应有的方式发送了 N 次。
serviceStub.sayHello(request)
如何提取此 rpc 调用时发生的重试次数?
我尝试提取标头,但似乎重试次数没有价值
如gRFC A6中所述,元数据
grpc-previous-rpc-attempts
设置在请求标头中以供服务器查看。 grpc-java 确实将其设置在响应标头中供客户端查看。
因此对于客户端,您可以调整元数据示例:
public class RetryLoggingInterceptor implements ClientInterceptor {
private static final Logger logger = Logger.getLogger(RetryLoggingInterceptor.class.getName());
private static final Metadata.Key<String> RPC_ATTEMPTS_KEY =
Metadata.Key.of("grpc-previous-rpc-attempts", Metadata.ASCII_STRING_MARSHALLER);
@Override
public <ReqT, RespT> ClientCall<ReqT, RespT> interceptCall(MethodDescriptor<ReqT, RespT> method,
CallOptions callOptions, Channel next) {
return new SimpleForwardingClientCall<ReqT, RespT>(next.newCall(method, callOptions)) {
@Override
public void start(Listener<RespT> responseListener, Metadata headers) {
super.start(new SimpleForwardingClientCallListener<RespT>(responseListener) {
@Override
public void onHeaders(Metadata headers) {
String retries = headers.get(RPC_ATTEMPTS_KEY);
if (retries != null) {
logger.info("retries:" + retries);
}
super.onHeaders(headers);
}
}, headers);
}
};
}
}