我们能否可靠地将每次 gRPC 调用的结果记录到我们的 grpc-java 服务器?

Can we reliably log the result of every gRPC call to our grpc-java server?

我们有一个自定义 ServerInterceptor 用于记录我们的 grpc-java 服务器收到的每个调用。它用覆盖 close(Status,Metadata)SimpleForwardingServerCall 包装传递给 next::startCallServerCall 以记录呼叫状态并跟踪 interceptCallclose。我们希望这会导致记录状态并跟踪收到的每个呼叫的经过时间。

我们发现了一种情况,我们的拦截器在 interceptCall 的主体中登录,然后内部拦截器在其 interceptCall 中进行了一些日志记录,但我们再也没有看到任何日志记录要求。其他上下文表明当时客户端和服务器之间存在连接问题。

我们是否可以期望每个 RPC 调用都会调用 ServerCall::close(Status,Metadata),而不管客户端或连接的不当行为?如果不是,是否还有其他一些我们可能错过的回调表明呼叫有 "died?"

你想要 ServerCall.Listener.onComplete()ServerCall.Listener.onCancel()onComplete()ServerCall.close()处理成功后调用。 onCancel() 用于任何通信错误或取消。请注意,在应用程序调用 ServerCall.close().

之后,可能会收到 onCancel()