全部产品
Search
文档中心

Managed Service for OpenTelemetry:Gunakan OpenTelemetry untuk melaporkan data jejak aplikasi C++

更新时间:Jul 02, 2025

Setelah Anda menggunakan OpenTelemetry untuk menginstrumentasi aplikasi dan melaporkan data jejak ke Managed Service for OpenTelemetry, Managed Service for OpenTelemetry mulai memantau aplikasi. Anda dapat melihat data pemantauan aplikasi seperti topologi aplikasi, jejak, transaksi abnormal, transaksi lambat, dan analisis SQL. Topik ini menjelaskan cara menggunakan OpenTelemetry SDK untuk C++ untuk menginstrumentasi aplikasi C++ dan melaporkan data jejak aplikasi C++.

Prasyarat

Untuk mendapatkan titik akhir Managed Service for OpenTelemetry, ikuti langkah-langkah berikut:

  1. Masuk ke Konsol Managed Service for OpenTelemetry.

  2. Di bilah navigasi sisi kiri, klik Cluster Configurations. Di halaman yang muncul, klik tab Access point information.

  3. Di bilah navigasi atas, pilih wilayah. Di bagian Cluster Information, aktifkan Show Token.

  4. Atur parameter Client ke OpenTelemetry.

    Dapatkan titik akhir Managed Service for OpenTelemetry di kolom Related Information pada tabel di bagian bawah.OT接入点信息

    Catatan

    Jika aplikasi Anda diterapkan di lingkungan produksi Alibaba Cloud, gunakan titik akhir Virtual Private Cloud (VPC). Jika tidak, gunakan titik akhir publik.

Kode contoh

Unduh contoh kode di halaman cpp-demo.

Persyaratan lingkungan

  • C++ 11 atau versi lebih baru telah diinstal.

  • Anda dapat memperoleh versi C++ yang didukung dan platform pengembangan di halaman opentelemetry-cpp.

Langkah 1: Persiapkan lingkungan

  1. Opsional. Buat gambar Docker di lingkungan C++.

    docker pull gcc # Gambar menggunakan sistem Debian.
    docker run -it --name otel-cpp-demo gcc bash
  2. Instal dependensi berikut:

    • protobuf

    • gRPC

    apt-get update
    apt-get install sudo
    
    sudo apt-get install git cmake g++ libcurl4-openssl-dev
    # Instal dependensi protobuf.
    sudo apt-get install protobuf-compiler libprotobuf-dev
    # Instal dependensi grpc.
    sudo apt-get install -y libgrpc++-dev libgrpc-dev protobuf-compiler-grpc

Langkah 2: Instal pustaka OpenTelemetry C++

git clone --recurse-submodules https://github.com/open-telemetry/opentelemetry-cpp

cd opentelemetry-cpp
mkdir build && cd build
cmake -DBUILD_TESTING=OFF -DWITH_OTLP_GRPC=ON -DWITH_OTLP_HTTP=ON ..

cmake --build . --target all

# Instal pustaka OpenTelemetry C++ ke jalur /usr/local. Kami merekomendasikan untuk menginstal pustaka OpenTelemetry C++ ke jalur ini.
cmake --install . 

# Instal pustaka OpenTelemetry C++ ke jalur tertentu.
# cmake --install . --prefix /opentelemetry-cpp-lib

Langkah 3: Gunakan pustaka OpenTelemetry C++ dalam proyek

