通过Jaeger接入C++ Trace数据

本文介绍通过Jaeger C++ SDK将C++应用的Trace数据接入到日志服务的操作步骤。

前提条件

  • 已创建Trace实例。更多信息,请参见创建Trace实例
  • 已准备相关的开发环境,该环境需支持编译及运行Jaeger C++ SDK。

    • 如果您使用的是CMake编辑器,则其版本需为3.0及以上。

    • 如果您使用的是GCC或G++编辑器,则其版本需为4.9.0及以上。

操作步骤

  1. 下载并编译SDK。

    1. 下载Jaeger C++ SDK

    2. 解压安装包到指定路径。

    3. 进入解压后的指定路径,执行如下命令。

      mkdir build
      cd build
      CXXFLAGS="-Wno-error=deprecated-copy" cmake ..
      make
  2. 编译并运行代码。

    1. 修改examples目录下的App.cpp文件。

      App.cpp文件中的内容替换为如下内容,如下内容表示使用环境变量方式初始化Jaeger。更多信息,请参见jaeger-client-cpp

      #include <iostream>
      #include <jaegertracing/Tracer.h>
      #include <jaegertracing/utils/EnvVariable.h>
      
      namespace {
      
      void setUpTracer()
      {
          const auto serviceName = jaegertracing::utils::EnvVariable::getStringVariable("JAEGER_SERVICE_NAME");
          auto config = jaegertracing::Config();
          config.fromEnv();
          auto tracer = jaegertracing::Tracer::make(
              serviceName, config, jaegertracing::logging::consoleLogger());
          opentracing::Tracer::InitGlobal(
              std::static_pointer_cast<opentracing::Tracer>(tracer));
      }
      
      void tracedSubroutine(const std::unique_ptr<opentracing::Span>& parentSpan)
      {
          auto span = opentracing::Tracer::Global()->StartSpan(
              "tracedSubroutine", { opentracing::ChildOf(&parentSpan->context()) });
      }
      
      void tracedFunction()
      {
          auto span = opentracing::Tracer::Global()->StartSpan("tracedFunction");
          tracedSubroutine(span);
      }
      
      }  // anonymous namespace
      
      int main(int argc, char* argv[])
      {
          setUpTracer();
          tracedFunction();
          // Not strictly necessary to close tracer, but might flush any buffered
          // spans. See more details in opentracing::Tracer::Close() documentation.
          opentracing::Tracer::Global()->Close();
          return 0;
      }
    2. 重新进入build目录。

    3. 执行make命令构建App。

    4. 运行如下代码。

      如下代码中的变量需根据实际情况替换,关于变量的详细说明如下表所示。

      # 如果您需要打印Span,则执行此环境变量export JAEGER_REPORTER_LOG_SPANS=true。
      export JAEGER_SAMPLER_TYPE=const
      export JAEGER_SAMPLER_PARAM=1
      export JAEGER_SERVICE_NAME=${service}
      export JAEGER_PROPAGATION=w3c
      export JAEGER_ENDPOINT="https://${endpoint}/jaeger/api/traces"
      export JAEGER_TAGS=sls.otel.project=${project},sls.otel.instanceid=${instance},sls.otel.akid=${access-key-id},sls.otel.aksecret=${access-key-secret},service.version=${version}
      ./app

      表 1. 变量说明

      变量

      说明

      示例

      ${service}

      服务名。根据您的实际场景取值即可。

      payment

      ${version}

      服务版本号。建议按照va.b.c格式定义。

      v0.1.2

      ${endpoint}

      日志服务Project的接入地址,格式为${project}.${region-endpoint}:Port,其中:

      • ${project}:日志服务Project名称。

      • ${region-endpoint}:日志服务Project所在地域的访问域名,支持公网和阿里云内网(经典网络、VPC)。更多信息,请参见服务入口

      • Port:网络端口,固定为10010。

      说明
      • 如果配置为stdout,即provider.WithTraceExporterEndpoint("stdout"),表示将数据打印到标准输出。

      • 如果配置为空值,表示不上传Trace数据到日志服务。

      test-project.cn-hangzhou.log.aliyuncs.com:10010

      ${project}

      日志服务Project名称。

      test-project

      ${instance}

      Trace服务实例ID。更多信息,请参见创建Trace实例

      test-traces

      ${access-key-id}

      阿里云账号AccessKey ID。

      建议您使用只具备日志服务Project写入权限的RAM用户的AccessKey(包括AccessKey ID和AccessKey Secret)。授予RAM用户向指定Project写入数据权限的具体操作,请参见授权。如何获取AccessKey的具体操作,请参见访问密钥

      ${access-key-secret}

      阿里云账号AccessKey Secret。

      建议您使用只具备日志服务Project写入权限的RAM用户的AccessKey。

后续步骤