文档表明 gRPC 拦截器最常见的应用之一是日志记录。但是,我不知道如何访问
grpcpp
中调用的方法的名称。
这是一个缺失的功能(
grpc::experimental
等等),还是我遗漏了一些东西?
GitHub 问题 #17520 似乎完全解决了我的观点,并通过以下回复结束:
通过拦截API就可以实现你想要的
请参阅https://github.com/grpc/grpc/blob/master/include/grpcpp/impl/codegen/interceptor.h获取文档
在维护者回复时,我在
<grpcpp/support/interceptor.h>
以及grpcpp/impl/codegen/interceptor.h
的版本中都找不到任何内容。
您确实需要使用实验性功能来获取拦截器内的 RPC 名称。以下是我如何在调用 RPC 时打印方法名称:
#include <grpcpp/support/interceptor.h>
#include <grpcpp/support/server_interceptor.h>
#include <string>
class LoggingInterceptor final : public grpc::experimental::Interceptor {
public:
explicit LoggingInterceptor(grpc::experimental::ServerRpcInfo *info) {
const std::string method = info->method();
if (method == "unknown") {
std::cout << "Unimplemented Rpc called" << std::endl;
return;
}
std::cout << "Rpc called : " << method << std::endl;
}
void Intercept(grpc::experimental::InterceptorBatchMethods *methods) override {
methods->Proceed();
}
};
class LoggingInterceptorFactory final : public grpc::experimental::ServerInterceptorFactoryInterface {
public:
grpc::experimental::Interceptor *CreateServerInterceptor(grpc::experimental::ServerRpcInfo *info) override {
return new LoggingInterceptor(info);
}
};
创建 ServerBuilder 时:
std::vector<std::unique_ptr<grpc::experimental::ServerInterceptorFactoryInterface>> creators;
creators.push_back(std::make_unique<LoggingInterceptorFactory>());
builder.experimental().SetInterceptorCreators(std::move(creators));