Laporkan data melalui HTTP

  1. Buat proyek.

    mkdir otel-http-export-demo
    cd otel-http-export-demo
  2. Tulis file CMakeLists.txt di proyek.

    cmake_minimum_required(VERSION 3.25.1) # Versi CMake.
    project(otel-http-export-demo) # Nama proyek.
    
    add_executable(otel-http-export-demo http_exporter.cc) # Nama proyek dan file utama.
    
    find_package(opentelemetry-cpp CONFIG REQUIRED)
    find_package(protobuf)
    find_package(gRPC)
    find_package(CURL)
    find_package(nlohmann_json)
    
    include_directories("${OPENTELEMETRY_CPP_INCLUDE_DIRS}")
    
    target_link_libraries(
        opentelemetry_trace
        opentelemetry_common
        opentelemetry_http_client_curl
        opentelemetry_exporter_otlp_http
        opentelemetry_exporter_otlp_grpc
        opentelemetry_exporter_otlp_http_client
        opentelemetry_otlp_recordable
        opentelemetry_resources
    )
  3. Tulis demo.

    Contoh kode hanya berisi satu file http_exporter.cc.

    Ganti ${ServiceName} dengan nama aplikasi Anda dan ${HostName} dengan nama host Anda.

    // Copyright The OpenTelemetry Authors
    // SPDX-License-Identifier: Apache-2.0
    
    #include "opentelemetry/exporters/otlp/otlp_http_exporter_factory.h"
    #include "opentelemetry/exporters/otlp/otlp_http_exporter_options.h"
    #include "opentelemetry/context/propagation/global_propagator.h"
    #include "opentelemetry/context/propagation/text_map_propagator.h"
    #include "opentelemetry/exporters/ostream/span_exporter_factory.h"
    #include "opentelemetry/nostd/shared_ptr.h"
    #include "opentelemetry/sdk/trace/simple_processor_factory.h"
    #include "opentelemetry/sdk/trace/tracer_context.h"
    #include "opentelemetry/sdk/trace/tracer_context_factory.h"
    #include "opentelemetry/sdk/trace/tracer_provider_factory.h"
    #include "opentelemetry/trace/propagation/http_trace_context.h"
    #include "opentelemetry/trace/provider.h"
    #include "opentelemetry/ext/http/client/http_client_factory.h"
    #include "opentelemetry/sdk/resource/semantic_conventions.h"
    #include "opentelemetry/sdk/common/global_log_handler.h"
    
    #include <string>
    
    
    namespace trace     = opentelemetry::trace;
    namespace trace_sdk = opentelemetry::sdk::trace;
    namespace otlp      = opentelemetry::exporter::otlp;
    namespace internal_log = opentelemetry::sdk::common::internal_log;
    namespace resource = opentelemetry::sdk::resource;
    
    namespace nostd = opentelemetry::nostd;
    
    namespace
    {
        opentelemetry::exporter::otlp::OtlpHttpExporterOptions opts;
        void InitTracer()
        {
            // Buat ekspor Protokol OpenTelemetry (OTLP).
            auto exporter  = otlp::OtlpHttpExporterFactory::Create(opts);
            auto processor = trace_sdk::SimpleSpanProcessorFactory::Create(std::move(exporter));
    
            resource::ResourceAttributes attributes = {
                    {resource::SemanticConventions::kServiceName, "${ServiceName}"}, // Nama aplikasi.
                    {resource::SemanticConventions::kHostName, "${HostName}"}
            };
            auto resource = opentelemetry::sdk::resource::Resource::Create(attributes);
    
            std::shared_ptr<opentelemetry::trace::TracerProvider> provider =
                    trace_sdk::TracerProviderFactory::Create(std::move(processor), std::move(resource));
    
            // Set penyedia jejak.
            trace::Provider::SetTracerProvider(provider);
        }
    
        void CleanupTracer()
        {
            std::shared_ptr<opentelemetry::trace::TracerProvider> none;
            trace::Provider::SetTracerProvider(none);
        }
    
        nostd::shared_ptr<trace::Tracer> get_tracer()
        {
            auto provider = trace::Provider::GetTracerProvider();
            return provider->GetTracer("library name to trace", OPENTELEMETRY_SDK_VERSION);
        }
    
        void f1()
        {
            auto scoped_span = trace::Scope(get_tracer()->StartSpan("f1"));
        }
    
        void f2()
        {
            auto scoped_span = trace::Scope(get_tracer()->StartSpan("f2"));
    
            f1();
            f1();
        }
    
        void foo_library()
        {
            auto scoped_span = trace::Scope(get_tracer()->StartSpan("library"));
    
            f2();
        }
    }  // namespace
    
    /*
      Penggunaan:
      - example_otlp_http
      - example_otlp_http <URL>
      - example_otlp_http <URL> <DEBUG>
      - example_otlp_http <URL> <DEBUG> <BIN>
      <DEBUG> = yes|no, untuk mengaktifkan atau menonaktifkan debug konsol
      <BIN> = bin, untuk mengekspor dalam format biner
    */
    int main(int argc, char *argv[])
    {
        if (argc > 1)
        {
            opts.url = argv[1];
            if (argc > 2)
            {
                std::string debug  = argv[2];
                opts.console_debug = debug != "" && debug != "0" && debug != "no";
            }
    
            if (argc > 3)
            {
                std::string binary_mode = argv[3];
                if (binary_mode.size() >= 3 && binary_mode.substr(0, 3) == "bin")
                {
                    opts.content_type = otlp::HttpRequestContentType::kBinary;
                }
            }
        }
    
        if (opts.console_debug)
        {
            internal_log::GlobalLogHandler::SetLogLevel(internal_log::LogLevel::Debug);
        }
    
        InitTracer();
    
        foo_library();
    
        CleanupTracer();
    }
  4. Kompilasi proyek.

    mkdir build && cd build && cmake .. && make
  5. Jalankan proyek.

    ./otel-http-export-demo ${http-endpoint}

    Ganti ${http-endpoint} dengan titik akhir HTTP yang diperoleh di bagian Prasyarat.

    Contoh:

    ./otel-http-export-demo http://tracing-analysis-dc-hz.aliyuncs.com/adapt_xxxxx_xxxxx/api/otlp/traces

