全部產品
Search
文件中心

Simple Log Service:通過Jaeger接入C++ Trace資料

更新時間:Oct 25, 2024

本文介紹通過Jaeger C++ SDK將C++應用的Trace資料接入到Log Service的操作步驟。

前提條件

  • 已建立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}

      Log ServiceProject的接入地址,格式為${project}.${region-endpoint}:Port,其中:

      • ${project}:Log ServiceProject名稱。

      • ${region-endpoint}:Log ServiceProject所在地區的訪問網域名稱,支援公網和阿里雲內網(傳統網路、VPC)。更多資訊,請參見服務入口

      • Port:網路連接埠,固定為10010。

      說明
      • 如果配置為stdout,即provider.WithTraceExporterEndpoint("stdout"),表示將資料列印到標準輸出。

      • 如果配置為空白值,表示不上傳Trace資料到Log Service。

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

      ${project}

      Log ServiceProject名稱。

      test-project

      ${instance}

      Trace服務執行個體ID。更多資訊,請參見建立Trace執行個體

      test-traces

      ${access-key-id}

      阿里雲帳號AccessKey ID。

      建議您使用只具備Log ServiceProject寫入許可權的RAM使用者的AccessKey(包括AccessKey ID和AccessKey Secret)。授予RAM使用者向指定Project寫入資料許可權的具體操作,請參見授權。如何擷取AccessKey的具體操作,請參見存取金鑰

      ${access-key-secret}

      阿里雲帳號AccessKey Secret。

      建議您使用只具備Log ServiceProject寫入許可權的RAM使用者的AccessKey。

後續步驟