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
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
Opsional. Buat gambar Docker di lingkungan C++.
docker pull gcc # Gambar menggunakan sistem Debian. docker run -it --name otel-cpp-demo gcc bashInstal 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-libLangkah 3: Gunakan pustaka OpenTelemetry C++ dalam proyek
Laporkan data melalui HTTP
Buat proyek.
mkdir otel-http-export-demo cd otel-http-export-demoTulis 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 )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(); }Kompilasi proyek.
mkdir build && cd build && cmake .. && makeJalankan 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
Buat proyek.
mkdir otel-grpc-export-demo cd otel-grpc-export-demoTulis 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 )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(); }Kompilasi proyek.
mkdir build && cd build && cmake .. && makeJalankan 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 directoryJalankan 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.
