实现目标
代码
import com.google.protobuf.Message;
import io.grpc.*;
import net.devh.boot.grpc.client.interceptor.GrpcGlobalClientInterceptor;
import java.util.Optional;
public class GrpcClientGlobalInterceptor implements ClientInterceptor {
private static final Metadata.Key<String> REQUEST_ID =
Metadata.Key.of("request_id", Metadata.ASCII_STRING_MARSHALLER);
private static final Metadata.Key<String> TRACE_ID =
Metadata.Key.of("trace_id", Metadata.ASCII_STRING_MARSHALLER);
@Override
public <ReqT, RespT> ClientCall<ReqT, RespT> interceptCall(
final MethodDescriptor<ReqT, RespT> method, final CallOptions callOptions,
final Channel next) {
final long startTime = System.currentTimeMillis();
return new ForwardingClientCall.SimpleForwardingClientCall<ReqT, RespT>(next.newCall(method, callOptions)) {
ReqT requestMsg = null;
@Override
public void sendMessage(final ReqT message) {
this.requestMsg = message;
super.sendMessage(message);
}
@Override
public void start(final Listener<RespT> responseListener, final Metadata headers) {
headers.put(REQUEST_ID, "");
headers.put(TRACE_ID, "");
super.start(
new ForwardingClientCallListener.SimpleForwardingClientCallListener<RespT>(responseListener) {
@Override
public void onMessage(final RespT message) {
super.onMessage(message);
logGrpc(requestMsg, message, startTime);
}
@Override
public void onHeaders(final Metadata headers) {
super.onHeaders(headers);
}
@Override
public void onClose(final Status status, final Metadata trailers) {
super.onClose(status, trailers);
}
}, headers);
}
};
}
private void logGrpc(final Object req, final Object resp, final Long startTime) {
try {
final long timeCost = System.currentTimeMillis() - startTime;
final String request = Optional.ofNullable(req)
.filter(r -> r instanceof Message)
.map(r -> GrpcFormatUtil.messageToStr((Message) r))
.orElse("null");
final String response = Optional.ofNullable(resp)
.filter(r -> r instanceof Message)
.map(r -> GrpcFormatUtil.messageToStr((Message) r))
.orElse("null");
} catch (final Exception e) {
}
}
}
@Configuration(proxyBeanMethods = false)
public class GlobalInterceptorConfiguration {
@GrpcGlobalClientInterceptor
LogGrpcInterceptor logClientInterceptor() {
return new LogGrpcInterceptor();
}
}