如何追踪thrift接口的调用过程

       当使用thrift作为一种为外部提供服务的方式,作为一个后端人员,通常会遭遇一个问题,即:前端到底调了我哪些接口?调用的顺序是怎么样的?这个问题很大程度上是在问业务的具体情况,如果对业务非常熟悉,那自然也能猜到具体是调用了那几个接口,但不可能谁都是老员工,并且对于业务细节需要进行确认的时候,我们也需要明确我们猜测的到底对不对,也需要对调用的接口,以及其顺序进行确认,我们可以在每个接口都打印一个日志来确认,但这种方式太low了,笔者这里提供一种通用的方式来打印日志,或者接口的调用信息,如下:

bool FileTransferServiceProcessor::dispatchCall(::apache::thrift::protocol::TProtocol* iprot, ::apache::thrift::protocol::TProtocol* oprot, const std::string& fname, int32_t seqid, void* callContext) {
  ProcessMap::iterator pfn;
  pfn = processMap_.find(fname);
  if (pfn == processMap_.end()) {
    iprot->skip(::apache::thrift::protocol::T_STRUCT);
    iprot->readMessageEnd();
    iprot->getTransport()->readEnd();
    ::apache::thrift::TApplicationException x(::apache::thrift::TApplicationException::UNKNOWN_METHOD, "Invalid method name: '"+fname+"'");
    oprot->writeMessageBegin(fname, ::apache::thrift::protocol::T_EXCEPTION, seqid);
    x.write(oprot);
    oprot->writeMessageEnd();
    oprot->getTransport()->writeEnd();
    oprot->getTransport()->flush();
    return true;
  }
  LOG_WRITE_WARN("Entry %s",fname.c_str());
  (this->*(pfn->second))(seqid, iprot, oprot, callContext);
  LOG_WRITE_WARN("Leave %s",fname.c_str());
  return true;
}

      每个thrift文件都会生成对应的cpp文件(假如是c++),在生成的cpp文件中,有一个dispatchCall函数,这个函数负责分发接口的请求,我们可以在从这个接口下手,

           LOG_WRITE_WARN("Entry %s",fname.c_str());
          (this->*(pfn->second))(seqid, iprot, oprot, callContext);
          LOG_WRITE_WARN("Leave %s",fname.c_str());

        我们可以在接口调用前和调用后,分别打印一次日志,其中,fname变量名即是接口的名称,这样就可以对所有的接口调用情况进行掌握,而不会有遗漏的情况。

猜你喜欢

转载自blog.csdn.net/lyj22/article/details/108269518