From e62536c8a813285c2b0f2a0c883f7c4e70017531 Mon Sep 17 00:00:00 2001 From: Douglas Barker Date: Wed, 14 May 2025 15:50:56 -0600 Subject: [PATCH 1/2] poc of an opentelemetry-cpp-contrib projectd with components --- CMakeLists.txt | 76 ++++++++++++++++++++++++ cmake/thirdparty-dependency-config.cmake | 26 ++++++++ exporters/CMakeLists.txt | 12 ++++ exporters/geneva/CMakeLists.txt | 26 ++++---- exporters/user_events/CMakeLists.txt | 70 ++++++++++------------ 5 files changed, 160 insertions(+), 50 deletions(-) create mode 100644 CMakeLists.txt create mode 100644 cmake/thirdparty-dependency-config.cmake create mode 100644 exporters/CMakeLists.txt diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 000000000..cc28100c5 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,76 @@ +# Copyright The OpenTelemetry Authors +# SPDX-License-Identifier: Apache-2.0 + +cmake_minimum_required(VERSION 3.14) + +project(opentelemetry-cpp-contrib VERSION 0.1.0 LANGUAGES CXX) + +# silence CMP0169 deprecation of one-arg Populate() +cmake_policy(SET CMP0169 OLD) + +# Define options for each component in opentelemetry-cpp-contrib +option(WITH_GENEVA "Build with Geneva exporters" ON) +option(WITH_USER_EVENTS "Build with User Events exporters" ON) + +# Set the opentelemetry-cpp provider to use. +# - "fetch" will use the FetchContent module to download the opentelemetry-cpp repo and build in the same build tree +# - "package" will find_package to import the installed opentelemetry-cpp package +set(opentelemetry-cpp_PROVIDER "fetch" CACHE STRING "Provider for opentelemetry-cpp") +set_property(CACHE opentelemetry-cpp_PROVIDER PROPERTY STRINGS "package" "fetch") + +set(OPENTELEMETRY_INSTALL OFF) +set(OPENTELEMETRY_CONTRIB_INSTALL ON) + +include(CTest) +include(GoogleTest) +include(FetchContent) + +# Fetch opentelemetry-cpp: +# This is required for the cmake install functions. +FetchContent_Declare( + opentelemetry-cpp + GIT_REPOSITORY + https://github.com/dbarker/opentelemetry-cpp.git + GIT_TAG + poc_otel_cmake_external_repo_support +) +# Alternatively fetch from an opentelemetry-cpp submodule +# FetchContent_Declare( +# opentelemetry-cpp +# SOURCE_DIR "${PROJECT_SOURCE_DIR}/third_party/opentelemetry-cpp") + +if(opentelemetry-cpp_PROVIDER STREQUAL "package") + find_package(opentelemetry-cpp CONFIG REQUIRED) + FetchContent_Populate(opentelemetry-cpp) +elseif(opentelemetry-cpp_PROVIDER STREQUAL "fetch") + if(WITH_USER_EVENTS) + # User Events needs the otlp_common component. Turn on one of the otlp components (There is no WITH_OTLP_COMMON option) + set(WITH_OTLP_FILE ON) + endif() + + set(OPENTELEMETRY_INSTALL ON) + + # Add opetelemetry-cpp to the build tree + FetchContent_MakeAvailable(opentelemetry-cpp) + + if(WITH_ABI_VERSION_2) + set(OPENTELEMETRY_ABI_VERSION_NO "2") + elseif(WITH_ABI_VERSION_1) + set(OPENTELEMETRY_ABI_VERSION_NO "1") + endif() +endif() + +# Include the opentelemetry-cpp cmake functions to support adding and installing components +include(${opentelemetry-cpp_SOURCE_DIR}/cmake/otel-install-functions.cmake) + +# Add the contrib exporters components to the build tree +add_subdirectory(exporters) + +# install the opentelemetry-cpp-contrib package +if(OPENTELEMETRY_CONTRIB_INSTALL) + # Set the version for the opentelemetry-cpp-contrib package used in the config file template + set(OPENTELEMETRY_VERSION ${PROJECT_VERSION}) + otel_install_cmake_config() + otel_install_components() + otel_install_thirdparty_definitions() +endif() \ No newline at end of file diff --git a/cmake/thirdparty-dependency-config.cmake b/cmake/thirdparty-dependency-config.cmake new file mode 100644 index 000000000..41937fe74 --- /dev/null +++ b/cmake/thirdparty-dependency-config.cmake @@ -0,0 +1,26 @@ +# Copyright The OpenTelemetry Authors +# SPDX-License-Identifier: Apache-2.0 + +#----------------------------------------------------------------------- +# Third party dependencies supported by opentelemetry-cpp-contrib +# Dependencies that must be found with find_dependency() when a user calls find_package(opentelemetry-cpp-contrib ...) +# should be included in this list. +#----------------------------------------------------------------------- +set(OTEL_THIRDPARTY_DEPENDENCIES_SUPPORTED + opentelemetry-cpp + tracepoint +) + +#----------------------------------------------------------------------- +# Third party dependency target namespaces. Defaults to the dependency's project name if not set. +# Only set if the target namespace is different from the project name (these are case sensitive). +# set(OTEL__TARGET_NAMESPACE "") +#----------------------------------------------------------------------- +# set(OTEL_Protobuf_TARGET_NAMESPACE "protobuf") + +#----------------------------------------------------------------------- +# Set the find_dependecy search mode - empty is default. Options: cmake default (empty string ""), "MODULE", or "CONFIG" +# # set(OTEL__SEARCH_MODE "") +#----------------------------------------------------------------------- +set(OTEL_opentelemetry-cpp_SEARCH_MODE "CONFIG") +set(OTEL_tracepoint_SEARCH_MODE "CONFIG") diff --git a/exporters/CMakeLists.txt b/exporters/CMakeLists.txt new file mode 100644 index 000000000..e8b751d22 --- /dev/null +++ b/exporters/CMakeLists.txt @@ -0,0 +1,12 @@ +# Copyright The OpenTelemetry Authors +# SPDX-License-Identifier: Apache-2.0 + +if(WITH_GENEVA) + message(STATUS "Building with Geneva exporters") + add_subdirectory(geneva) +endif() + +if(WITH_USER_EVENTS) + message(STATUS "Building with User Events exporters") + add_subdirectory(user_events) +endif() \ No newline at end of file diff --git a/exporters/geneva/CMakeLists.txt b/exporters/geneva/CMakeLists.txt index 2bca758e3..4d3da3bcd 100644 --- a/exporters/geneva/CMakeLists.txt +++ b/exporters/geneva/CMakeLists.txt @@ -17,7 +17,7 @@ endif() add_definitions(-DHAVE_CONSOLE_LOG) if(MAIN_PROJECT) - find_package(opentelemetry-cpp REQUIRED) + find_package(opentelemetry-cpp REQUIRED COMPONENTS api sdk) endif() include_directories(include) @@ -44,18 +44,13 @@ else() src/exporter.cc src/unix_domain_socket_data_transport.cc) endif() -if(MAIN_PROJECT) - target_include_directories(opentelemetry_exporter_geneva_metrics - PRIVATE ${OPENTELEMETRY_CPP_INCLUDE_DIRS}) - target_link_libraries(opentelemetry_exporter_geneva_metrics - PUBLIC ${OPENTELEMETRY_CPP_LIBRARIES}) -else() - target_link_libraries(opentelemetry_exporter_geneva_metrics - PUBLIC opentelemetry_metrics opentelemetry_resources opentelemetry_common) -endif() +target_link_libraries(opentelemetry_exporter_geneva_metrics + PUBLIC opentelemetry-cpp::metrics) set_target_version(opentelemetry_exporter_geneva_metrics) +set_target_properties(opentelemetry_exporter_geneva_metrics PROPERTIES EXPORT_NAME geneva_metrics_exporter) + if(BUILD_TESTING) if(EXISTS ${CMAKE_BINARY_DIR}/lib/libgtest.a) # Prefer GTest from build tree. GTest is not always working with @@ -90,7 +85,14 @@ if(BUILD_TESTING) TEST_LIST geneva_metrics_exporter_test) endif() -if(OPENTELEMETRY_INSTALL) +if(NOT MAIN_PROJECT) + otel_add_component( + COMPONENT exporters_geneva_metrics + TARGETS opentelemetry_exporter_geneva_metrics + FILES_DIRECTORY include/opentelemetry/exporters/geneva + FILES_DESTINATION include/opentelemetry/exporters + FILES_MATCHING PATTERN "*.h") +elseif(OPENTELEMETRY_INSTALL) install( TARGETS opentelemetry_exporter_geneva_metrics EXPORT "${PROJECT_NAME}-target" @@ -112,7 +114,7 @@ if(WITH_EXAMPLES) if(NOT WIN32) add_executable(stress_test_linux example/stress_test_linux.cc) - find_package(Boost QUIET) + find_package(Boost CONFIG QUIET) if(Boost_FOUND) include_directories(${Boost_INCLUDE_DIRS}) target_compile_definitions(stress_test_linux PRIVATE HAVE_BOOST) diff --git a/exporters/user_events/CMakeLists.txt b/exporters/user_events/CMakeLists.txt index 9d553c3a3..e6bc22c55 100644 --- a/exporters/user_events/CMakeLists.txt +++ b/exporters/user_events/CMakeLists.txt @@ -8,12 +8,11 @@ option(WITH_EXAMPLES "Build example" ON) option(BUILD_TESTING "Build tests" ON) option(BUILD_TRACEPOINTS "Build tracepoints library" ON) -project(opentelemetry-user_events-exporter) +set(MAIN_PROJECT OFF) if(CMAKE_CURRENT_SOURCE_DIR STREQUAL CMAKE_SOURCE_DIR) + project(opentelemetry-user_events-exporter) set(MAIN_PROJECT ON) message(STATUS "${PROJECT_NAME} is main project") -else() - set(MAIN_PROJECT OFF) endif() if(MAIN_PROJECT) @@ -21,7 +20,7 @@ if(MAIN_PROJECT) find_package(Protobuf REQUIRED) find_package(CURL REQUIRED) find_package(nlohmann_json REQUIRED) - find_package(opentelemetry-cpp REQUIRED) + find_package(opentelemetry-cpp CONFIG REQUIRED COMPONENTS api sdk exporters_otlp_common) endif() if(BUILD_TRACEPOINTS) @@ -49,41 +48,27 @@ target_compile_features(opentelemetry_exporter_user_events_logs target_compile_definitions(opentelemetry_exporter_user_events_logs PUBLIC HAVE_CONSOLE_LOG HAVE_LOGS_PREVIEW) -if(MAIN_PROJECT) - target_include_directories(opentelemetry_exporter_user_events_logs - PRIVATE ${OPENTELEMETRY_CPP_INCLUDE_DIRS}) - target_link_libraries(opentelemetry_exporter_user_events_logs - PUBLIC ${OPENTELEMETRY_CPP_LIBRARIES}) -else() - target_link_libraries( +target_link_libraries( opentelemetry_exporter_user_events_logs - PUBLIC opentelemetry_logs opentelemetry_resources opentelemetry_common) -endif() + PUBLIC opentelemetry-cpp::logs opentelemetry-cpp::version) target_link_libraries(opentelemetry_exporter_user_events_logs PUBLIC eventheader-tracepoint tracepoint) set_target_properties(opentelemetry_exporter_user_events_logs - PROPERTIES EXPORT_NAME logs) + PROPERTIES EXPORT_NAME user_events_logs_exporter) add_library(opentelemetry_exporter_user_events_metrics src/metrics_exporter.cc) target_compile_features(opentelemetry_exporter_user_events_metrics PRIVATE cxx_std_17) -if(MAIN_PROJECT) - target_include_directories(opentelemetry_exporter_user_events_metrics - PRIVATE ${OPENTELEMETRY_CPP_INCLUDE_DIRS}) - target_link_libraries( +target_link_libraries( opentelemetry_exporter_user_events_metrics - PUBLIC ${OPENTELEMETRY_CPP_LIBRARIES} tracepoint protobuf::libprotobuf) - # TODO: link to opentelemetry_otlp_recordable -else() - target_link_libraries( - opentelemetry_exporter_user_events_metrics - PUBLIC opentelemetry_metrics opentelemetry_resources opentelemetry_common - opentelemetry_otlp_recordable tracepoint) -endif() + PUBLIC opentelemetry-cpp::metrics opentelemetry-cpp::otlp_recordable tracepoint) + +set_target_properties(opentelemetry_exporter_user_events_metrics + PROPERTIES EXPORT_NAME user_events_metrics_exporter) if(WITH_EXAMPLES) add_executable(user_events_logs example/logs/main.cc @@ -136,15 +121,24 @@ if(WITH_BENCHMARK) opentelemetry_exporter_user_events_logs) endif() -install( - TARGETS opentelemetry_exporter_user_events_logs - EXPORT "${PROJECT_NAME}-target" - RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} - LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} - ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}) - -install( - DIRECTORY include/opentelemetry/exporters/user_events - DESTINATION include/opentelemetry/exporters - FILES_MATCHING - PATTERN "*.h") +if(NOT MAIN_PROJECT) + otel_add_component( + COMPONENT exporters_user_events + TARGETS opentelemetry_exporter_user_events_logs opentelemetry_exporter_user_events_metrics + FILES_DIRECTORY include/opentelemetry/exporters/user_events + FILES_DESTINATION include/opentelemetry/exporters + FILES_MATCHING PATTERN "*.h") +elseif(OPENTELEMETRY_INSTALL) + install( + TARGETS opentelemetry_exporter_user_events_logs + EXPORT "${PROJECT_NAME}-target" + RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} + LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} + ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}) + + install( + DIRECTORY include/opentelemetry/exporters/user_events + DESTINATION include/opentelemetry/exporters + FILES_MATCHING + PATTERN "*.h") +endif() From e881204e23ee3a1c286ebb5717dd97d55052cf1a Mon Sep 17 00:00:00 2001 From: Douglas Barker Date: Thu, 15 May 2025 19:13:08 -0600 Subject: [PATCH 2/2] move testing/benchmark dependencies to top level cmake file. Add contrib specific config.cmake template. Simplify component cmake and remove the MAIN_PROJECT conditionals --- CMakeLists.txt | 68 +++------ cmake/benchmark.cmake | 20 +++ cmake/googletest.cmake | 24 +++ cmake/opentelemetry-cpp.cmake | 38 +++++ .../opentelemetry-cpp-contrib-config.cmake.in | 48 ++++++ exporters/CMakeLists.txt | 4 +- exporters/geneva/CMakeLists.txt | 125 +++++---------- exporters/user_events/CMakeLists.txt | 143 ++++++------------ 8 files changed, 247 insertions(+), 223 deletions(-) create mode 100644 cmake/benchmark.cmake create mode 100644 cmake/googletest.cmake create mode 100644 cmake/opentelemetry-cpp.cmake create mode 100644 cmake/templates/opentelemetry-cpp-contrib-config.cmake.in diff --git a/CMakeLists.txt b/CMakeLists.txt index cc28100c5..7a364abc8 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -5,12 +5,17 @@ cmake_minimum_required(VERSION 3.14) project(opentelemetry-cpp-contrib VERSION 0.1.0 LANGUAGES CXX) -# silence CMP0169 deprecation of one-arg Populate() -cmake_policy(SET CMP0169 OLD) - # Define options for each component in opentelemetry-cpp-contrib -option(WITH_GENEVA "Build with Geneva exporters" ON) -option(WITH_USER_EVENTS "Build with User Events exporters" ON) +option(WITH_COMPONENT_GENEVA "Build with Geneva exporters" ON) +option(WITH_COMPONENT_USER_EVENTS "Build with User Events exporters" ON) + +# Other options for opentelemetry-cpp-contrib +option(OPENTELEMETRY_CONTRIB_INSTALL "Install the opentelemetry-cpp-contrib package" ON) +option(WITH_EXAMPLES "Build example" ON) +option(WITH_BENCHMARK "Build with benchmark" ON) +option(BUILD_TESTING "Build tests" ON) +option(BUILD_TRACEPOINTS "Build tracepoints library" ON) +option(OTELCPP_VERSIONED_LIBS "Whether to generate the versioned shared libs" OFF) # Set the opentelemetry-cpp provider to use. # - "fetch" will use the FetchContent module to download the opentelemetry-cpp repo and build in the same build tree @@ -18,47 +23,26 @@ option(WITH_USER_EVENTS "Build with User Events exporters" ON) set(opentelemetry-cpp_PROVIDER "fetch" CACHE STRING "Provider for opentelemetry-cpp") set_property(CACHE opentelemetry-cpp_PROVIDER PROPERTY STRINGS "package" "fetch") -set(OPENTELEMETRY_INSTALL OFF) -set(OPENTELEMETRY_CONTRIB_INSTALL ON) - -include(CTest) -include(GoogleTest) include(FetchContent) -# Fetch opentelemetry-cpp: -# This is required for the cmake install functions. -FetchContent_Declare( - opentelemetry-cpp - GIT_REPOSITORY - https://github.com/dbarker/opentelemetry-cpp.git - GIT_TAG - poc_otel_cmake_external_repo_support -) -# Alternatively fetch from an opentelemetry-cpp submodule -# FetchContent_Declare( -# opentelemetry-cpp -# SOURCE_DIR "${PROJECT_SOURCE_DIR}/third_party/opentelemetry-cpp") - -if(opentelemetry-cpp_PROVIDER STREQUAL "package") - find_package(opentelemetry-cpp CONFIG REQUIRED) - FetchContent_Populate(opentelemetry-cpp) -elseif(opentelemetry-cpp_PROVIDER STREQUAL "fetch") - if(WITH_USER_EVENTS) - # User Events needs the otlp_common component. Turn on one of the otlp components (There is no WITH_OTLP_COMMON option) - set(WITH_OTLP_FILE ON) - endif() +if(BUILD_TESTING) + include(CTest) + include(GoogleTest) + # Find or Fetch googletest + include(${PROJECT_SOURCE_DIR}/cmake/googletest.cmake) + enable_testing() +endif() - set(OPENTELEMETRY_INSTALL ON) +if(WITH_BENCHMARK) + # Find or Fetch benchmark + include(${PROJECT_SOURCE_DIR}/cmake/benchmark.cmake) +endif() - # Add opetelemetry-cpp to the build tree - FetchContent_MakeAvailable(opentelemetry-cpp) +# Make Threads available +find_package(Threads REQUIRED) - if(WITH_ABI_VERSION_2) - set(OPENTELEMETRY_ABI_VERSION_NO "2") - elseif(WITH_ABI_VERSION_1) - set(OPENTELEMETRY_ABI_VERSION_NO "1") - endif() -endif() +# Find or Fetch opentelemetry-cpp +include(${PROJECT_SOURCE_DIR}/cmake/opentelemetry-cpp.cmake) # Include the opentelemetry-cpp cmake functions to support adding and installing components include(${opentelemetry-cpp_SOURCE_DIR}/cmake/otel-install-functions.cmake) @@ -68,8 +52,6 @@ add_subdirectory(exporters) # install the opentelemetry-cpp-contrib package if(OPENTELEMETRY_CONTRIB_INSTALL) - # Set the version for the opentelemetry-cpp-contrib package used in the config file template - set(OPENTELEMETRY_VERSION ${PROJECT_VERSION}) otel_install_cmake_config() otel_install_components() otel_install_thirdparty_definitions() diff --git a/cmake/benchmark.cmake b/cmake/benchmark.cmake new file mode 100644 index 000000000..ac83966fd --- /dev/null +++ b/cmake/benchmark.cmake @@ -0,0 +1,20 @@ +find_package(benchmark CONFIG QUIET) +if(NOT benchmark_FOUND) + message(STATUS "benchmark not found, fetching...") + FetchContent_Declare( + benchmark + GIT_REPOSITORY + https://github.com/google/benchmark.git + GIT_TAG + 299e5928955cc62af9968370293b916f5130916f #v1.9.3 + ) + FetchContent_MakeAvailable(benchmark) +endif() + +if(NOT benchmark_VERSION) + message(FATAL_ERROR "benchmark version not found") +endif() + +if(NOT TARGET benchmark::benchmark) + message(FATAL_ERROR "benchmark not found") +endif() \ No newline at end of file diff --git a/cmake/googletest.cmake b/cmake/googletest.cmake new file mode 100644 index 000000000..567d97383 --- /dev/null +++ b/cmake/googletest.cmake @@ -0,0 +1,24 @@ +find_package(GTest CONFIG QUIET) +if(NOT GTest_FOUND) + message(STATUS "GTest not found, fetching...") + FetchContent_Declare( + googletest + GIT_REPOSITORY + https://github.com/google/googletest.git + GIT_TAG + 52eb8108c5bdec04579160ae17225d66034bd723 # v1.17.0 + ) + FetchContent_MakeAvailable(googletest) +endif() + +if(NOT GTest_VERSION) + message(FATAL_ERROR "GTest version not found") +endif() + +if(NOT TARGET GTest::gtest) + message(FATAL_ERROR "GTest::gtest not found") +endif() + +if(NOT TARGET GTest::gtest_main) + message(FATAL_ERROR "GTest::gtest_main not found") +endif() diff --git a/cmake/opentelemetry-cpp.cmake b/cmake/opentelemetry-cpp.cmake new file mode 100644 index 000000000..846effac7 --- /dev/null +++ b/cmake/opentelemetry-cpp.cmake @@ -0,0 +1,38 @@ +# Fetch opentelemetry-cpp: +# This is required for the cmake install functions. +FetchContent_Declare( + opentelemetry-cpp + GIT_REPOSITORY + https://github.com/dbarker/opentelemetry-cpp.git + GIT_TAG + poc_otel_cmake_external_repo_support +) + +# Alternatively fetch from an opentelemetry-cpp local src directory +# FetchContent_Declare( +# opentelemetry-cpp +# SOURCE_DIR "/workspaces/opentelemetry-cpp" +# ) + +if(opentelemetry-cpp_PROVIDER STREQUAL "package") + find_package(opentelemetry-cpp CONFIG REQUIRED) + # silence CMP0169 deprecation of one-arg Populate() + cmake_policy(SET CMP0169 OLD) + # Populate the opentelemetry-cpp src to enable using the cmake install functions + FetchContent_Populate(opentelemetry-cpp) +elseif(opentelemetry-cpp_PROVIDER STREQUAL "fetch") + set(OPENTELEMETRY_INSTALL ${OPENTELEMETRY_CONTRIB_INSTALL}) + # If user events is enabled, set the otlp file to ON to make the otlp_recordable target available + if(WITH_COMPONENT_USER_EVENTS) + set(WITH_OTLP_FILE ON) + endif() + # Add opetelemetry-cpp src to the build tree + FetchContent_MakeAvailable(opentelemetry-cpp) + get_target_property(opentelemetry-cpp_VERSION opentelemetry-cpp::api INTERFACE_OPENTELEMETRY_VERSION) + get_target_property(OPENTELEMETRY_ABI_VERSION_NO opentelemetry-cpp::api INTERFACE_OPENTELEMETRY_ABI_VERSION_NO) +endif() + +message(STATUS "opentelemetry-cpp PROVIDER: ${opentelemetry-cpp_PROVIDER}") +message(STATUS "opentelemetry-cpp SOURCE_DIR: ${opentelemetry-cpp_SOURCE_DIR}") +message(STATUS "opentelemetry-cpp VERSION: ${opentelemetry-cpp_VERSION}") +message(STATUS "opentelemetry-cpp ABI_VERSION_NO: ${OPENTELEMETRY_ABI_VERSION_NO}") diff --git a/cmake/templates/opentelemetry-cpp-contrib-config.cmake.in b/cmake/templates/opentelemetry-cpp-contrib-config.cmake.in new file mode 100644 index 000000000..39f4e9f64 --- /dev/null +++ b/cmake/templates/opentelemetry-cpp-contrib-config.cmake.in @@ -0,0 +1,48 @@ +# Copyright The OpenTelemetry Authors +# SPDX-License-Identifier: Apache-2.0 + +#.rst: +# opentelemetry-cpp-contrib-config.cmake +# -------- +# Finding opentelemetry-cpp-contrib in CMake projects +# ======================================== +# +# - find_package(opentelemetry-cpp-contrib CONFIG REQUIRED) to import all installed targets and dependencies +# - find_package(opentelemetry-cpp-contrib CONFIG COMPONENTS ...) to import specific components' targets and dependencies +# + +@PACKAGE_INIT@ + +# Include the opentelemetry-cpp cmake functions file that includes component defintions, thirdparty definitons and functions to support finding this package and dependencies. +include("${CMAKE_CURRENT_LIST_DIR}/find-package-support-functions.cmake") + +set(_INSTALLED_COMPONENTS "") +get_installed_components(_INSTALLED_COMPONENTS) + +set(OPENTELEMETRY_CPP_CONTRIB_COMPONENTS_INSTALLED ${_INSTALLED_COMPONENTS} CACHE STRING "opentelemetry-cpp-contrib components installed" FORCE) + +set(_REQUESTED_COMPONENTS "") +get_requested_components(_INSTALLED_COMPONENTS _REQUESTED_COMPONENTS) + +find_required_dependencies(_REQUESTED_COMPONENTS) + +# include the target files selected and set the component found flag +foreach(_COMPONENT IN LISTS _REQUESTED_COMPONENTS) + include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@-${_COMPONENT}-target.cmake") + set(${CMAKE_FIND_PACKAGE_NAME}_${_COMPONENT}_FOUND TRUE + CACHE BOOL "whether ${CMAKE_FIND_PACKAGE_NAME} component ${_COMPONENT} is found" FORCE) +endforeach() + +# get installed and requested targets +set(_OPENTELEMETRY_CPP_CONTRIB_TARGETS "") +get_targets(_REQUESTED_COMPONENTS _OPENTELEMETRY_CPP_CONTRIB_TARGETS) +check_targets_imported(_OPENTELEMETRY_CPP_CONTRIB_TARGETS) + +# handle the QUIETLY and REQUIRED arguments and set opentelemetry-cpp-contrib_FOUND to +# TRUE +include("FindPackageHandleStandardArgs") +find_package_handle_standard_args( + ${CMAKE_FIND_PACKAGE_NAME} + FOUND_VAR ${CMAKE_FIND_PACKAGE_NAME}_FOUND) + +check_required_components(${CMAKE_FIND_PACKAGE_NAME}) \ No newline at end of file diff --git a/exporters/CMakeLists.txt b/exporters/CMakeLists.txt index e8b751d22..c91308226 100644 --- a/exporters/CMakeLists.txt +++ b/exporters/CMakeLists.txt @@ -1,12 +1,12 @@ # Copyright The OpenTelemetry Authors # SPDX-License-Identifier: Apache-2.0 -if(WITH_GENEVA) +if(WITH_COMPONENT_GENEVA) message(STATUS "Building with Geneva exporters") add_subdirectory(geneva) endif() -if(WITH_USER_EVENTS) +if(WITH_COMPONENT_USER_EVENTS) message(STATUS "Building with User Events exporters") add_subdirectory(user_events) endif() \ No newline at end of file diff --git a/exporters/geneva/CMakeLists.txt b/exporters/geneva/CMakeLists.txt index 4d3da3bcd..9fe771719 100644 --- a/exporters/geneva/CMakeLists.txt +++ b/exporters/geneva/CMakeLists.txt @@ -1,27 +1,3 @@ -cmake_minimum_required(VERSION 3.12) - -# MAIN_PROJECT CHECK determine if fluentd exporter is built as a subproject -# (using add_subdirectory) or if it is the main project -# -set(MAIN_PROJECT OFF) - -if(CMAKE_CURRENT_SOURCE_DIR STREQUAL CMAKE_SOURCE_DIR) - project(opentelemetry-geneva-metrics) - set(MAIN_PROJECT ON) -endif() -option(OTELCPP_VERSIONED_LIBS "Whether to generate the versioned shared libs" - OFF) -if(OTELCPP_VERSIONED_LIBS AND NOT BUILD_SHARED_LIBS) - message(FATAL_ERROR "OTELCPP_VERSIONED_LIBS=ON requires BUILD_SHARED_LIBS=ON") -endif() - -add_definitions(-DHAVE_CONSOLE_LOG) -if(MAIN_PROJECT) - find_package(opentelemetry-cpp REQUIRED COMPONENTS api sdk) -endif() - -include_directories(include) - set(OTEL_GENEVA_EXPORTER_VERSION 1.0.0) set(OTEL_GENEVA_EXPORTER_MAJOR_VERSION 1) @@ -33,80 +9,55 @@ function(set_target_version target_name) endif() endfunction() -# create geneva metrics exporter +add_library(opentelemetry_exporter_geneva_metrics + src/exporter.cc + src/unix_domain_socket_data_transport.cc) + if(WIN32) - add_library( + target_sources( opentelemetry_exporter_geneva_metrics - src/exporter.cc src/etw_data_transport.cc - src/unix_domain_socket_data_transport.cc) -else() - add_library(opentelemetry_exporter_geneva_metrics - src/exporter.cc src/unix_domain_socket_data_transport.cc) + src/etw_data_transport.cc) endif() -target_link_libraries(opentelemetry_exporter_geneva_metrics - PUBLIC opentelemetry-cpp::metrics) - set_target_version(opentelemetry_exporter_geneva_metrics) +target_compile_definitions(opentelemetry_exporter_geneva_metrics PRIVATE HAVE_CONSOLE_LOG) + set_target_properties(opentelemetry_exporter_geneva_metrics PROPERTIES EXPORT_NAME geneva_metrics_exporter) +target_include_directories(opentelemetry_exporter_geneva_metrics + PUBLIC $ + $) + +target_link_libraries(opentelemetry_exporter_geneva_metrics + PUBLIC opentelemetry-cpp::metrics) + if(BUILD_TESTING) - if(EXISTS ${CMAKE_BINARY_DIR}/lib/libgtest.a) - # Prefer GTest from build tree. GTest is not always working with - # CMAKE_PREFIX_PATH - set(GTEST_INCLUDE_DIRS - ${CMAKE_CURRENT_SOURCE_DIR}/third_party/googletest/googletest/include - ${CMAKE_CURRENT_SOURCE_DIR}/third_party/googletest/googlemock/include) - set(GTEST_BOTH_LIBRARIES - ${CMAKE_BINARY_DIR}/lib/libgtest.a - ${CMAKE_BINARY_DIR}/lib/libgtest_main.a - ${CMAKE_BINARY_DIR}/lib/libgmock.a) - else() - find_package(GTest REQUIRED) - endif() - include_directories(SYSTEM ${GTEST_INCLUDE_DIRS}) - include_directories(SYSTEM test/decoder) - enable_testing() - include(GoogleTest) # build geneva metrics tests - add_compile_definitions(KS_STR_ENCODING_NONE) add_executable( geneva_metrics_exporter_test - test/metrics_exporter_test.cc test/decoder/ifx_metrics_bin.cpp + test/metrics_exporter_test.cc + test/decoder/ifx_metrics_bin.cpp test/decoder/kaitai/kaitaistream.cpp) + + target_include_directories(geneva_metrics_exporter_test PRIVATE + test/common + test/decoder) + target_link_libraries( - geneva_metrics_exporter_test ${GTEST_BOTH_LIBRARIES} - ${CMAKE_THREAD_LIBS_INIT} opentelemetry_exporter_geneva_metrics) + geneva_metrics_exporter_test PRIVATE + opentelemetry_exporter_geneva_metrics + GTest::gtest GTest::gtest_main + Threads::Threads) + target_compile_definitions(geneva_metrics_exporter_test PRIVATE KS_STR_ENCODING_NONE) + gtest_add_tests( TARGET geneva_metrics_exporter_test - TEST_PREFIX exporter. + TEST_PREFIX geneva. TEST_LIST geneva_metrics_exporter_test) endif() -if(NOT MAIN_PROJECT) - otel_add_component( - COMPONENT exporters_geneva_metrics - TARGETS opentelemetry_exporter_geneva_metrics - FILES_DIRECTORY include/opentelemetry/exporters/geneva - FILES_DESTINATION include/opentelemetry/exporters - FILES_MATCHING PATTERN "*.h") -elseif(OPENTELEMETRY_INSTALL) - install( - TARGETS opentelemetry_exporter_geneva_metrics - EXPORT "${PROJECT_NAME}-target" - RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} - LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} - ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}) - - install( - DIRECTORY include/opentelemetry/exporters/geneva - DESTINATION include/opentelemetry/exporters - FILES_MATCHING - PATTERN "*.h") -endif() - if(WITH_EXAMPLES) add_executable(example_metrics example/example_metrics.cc example/foo_library.cc) @@ -114,15 +65,19 @@ if(WITH_EXAMPLES) if(NOT WIN32) add_executable(stress_test_linux example/stress_test_linux.cc) - find_package(Boost CONFIG QUIET) + target_link_libraries(stress_test_linux opentelemetry_exporter_geneva_metrics) + + find_package(Boost CONFIG QUIET COMPONENTS system uuid) if(Boost_FOUND) - include_directories(${Boost_INCLUDE_DIRS}) target_compile_definitions(stress_test_linux PRIVATE HAVE_BOOST) + target_link_libraries(stress_test_linux PRIVATE Boost::uuid) endif() - target_link_libraries(stress_test_linux opentelemetry_exporter_geneva_metrics) endif() endif() -if(MAIN_PROJECT AND BUILD_PACKAGE) - include(cmake/package.cmake) - include(CPack) -endif() + +otel_add_component( + COMPONENT exporters_geneva_metrics + TARGETS opentelemetry_exporter_geneva_metrics + FILES_DIRECTORY include/opentelemetry/exporters/geneva + FILES_DESTINATION include/opentelemetry/exporters + FILES_MATCHING PATTERN "*.h") \ No newline at end of file diff --git a/exporters/user_events/CMakeLists.txt b/exporters/user_events/CMakeLists.txt index e6bc22c55..90f784e8f 100644 --- a/exporters/user_events/CMakeLists.txt +++ b/exporters/user_events/CMakeLists.txt @@ -1,144 +1,101 @@ -cmake_minimum_required(VERSION 3.12) - if(WIN32) message(FATAL_ERROR "user_events exporter is Linux only for now") endif() -option(WITH_EXAMPLES "Build example" ON) -option(BUILD_TESTING "Build tests" ON) -option(BUILD_TRACEPOINTS "Build tracepoints library" ON) - -set(MAIN_PROJECT OFF) -if(CMAKE_CURRENT_SOURCE_DIR STREQUAL CMAKE_SOURCE_DIR) - project(opentelemetry-user_events-exporter) - set(MAIN_PROJECT ON) - message(STATUS "${PROJECT_NAME} is main project") -endif() - -if(MAIN_PROJECT) - # TODO: cleanup the dependent packages - find_package(Protobuf REQUIRED) - find_package(CURL REQUIRED) - find_package(nlohmann_json REQUIRED) - find_package(opentelemetry-cpp CONFIG REQUIRED COMPONENTS api sdk exporters_otlp_common) -endif() - -if(BUILD_TRACEPOINTS) - set(ORIGINAL_BUILD_SAMPLES ${BUILD_SAMPLES}) - set(ORIGINAL_BUILD_TOOLS ${BUILD_TOOLS}) - - # don't build samples and tools from LinuxTracepoints. +function (add_LinuxTracepoints) + FetchContent_Declare( + LinuxTracepoints + SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/third_party/LinuxTracepoints + ) set(BUILD_SAMPLES OFF) set(BUILD_TOOLS OFF) - add_subdirectory(third_party/LinuxTracepoints) + FetchContent_MakeAvailable(LinuxTracepoints) +endfunction() - # Restore original values - set(BUILD_SAMPLES ${ORIGINAL_BUILD_SAMPLES}) - set(BUILD_TOOLS ${ORIGINAL_BUILD_TOOLS}) +if(BUILD_TRACEPOINTS) + add_LinuxTracepoints() endif() -include_directories(include) - add_library(opentelemetry_exporter_user_events_logs src/logs_exporter.cc src/recordable.cc src/utils.cc) +set_target_properties(opentelemetry_exporter_user_events_logs + PROPERTIES EXPORT_NAME user_events_logs_exporter) + target_compile_features(opentelemetry_exporter_user_events_logs PRIVATE cxx_std_17) target_compile_definitions(opentelemetry_exporter_user_events_logs PUBLIC HAVE_CONSOLE_LOG HAVE_LOGS_PREVIEW) +target_include_directories(opentelemetry_exporter_user_events_logs + PUBLIC $ + $) + target_link_libraries( opentelemetry_exporter_user_events_logs - PUBLIC opentelemetry-cpp::logs opentelemetry-cpp::version) - -target_link_libraries(opentelemetry_exporter_user_events_logs - PUBLIC eventheader-tracepoint tracepoint) - -set_target_properties(opentelemetry_exporter_user_events_logs - PROPERTIES EXPORT_NAME user_events_logs_exporter) + PUBLIC + opentelemetry-cpp::logs + opentelemetry-cpp::version + eventheader-tracepoint + tracepoint + ) add_library(opentelemetry_exporter_user_events_metrics src/metrics_exporter.cc) target_compile_features(opentelemetry_exporter_user_events_metrics PRIVATE cxx_std_17) -target_link_libraries( - opentelemetry_exporter_user_events_metrics - PUBLIC opentelemetry-cpp::metrics opentelemetry-cpp::otlp_recordable tracepoint) - set_target_properties(opentelemetry_exporter_user_events_metrics PROPERTIES EXPORT_NAME user_events_metrics_exporter) +target_include_directories(opentelemetry_exporter_user_events_metrics + PUBLIC $ + $) + +target_link_libraries( + opentelemetry_exporter_user_events_metrics + PUBLIC + opentelemetry-cpp::metrics + opentelemetry-cpp::otlp_recordable + tracepoint) + if(WITH_EXAMPLES) add_executable(user_events_logs example/logs/main.cc example/logs/foo_library.cc) - target_link_libraries(user_events_logs ${CMAKE_THREAD_LIBS_INIT} - opentelemetry_exporter_user_events_logs) + target_link_libraries(user_events_logs PRIVATE opentelemetry_exporter_user_events_logs) add_executable(user_events_metrics example/metrics/main.cc example/metrics/foo_library.cc) - target_link_libraries(user_events_metrics ${CMAKE_THREAD_LIBS_INIT} - opentelemetry_exporter_user_events_metrics) + target_link_libraries(user_events_metrics PRIVATE opentelemetry_exporter_user_events_metrics) endif() if(BUILD_TESTING) - if(EXISTS ${CMAKE_BINARY_DIR}/lib/libgtest.a) - # Prefer GTest from build tree. GTest is not always working with - # CMAKE_PREFIX_PATH - set(GTEST_INCLUDE_DIRS - ${CMAKE_CURRENT_SOURCE_DIR}/third_party/googletest/googletest/include - ${CMAKE_CURRENT_SOURCE_DIR}/third_party/googletest/googlemock/include) - set(GTEST_BOTH_LIBRARIES - ${CMAKE_BINARY_DIR}/lib/libgtest.a - ${CMAKE_BINARY_DIR}/lib/libgtest_main.a - ${CMAKE_BINARY_DIR}/lib/libgmock.a) - else() - find_package(GTest REQUIRED) - endif() - include_directories(SYSTEM ${GTEST_INCLUDE_DIRS}) - include_directories(SYSTEM test/decoder) - enable_testing() - include(GoogleTest) - # build tests for user_events logs add_executable(user_events_logs_exporter_test test/logs_exporter_test.cc) target_link_libraries( - user_events_logs_exporter_test ${GTEST_BOTH_LIBRARIES} - ${CMAKE_THREAD_LIBS_INIT} opentelemetry_exporter_user_events_logs) + user_events_logs_exporter_test + PRIVATE + opentelemetry_exporter_user_events_logs + Threads::Threads + GTest::gtest GTest::gtest_main) gtest_add_tests( TARGET user_events_logs_exporter_test - TEST_PREFIX exporter. + TEST_PREFIX user_events. TEST_LIST user_events_logs_exporter_test) endif() if(WITH_BENCHMARK) - find_package(benchmark CONFIG REQUIRED) add_executable(user_events_logger_benchmark benchmark/logger_benchmark.cc) target_link_libraries( - user_events_logger_benchmark benchmark::benchmark ${CMAKE_THREAD_LIBS_INIT} - ${CMAKE_THREAD_LIBS_INIT} opentelemetry_logs + user_events_logger_benchmark PRIVATE benchmark::benchmark opentelemetry-cpp::logs opentelemetry_exporter_user_events_logs) endif() - -if(NOT MAIN_PROJECT) - otel_add_component( - COMPONENT exporters_user_events - TARGETS opentelemetry_exporter_user_events_logs opentelemetry_exporter_user_events_metrics - FILES_DIRECTORY include/opentelemetry/exporters/user_events - FILES_DESTINATION include/opentelemetry/exporters - FILES_MATCHING PATTERN "*.h") -elseif(OPENTELEMETRY_INSTALL) - install( - TARGETS opentelemetry_exporter_user_events_logs - EXPORT "${PROJECT_NAME}-target" - RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} - LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} - ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}) - - install( - DIRECTORY include/opentelemetry/exporters/user_events - DESTINATION include/opentelemetry/exporters - FILES_MATCHING - PATTERN "*.h") -endif() + +otel_add_component( + COMPONENT exporters_user_events + TARGETS opentelemetry_exporter_user_events_logs opentelemetry_exporter_user_events_metrics + FILES_DIRECTORY include/opentelemetry/exporters/user_events + FILES_DESTINATION include/opentelemetry/exporters + FILES_MATCHING PATTERN "*.h") + \ No newline at end of file