如何在gRPC C++拦截器中获取方法名称?

问题描述 投票:0回答:1

文档表明 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
的版本中都找不到任何内容

grpc grpc-c++
1个回答
0
投票

您确实需要使用实验性功能来获取拦截器内的 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));
© www.soinside.com 2019 - 2024. All rights reserved.