gpt4 book ai didi

java - 在 Java 中审计 gRPC 调用

转载 作者:行者123 更新时间:2023-11-30 12:02:55 25 4
gpt4 key购买 nike

我正在尝试创建一个 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,我可以创建一个过滤器,它可以访问包含所有 header 等的请求和响应对象,并且可以将过滤器链调用包装在 try/catch 中以确定是否有一个错误等。但是,对于 gRPC,所有这些不同的部分都有些脱节。 header 在 ServerInterceptor#interceptCall 中接收方法,如果我创建一个 SimpleForwardingServerCallListener 请求对象是可访问的并覆盖 onMessage方法,如果我创建一个 SimpleForwardingServerCall 响应对象是可访问的并覆盖 sendMessage对象,我可以覆盖 onHalfComplete SimpleForwardingServerCallListener 中的方法并将调用包装在 try/catch 中以确定调用是否成功。我怎样才能将所有这些信息放在一个对象中,作为一行写入日志或存储在审计数据库中?

最佳答案

您应该覆盖您感兴趣的每个调用,复制出您需要的数据。然后在 onComplete() 内/onCancel()您将数据存储到数据库中。 onComplete()/onCancel()始终是 RPC 的结尾(尽管意识到发送可以在取消之后发生,因为处理取消是活泼的;onCancel() 之后的任何内容都被 grpc 丢弃)。

您将创建一个(转发)ServerCall 和一个(转发)ServerCall.Listener。要将数据存储在“一个地方”,您可以简单地让一个对象引用另一个对象(例如,嵌套类)。

请注意,制作一份 Metadata 的完整副本真的很重要,因为它不是线程安全的对象。

Metadata copy = new Metadata();
copy.merge(headers);
next.interceptCall(call, headers);

关于java - 在 Java 中审计 gRPC 调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58119696/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com