我的目标是在服务器收到 gRPC 请求有效负载后立即记录它,然后再执行其他任何操作。
这就是我编写ServerInterceptor实现以尝试记录请求有效负载的方式。
import io.grpc.ForwardingServerCallListener
import io.grpc.Metadata
import io.grpc.ServerCall
import io.grpc.ServerCallHandler
import io.grpc.ServerInterceptor
class RequestLoggingInterceptor(private val shouldLogRequest: Boolean) : ServerInterceptor {
override fun <ReqT : Any, RespT : Any> interceptCall(
call: ServerCall<ReqT, RespT>,
headers: Metadata,
next: ServerCallHandler<ReqT, RespT>
): ServerCall.Listener<ReqT> {
if (!shouldLogRequest) {
return next.startCall(call, headers)
}
val logBuilder = logger.info()
.event(EVENT)
.add("method", call.methodDescriptor.fullMethodName)
logBuilder.log("before forwarding")
return object : ForwardingServerCallListener.SimpleForwardingServerCallListener<ReqT>(next.startCall(call, headers)) {
override fun onMessage(message: ReqT) {
logBuilder
.add("request", message.toString())
.log("after forwarding")
super.onMessage(message)
}
}
}
companion object {
private val logger by LoggerCreator
private const val EVENT = "grpc_request_logging"
}
}
在正常情况下,当一切正常时,主体中的日志记录interceptCall和onMessage方法都会被触发。但是,在意外情况下,例如 gRPC 服务器与之通信的数据库已关闭,onMessage方法中的日志记录不会被触发。
现在,您可以看到我只能访问onMessage方法内的请求负载(或消息)。在此之前如何访问请求有效负载,即在interceptCall?
我检查过的 StackOverflow 问题不能解决我的问题: