Unable to compile opentelemetry-cpp on linux and getting link error using cmake
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 "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
)
The variable names should be Protobuf_INCLUDE_DIRS and Protobuf_LIBRARIES, not Protobuf_LIBRARY and Protobuf_INCLUDE_DIR. Please see https://cmake.org/cmake/help/latest/module/FindProtobuf.html for more details.
I have updated as suggested. Still getting the same linker error
Instead of setting Protobuf_INCLUDE_DIRS and Protobuf_LIBRARIES, could you please try list(APPEND CMAKE_FIND_ROOT_PATH "/usr/local/qualys/cloud-agent") and list(APPEND CMAKE_PREFIX_PATH "/usr/local/qualys/cloud-agent") ? Or setting set(protobuf_ROOT "/usr/local/qualys/cloud-agent") if CMP0074 is NEW.
I have tried above suggested changes .But still getting the same error
@vijaymbhaskar It looks like a link to opentelemetry-cpp::otlp_grpc_metrics_exporter is missing. That will add the OtlpGrpcMetricExporterFactory and options classes.
With opentelemetry-cpp 1.21.0+ calling find_package(opentelemetry-cpp CONFIG) will also find grpc and protobuf (if the package is built with those dependencies) so you won't need to handle finding and linking protobuf in that case.
As indicated earlier, opentelemetry-cpp::otlp_grpc_metrics_exporter is missing.
Please try to add this library, and post the results if still failing, or close the issue.
This issue was marked as stale due to lack of activity.