【发布时间】:2019-09-26 15:02:57
【问题描述】:
我正在尝试创建一个ServerInterceptor 来审核对 gRPC API 的所有调用。我想为每次调用 API 组合一个具有如下所示结构的对象。这些调用都是一元调用——一个简单的请求和响应。
public class ApiAudit {
private Map<String, String> headers;
private long processTime;
private String api;
private String protocol;
private String requestBody;
private String responseBody;
private int responseCode;
private String errorMessage;
private boolean isDeprecated;
}
我的挑战是似乎没有一个地方可以收集这些信息。例如,如果这是一个 REST API,我可以创建一个过滤器,该过滤器可以访问请求和响应对象,其中包含所有标头等,并且可以将过滤器链调用包装在 try/catch 中以确定是否存在错误等。但是,对于 gRPC,所有这些不同的部分都有些脱节。标头在ServerInterceptor#interceptCall 方法中接收,如果我创建SimpleForwardingServerCallListener 并覆盖onMessage 方法,则可以访问请求对象,如果我创建SimpleForwardingServerCall 并覆盖sendMessage 对象,则可以访问响应对象,我可以覆盖SimpleForwardingServerCallListener 中的onHalfComplete 方法并将调用包装在try/catch 中以确定调用是否成功。如何将所有这些信息放在一个对象中,以单行形式写入日志或存储在审计数据库中?
【问题讨论】: