我们能否可靠地将每次 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::startCall
的 ServerCall
以记录呼叫状态并跟踪 interceptCall
和 close
。我们希望这会导致记录状态并跟踪收到的每个呼叫的经过时间。
我们发现了一种情况,我们的拦截器在 interceptCall
的主体中登录,然后内部拦截器在其 interceptCall
中进行了一些日志记录,但我们再也没有看到任何日志记录要求。其他上下文表明当时客户端和服务器之间存在连接问题。
我们是否可以期望每个 RPC 调用都会调用 ServerCall::close(Status,Metadata)
,而不管客户端或连接的不当行为?如果不是,是否还有其他一些我们可能错过的回调表明呼叫有 "died?"
你想要 ServerCall.Listener.onComplete()
和 ServerCall.Listener.onCancel()
。 onComplete()
在ServerCall.close()
处理成功后调用。 onCancel()
用于任何通信错误或取消。请注意,在应用程序调用 ServerCall.close()
.
之后,可能会收到 onCancel()
我们有一个自定义 ServerInterceptor
用于记录我们的 grpc-java 服务器收到的每个调用。它用覆盖 close(Status,Metadata)
的 SimpleForwardingServerCall
包装传递给 next::startCall
的 ServerCall
以记录呼叫状态并跟踪 interceptCall
和 close
。我们希望这会导致记录状态并跟踪收到的每个呼叫的经过时间。
我们发现了一种情况,我们的拦截器在 interceptCall
的主体中登录,然后内部拦截器在其 interceptCall
中进行了一些日志记录,但我们再也没有看到任何日志记录要求。其他上下文表明当时客户端和服务器之间存在连接问题。
我们是否可以期望每个 RPC 调用都会调用 ServerCall::close(Status,Metadata)
,而不管客户端或连接的不当行为?如果不是,是否还有其他一些我们可能错过的回调表明呼叫有 "died?"
你想要 ServerCall.Listener.onComplete()
和 ServerCall.Listener.onCancel()
。 onComplete()
在ServerCall.close()
处理成功后调用。 onCancel()
用于任何通信错误或取消。请注意,在应用程序调用 ServerCall.close()
.
onCancel()