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 的大小限制。无论堆栈跟踪嵌入何处。