Laporkan data melalui gRPC

  1. Buat proyek.

    mkdir otel-grpc-export-demo
    cd otel-grpc-export-demo
  2. Tulis file CMakeLists.txt di proyek.

    cmake_minimum_required(VERSION 3.25.1) # Versi CMake.
    project(otel-grpc-export-demo) # Nama proyek.
    
    add_executable(otel-grpc-export-demo grpc_exporter.cc) # Nama proyek dan file utama.
    
    find_package(opentelemetry-cpp CONFIG REQUIRED)
    find_package(protobuf)
    find_package(gRPC)
    find_package(CURL)
    find_package(nlohmann_json)
    
    include_directories("${OPENTELEMETRY_CPP_INCLUDE_DIRS}")
    
    target_link_libraries(
        otel-grpc-export-demo ${OPENTELEMETRY_CPP_LIBRARIES}
        opentelemetry_trace
        opentelemetry_common
        opentelemetry_http_client_curl
        opentelemetry_exporter_otlp_http
        opentelemetry_exporter_otlp_grpc
        opentelemetry_exporter_otlp_http_client
        opentelemetry_otlp_recordable
        opentelemetry_resources
    )
  3. Tulis demo.

    Kode uji hanya berisi satu file grpc_exporter.cc.

    Ganti ${ServiceName} dengan nama aplikasi Anda dan ${HostName} dengan nama host Anda.

    // Copyright The OpenTelemetry Authors
    // SPDX-License-Identifier: Apache-2.0
    
    #include "opentelemetry/exporters/otlp/otlp_grpc_exporter_factory.h"
    #include "opentelemetry/exporters/otlp/otlp_grpc_exporter_options.h"
    #include "opentelemetry/context/propagation/global_propagator.h"
    #include "opentelemetry/context/propagation/text_map_propagator.h"
    #include "opentelemetry/exporters/ostream/span_exporter_factory.h"
    #include "opentelemetry/nostd/shared_ptr.h"
    #include "opentelemetry/sdk/trace/simple_processor_factory.h"
    #include "opentelemetry/sdk/trace/tracer_context.h"
    #include "opentelemetry/sdk/trace/tracer_context_factory.h"
    #include "opentelemetry/sdk/trace/tracer_provider_factory.h"
    #include "opentelemetry/trace/propagation/http_trace_context.h"
    #include "opentelemetry/trace/provider.h"
    #include "opentelemetry/ext/http/client/http_client_factory.h"
    #include "opentelemetry/sdk/resource/semantic_conventions.h"
    #include "opentelemetry/sdk/common/global_log_handler.h"
    
    #include <string>
    
    
    namespace trace     = opentelemetry::trace;
    namespace trace_sdk = opentelemetry::sdk::trace;
    namespace otlp      = opentelemetry::exporter::otlp;
    namespace internal_log = opentelemetry::sdk::common::internal_log;
    namespace resource = opentelemetry::sdk::resource;
    
    namespace nostd = opentelemetry::nostd;
    
    namespace
    {
        opentelemetry::exporter::otlp::OtlpGrpcExporterOptions opts;
        void InitTracer()
        {
            // Buat ekspor OTLP.
            auto exporter  = otlp::OtlpGrpcExporterFactory::Create(opts);
            auto processor = trace_sdk::SimpleSpanProcessorFactory::Create(std::move(exporter));
    
            resource::ResourceAttributes attributes = {
                    {resource::SemanticConventions::kServiceName, "${ServiceName} "}, // Nama aplikasi.
                    {resource::SemanticConventions::kHostName, "${HostName}"}
            };
            auto resource = opentelemetry::sdk::resource::Resource::Create(attributes);
    
            std::shared_ptr<opentelemetry::trace::TracerProvider> provider =
                    trace_sdk::TracerProviderFactory::Create(std::move(processor), std::move(resource));
    
            // Set penyedia jejak.
            trace::Provider::SetTracerProvider(provider);
        }
    
        void CleanupTracer()
        {
            std::shared_ptr<opentelemetry::trace::TracerProvider> none;
            trace::Provider::SetTracerProvider(none);
        }
    
        nostd::shared_ptr<trace::Tracer> get_tracer()
        {
            auto provider = trace::Provider::GetTracerProvider();
            return provider->GetTracer("library name to trace", OPENTELEMETRY_SDK_VERSION);
        }
    
        void f1()
        {
            auto scoped_span = trace::Scope(get_tracer()->StartSpan("f1"));
        }
    
        void f2()
        {
            auto scoped_span = trace::Scope(get_tracer()->StartSpan("f2"));
    
            f1();
            f1();
        }
    
        void foo_library()
        {
            auto scoped_span = trace::Scope(get_tracer()->StartSpan("library"));
    
            f2();
        }
    }  // namespace
    
    /*
      Penggunaan:
      - example_otlp_grpc
      - example_otlp_grpc <URL> <TOKEN>
    */
    int main(int argc, char *argv[])
    {
        if (argc > 1)
        {
            opts.endpoint = argv[1];
            if (argc > 2)
            {
                opts.metadata.insert(std::pair<std::string, std::string>("authentication",argv[2]));
            }
    
            if (argc > 3)
            {
                opts.use_ssl_credentials         = true;
                opts.ssl_credentials_cacert_path = argv[3];
            }
        }
    
        InitTracer();
    
        foo_library();
    
        CleanupTracer();
    }
  4. Kompilasi proyek.

    mkdir build && cd build && cmake .. && make
  5. Jalankan proyek.

    ./otel-grpc-export-demo ${gRPC-endpoint} ${token}

    Ganti ${gRPC-endpoint} dan ${token} dengan titik akhir gRPC dan token otentikasi yang diperoleh di bagian Prasyarat.

    Contoh:

    ./otel-grpc-export-demo http://tracing-analysis-dc-hz.aliyuncs.com:8090 xxxxx_xxxxxx

Kesalahan umum

Pesan kesalahan berikut mungkin muncul setelah Anda menjalankan demo:

./otel-grpc-export-demo: error while loading shared libraries: libopentelemetry_proto_grpc.so: cannot open shared object file: No such file or directory

Jalankan perintah berikut untuk memodifikasi variabel lingkungan:

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib/

/usr/local/lib menunjukkan jalur tempat demo opentelemetry-cpp diinstal.

Lihat data pemantauan

Di halaman Applications dari Konsol Managed Service for OpenTelemetry, klik nama aplikasi. Di halaman yang muncul, lihat data jejak.