Description
I am getting below link error while compiling opentelemetry-cpp
/usr/bin/ld: CMakeFiles/MyTelemetryProject.dir/main.cpp.o: in function InitMetrics()': main.cpp:(.text+0x17): undefined reference to
opentelemetry::v1::exporter::otlp::OtlpGrpcMetricExporterOptions::OtlpGrpcMetricExporterOptions()'
/usr/bin/ld: main.cpp:(.text+0x4b): undefined reference to opentelemetry::v1::exporter::otlp::OtlpGrpcMetricExporterFactory::Create(opentelemetry::v1::exporter::otlp::OtlpGrpcMetricExporterOptions const&)' /usr/bin/ld: main.cpp:(.text+0x28d): undefined reference to
opentelemetry::v1::exporter::otlp::OtlpGrpcMetricExporterOptions::~OtlpGrpcMetricExporterOptions()'
source code:
#include
#include
#include
#include
#include "opentelemetry/sdk/metrics/meter_provider_factory.h"
#include "opentelemetry/sdk/metrics/meter_context_factory.h"
#include "opentelemetry/sdk/metrics/export/periodic_exporting_metric_reader_factory.h"
#include "opentelemetry/exporters/otlp/otlp_grpc_metric_exporter_factory.h"
#include "opentelemetry/exporters/otlp/otlp_grpc_metric_exporter_options.h"
#include "opentelemetry/metrics/provider.h"
namespace metric_sdk = opentelemetry::sdk::metrics;
namespace metrics_api = opentelemetry::metrics;
namespace otlp = opentelemetry::exporter::otlp;
void InitMetrics()
{
// Configure OTLP gRPC exporter
otlp::OtlpGrpcMetricExporterOptions opts;
opts.endpoint = "localhost:4317"; // Change if your collector is remote
opts.use_ssl_credentials = false; // Set to true and configure certs if using TLS
auto exporter = otlp::OtlpGrpcMetricExporterFactory::Create(opts);
// Configure periodic metric reader
metric_sdk::PeriodicExportingMetricReaderOptions reader_options;
reader_options.export_interval_millis = std::chrono::milliseconds(1000);
reader_options.export_timeout_millis = std::chrono::milliseconds(500);
auto reader = metric_sdk::PeriodicExportingMetricReaderFactory::Create(std::move(exporter), reader_options);
// Create MeterContext and MeterProvider
auto context = metric_sdk::MeterContextFactory::Create();
context->AddMetricReader(std::move(reader));
auto provider = metric_sdk::MeterProviderFactory::Create(std::move(context));
//metrics_api::Provider::SetMeterProvider(provider);
auto std_shared_provider = std::shared_ptr<metrics_api::MeterProvider>(std::move(provider));
metrics_api::Provider::SetMeterProvider(opentelemetry::nostd::shared_ptr<metrics_api::MeterProvider>(std_shared_provider));
}
int main()
{
InitMetrics();
// Get a meter and create a counter
auto meter = metrics_api::Provider::GetMeterProvider()->GetMeter("my_app", "1.0.0");
auto counter = meter->CreateUInt64Counter("my_counter");
// Simulate metric recording
for (int i = 0; i < 10; ++i)
{
counter->Add(1, {{"env", "dev"}});
std::cout << "Metric recorded: my_counter += 1" << std::endl;
std::this_thread::sleep_for(std::chrono::seconds(1));
}
return 0;
}
compiling commands
mkdir build_manual
cd build_manual
cmake ..
make
CMakeList.txt
cmake_minimum_required(VERSION 3.10)
project(MyTelemetryProject)
add_executable(${PROJECT_NAME}
main.cpp
)
set(CMAKE_TOOLCHAIN_FILE "/opt/Anurag/vcpkg/vcpkg/scripts/buildsystems/vcpkg.cmake" CACHE STRING "Vcpkg toolchain file")
set(CMAKE_PREFIX_PATH "${CMAKE_PREFIX_PATH};/opt/vijay/build/vcpkg_installed/x64-linux/share/opentelemetry-cpp;/opt/vijay/build/vcpkg_installed/x64-linux/share/absl;/opt/vijay/build/vcpkg_installed/x64-linux/share/grpc;/opt/vijay/build/vcpkg_installed/x64-linux/share/upb;/opt/vijay/build/vcpkg_installed/x64-linux/share/protobuf;/opt/vijay/build/vcpkg_installed/x64-linux/share/curl;/opt/vijay/build/vcpkg_installed/x64-linux/share/c-ares;/opt/vijay/build/vcpkg_installed/x64-linux/share/re2")
Set Protobuf include and library paths BEFORE find_package
set(Protobuf_INCLUDE_DIR "/opt/vijay/vcpkg_installed/x64-linux/include")
set(Protobuf_LIBRARY "/usr/local/qualys/cloud-agent/lib/libprotobuf.so")
find_package(protobuf REQUIRED)
#find_package(curl REQUIRED)
include_directories(${Protobuf_INCLUDE_DIR})
link_directories(/usr/local/qualys/cloud-agent/lib)
find_package(opentelemetry-cpp CONFIG REQUIRED)
target_link_libraries(${PROJECT_NAME}
PRIVATE
opentelemetry-cpp::sdk
opentelemetry-cpp::otlp_grpc_exporter
opentelemetry-cpp::metrics
${Protobuf_LIBRARY}
#pthread
)