grpc 状态未从服务器拦截器发送到客户端
grpc status not sent from server interceptor to client
在 grpc 服务器拦截器中,我想捕获异常并将完整的堆栈跟踪发送给客户端。
public void onHalfClose() {
try {
super.onHalfClose();
} catch (Exception ex) {
handleException(ex);
throw ex;
}
}
private void handleException(Exception exception) {
var status = Status.fromThrowable(exception);
// status.cause has the full stack trace now
// Add requestHeaders with new metadata.
call.close(status, requestHeaders);
}
在client-side上,我有一个ClientInterceptor
,它拦截了OnClose()
@Override
public void onClose(Status status, Metadata requestHeaders) {
// status is different, requestHeaders include the added info
super.onClose(status, requestHeaders);
}
我可以收到 header,但不能收到状态。我可以将整个堆栈跟踪作为字符串复制到 header 之一,但它存在 header 8K 大小限制的问题,这对于我在应用程序中获得的超长堆栈跟踪来说是不够的.
Status
的原因被删除并 not serialized and sent 给客户端。仅发送状态代码及其描述。所以你永远不会收到堆栈跟踪。
如果您想保留它并将其发送到客户端,您可以使用堆栈跟踪字符串 (Status.augmentDescription
) 来扩充状态描述。
但无论如何,所有的状态信息都在响应尾部序列化,需要符合 8 KB 的大小限制。无论堆栈跟踪嵌入何处。
在 grpc 服务器拦截器中,我想捕获异常并将完整的堆栈跟踪发送给客户端。
public void onHalfClose() {
try {
super.onHalfClose();
} catch (Exception ex) {
handleException(ex);
throw ex;
}
}
private void handleException(Exception exception) {
var status = Status.fromThrowable(exception);
// status.cause has the full stack trace now
// Add requestHeaders with new metadata.
call.close(status, requestHeaders);
}
在client-side上,我有一个ClientInterceptor
,它拦截了OnClose()
@Override
public void onClose(Status status, Metadata requestHeaders) {
// status is different, requestHeaders include the added info
super.onClose(status, requestHeaders);
}
我可以收到 header,但不能收到状态。我可以将整个堆栈跟踪作为字符串复制到 header 之一,但它存在 header 8K 大小限制的问题,这对于我在应用程序中获得的超长堆栈跟踪来说是不够的.
Status
的原因被删除并 not serialized and sent 给客户端。仅发送状态代码及其描述。所以你永远不会收到堆栈跟踪。
如果您想保留它并将其发送到客户端,您可以使用堆栈跟踪字符串 (Status.augmentDescription
) 来扩充状态描述。
但无论如何,所有的状态信息都在响应尾部序列化,需要符合 8 KB 的大小限制。无论堆栈跟踪嵌入何处。