如何提取rpc调用中发生的重试次数?

问题描述 投票:0回答:1

我有一个简单的 rpc 调用,配置了重试,该调用应该会失败并出现错误 UNAVAILABLE。在日志中的 DEBUG 级别,我可以看到该请求已按其应有的方式发送了 N 次。

serviceStub.sayHello(request)

如何提取此 rpc 调用时发生的重试次数?

我尝试提取标头,但似乎重试次数没有价值

kotlin protocol-buffers grpc grpc-java
1个回答
0
投票

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);
      }
    };
  }
}
© www.soinside.com 2019 - 2024. All rights reserved.