diff --git a/INSTALL.md b/INSTALL.md index 25564665ca..1491439167 100644 --- a/INSTALL.md +++ b/INSTALL.md @@ -242,6 +242,8 @@ build configuration. | | opentelemetry-cpp::trace | | | opentelemetry-cpp::metrics | | | opentelemetry-cpp::logs | +| | opentelemetry-cpp::configuration_core (EXPERIMENTAL: Programmatic configuration) | +| **configuration** | opentelemetry-cpp::configuration (EXPERIMENTAL: YAML configuration) | | **ext_common** | opentelemetry-cpp::ext | | **ext_http_curl** | opentelemetry-cpp::http_client_curl | | **ext_dll** | opentelemetry-cpp::opentelemetry_cpp | diff --git a/ci/do_ci.sh b/ci/do_ci.sh index cc825c37f1..a3889e6ba7 100755 --- a/ci/do_ci.sh +++ b/ci/do_ci.sh @@ -493,16 +493,11 @@ elif [[ "$1" == "cmake.install.test" ]]; then "ext_http_curl" "exporters_in_memory" "exporters_ostream" - "exporters_ostream_builder" "exporters_otlp_common" "exporters_otlp_file" - "exporters_otlp_file_builder" "exporters_otlp_grpc" - "exporters_otlp_grpc_builder" "exporters_otlp_http" - "exporters_otlp_http_builder" "exporters_prometheus" - "exporters_prometheus_builder" "exporters_elasticsearch" "exporters_zipkin" "resource_detectors" diff --git a/cmake/find-package-support-functions.cmake b/cmake/find-package-support-functions.cmake index f74d029d27..8547f78978 100644 --- a/cmake/find-package-support-functions.cmake +++ b/cmake/find-package-support-functions.cmake @@ -4,6 +4,29 @@ include("${CMAKE_CURRENT_LIST_DIR}/component-definitions.cmake") include("${CMAKE_CURRENT_LIST_DIR}/thirdparty-dependency-definitions.cmake") +#------------------------------------------------------------------------- +# Function to resolve deprecated component names to their aliases. +# Components without an alias are removed from the list +#------------------------------------------------------------------------- +function(resolve_deprecated_components requested_components_inout) + set(_result ${${requested_components_inout}}) + foreach(_COMPONENT IN LISTS ${requested_components_inout}) + if(${_COMPONENT} IN_LIST OTEL_DEPRECATED_COMPONENTS_LIST) + set(_alias_var "COMPONENT_${_COMPONENT}_DEPRECATED_ALIAS") + if(DEFINED ${_alias_var}) + message(DEPRECATION "opentelemetry-cpp: component `${_COMPONENT}` is deprecated, use `${${_alias_var}}` instead.") + list(REMOVE_ITEM _result ${_COMPONENT}) + list(APPEND _result ${${_alias_var}}) + else() + message(DEPRECATION "opentelemetry-cpp: component `${_COMPONENT}` is deprecated with no replacement.") + list(REMOVE_ITEM _result ${_COMPONENT}) + endif() + endif() + endforeach() + list(REMOVE_DUPLICATES _result) + set(${requested_components_inout} "${_result}" PARENT_SCOPE) +endfunction() + #------------------------------------------------------------------------- # Function to get installed components. #------------------------------------------------------------------------- @@ -33,7 +56,6 @@ function(get_dependent_components component_in dependent_components_out) set(${dependent_components_out} ${result} PARENT_SCOPE) endfunction() - #------------------------------------------------------------------------- # Function to get requested components. #------------------------------------------------------------------------- @@ -44,8 +66,10 @@ function(get_requested_components installed_components_in requested_components_o message(DEBUG "get_requested_components: No components explicitly requested. Importing all installed components including: ${result}") set(${requested_components_out} ${result} PARENT_SCOPE) else() - message(DEBUG "get_requested_components: Components requested: ${opentelemetry-cpp_FIND_COMPONENTS}") - foreach(_COMPONENT IN LISTS opentelemetry-cpp_FIND_COMPONENTS) + set(REQUESTED_COMPONENTS ${opentelemetry-cpp_FIND_COMPONENTS}) + message(DEBUG "get_requested_components: Components requested: ${REQUESTED_COMPONENTS}") + resolve_deprecated_components(REQUESTED_COMPONENTS) + foreach(_COMPONENT IN LISTS REQUESTED_COMPONENTS) if(NOT ${_COMPONENT} IN_LIST OTEL_BUILT_COMPONENTS_LIST) message(ERROR " get_requested_components: Component `${_COMPONENT}` is not a built component of the opentelemetry-cpp package. Built components include: ${OTEL_BUILT_COMPONENTS_LIST}") return() diff --git a/cmake/otel-install-functions.cmake b/cmake/otel-install-functions.cmake index 109a0ed548..d297958647 100644 --- a/cmake/otel-install-functions.cmake +++ b/cmake/otel-install-functions.cmake @@ -317,28 +317,42 @@ endfunction() #----------------------------------------------------------------------- # otel_add_component: -# Adds a component to the list of components to be installed. A component name and list of targest are required. +# Adds a component to the list of components to be installed. A component name and list of targets are required. # Optional files can be added to the component by specifying a directory, destination and matching pattern. # Each target is assigned to the component and its dependencies are identified based on the LINK_LIBRARIES property. # An alias target is also created for each target in the form of PROJECT_NAME::TARGET_EXPORT_NAME. +# DEPRECATED_NAMES lists old component names that are redirected to this component with a deprecation warning. +# DEPRECATED marks a component that has been fully removed with no replacement (no TARGETS required). # Usage: # otel_add_component( # COMPONENT +# [DEPRECATED_NAMES ...] # TARGETS ... -# FILES_DIRECTORY -# FILES_DESTINATION -# FILES_MATCHING ) +# [FILES_DIRECTORY +# FILES_DESTINATION +# FILES_MATCHING ]) +# otel_add_component( +# COMPONENT +# DEPRECATED) #----------------------------------------------------------------------- function(otel_add_component) - set(optionArgs ) + set(optionArgs DEPRECATED) set(oneValueArgs COMPONENT FILES_DIRECTORY FILES_DESTINATION) - set(multiValueArgs TARGETS FILES_MATCHING) + set(multiValueArgs TARGETS FILES_MATCHING DEPRECATED_NAMES) cmake_parse_arguments(_OTEL_ADD_COMP "${optionArgs}" "${oneValueArgs}" "${multiValueArgs}" "${ARGN}") if(NOT _OTEL_ADD_COMP_COMPONENT) message(FATAL_ERROR "otel_add_component: COMPONENT is required") endif() + if(_OTEL_ADD_COMP_DEPRECATED) + get_property(_deprecated_components DIRECTORY ${PROJECT_SOURCE_DIR} PROPERTY OTEL_DEPRECATED_COMPONENTS_LIST) + list(APPEND _deprecated_components "${_OTEL_ADD_COMP_COMPONENT}") + set_property(DIRECTORY ${PROJECT_SOURCE_DIR} PROPERTY OTEL_DEPRECATED_COMPONENTS_LIST "${_deprecated_components}") + message(DEBUG " DEPRECATED: ${_OTEL_ADD_COMP_COMPONENT} (no replacement)") + return() + endif() + if(NOT _OTEL_ADD_COMP_TARGETS) message(FATAL_ERROR "otel_add_component: TARGETS is required") endif() @@ -378,6 +392,16 @@ function(otel_add_component) FILES_MATCHING ${_OTEL_ADD_COMP_FILES_MATCHING} COMPONENT_DEPENDS ${_COMPONENT_DEPENDS} THIRDPARTY_DEPENDS ${_THIRDPARTY_DEPENDS}) + + foreach(_DEP_NAME IN LISTS _OTEL_ADD_COMP_DEPRECATED_NAMES) + get_property(_deprecated_components DIRECTORY ${PROJECT_SOURCE_DIR} PROPERTY OTEL_DEPRECATED_COMPONENTS_LIST) + list(APPEND _deprecated_components "${_DEP_NAME}") + set_property(DIRECTORY ${PROJECT_SOURCE_DIR} PROPERTY OTEL_DEPRECATED_COMPONENTS_LIST "${_deprecated_components}") + set_property(DIRECTORY ${PROJECT_SOURCE_DIR} + PROPERTY OTEL_COMPONENT_DEPRECATED_ALIAS_${_DEP_NAME} + "${_OTEL_ADD_COMP_COMPONENT}") + message(DEBUG " DEPRECATED_NAME: ${_DEP_NAME} -> ${_OTEL_ADD_COMP_COMPONENT}") + endforeach() endfunction() #----------------------------------------------------------------------- @@ -420,6 +444,22 @@ function(otel_install_components) _otel_populate_component_thirdparty_depends_block(${_COMPONENT} OTEL_COMPONENTS_THIRDPARTY_DEPENDENCIES_BLOCK) endforeach() + message(STATUS "Install DEPRECATED COMPONENTS") + get_property(OTEL_DEPRECATED_COMPONENTS_LIST DIRECTORY ${PROJECT_SOURCE_DIR} PROPERTY OTEL_DEPRECATED_COMPONENTS_LIST) + + set(OTEL_COMPONENTS_DEPRECATED_ALIASES_BLOCK "") + foreach(_DEP_COMP IN LISTS OTEL_DEPRECATED_COMPONENTS_LIST) + get_property(_alias DIRECTORY ${PROJECT_SOURCE_DIR} + PROPERTY OTEL_COMPONENT_DEPRECATED_ALIAS_${_DEP_COMP}) + if(_alias) + message(STATUS " Deprecated COMPONENT ${_DEP_COMP} -> ${_alias}") + string(APPEND OTEL_COMPONENTS_DEPRECATED_ALIASES_BLOCK + "set(COMPONENT_${_DEP_COMP}_DEPRECATED_ALIAS ${_alias})\n") + else() + message(STATUS " Deprecated COMPONENT ${_DEP_COMP} (no replacement)") + endif() + endforeach() + configure_file( "${PROJECT_SOURCE_DIR}/cmake/templates/component-definitions.cmake.in" "${CMAKE_CURRENT_BINARY_DIR}/cmake/component-definitions.cmake" diff --git a/cmake/templates/component-definitions.cmake.in b/cmake/templates/component-definitions.cmake.in index 8430cc90fe..a898ba5e5e 100644 --- a/cmake/templates/component-definitions.cmake.in +++ b/cmake/templates/component-definitions.cmake.in @@ -3,6 +3,17 @@ # Configured from opentelemetry-cpp/cmake/component-definitions.cmake.in +# ---------------------------------------------------------------------- +# Deprecated components +# ---------------------------------------------------------------------- +set(OTEL_DEPRECATED_COMPONENTS_LIST @OTEL_DEPRECATED_COMPONENTS_LIST@) + +# ---------------------------------------------------------------------- +# Deprecated component aliases (deprecated_name -> replacement_name) +# ---------------------------------------------------------------------- + +@OTEL_COMPONENTS_DEPRECATED_ALIASES_BLOCK@ + # ---------------------------------------------------------------------- # opentelmetry-cpp Built COMPONENT list # ---------------------------------------------------------------------- diff --git a/cmake/templates/opentelemetry-cpp-config.cmake.in b/cmake/templates/opentelemetry-cpp-config.cmake.in index 69f77feac9..4a62d36947 100644 --- a/cmake/templates/opentelemetry-cpp-config.cmake.in +++ b/cmake/templates/opentelemetry-cpp-config.cmake.in @@ -72,6 +72,7 @@ # COMPONENTS # api # sdk +# configuration # ext_common # ext_http_curl # ext_dll @@ -88,6 +89,14 @@ # resource_detectors # shims_opentracing # +# DEPRECATED COMPONENTS +# exporters_otlp_builder_utils - targets moved to COMPONENT exporters_otlp_common +# exporters_otlp_file_builder - targets moved to COMPONENT exporters_otlp_file +# exporters_otlp_http_builder - targets moved to COMPONENT exporters_otlp_http +# exporters_otlp_grpc_builder - targets moved to COMPONENT exporters_otlp_grpc +# exporters_ostream_builder - targets moved to COMPONENT exporters_ostream +# exporters_prometheus_builder - targets moved to COMPONENT exporters_prometheus +# -------------------- # :: # # TARGETS @@ -99,6 +108,8 @@ # opentelemetry-cpp::trace - Imported target of COMPONENT sdk # opentelemetry-cpp::metrics - Imported target of COMPONENT sdk # opentelemetry-cpp::logs - Imported target of COMPONENT sdk +# opentelemetry-cpp::configuration_core - Imported target of COMPONENT sdk +# opentelemetry-cpp::configuration - Imported target of COMPONENT configuration # opentelemetry-cpp::ext - Imported target of COMPONENT ext_common # opentelemetry-cpp::http_client_curl - Imported target of COMPONENT ext_http_curl # opentelemetry-cpp::opentelemetry_cpp - Imported target of COMPONENT ext_dll @@ -143,6 +154,7 @@ # - **Protobuf** # - **gRPC** # - **prometheus-cpp** +# - **ryml** # - **OpenTracing** # # **Found using the CMake MODULE search mode:** @@ -214,6 +226,7 @@ endforeach() # TRUE if all variables listed contain valid results, e.g. valid file paths. include("FindPackageHandleStandardArgs") +set(${CMAKE_FIND_PACKAGE_NAME}_FIND_COMPONENTS ${_REQUESTED_COMPONENTS}) set(${CMAKE_FIND_PACKAGE_NAME}_CONFIG ${CMAKE_CURRENT_LIST_FILE}) find_package_handle_standard_args( diff --git a/exporters/ostream/CMakeLists.txt b/exporters/ostream/CMakeLists.txt index 6ca8b7d654..dc3946176a 100644 --- a/exporters/ostream/CMakeLists.txt +++ b/exporters/ostream/CMakeLists.txt @@ -155,29 +155,10 @@ list(APPEND OPENTELEMETRY_OSTREAM_BUILDER_TARGETS otel_add_component( COMPONENT exporters_ostream - TARGETS - ${OPENTELEMETRY_OSTREAM_TARGETS} - FILES_DIRECTORY - "include/opentelemetry/exporters/ostream" - FILES_DESTINATION - "include/opentelemetry/exporters" - FILES_MATCHING - PATTERN - "*.h" - PATTERN - "console_log_record_builder.h" - EXCLUDE - PATTERN - "console_push_metric_builder.h" - EXCLUDE - PATTERN - "console_span_builder.h" - EXCLUDE) - -otel_add_component( - COMPONENT + DEPRECATED_NAMES exporters_ostream_builder TARGETS + ${OPENTELEMETRY_OSTREAM_TARGETS} ${OPENTELEMETRY_OSTREAM_BUILDER_TARGETS} FILES_DIRECTORY "include/opentelemetry/exporters/ostream" @@ -185,11 +166,7 @@ otel_add_component( "include/opentelemetry/exporters" FILES_MATCHING PATTERN - "console_log_record_builder.h" - PATTERN - "console_push_metric_builder.h" - PATTERN - "console_span_builder.h") + "*.h") if(OPENTELEMETRY_INSTALL) opentelemetry_add_pkgconfig( diff --git a/exporters/otlp/CMakeLists.txt b/exporters/otlp/CMakeLists.txt index eef251a1de..9a266cac1a 100644 --- a/exporters/otlp/CMakeLists.txt +++ b/exporters/otlp/CMakeLists.txt @@ -708,9 +708,12 @@ target_link_libraries( otel_add_component( COMPONENT exporters_otlp_common + DEPRECATED_NAMES + exporters_otlp_builder_utils TARGETS opentelemetry_otlp_recordable opentelemetry_proto + opentelemetry_exporter_otlp_builder_utils FILES_DIRECTORY "include/opentelemetry/exporters/otlp" FILES_DESTINATION @@ -719,9 +722,6 @@ otel_add_component( PATTERN "*.h" PATTERN - "otlp_builder_utils*.h" - EXCLUDE - PATTERN "otlp_http*.h" EXCLUDE PATTERN @@ -731,46 +731,14 @@ otel_add_component( "otlp_file*.h" EXCLUDE) -otel_add_component( - COMPONENT - exporter_otlp_builder_utils - TARGETS - opentelemetry_exporter_otlp_builder_utils - FILES_DIRECTORY - "include/opentelemetry/exporters/otlp" - FILES_DESTINATION - "include/opentelemetry/exporters" - FILES_MATCHING - PATTERN - "otlp_builder_utils.h") - if(WITH_OTLP_GRPC) otel_add_component( COMPONENT exporters_otlp_grpc - TARGETS - ${OPENTELEMETRY_OTLP_GRPC_TARGETS} - FILES_DIRECTORY - "include/opentelemetry/exporters/otlp" - FILES_DESTINATION - "include/opentelemetry/exporters" - FILES_MATCHING - PATTERN - "otlp_grpc*.h" - PATTERN - "otlp_grpc_span_builder.h" - EXCLUDE - PATTERN - "otlp_grpc_log_record_builder.h" - EXCLUDE - PATTERN - "otlp_grpc_push_metric_builder.h" - EXCLUDE) - - otel_add_component( - COMPONENT + DEPRECATED_NAMES exporters_otlp_grpc_builder TARGETS + ${OPENTELEMETRY_OTLP_GRPC_TARGETS} ${OPENTELEMETRY_OTLP_GRPC_BUILDER_TARGETS} FILES_DIRECTORY "include/opentelemetry/exporters/otlp" @@ -778,11 +746,7 @@ if(WITH_OTLP_GRPC) "include/opentelemetry/exporters" FILES_MATCHING PATTERN - "otlp_grpc_span_builder.h" - PATTERN - "otlp_grpc_log_record_builder.h" - PATTERN - "otlp_grpc_push_metric_builder.h") + "otlp_grpc*.h") endif() @@ -790,29 +754,10 @@ if(WITH_OTLP_HTTP) otel_add_component( COMPONENT exporters_otlp_http - TARGETS - ${OPENTELEMETRY_OTLP_HTTP_TARGETS} - FILES_DIRECTORY - "include/opentelemetry/exporters/otlp" - FILES_DESTINATION - "include/opentelemetry/exporters" - FILES_MATCHING - PATTERN - "otlp_http*.h" - PATTERN - "otlp_http_span_builder.h" - EXCLUDE - PATTERN - "otlp_http_log_record_builder.h" - EXCLUDE - PATTERN - "otlp_http_push_metric_builder.h" - EXCLUDE) - - otel_add_component( - COMPONENT + DEPRECATED_NAMES exporters_otlp_http_builder TARGETS + ${OPENTELEMETRY_OTLP_HTTP_TARGETS} ${OPENTELEMETRY_OTLP_HTTP_BUILDER_TARGETS} FILES_DIRECTORY "include/opentelemetry/exporters/otlp" @@ -820,11 +765,7 @@ if(WITH_OTLP_HTTP) "include/opentelemetry/exporters" FILES_MATCHING PATTERN - "otlp_http_span_builder.h" - PATTERN - "otlp_http_log_record_builder.h" - PATTERN - "otlp_http_push_metric_builder.h") + "otlp_http*.h") endif() @@ -832,29 +773,10 @@ if(WITH_OTLP_FILE) otel_add_component( COMPONENT exporters_otlp_file - TARGETS - ${OPENTELEMETRY_OTLP_FILE_TARGETS} - FILES_DIRECTORY - "include/opentelemetry/exporters/otlp" - FILES_DESTINATION - "include/opentelemetry/exporters" - FILES_MATCHING - PATTERN - "otlp_file*.h" - PATTERN - "otlp_file_span_builder.h" - EXCLUDE - PATTERN - "otlp_file_log_record_builder.h" - EXCLUDE - PATTERN - "otlp_file_push_metric_builder.h" - EXCLUDE) - - otel_add_component( - COMPONENT + DEPRECATED_NAMES exporters_otlp_file_builder TARGETS + ${OPENTELEMETRY_OTLP_FILE_TARGETS} ${OPENTELEMETRY_OTLP_FILE_BUILDER_TARGETS} FILES_DIRECTORY "include/opentelemetry/exporters/otlp" @@ -862,11 +784,7 @@ if(WITH_OTLP_FILE) "include/opentelemetry/exporters" FILES_MATCHING PATTERN - "otlp_file_span_builder.h" - PATTERN - "otlp_file_log_record_builder.h" - PATTERN - "otlp_file_push_metric_builder.h") + "otlp_file*.h") endif() diff --git a/exporters/prometheus/CMakeLists.txt b/exporters/prometheus/CMakeLists.txt index a5a13c76ee..233033dd44 100644 --- a/exporters/prometheus/CMakeLists.txt +++ b/exporters/prometheus/CMakeLists.txt @@ -48,23 +48,10 @@ target_link_libraries(opentelemetry_exporter_prometheus_builder otel_add_component( COMPONENT exporters_prometheus - TARGETS - opentelemetry_exporter_prometheus - FILES_DIRECTORY - "include/opentelemetry/exporters/prometheus" - FILES_DESTINATION - "include/opentelemetry/exporters" - FILES_MATCHING - PATTERN - "*.h" - PATTERN - "prometheus_pull_builder.h" - EXCLUDE) - -otel_add_component( - COMPONENT + DEPRECATED_NAMES exporters_prometheus_builder TARGETS + opentelemetry_exporter_prometheus opentelemetry_exporter_prometheus_builder FILES_DIRECTORY "include/opentelemetry/exporters/prometheus" @@ -72,7 +59,7 @@ otel_add_component( "include/opentelemetry/exporters" FILES_MATCHING PATTERN - "prometheus_pull_builder.h") + "*.h") if(OPENTELEMETRY_INSTALL) opentelemetry_add_pkgconfig( diff --git a/install/test/cmake/CMakeLists.txt b/install/test/cmake/CMakeLists.txt index dfe569bf8f..caca8ad87f 100644 --- a/install/test/cmake/CMakeLists.txt +++ b/install/test/cmake/CMakeLists.txt @@ -59,6 +59,9 @@ enable_testing() # 3. Test find_package with components specified but missing dependent components # 4. Test find_package with components specified but including # unsupported/unknown components +# 5. Test find_package with components specified but including deprecated +# components +# ----------------------------------------------------------- add_test( NAME cmake-usage-no-components-test @@ -92,6 +95,14 @@ add_test( build-cmake-usage-unsupported-components-test "-DCMAKE_PREFIX_PATH=${CMAKE_PREFIX_PATH}" ${INSTALL_TEST_CMAKE_OPTIONS}) +add_test( + NAME cmake-usage-deprecated-components-test + COMMAND + ${CMAKE_COMMAND} --log-level=DEBUG -S + ${CMAKE_SOURCE_DIR}/usage_tests/deprecated_components -B + build-cmake-usage-deprecated-components-test + "-DCMAKE_PREFIX_PATH=${CMAKE_PREFIX_PATH}" ${INSTALL_TEST_CMAKE_OPTIONS}) + # ----------------------------------------------------------- # Test the full package install using legacy cmake build instructions # find_package(opentelemetry-cpp CONFIG REQUIRED) diff --git a/install/test/cmake/component_tests/configuration/CMakeLists.txt b/install/test/cmake/component_tests/configuration/CMakeLists.txt index 5fef844f18..058abc488c 100644 --- a/install/test/cmake/component_tests/configuration/CMakeLists.txt +++ b/install/test/cmake/component_tests/configuration/CMakeLists.txt @@ -5,7 +5,7 @@ cmake_minimum_required(VERSION 3.16) project(opentelemetry-cpp-configuration-install-test LANGUAGES CXX) find_package(opentelemetry-cpp REQUIRED COMPONENTS configuration - exporters_ostream_builder) + exporters_ostream) if(NOT TARGET Threads::Threads) message(FATAL_ERROR "Threads::Threads target not found") diff --git a/install/test/cmake/component_tests/exporters_ostream/CMakeLists.txt b/install/test/cmake/component_tests/exporters_ostream/CMakeLists.txt index bb510acc3b..76eff0c92b 100644 --- a/install/test/cmake/component_tests/exporters_ostream/CMakeLists.txt +++ b/install/test/cmake/component_tests/exporters_ostream/CMakeLists.txt @@ -16,6 +16,9 @@ target_link_libraries( PRIVATE opentelemetry-cpp::ostream_log_record_exporter opentelemetry-cpp::ostream_metrics_exporter opentelemetry-cpp::ostream_span_exporter + opentelemetry-cpp::ostream_log_record_exporter_builder + opentelemetry-cpp::ostream_metrics_exporter_builder + opentelemetry-cpp::ostream_span_exporter_builder GTest::gtest GTest::gtest_main) diff --git a/install/test/cmake/component_tests/exporters_ostream_builder/CMakeLists.txt b/install/test/cmake/component_tests/exporters_ostream_builder/CMakeLists.txt deleted file mode 100644 index 260a8ba1f9..0000000000 --- a/install/test/cmake/component_tests/exporters_ostream_builder/CMakeLists.txt +++ /dev/null @@ -1,22 +0,0 @@ -# Copyright The OpenTelemetry Authors -# SPDX-License-Identifier: Apache-2.0 - -cmake_minimum_required(VERSION 3.16) -project(opentelemetry-cpp-exporters-ostream-builder-install-test LANGUAGES CXX) - -find_package(opentelemetry-cpp REQUIRED COMPONENTS exporters_ostream_builder) - -find_package(GTest CONFIG REQUIRED) -include(GoogleTest) - -add_executable(exporters_ostream_builder_test - ${INSTALL_TEST_SRC_DIR}/test_exporters_ostream_builder.cc) -target_link_libraries( - exporters_ostream_builder_test - PRIVATE opentelemetry-cpp::ostream_log_record_exporter_builder - opentelemetry-cpp::ostream_metrics_exporter_builder - opentelemetry-cpp::ostream_span_exporter_builder - GTest::gtest - GTest::gtest_main) - -gtest_discover_tests(exporters_ostream_builder_test) diff --git a/install/test/cmake/component_tests/exporters_otlp_file/CMakeLists.txt b/install/test/cmake/component_tests/exporters_otlp_file/CMakeLists.txt index 5886f51a2f..67b0dd135a 100644 --- a/install/test/cmake/component_tests/exporters_otlp_file/CMakeLists.txt +++ b/install/test/cmake/component_tests/exporters_otlp_file/CMakeLists.txt @@ -21,6 +21,9 @@ target_link_libraries( opentelemetry-cpp::otlp_file_exporter opentelemetry-cpp::otlp_file_log_record_exporter opentelemetry-cpp::otlp_file_metric_exporter + opentelemetry-cpp::otlp_file_exporter_builder + opentelemetry-cpp::otlp_file_log_record_exporter_builder + opentelemetry-cpp::otlp_file_metric_exporter_builder GTest::gtest GTest::gtest_main) diff --git a/install/test/cmake/component_tests/exporters_otlp_file_builder/CMakeLists.txt b/install/test/cmake/component_tests/exporters_otlp_file_builder/CMakeLists.txt deleted file mode 100644 index 04af0e3544..0000000000 --- a/install/test/cmake/component_tests/exporters_otlp_file_builder/CMakeLists.txt +++ /dev/null @@ -1,27 +0,0 @@ -# Copyright The OpenTelemetry Authors -# SPDX-License-Identifier: Apache-2.0 - -cmake_minimum_required(VERSION 3.16) -project(opentelemetry-cpp-exporters-otlp-file-builder-install-test - LANGUAGES CXX) - -find_package(opentelemetry-cpp REQUIRED COMPONENTS exporters_otlp_file_builder) - -if(NOT TARGET protobuf::libprotobuf) - message(FATAL_ERROR "protobuf::libprotobuf target not found") -endif() - -find_package(GTest CONFIG REQUIRED) -include(GoogleTest) - -add_executable(exporters_otlp_file_builder_test - ${INSTALL_TEST_SRC_DIR}/test_exporters_otlp_file_builder.cc) -target_link_libraries( - exporters_otlp_file_builder_test - PRIVATE opentelemetry-cpp::otlp_file_exporter_builder - opentelemetry-cpp::otlp_file_log_record_exporter_builder - opentelemetry-cpp::otlp_file_metric_exporter_builder - GTest::gtest - GTest::gtest_main) - -gtest_discover_tests(exporters_otlp_file_builder_test) diff --git a/install/test/cmake/component_tests/exporters_otlp_grpc/CMakeLists.txt b/install/test/cmake/component_tests/exporters_otlp_grpc/CMakeLists.txt index 2494c84342..43fc7728f9 100644 --- a/install/test/cmake/component_tests/exporters_otlp_grpc/CMakeLists.txt +++ b/install/test/cmake/component_tests/exporters_otlp_grpc/CMakeLists.txt @@ -24,6 +24,9 @@ target_link_libraries( PRIVATE opentelemetry-cpp::otlp_grpc_exporter opentelemetry-cpp::otlp_grpc_log_record_exporter opentelemetry-cpp::otlp_grpc_metrics_exporter + opentelemetry-cpp::otlp_grpc_exporter_builder + opentelemetry-cpp::otlp_grpc_log_record_exporter_builder + opentelemetry-cpp::otlp_grpc_metric_exporter_builder GTest::gtest GTest::gtest_main) diff --git a/install/test/cmake/component_tests/exporters_otlp_grpc_builder/CMakeLists.txt b/install/test/cmake/component_tests/exporters_otlp_grpc_builder/CMakeLists.txt deleted file mode 100644 index 1fac7df880..0000000000 --- a/install/test/cmake/component_tests/exporters_otlp_grpc_builder/CMakeLists.txt +++ /dev/null @@ -1,27 +0,0 @@ -# Copyright The OpenTelemetry Authors -# SPDX-License-Identifier: Apache-2.0 - -cmake_minimum_required(VERSION 3.16) -project(opentelemetry-cpp-exporters-otlp-grpc-builder-install-test - LANGUAGES CXX) - -find_package(opentelemetry-cpp REQUIRED COMPONENTS exporters_otlp_grpc_builder) - -if(NOT TARGET protobuf::libprotobuf) - message(FATAL_ERROR "protobuf::libprotobuf target not found") -endif() - -find_package(GTest CONFIG REQUIRED) -include(GoogleTest) - -add_executable(exporters_otlp_grpc_builder_test - ${INSTALL_TEST_SRC_DIR}/test_exporters_otlp_grpc_builder.cc) -target_link_libraries( - exporters_otlp_grpc_builder_test - PRIVATE opentelemetry-cpp::otlp_grpc_exporter_builder - opentelemetry-cpp::otlp_grpc_log_record_exporter_builder - opentelemetry-cpp::otlp_grpc_metric_exporter_builder - GTest::gtest - GTest::gtest_main) - -gtest_discover_tests(exporters_otlp_grpc_builder_test) diff --git a/install/test/cmake/component_tests/exporters_otlp_http/CMakeLists.txt b/install/test/cmake/component_tests/exporters_otlp_http/CMakeLists.txt index 5404611f4c..5f9b42bf02 100644 --- a/install/test/cmake/component_tests/exporters_otlp_http/CMakeLists.txt +++ b/install/test/cmake/component_tests/exporters_otlp_http/CMakeLists.txt @@ -21,6 +21,9 @@ target_link_libraries( opentelemetry-cpp::otlp_http_exporter opentelemetry-cpp::otlp_http_log_record_exporter opentelemetry-cpp::otlp_http_metric_exporter + opentelemetry-cpp::otlp_http_exporter_builder + opentelemetry-cpp::otlp_http_log_record_exporter_builder + opentelemetry-cpp::otlp_http_metric_exporter_builder GTest::gtest GTest::gtest_main) diff --git a/install/test/cmake/component_tests/exporters_otlp_http_builder/CMakeLists.txt b/install/test/cmake/component_tests/exporters_otlp_http_builder/CMakeLists.txt deleted file mode 100644 index 44ba0b879f..0000000000 --- a/install/test/cmake/component_tests/exporters_otlp_http_builder/CMakeLists.txt +++ /dev/null @@ -1,27 +0,0 @@ -# Copyright The OpenTelemetry Authors -# SPDX-License-Identifier: Apache-2.0 - -cmake_minimum_required(VERSION 3.16) -project(opentelemetry-cpp-exporters-otlp-http-builder-install-test - LANGUAGES CXX) - -find_package(opentelemetry-cpp REQUIRED COMPONENTS exporters_otlp_http_builder) - -if(NOT TARGET protobuf::libprotobuf) - message(FATAL_ERROR "protobuf::libprotobuf target not found") -endif() - -find_package(GTest CONFIG REQUIRED) -include(GoogleTest) - -add_executable(exporters_otlp_http_builder_test - ${INSTALL_TEST_SRC_DIR}/test_exporters_otlp_http_builder.cc) -target_link_libraries( - exporters_otlp_http_builder_test - PRIVATE opentelemetry-cpp::otlp_http_exporter_builder - opentelemetry-cpp::otlp_http_log_record_exporter_builder - opentelemetry-cpp::otlp_http_metric_exporter_builder - GTest::gtest - GTest::gtest_main) - -gtest_discover_tests(exporters_otlp_http_builder_test) diff --git a/install/test/cmake/component_tests/exporters_prometheus/CMakeLists.txt b/install/test/cmake/component_tests/exporters_prometheus/CMakeLists.txt index 2192b6ff46..7af06ab04d 100644 --- a/install/test/cmake/component_tests/exporters_prometheus/CMakeLists.txt +++ b/install/test/cmake/component_tests/exporters_prometheus/CMakeLists.txt @@ -16,7 +16,9 @@ include(GoogleTest) add_executable(exporters_prometheus_test ${INSTALL_TEST_SRC_DIR}/test_exporters_prometheus.cc) target_link_libraries( - exporters_prometheus_test PRIVATE opentelemetry-cpp::prometheus_exporter - GTest::gtest GTest::gtest_main) + exporters_prometheus_test + PRIVATE opentelemetry-cpp::prometheus_exporter + opentelemetry-cpp::prometheus_exporter_builder GTest::gtest + GTest::gtest_main) gtest_discover_tests(exporters_prometheus_test) diff --git a/install/test/cmake/component_tests/exporters_prometheus_builder/CMakeLists.txt b/install/test/cmake/component_tests/exporters_prometheus_builder/CMakeLists.txt deleted file mode 100644 index d51fa41171..0000000000 --- a/install/test/cmake/component_tests/exporters_prometheus_builder/CMakeLists.txt +++ /dev/null @@ -1,24 +0,0 @@ -# Copyright The OpenTelemetry Authors -# SPDX-License-Identifier: Apache-2.0 - -cmake_minimum_required(VERSION 3.16) -project(opentelemetry-cpp-exporters-prometheus-builder-install-test - LANGUAGES CXX) - -find_package(opentelemetry-cpp REQUIRED COMPONENTS exporters_prometheus_builder) - -if(NOT TARGET prometheus-cpp::core) - message(FATAL_ERROR "prometheus-cpp::core target not found") -endif() - -find_package(GTest CONFIG REQUIRED) -include(GoogleTest) - -add_executable(exporters_prometheus_builder_test - ${INSTALL_TEST_SRC_DIR}/test_exporters_prometheus_builder.cc) -target_link_libraries( - exporters_prometheus_builder_test - PRIVATE opentelemetry-cpp::prometheus_exporter_builder GTest::gtest - GTest::gtest_main) - -gtest_discover_tests(exporters_prometheus_builder_test) diff --git a/install/test/cmake/component_tests/sdk/CMakeLists.txt b/install/test/cmake/component_tests/sdk/CMakeLists.txt index 900ece1a32..747eec8862 100644 --- a/install/test/cmake/component_tests/sdk/CMakeLists.txt +++ b/install/test/cmake/component_tests/sdk/CMakeLists.txt @@ -24,6 +24,7 @@ target_link_libraries( opentelemetry-cpp::trace opentelemetry-cpp::metrics opentelemetry-cpp::logs + opentelemetry-cpp::configuration_core GTest::gtest GTest::gtest_main) diff --git a/install/test/cmake/fetch_content_test/CMakeLists.txt b/install/test/cmake/fetch_content_test/CMakeLists.txt index 7385b51222..937cac5939 100644 --- a/install/test/cmake/fetch_content_test/CMakeLists.txt +++ b/install/test/cmake/fetch_content_test/CMakeLists.txt @@ -56,7 +56,10 @@ add_executable( fetch_content_src_test ${OPENTELEMETRY_CPP_SRC_DIR}/install/test/src/test_api.cc ${OPENTELEMETRY_CPP_SRC_DIR}/install/test/src/test_sdk.cc + ${OPENTELEMETRY_CPP_SRC_DIR}/install/test/src/test_configuration.cc + ${OPENTELEMETRY_CPP_SRC_DIR}/install/test/src/test_resource_detectors.cc ${OPENTELEMETRY_CPP_SRC_DIR}/install/test/src/test_ext_common.cc + ${OPENTELEMETRY_CPP_SRC_DIR}/install/test/src/test_ext_http.cc ${OPENTELEMETRY_CPP_SRC_DIR}/install/test/src/test_ext_http_curl.cc ${OPENTELEMETRY_CPP_SRC_DIR}/install/test/src/test_exporters_ostream.cc ${OPENTELEMETRY_CPP_SRC_DIR}/install/test/src/test_exporters_in_memory.cc @@ -75,22 +78,39 @@ target_link_libraries( opentelemetry-cpp::metrics opentelemetry-cpp::trace opentelemetry-cpp::logs + opentelemetry-cpp::configuration_core + opentelemetry-cpp::configuration + opentelemetry-cpp::resource_detectors + opentelemetry-cpp::http_client opentelemetry-cpp::http_client_curl opentelemetry-cpp::in_memory_span_exporter opentelemetry-cpp::in_memory_metric_exporter opentelemetry-cpp::ostream_log_record_exporter + opentelemetry-cpp::ostream_log_record_exporter_builder opentelemetry-cpp::ostream_metrics_exporter + opentelemetry-cpp::ostream_metrics_exporter_builder opentelemetry-cpp::ostream_span_exporter + opentelemetry-cpp::ostream_span_exporter_builder opentelemetry-cpp::otlp_file_exporter + opentelemetry-cpp::otlp_file_exporter_builder opentelemetry-cpp::otlp_file_log_record_exporter + opentelemetry-cpp::otlp_file_log_record_exporter_builder opentelemetry-cpp::otlp_file_metric_exporter + opentelemetry-cpp::otlp_file_metric_exporter_builder opentelemetry-cpp::otlp_grpc_exporter + opentelemetry-cpp::otlp_grpc_exporter_builder opentelemetry-cpp::otlp_grpc_log_record_exporter + opentelemetry-cpp::otlp_grpc_log_record_exporter_builder opentelemetry-cpp::otlp_grpc_metrics_exporter + opentelemetry-cpp::otlp_grpc_metric_exporter_builder opentelemetry-cpp::otlp_http_exporter + opentelemetry-cpp::otlp_http_exporter_builder opentelemetry-cpp::otlp_http_log_record_exporter + opentelemetry-cpp::otlp_http_log_record_exporter_builder opentelemetry-cpp::otlp_http_metric_exporter + opentelemetry-cpp::otlp_http_metric_exporter_builder opentelemetry-cpp::prometheus_exporter + opentelemetry-cpp::prometheus_exporter_builder opentelemetry-cpp::zipkin_trace_exporter opentelemetry-cpp::elasticsearch_log_record_exporter GTest::gtest diff --git a/install/test/cmake/usage_tests/deprecated_components/CMakeLists.txt b/install/test/cmake/usage_tests/deprecated_components/CMakeLists.txt new file mode 100644 index 0000000000..d9b9b547da --- /dev/null +++ b/install/test/cmake/usage_tests/deprecated_components/CMakeLists.txt @@ -0,0 +1,23 @@ +# Copyright The OpenTelemetry Authors +# SPDX-License-Identifier: Apache-2.0 + +cmake_minimum_required(VERSION 3.16) + +project(opentelemetry-cpp-deprecated-components-install-test LANGUAGES CXX) + +set(DEPRECATED_COMPONENTS_WITH_ALIAS + exporters_otlp_builder_utils exporters_otlp_file_builder + exporters_otlp_http_builder exporters_otlp_grpc_builder + exporters_prometheus_builder) + +foreach(component ${DEPRECATED_COMPONENTS_WITH_ALIAS}) + # request a deprecated component — if it has an alias it resolves + # transparently + find_package(opentelemetry-cpp CONFIG COMPONENTS ${component}) + if(NOT opentelemetry-cpp_FOUND) + message( + FATAL_ERROR + "find_package with deprecated component '${component}' with an alias should succeed but opentelemetry-cpp_FOUND is FALSE" + ) + endif() +endforeach() diff --git a/install/test/src/test_exporters_ostream.cc b/install/test/src/test_exporters_ostream.cc index ef59856727..0fec996536 100644 --- a/install/test/src/test_exporters_ostream.cc +++ b/install/test/src/test_exporters_ostream.cc @@ -3,6 +3,9 @@ #include +#include +#include +#include #include #include #include @@ -23,4 +26,35 @@ TEST(ExportersOstreamInstall, OStreamLogRecordExporter) { auto exporter = opentelemetry::exporter::logs::OStreamLogRecordExporterFactory::Create(); ASSERT_TRUE(exporter != nullptr); -} \ No newline at end of file +} + +TEST(ExportersOstreamBuilderInstall, ConsoleSpanBuilder) +{ + auto builder = std::make_unique(); + ASSERT_TRUE(builder != nullptr); + auto exporter = builder->Build(nullptr); + ASSERT_TRUE(exporter != nullptr); +} + +TEST(ExportersOstreamBuilderInstall, ConsolePushMetricBuilder) +{ + auto builder = std::make_unique(); + ASSERT_TRUE(builder != nullptr); + + opentelemetry::sdk::configuration::ConsolePushMetricExporterConfiguration model; + model.temporality_preference = + opentelemetry::sdk::configuration::TemporalityPreference::cumulative; + model.default_histogram_aggregation = + opentelemetry::sdk::configuration::DefaultHistogramAggregation::explicit_bucket_histogram; + + auto exporter = builder->Build(&model); + ASSERT_TRUE(exporter != nullptr); +} + +TEST(ExportersOstreamBuilderInstall, ConsoleLogRecordBuilder) +{ + auto builder = std::make_unique(); + ASSERT_TRUE(builder != nullptr); + auto exporter = builder->Build(nullptr); + ASSERT_TRUE(exporter != nullptr); +} diff --git a/install/test/src/test_exporters_ostream_builder.cc b/install/test/src/test_exporters_ostream_builder.cc deleted file mode 100644 index c1ac7219ce..0000000000 --- a/install/test/src/test_exporters_ostream_builder.cc +++ /dev/null @@ -1,39 +0,0 @@ -// Copyright The OpenTelemetry Authors -// SPDX-License-Identifier: Apache-2.0 - -#include - -#include -#include -#include - -TEST(ExportersOstreamBuilderInstall, ConsoleSpanBuilder) -{ - auto builder = std::make_unique(); - ASSERT_TRUE(builder != nullptr); - auto exporter = builder->Build(nullptr); - ASSERT_TRUE(exporter != nullptr); -} - -TEST(ExportersOstreamBuilderInstall, ConsolePushMetricBuilder) -{ - auto builder = std::make_unique(); - ASSERT_TRUE(builder != nullptr); - - opentelemetry::sdk::configuration::ConsolePushMetricExporterConfiguration model; - model.temporality_preference = - opentelemetry::sdk::configuration::TemporalityPreference::cumulative; - model.default_histogram_aggregation = - opentelemetry::sdk::configuration::DefaultHistogramAggregation::explicit_bucket_histogram; - - auto exporter = builder->Build(&model); - ASSERT_TRUE(exporter != nullptr); -} - -TEST(ExportersOstreamBuilderInstall, ConsoleLogRecordBuilder) -{ - auto builder = std::make_unique(); - ASSERT_TRUE(builder != nullptr); - auto exporter = builder->Build(nullptr); - ASSERT_TRUE(exporter != nullptr); -} diff --git a/install/test/src/test_exporters_otlp_file.cc b/install/test/src/test_exporters_otlp_file.cc index 11627f5503..474d95742c 100644 --- a/install/test/src/test_exporters_otlp_file.cc +++ b/install/test/src/test_exporters_otlp_file.cc @@ -12,6 +12,10 @@ #include #include +#include +#include +#include + TEST(ExportersOtlpFileInstall, OtlpFileExporter) { auto options = opentelemetry::exporter::otlp::OtlpFileExporterOptions(); @@ -32,3 +36,32 @@ TEST(ExportersOtlpFileInstall, OtlpFileMetricExporter) auto exporter = opentelemetry::exporter::otlp::OtlpFileMetricExporterFactory::Create(options); ASSERT_TRUE(exporter != nullptr); } + +TEST(ExportersOtlpFileBuilderInstall, OtlpFileSpanBuilder) +{ + auto builder = std::make_unique(); + ASSERT_TRUE(builder != nullptr); + auto exporter = builder->Build(nullptr); + ASSERT_TRUE(exporter != nullptr); +} + +TEST(ExportersOtlpFileBuilderInstall, OtlpFilePushMetricBuilder) +{ + auto builder = std::make_unique(); + ASSERT_TRUE(builder != nullptr); + + opentelemetry::sdk::configuration::OtlpFilePushMetricExporterConfiguration model; + model.temporality_preference = + opentelemetry::sdk::configuration::TemporalityPreference::cumulative; + + auto exporter = builder->Build(&model); + ASSERT_TRUE(exporter != nullptr); +} + +TEST(ExportersOtlpFileBuilderInstall, OtlpFileLogRecordBuilder) +{ + auto builder = std::make_unique(); + ASSERT_TRUE(builder != nullptr); + auto exporter = builder->Build(nullptr); + ASSERT_TRUE(exporter != nullptr); +} diff --git a/install/test/src/test_exporters_otlp_file_builder.cc b/install/test/src/test_exporters_otlp_file_builder.cc deleted file mode 100644 index da8d4f1210..0000000000 --- a/install/test/src/test_exporters_otlp_file_builder.cc +++ /dev/null @@ -1,37 +0,0 @@ -// Copyright The OpenTelemetry Authors -// SPDX-License-Identifier: Apache-2.0 - -#include - -#include "opentelemetry/exporters/otlp/otlp_file_log_record_builder.h" -#include "opentelemetry/exporters/otlp/otlp_file_push_metric_builder.h" -#include "opentelemetry/exporters/otlp/otlp_file_span_builder.h" - -TEST(ExportersOtlpFileBuilderInstall, OtlpFileSpanBuilder) -{ - auto builder = std::make_unique(); - ASSERT_TRUE(builder != nullptr); - auto exporter = builder->Build(nullptr); - ASSERT_TRUE(exporter != nullptr); -} - -TEST(ExportersOtlpFileBuilderInstall, OtlpFilePushMetricBuilder) -{ - auto builder = std::make_unique(); - ASSERT_TRUE(builder != nullptr); - - opentelemetry::sdk::configuration::OtlpFilePushMetricExporterConfiguration model; - model.temporality_preference = - opentelemetry::sdk::configuration::TemporalityPreference::cumulative; - - auto exporter = builder->Build(&model); - ASSERT_TRUE(exporter != nullptr); -} - -TEST(ExportersOtlpFileBuilderInstall, OtlpFileLogRecordBuilder) -{ - auto builder = std::make_unique(); - ASSERT_TRUE(builder != nullptr); - auto exporter = builder->Build(nullptr); - ASSERT_TRUE(exporter != nullptr); -} diff --git a/install/test/src/test_exporters_otlp_grpc.cc b/install/test/src/test_exporters_otlp_grpc.cc index 6e32c68a23..e0360c1647 100644 --- a/install/test/src/test_exporters_otlp_grpc.cc +++ b/install/test/src/test_exporters_otlp_grpc.cc @@ -13,6 +13,10 @@ #include #include +#include +#include +#include + TEST(ExportersOtlpGrpcInstall, OtlpGrpcClient) { auto options = opentelemetry::exporter::otlp::OtlpGrpcExporterOptions(); @@ -40,3 +44,56 @@ TEST(ExportersOtlpGrpcInstall, OtlpGrpcMetricExporter) auto exporter = opentelemetry::exporter::otlp::OtlpGrpcMetricExporterFactory::Create(options); ASSERT_TRUE(exporter != nullptr); } + +TEST(ExportersOtlpGrpcBuilderInstall, OtlpGrpcSpanBuilder) +{ + auto builder = std::make_unique(); + ASSERT_TRUE(builder != nullptr); + + opentelemetry::sdk::configuration::OtlpGrpcSpanExporterConfiguration model; + model.tls = std::make_unique(); + + model.endpoint = "http://localhost:4317"; + model.tls->insecure = false; + model.timeout = 12; + model.compression = "none"; + + auto exporter = builder->Build(&model); + ASSERT_TRUE(exporter != nullptr); +} + +TEST(ExportersOtlpGrpcBuilderInstall, OtlpGrpcPushMetricBuilder) +{ + auto builder = std::make_unique(); + ASSERT_TRUE(builder != nullptr); + + opentelemetry::sdk::configuration::OtlpGrpcPushMetricExporterConfiguration model; + model.tls = std::make_unique(); + + model.endpoint = "http://localhost:4317"; + model.tls->insecure = false; + model.timeout = 12; + model.compression = "none"; + model.temporality_preference = + opentelemetry::sdk::configuration::TemporalityPreference::cumulative; + + auto exporter = builder->Build(&model); + ASSERT_TRUE(exporter != nullptr); +} + +TEST(ExportersOtlpGrpcBuilderInstall, OtlpGrpcLogRecordBuilder) +{ + auto builder = std::make_unique(); + ASSERT_TRUE(builder != nullptr); + + opentelemetry::sdk::configuration::OtlpGrpcLogRecordExporterConfiguration model; + model.tls = std::make_unique(); + + model.endpoint = "http://localhost:4317"; + model.tls->insecure = false; + model.timeout = 12; + model.compression = "none"; + + auto exporter = builder->Build(&model); + ASSERT_TRUE(exporter != nullptr); +} diff --git a/install/test/src/test_exporters_otlp_grpc_builder.cc b/install/test/src/test_exporters_otlp_grpc_builder.cc deleted file mode 100644 index fac9ed5ee3..0000000000 --- a/install/test/src/test_exporters_otlp_grpc_builder.cc +++ /dev/null @@ -1,61 +0,0 @@ -// Copyright The OpenTelemetry Authors -// SPDX-License-Identifier: Apache-2.0 - -#include - -#include "opentelemetry/exporters/otlp/otlp_grpc_log_record_builder.h" -#include "opentelemetry/exporters/otlp/otlp_grpc_push_metric_builder.h" -#include "opentelemetry/exporters/otlp/otlp_grpc_span_builder.h" - -TEST(ExportersOtlpGrpcBuilderInstall, OtlpGrpcSpanBuilder) -{ - auto builder = std::make_unique(); - ASSERT_TRUE(builder != nullptr); - - opentelemetry::sdk::configuration::OtlpGrpcSpanExporterConfiguration model; - model.tls = std::make_unique(); - - model.endpoint = "http://localhost:4317"; - model.tls->insecure = false; - model.timeout = 12; - model.compression = "none"; - - auto exporter = builder->Build(&model); - ASSERT_TRUE(exporter != nullptr); -} - -TEST(ExportersOtlpGrpcBuilderInstall, OtlpGrpcPushMetricBuilder) -{ - auto builder = std::make_unique(); - ASSERT_TRUE(builder != nullptr); - - opentelemetry::sdk::configuration::OtlpGrpcPushMetricExporterConfiguration model; - model.tls = std::make_unique(); - - model.endpoint = "http://localhost:4317"; - model.tls->insecure = false; - model.timeout = 12; - model.compression = "none"; - model.temporality_preference = - opentelemetry::sdk::configuration::TemporalityPreference::cumulative; - - auto exporter = builder->Build(&model); - ASSERT_TRUE(exporter != nullptr); -} - -TEST(ExportersOtlpGrpcBuilderInstall, OtlpGrpcLogRecordBuilder) -{ - auto builder = std::make_unique(); - ASSERT_TRUE(builder != nullptr); - - opentelemetry::sdk::configuration::OtlpGrpcLogRecordExporterConfiguration model; - model.tls = std::make_unique(); - - model.endpoint = "http://localhost:4317"; - model.tls->insecure = false; - model.timeout = 12; - model.compression = "none"; - - auto exporter = builder->Build(&model); - ASSERT_TRUE(exporter != nullptr); -} diff --git a/install/test/src/test_exporters_otlp_http.cc b/install/test/src/test_exporters_otlp_http.cc index 441df255cc..4c6a4c4469 100644 --- a/install/test/src/test_exporters_otlp_http.cc +++ b/install/test/src/test_exporters_otlp_http.cc @@ -12,6 +12,10 @@ #include #include +#include +#include +#include + TEST(ExportersOtlpHttpInstall, OtlpHttpExporter) { auto options = opentelemetry::exporter::otlp::OtlpHttpExporterOptions(); @@ -32,3 +36,50 @@ TEST(ExportersOtlpHttpInstall, OtlpHttpMetricExporter) auto exporter = opentelemetry::exporter::otlp::OtlpHttpMetricExporterFactory::Create(options); ASSERT_TRUE(exporter != nullptr); } + +TEST(ExportersOtlpHttpBuilderInstall, OtlpHttpSpanBuilder) +{ + auto builder = std::make_unique(); + ASSERT_TRUE(builder != nullptr); + + opentelemetry::sdk::configuration::OtlpHttpSpanExporterConfiguration model; + model.endpoint = "http://localhost:4318"; + model.encoding = opentelemetry::sdk::configuration::OtlpHttpEncoding::json; + model.timeout = 12; + model.compression = "none"; + + auto exporter = builder->Build(&model); + ASSERT_TRUE(exporter != nullptr); +} + +TEST(ExportersOtlpHttpBuilderInstall, OtlpHttpPushMetricBuilder) +{ + auto builder = std::make_unique(); + ASSERT_TRUE(builder != nullptr); + + opentelemetry::sdk::configuration::OtlpHttpPushMetricExporterConfiguration model; + model.endpoint = "http://localhost:4318"; + model.encoding = opentelemetry::sdk::configuration::OtlpHttpEncoding::json; + model.timeout = 12; + model.compression = "none"; + model.temporality_preference = + opentelemetry::sdk::configuration::TemporalityPreference::cumulative; + + auto exporter = builder->Build(&model); + ASSERT_TRUE(exporter != nullptr); +} + +TEST(ExportersOtlpHttpBuilderInstall, OtlpHttpLogRecordBuilder) +{ + auto builder = std::make_unique(); + ASSERT_TRUE(builder != nullptr); + + opentelemetry::sdk::configuration::OtlpHttpLogRecordExporterConfiguration model; + model.endpoint = "http://localhost:4318"; + model.encoding = opentelemetry::sdk::configuration::OtlpHttpEncoding::json; + model.timeout = 12; + model.compression = "none"; + + auto exporter = builder->Build(&model); + ASSERT_TRUE(exporter != nullptr); +} diff --git a/install/test/src/test_exporters_otlp_http_builder.cc b/install/test/src/test_exporters_otlp_http_builder.cc deleted file mode 100644 index 992f4337b5..0000000000 --- a/install/test/src/test_exporters_otlp_http_builder.cc +++ /dev/null @@ -1,55 +0,0 @@ -// Copyright The OpenTelemetry Authors -// SPDX-License-Identifier: Apache-2.0 - -#include - -#include "opentelemetry/exporters/otlp/otlp_http_log_record_builder.h" -#include "opentelemetry/exporters/otlp/otlp_http_push_metric_builder.h" -#include "opentelemetry/exporters/otlp/otlp_http_span_builder.h" - -TEST(ExportersOtlpHttpBuilderInstall, OtlpHttpSpanBuilder) -{ - auto builder = std::make_unique(); - ASSERT_TRUE(builder != nullptr); - - opentelemetry::sdk::configuration::OtlpHttpSpanExporterConfiguration model; - model.endpoint = "http://localhost:4318"; - model.encoding = opentelemetry::sdk::configuration::OtlpHttpEncoding::json; - model.timeout = 12; - model.compression = "none"; - - auto exporter = builder->Build(&model); - ASSERT_TRUE(exporter != nullptr); -} - -TEST(ExportersOtlpHttpBuilderInstall, OtlpHttpPushMetricBuilder) -{ - auto builder = std::make_unique(); - ASSERT_TRUE(builder != nullptr); - - opentelemetry::sdk::configuration::OtlpHttpPushMetricExporterConfiguration model; - model.endpoint = "http://localhost:4318"; - model.encoding = opentelemetry::sdk::configuration::OtlpHttpEncoding::json; - model.timeout = 12; - model.compression = "none"; - model.temporality_preference = - opentelemetry::sdk::configuration::TemporalityPreference::cumulative; - - auto exporter = builder->Build(&model); - ASSERT_TRUE(exporter != nullptr); -} - -TEST(ExportersOtlpHttpBuilderInstall, OtlpHttpLogRecordBuilder) -{ - auto builder = std::make_unique(); - ASSERT_TRUE(builder != nullptr); - - opentelemetry::sdk::configuration::OtlpHttpLogRecordExporterConfiguration model; - model.endpoint = "http://localhost:4318"; - model.encoding = opentelemetry::sdk::configuration::OtlpHttpEncoding::json; - model.timeout = 12; - model.compression = "none"; - - auto exporter = builder->Build(&model); - ASSERT_TRUE(exporter != nullptr); -} diff --git a/install/test/src/test_exporters_prometheus.cc b/install/test/src/test_exporters_prometheus.cc index 1def1417f9..40a7a3e637 100644 --- a/install/test/src/test_exporters_prometheus.cc +++ b/install/test/src/test_exporters_prometheus.cc @@ -5,10 +5,25 @@ #include #include +#include TEST(ExportersPrometheusInstall, PrometheusExporter) { auto options = opentelemetry::exporter::metrics::PrometheusExporterOptions(); auto exporter = opentelemetry::exporter::metrics::PrometheusExporterFactory::Create(options); ASSERT_TRUE(exporter != nullptr); -} \ No newline at end of file +} + +TEST(ExportersPrometheusBuilderInstall, PrometheusPullBuilder) +{ + auto builder = std::make_unique(); + ASSERT_TRUE(builder != nullptr); + + opentelemetry::sdk::configuration::PrometheusPullMetricExporterConfiguration model; + model.host = "localhost"; + model.port = 1234; + model.without_scope_info = false; + + auto exporter = builder->Build(&model); + ASSERT_TRUE(exporter != nullptr); +} diff --git a/install/test/src/test_exporters_prometheus_builder.cc b/install/test/src/test_exporters_prometheus_builder.cc deleted file mode 100644 index 0f5781683b..0000000000 --- a/install/test/src/test_exporters_prometheus_builder.cc +++ /dev/null @@ -1,20 +0,0 @@ -// Copyright The OpenTelemetry Authors -// SPDX-License-Identifier: Apache-2.0 - -#include - -#include - -TEST(ExportersPrometheusBuilderInstall, PrometheusPullBuilder) -{ - auto builder = std::make_unique(); - ASSERT_TRUE(builder != nullptr); - - opentelemetry::sdk::configuration::PrometheusPullMetricExporterConfiguration model; - model.host = "localhost"; - model.port = 1234; - model.without_scope_info = false; - - auto exporter = builder->Build(&model); - ASSERT_TRUE(exporter != nullptr); -} diff --git a/install/test/src/test_sdk.cc b/install/test/src/test_sdk.cc index 13c4d19245..b2e59e3279 100644 --- a/install/test/src/test_sdk.cc +++ b/install/test/src/test_sdk.cc @@ -3,6 +3,9 @@ #include +#include +#include +#include #include #include #include @@ -32,7 +35,27 @@ #include #include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + namespace nostd = opentelemetry::nostd; +namespace propagation = opentelemetry::context::propagation; +namespace config_sdk = opentelemetry::sdk::configuration; namespace version_sdk = opentelemetry::sdk::version; namespace common = opentelemetry::common; namespace common_sdk = opentelemetry::sdk::common; @@ -45,6 +68,8 @@ namespace logs = opentelemetry::logs; namespace trace_sdk = opentelemetry::sdk::trace; namespace trace = opentelemetry::trace; +namespace +{ class NoopLogRecordable : public logs_sdk::Recordable { public: @@ -171,7 +196,31 @@ class NoopPushMetricExporter : public metrics_sdk::PushMetricExporter } }; -TEST(SdkInstallTest, SdkVersionCheck) +class SdkInstallTest : public ::testing::Test +{ +protected: + void SetUp() override + { + propagation::GlobalTextMapPropagator::SetGlobalPropagator( + {std::make_shared()}); + trace::Provider::SetTracerProvider({std::make_shared()}); + logs::Provider::SetLoggerProvider({std::make_shared()}); + metrics::Provider::SetMeterProvider({std::make_shared()}); + } + + void TearDown() override + { + propagation::GlobalTextMapPropagator::SetGlobalPropagator( + {std::make_shared()}); + trace::Provider::SetTracerProvider({std::make_shared()}); + logs::Provider::SetLoggerProvider({std::make_shared()}); + metrics::Provider::SetMeterProvider({std::make_shared()}); + } +}; + +} // namespace + +TEST_F(SdkInstallTest, SdkVersionCheck) { EXPECT_NE(OPENTELEMETRY_SDK_VERSION, "not a version"); EXPECT_GE(version_sdk::major_version, 0); @@ -181,7 +230,7 @@ TEST(SdkInstallTest, SdkVersionCheck) EXPECT_NE(version_sdk::short_version, ""); } -TEST(SdkInstallTest, ResourceDetectorCheck) +TEST_F(SdkInstallTest, ResourceDetectorCheck) { auto resource = resource_sdk::Resource::GetDefault(); resource_sdk::OTELResourceDetector detector; @@ -190,7 +239,7 @@ TEST(SdkInstallTest, ResourceDetectorCheck) EXPECT_NE(attributes.size(), 0); } -TEST(SdkInstallTest, LoggerProviderCheck) +TEST_F(SdkInstallTest, LoggerProviderCheck) { { auto exporter = nostd::unique_ptr(new NoopLogRecordExporter()); @@ -211,7 +260,7 @@ TEST(SdkInstallTest, LoggerProviderCheck) sdk_provider->ForceFlush(); } -TEST(SdkInstallTest, TracerProviderCheck) +TEST_F(SdkInstallTest, TracerProviderCheck) { { auto exporter = nostd::unique_ptr(new NoopSpanExporter()); @@ -234,7 +283,7 @@ TEST(SdkInstallTest, TracerProviderCheck) sdk_provider->ForceFlush(); } -TEST(SdkInstallTest, MeterProviderCheck) +TEST_F(SdkInstallTest, MeterProviderCheck) { { auto exporter = @@ -259,4 +308,130 @@ TEST(SdkInstallTest, MeterProviderCheck) } auto sdk_provider = static_cast(provider.get()); sdk_provider->ForceFlush(); -} \ No newline at end of file +} + +TEST_F(SdkInstallTest, ConfigurationCoreCheck) +{ + class NoopConsoleSpanBuilder : public config_sdk::ConsoleSpanExporterBuilder + { + public: + std::unique_ptr Build( + const config_sdk::ConsoleSpanExporterConfiguration *) const override + { + return std::make_unique(); + } + }; + + class NoopConsoleLogRecordBuilder : public config_sdk::ConsoleLogRecordExporterBuilder + { + public: + std::unique_ptr Build( + const config_sdk::ConsoleLogRecordExporterConfiguration *) const override + { + return std::make_unique(); + } + }; + + class NoopConsolePushMetricBuilder : public config_sdk::ConsolePushMetricExporterBuilder + { + public: + std::unique_ptr Build( + const config_sdk::ConsolePushMetricExporterConfiguration *) const override + { + return std::make_unique(); + } + }; + + class NoopTextMapPropagatorBuilder : public config_sdk::TextMapPropagatorBuilder + { + public: + std::unique_ptr Build() const override + { + return std::make_unique(); + } + }; + + // Programmatic SDK Configuration + std::unique_ptr sdk; + { + const std::string propagator_name{"noop"}; + + auto registry = std::make_shared(); + registry->SetConsoleSpanBuilder(std::make_unique()); + registry->SetConsoleLogRecordBuilder(std::make_unique()); + registry->SetConsolePushMetricExporterBuilder(std::make_unique()); + registry->SetTextMapPropagatorBuilder(propagator_name, + std::make_unique()); + + auto model = std::make_unique(); + + // Tracer provider: simple processor + console exporter + auto span_exporter = std::make_unique(); + auto span_processor = std::make_unique(); + span_processor->exporter = std::move(span_exporter); + auto tracer_config = std::make_unique(); + tracer_config->processors.push_back(std::move(span_processor)); + + // Logger provider: simple processor + console exporter + auto log_exporter = std::make_unique(); + auto log_processor = std::make_unique(); + log_processor->exporter = std::move(log_exporter); + auto logger_config = std::make_unique(); + logger_config->processors.push_back(std::move(log_processor)); + + // Meter provider: periodic reader + console push exporter + auto metric_exporter = std::make_unique(); + auto metric_reader = std::make_unique(); + metric_reader->exporter = std::move(metric_exporter); + auto meter_config = std::make_unique(); + meter_config->readers.push_back(std::move(metric_reader)); + + // Propagator: noop + auto propagator_config = std::make_unique(); + propagator_config->composite.push_back(propagator_name); + + // Assemble the full configuration model + model->tracer_provider = std::move(tracer_config); + model->logger_provider = std::move(logger_config); + model->meter_provider = std::move(meter_config); + model->propagator = std::move(propagator_config); + + ASSERT_NO_THROW(sdk = config_sdk::ConfiguredSdk::Create(registry, model)); + ASSERT_NE(sdk, nullptr); + ASSERT_NE(sdk->tracer_provider, nullptr); + ASSERT_NE(sdk->logger_provider, nullptr); + ASSERT_NE(sdk->meter_provider, nullptr); + ASSERT_NE(sdk->propagator, nullptr); + } + + // Set the global providers + sdk->Install(); + + auto propagator = propagation::GlobalTextMapPropagator::GetGlobalPropagator(); + ASSERT_NE(propagator, nullptr); + + auto tracer_provider = trace::Provider::GetTracerProvider(); + ASSERT_NE(tracer_provider, nullptr); + + auto logger_provider = logs::Provider::GetLoggerProvider(); + ASSERT_NE(logger_provider, nullptr); + + auto meter_provider = metrics::Provider::GetMeterProvider(); + ASSERT_NE(meter_provider, nullptr); + + auto tracer = tracer_provider->GetTracer("config-core-test"); + auto logger = logger_provider->GetLogger("config-core-test"); + auto meter = meter_provider->GetMeter("config-core-test"); + auto counter = meter->CreateUInt64Counter("test-counter"); + + { + auto span = tracer->StartSpan("test-span"); + opentelemetry::trace::Scope scope(span); + logger->Info("test-message"); + counter->Add(1); + span->End(); + } + + // Destroy the global providers + sdk->UnInstall(); +} diff --git a/sdk/CMakeLists.txt b/sdk/CMakeLists.txt index c433c560c2..8e7d5e9def 100644 --- a/sdk/CMakeLists.txt +++ b/sdk/CMakeLists.txt @@ -25,6 +25,7 @@ otel_add_component( opentelemetry_logs opentelemetry_trace opentelemetry_metrics + opentelemetry_configuration_core FILES_DIRECTORY "include/opentelemetry/" FILES_DESTINATION @@ -33,7 +34,16 @@ otel_add_component( PATTERN "*.h" PATTERN - "sdk/configuration/*.h" + "sdk/configuration/configuration_parser.h" + EXCLUDE + PATTERN + "sdk/configuration/yaml_configuration_parser.h" + EXCLUDE + PATTERN + "sdk/configuration/ryml_document.h" + EXCLUDE + PATTERN + "sdk/configuration/ryml_document_node.h" EXCLUDE) if(WITH_CONFIGURATION) @@ -48,7 +58,13 @@ if(WITH_CONFIGURATION) "include/opentelemetry" FILES_MATCHING PATTERN - "sdk/configuration/*.h") + "sdk/configuration/configuration_parser.h" + PATTERN + "sdk/configuration/yaml_configuration_parser.h" + PATTERN + "sdk/configuration/ryml_document.h" + PATTERN + "sdk/configuration/ryml_document_node.h") endif() if(BUILD_TESTING) diff --git a/sdk/include/opentelemetry/sdk/configuration/attribute_limits_configuration.h b/sdk/include/opentelemetry/sdk/configuration/attribute_limits_configuration.h index 69f311575c..105856ede0 100644 --- a/sdk/include/opentelemetry/sdk/configuration/attribute_limits_configuration.h +++ b/sdk/include/opentelemetry/sdk/configuration/attribute_limits_configuration.h @@ -18,8 +18,12 @@ namespace configuration class AttributeLimitsConfiguration { public: - std::size_t attribute_value_length_limit; - std::size_t attribute_count_limit; + // TODO: spec default is no limit, using 4096 to preserve original behavior + static constexpr std::size_t kDefaultAttributeValueLengthLimit = 4096; + static constexpr std::size_t kDefaultAttributeCountLimit = 128; + + std::size_t attribute_value_length_limit{kDefaultAttributeValueLengthLimit}; + std::size_t attribute_count_limit{kDefaultAttributeCountLimit}; }; } // namespace configuration diff --git a/sdk/include/opentelemetry/sdk/configuration/base2_exponential_bucket_histogram_aggregation_configuration.h b/sdk/include/opentelemetry/sdk/configuration/base2_exponential_bucket_histogram_aggregation_configuration.h index 86d87f8393..26146d9782 100644 --- a/sdk/include/opentelemetry/sdk/configuration/base2_exponential_bucket_histogram_aggregation_configuration.h +++ b/sdk/include/opentelemetry/sdk/configuration/base2_exponential_bucket_histogram_aggregation_configuration.h @@ -3,6 +3,8 @@ #pragma once +#include + #include "opentelemetry/sdk/configuration/aggregation_configuration.h" #include "opentelemetry/sdk/configuration/aggregation_configuration_visitor.h" #include "opentelemetry/version.h" @@ -18,14 +20,19 @@ namespace configuration class Base2ExponentialBucketHistogramAggregationConfiguration : public AggregationConfiguration { public: + // TODO: max_scale range is [-10, 20]. Negative values require GetSignedInteger in the parser + static constexpr std::size_t kDefaultMaxScale = 20; // schema: minimum -10, maximum 20 + static constexpr std::size_t kDefaultMaxSize = 160; + static constexpr bool kDefaultRecordMinMax = true; + void Accept(AggregationConfigurationVisitor *visitor) const override { visitor->VisitBase2ExponentialBucketHistogram(this); } - std::size_t max_scale{0}; - std::size_t max_size{0}; - bool record_min_max{false}; + std::size_t max_scale{kDefaultMaxScale}; + std::size_t max_size{kDefaultMaxSize}; + bool record_min_max{kDefaultRecordMinMax}; }; } // namespace configuration diff --git a/sdk/include/opentelemetry/sdk/configuration/batch_log_record_processor_configuration.h b/sdk/include/opentelemetry/sdk/configuration/batch_log_record_processor_configuration.h index 17570f0552..a011a907a8 100644 --- a/sdk/include/opentelemetry/sdk/configuration/batch_log_record_processor_configuration.h +++ b/sdk/include/opentelemetry/sdk/configuration/batch_log_record_processor_configuration.h @@ -3,6 +3,7 @@ #pragma once +#include #include #include "opentelemetry/sdk/configuration/log_record_exporter_configuration.h" @@ -21,15 +22,21 @@ namespace configuration class BatchLogRecordProcessorConfiguration : public LogRecordProcessorConfiguration { public: + // TODO: spec default is 1000ms for schedule_delay, using 5000ms to preserve original behavior + static constexpr std::size_t kDefaultScheduleDelayMs = 5000; + static constexpr std::size_t kDefaultExportTimeoutMs = 30000; + static constexpr std::size_t kDefaultMaxQueueSize = 2048; + static constexpr std::size_t kDefaultMaxExportBatchSize = 512; + void Accept(LogRecordProcessorConfigurationVisitor *visitor) const override { visitor->VisitBatch(this); } - std::size_t schedule_delay{0}; - std::size_t export_timeout{0}; - std::size_t max_queue_size{0}; - std::size_t max_export_batch_size{0}; + std::size_t schedule_delay{kDefaultScheduleDelayMs}; + std::size_t export_timeout{kDefaultExportTimeoutMs}; + std::size_t max_queue_size{kDefaultMaxQueueSize}; + std::size_t max_export_batch_size{kDefaultMaxExportBatchSize}; std::unique_ptr exporter; }; diff --git a/sdk/include/opentelemetry/sdk/configuration/batch_span_processor_configuration.h b/sdk/include/opentelemetry/sdk/configuration/batch_span_processor_configuration.h index 1230f616a2..40446aac20 100644 --- a/sdk/include/opentelemetry/sdk/configuration/batch_span_processor_configuration.h +++ b/sdk/include/opentelemetry/sdk/configuration/batch_span_processor_configuration.h @@ -3,6 +3,7 @@ #pragma once +#include #include #include "opentelemetry/sdk/configuration/span_exporter_configuration.h" @@ -21,15 +22,20 @@ namespace configuration class BatchSpanProcessorConfiguration : public SpanProcessorConfiguration { public: + static constexpr std::size_t kDefaultScheduleDelayMs = 5000; + static constexpr std::size_t kDefaultExportTimeoutMs = 30000; + static constexpr std::size_t kDefaultMaxQueueSize = 2048; + static constexpr std::size_t kDefaultMaxExportBatchSize = 512; + void Accept(SpanProcessorConfigurationVisitor *visitor) const override { visitor->VisitBatch(this); } - std::size_t schedule_delay{0}; - std::size_t export_timeout{0}; - std::size_t max_queue_size{0}; - std::size_t max_export_batch_size{0}; + std::size_t schedule_delay{kDefaultScheduleDelayMs}; + std::size_t export_timeout{kDefaultExportTimeoutMs}; + std::size_t max_queue_size{kDefaultMaxQueueSize}; + std::size_t max_export_batch_size{kDefaultMaxExportBatchSize}; std::unique_ptr exporter; }; diff --git a/sdk/include/opentelemetry/sdk/configuration/boolean_attribute_value_configuration.h b/sdk/include/opentelemetry/sdk/configuration/boolean_attribute_value_configuration.h index 2e2700f6eb..3fb81a3465 100644 --- a/sdk/include/opentelemetry/sdk/configuration/boolean_attribute_value_configuration.h +++ b/sdk/include/opentelemetry/sdk/configuration/boolean_attribute_value_configuration.h @@ -23,7 +23,7 @@ class BooleanAttributeValueConfiguration : public AttributeValueConfiguration visitor->VisitBoolean(this); } - bool value; + bool value{false}; }; } // namespace configuration diff --git a/sdk/include/opentelemetry/sdk/configuration/cardinality_limits_configuration.h b/sdk/include/opentelemetry/sdk/configuration/cardinality_limits_configuration.h index 808663cf4c..a65b90abe7 100644 --- a/sdk/include/opentelemetry/sdk/configuration/cardinality_limits_configuration.h +++ b/sdk/include/opentelemetry/sdk/configuration/cardinality_limits_configuration.h @@ -18,15 +18,19 @@ namespace configuration class CardinalityLimitsConfiguration { public: - std::size_t default_limit; - // For all limits, 0 means unset, use default_limit - std::size_t counter; - std::size_t gauge; - std::size_t histogram; - std::size_t observable_counter; - std::size_t observable_gauge; - std::size_t observable_up_down_counter; - std::size_t up_down_counter; + static constexpr std::size_t kDefaultLimit = 2000; + // 0 is a sentinel: inherit from default_limit (schema exclusiveMinimum: 0) + static constexpr std::size_t kInheritDefault = 0; + + std::size_t default_limit{kDefaultLimit}; + // For all limits, kInheritDefault means unset, use default_limit + std::size_t counter{kInheritDefault}; + std::size_t gauge{kInheritDefault}; + std::size_t histogram{kInheritDefault}; + std::size_t observable_counter{kInheritDefault}; + std::size_t observable_gauge{kInheritDefault}; + std::size_t observable_up_down_counter{kInheritDefault}; + std::size_t up_down_counter{kInheritDefault}; }; } // namespace configuration diff --git a/sdk/include/opentelemetry/sdk/configuration/composable_probability_sampler_configuration.h b/sdk/include/opentelemetry/sdk/configuration/composable_probability_sampler_configuration.h index b5d63a40a3..a270a4c17f 100644 --- a/sdk/include/opentelemetry/sdk/configuration/composable_probability_sampler_configuration.h +++ b/sdk/include/opentelemetry/sdk/configuration/composable_probability_sampler_configuration.h @@ -15,8 +15,10 @@ namespace configuration class ComposableProbabilitySamplerConfiguration : public ComposableSamplerConfiguration { public: + static constexpr double kDefaultRatio = 1.0; + ComposableProbabilitySamplerConfiguration() = default; - double ratio{1.0}; + double ratio{kDefaultRatio}; void Accept(SamplerConfigurationVisitor *visitor) const override; }; diff --git a/sdk/include/opentelemetry/sdk/configuration/configuration.h b/sdk/include/opentelemetry/sdk/configuration/configuration.h index 05dfffcb80..a7fbac4845 100644 --- a/sdk/include/opentelemetry/sdk/configuration/configuration.h +++ b/sdk/include/opentelemetry/sdk/configuration/configuration.h @@ -58,7 +58,8 @@ namespace configuration class Configuration { public: - Configuration(std::unique_ptr doc) : doc_(std::move(doc)) {} + Configuration() = default; + explicit Configuration(std::unique_ptr doc) : doc_(std::move(doc)) {} Configuration(Configuration &&) = delete; Configuration(const Configuration &) = delete; Configuration &operator=(Configuration &&) = delete; diff --git a/sdk/include/opentelemetry/sdk/configuration/configuration_parser.h b/sdk/include/opentelemetry/sdk/configuration/configuration_parser.h index 0566425946..84f5811874 100644 --- a/sdk/include/opentelemetry/sdk/configuration/configuration_parser.h +++ b/sdk/include/opentelemetry/sdk/configuration/configuration_parser.h @@ -474,8 +474,8 @@ class ConfigurationParser private: std::string version_; - int version_major_; - int version_minor_; + int version_major_{}; + int version_minor_{}; }; } // namespace configuration diff --git a/sdk/include/opentelemetry/sdk/configuration/configured_sdk.h b/sdk/include/opentelemetry/sdk/configuration/configured_sdk.h index 64d2be0b0b..6362324d4b 100644 --- a/sdk/include/opentelemetry/sdk/configuration/configured_sdk.h +++ b/sdk/include/opentelemetry/sdk/configuration/configured_sdk.h @@ -48,7 +48,8 @@ class ConfiguredSdk */ void UnInstall(); - opentelemetry::sdk::common::internal_log::LogLevel log_level; + opentelemetry::sdk::common::internal_log::LogLevel log_level{ + opentelemetry::sdk::common::internal_log::LogLevel::Info}; opentelemetry::sdk::resource::Resource resource; std::shared_ptr tracer_provider; std::shared_ptr propagator; diff --git a/sdk/include/opentelemetry/sdk/configuration/console_push_metric_exporter_configuration.h b/sdk/include/opentelemetry/sdk/configuration/console_push_metric_exporter_configuration.h index 8755b31e9a..bff56b3375 100644 --- a/sdk/include/opentelemetry/sdk/configuration/console_push_metric_exporter_configuration.h +++ b/sdk/include/opentelemetry/sdk/configuration/console_push_metric_exporter_configuration.h @@ -21,14 +21,18 @@ namespace configuration class ConsolePushMetricExporterConfiguration : public PushMetricExporterConfiguration { public: + static constexpr TemporalityPreference kDefaultTemporalityPreference = + TemporalityPreference::cumulative; + static constexpr DefaultHistogramAggregation kDefaultHistogramAggregation = + DefaultHistogramAggregation::explicit_bucket_histogram; + void Accept(PushMetricExporterConfigurationVisitor *visitor) const override { visitor->VisitConsole(this); } - TemporalityPreference temporality_preference{TemporalityPreference::cumulative}; - DefaultHistogramAggregation default_histogram_aggregation{ - DefaultHistogramAggregation::explicit_bucket_histogram}; + TemporalityPreference temporality_preference{kDefaultTemporalityPreference}; + DefaultHistogramAggregation default_histogram_aggregation{kDefaultHistogramAggregation}; }; } // namespace configuration diff --git a/sdk/include/opentelemetry/sdk/configuration/document_node.h b/sdk/include/opentelemetry/sdk/configuration/document_node.h index 646a15de17..7a725a3116 100644 --- a/sdk/include/opentelemetry/sdk/configuration/document_node.h +++ b/sdk/include/opentelemetry/sdk/configuration/document_node.h @@ -178,9 +178,9 @@ class PropertiesNodeConstIterator class DocumentNodeLocation { public: - size_t offset; - size_t line; - size_t col; + std::size_t offset{}; + std::size_t line{}; + std::size_t col{}; std::string filename; std::string ToString() const; diff --git a/sdk/include/opentelemetry/sdk/configuration/double_attribute_value_configuration.h b/sdk/include/opentelemetry/sdk/configuration/double_attribute_value_configuration.h index 2408d81bc0..b300e8bc29 100644 --- a/sdk/include/opentelemetry/sdk/configuration/double_attribute_value_configuration.h +++ b/sdk/include/opentelemetry/sdk/configuration/double_attribute_value_configuration.h @@ -23,7 +23,7 @@ class DoubleAttributeValueConfiguration : public AttributeValueConfiguration visitor->VisitDouble(this); } - double value; + double value{0.0}; }; } // namespace configuration diff --git a/sdk/include/opentelemetry/sdk/configuration/explicit_bucket_histogram_aggregation_configuration.h b/sdk/include/opentelemetry/sdk/configuration/explicit_bucket_histogram_aggregation_configuration.h index 122e84d034..53101a4032 100644 --- a/sdk/include/opentelemetry/sdk/configuration/explicit_bucket_histogram_aggregation_configuration.h +++ b/sdk/include/opentelemetry/sdk/configuration/explicit_bucket_histogram_aggregation_configuration.h @@ -20,13 +20,16 @@ namespace configuration class ExplicitBucketHistogramAggregationConfiguration : public AggregationConfiguration { public: + // empty boundaries means use the SDK spec default ([0, 5, 10, ...]) + static constexpr bool kDefaultRecordMinMax = true; + void Accept(AggregationConfigurationVisitor *visitor) const override { visitor->VisitExplicitBucketHistogram(this); } std::vector boundaries; - bool record_min_max{false}; + bool record_min_max{kDefaultRecordMinMax}; }; } // namespace configuration diff --git a/sdk/include/opentelemetry/sdk/configuration/grpc_tls_configuration.h b/sdk/include/opentelemetry/sdk/configuration/grpc_tls_configuration.h index 9a10b8e6c8..b1120eda03 100644 --- a/sdk/include/opentelemetry/sdk/configuration/grpc_tls_configuration.h +++ b/sdk/include/opentelemetry/sdk/configuration/grpc_tls_configuration.h @@ -19,10 +19,12 @@ namespace configuration class GrpcTlsConfiguration { public: + static constexpr bool kDefaultInsecure = false; + std::string ca_file; std::string key_file; std::string cert_file; - bool insecure{false}; + bool insecure{kDefaultInsecure}; }; } // namespace configuration diff --git a/sdk/include/opentelemetry/sdk/configuration/integer_attribute_value_configuration.h b/sdk/include/opentelemetry/sdk/configuration/integer_attribute_value_configuration.h index 60878d728b..28bc09c0be 100644 --- a/sdk/include/opentelemetry/sdk/configuration/integer_attribute_value_configuration.h +++ b/sdk/include/opentelemetry/sdk/configuration/integer_attribute_value_configuration.h @@ -25,7 +25,7 @@ class IntegerAttributeValueConfiguration : public AttributeValueConfiguration visitor->VisitInteger(this); } - int64_t value; + std::int64_t value{0}; }; } // namespace configuration diff --git a/sdk/include/opentelemetry/sdk/configuration/jaeger_remote_sampler_configuration.h b/sdk/include/opentelemetry/sdk/configuration/jaeger_remote_sampler_configuration.h index 19af801b61..cc882eb62c 100644 --- a/sdk/include/opentelemetry/sdk/configuration/jaeger_remote_sampler_configuration.h +++ b/sdk/include/opentelemetry/sdk/configuration/jaeger_remote_sampler_configuration.h @@ -3,6 +3,7 @@ #pragma once +#include #include #include @@ -21,13 +22,15 @@ namespace configuration class JaegerRemoteSamplerConfiguration : public SamplerConfiguration { public: + static constexpr std::size_t kDefaultIntervalMs = 60000; + void Accept(SamplerConfigurationVisitor *visitor) const override { visitor->VisitJaegerRemote(this); } std::string endpoint; - std::size_t interval{0}; + std::size_t interval{kDefaultIntervalMs}; std::unique_ptr initial_sampler; }; diff --git a/sdk/include/opentelemetry/sdk/configuration/log_record_limits_configuration.h b/sdk/include/opentelemetry/sdk/configuration/log_record_limits_configuration.h index 81ab1383be..26a66cc661 100644 --- a/sdk/include/opentelemetry/sdk/configuration/log_record_limits_configuration.h +++ b/sdk/include/opentelemetry/sdk/configuration/log_record_limits_configuration.h @@ -3,6 +3,8 @@ #pragma once +#include + #include "opentelemetry/version.h" OPENTELEMETRY_BEGIN_NAMESPACE @@ -16,8 +18,12 @@ namespace configuration class LogRecordLimitsConfiguration { public: - std::size_t attribute_value_length_limit; - std::size_t attribute_count_limit; + // TODO: spec default is no limit, using 4096 to preserve original behavior + static constexpr std::size_t kDefaultAttributeValueLengthLimit = 4096; + static constexpr std::size_t kDefaultAttributeCountLimit = 128; + + std::size_t attribute_value_length_limit{kDefaultAttributeValueLengthLimit}; + std::size_t attribute_count_limit{kDefaultAttributeCountLimit}; }; } // namespace configuration diff --git a/sdk/include/opentelemetry/sdk/configuration/logger_config_configuration.h b/sdk/include/opentelemetry/sdk/configuration/logger_config_configuration.h index 736699754f..5f79709105 100644 --- a/sdk/include/opentelemetry/sdk/configuration/logger_config_configuration.h +++ b/sdk/include/opentelemetry/sdk/configuration/logger_config_configuration.h @@ -17,9 +17,13 @@ namespace configuration class LoggerConfigConfiguration { public: - bool enabled{true}; - SeverityNumber minimum_severity{SeverityNumber::trace}; - bool trace_based{false}; + static constexpr bool kDefaultEnabled = true; + static constexpr SeverityNumber kDefaultMinimumSeverity = SeverityNumber::trace; + static constexpr bool kDefaultTraceBased = false; + + bool enabled{kDefaultEnabled}; + SeverityNumber minimum_severity{kDefaultMinimumSeverity}; + bool trace_based{kDefaultTraceBased}; }; } // namespace configuration diff --git a/sdk/include/opentelemetry/sdk/configuration/meter_provider_configuration.h b/sdk/include/opentelemetry/sdk/configuration/meter_provider_configuration.h index a48d522e50..844516a5b6 100644 --- a/sdk/include/opentelemetry/sdk/configuration/meter_provider_configuration.h +++ b/sdk/include/opentelemetry/sdk/configuration/meter_provider_configuration.h @@ -25,7 +25,7 @@ class MeterProviderConfiguration public: std::vector> readers; std::vector> views; - ExemplarFilter exemplar_filter = ExemplarFilter::trace_based; + ExemplarFilter exemplar_filter{ExemplarFilter::trace_based}; std::unique_ptr meter_configurator; }; diff --git a/sdk/include/opentelemetry/sdk/configuration/otlp_file_push_metric_exporter_configuration.h b/sdk/include/opentelemetry/sdk/configuration/otlp_file_push_metric_exporter_configuration.h index 03b75ef593..6744a5810b 100644 --- a/sdk/include/opentelemetry/sdk/configuration/otlp_file_push_metric_exporter_configuration.h +++ b/sdk/include/opentelemetry/sdk/configuration/otlp_file_push_metric_exporter_configuration.h @@ -23,15 +23,19 @@ namespace configuration class OtlpFilePushMetricExporterConfiguration : public PushMetricExporterConfiguration { public: + static constexpr TemporalityPreference kDefaultTemporalityPreference = + TemporalityPreference::cumulative; + static constexpr DefaultHistogramAggregation kDefaultHistogramAggregation = + DefaultHistogramAggregation::explicit_bucket_histogram; + void Accept(PushMetricExporterConfigurationVisitor *visitor) const override { visitor->VisitOtlpFile(this); } std::string output_stream; - TemporalityPreference temporality_preference{TemporalityPreference::cumulative}; - DefaultHistogramAggregation default_histogram_aggregation{ - DefaultHistogramAggregation::explicit_bucket_histogram}; + TemporalityPreference temporality_preference{kDefaultTemporalityPreference}; + DefaultHistogramAggregation default_histogram_aggregation{kDefaultHistogramAggregation}; }; } // namespace configuration diff --git a/sdk/include/opentelemetry/sdk/configuration/otlp_grpc_log_record_exporter_configuration.h b/sdk/include/opentelemetry/sdk/configuration/otlp_grpc_log_record_exporter_configuration.h index 1d0f4a40d5..e1f036eb4d 100644 --- a/sdk/include/opentelemetry/sdk/configuration/otlp_grpc_log_record_exporter_configuration.h +++ b/sdk/include/opentelemetry/sdk/configuration/otlp_grpc_log_record_exporter_configuration.h @@ -3,6 +3,7 @@ #pragma once +#include #include #include @@ -23,6 +24,8 @@ namespace configuration class OtlpGrpcLogRecordExporterConfiguration : public LogRecordExporterConfiguration { public: + static constexpr std::size_t kDefaultTimeoutMs = 10000; + void Accept(LogRecordExporterConfigurationVisitor *visitor) const override { visitor->VisitOtlpGrpc(this); @@ -33,7 +36,7 @@ class OtlpGrpcLogRecordExporterConfiguration : public LogRecordExporterConfigura std::unique_ptr headers; std::string headers_list; std::string compression; - std::size_t timeout{0}; + std::size_t timeout{kDefaultTimeoutMs}; }; } // namespace configuration diff --git a/sdk/include/opentelemetry/sdk/configuration/otlp_grpc_push_metric_exporter_configuration.h b/sdk/include/opentelemetry/sdk/configuration/otlp_grpc_push_metric_exporter_configuration.h index fe63a5e5b9..3078042ca0 100644 --- a/sdk/include/opentelemetry/sdk/configuration/otlp_grpc_push_metric_exporter_configuration.h +++ b/sdk/include/opentelemetry/sdk/configuration/otlp_grpc_push_metric_exporter_configuration.h @@ -3,6 +3,7 @@ #pragma once +#include #include #include @@ -25,6 +26,12 @@ namespace configuration class OtlpGrpcPushMetricExporterConfiguration : public PushMetricExporterConfiguration { public: + static constexpr std::size_t kDefaultTimeoutMs = 10000; + static constexpr TemporalityPreference kDefaultTemporalityPreference = + TemporalityPreference::cumulative; + static constexpr DefaultHistogramAggregation kDefaultHistogramAggregation = + DefaultHistogramAggregation::explicit_bucket_histogram; + void Accept(PushMetricExporterConfigurationVisitor *visitor) const override { visitor->VisitOtlpGrpc(this); @@ -35,10 +42,9 @@ class OtlpGrpcPushMetricExporterConfiguration : public PushMetricExporterConfigu std::unique_ptr headers; std::string headers_list; std::string compression; - std::size_t timeout{0}; - TemporalityPreference temporality_preference{TemporalityPreference::cumulative}; - DefaultHistogramAggregation default_histogram_aggregation{ - DefaultHistogramAggregation::explicit_bucket_histogram}; + std::size_t timeout{kDefaultTimeoutMs}; + TemporalityPreference temporality_preference{kDefaultTemporalityPreference}; + DefaultHistogramAggregation default_histogram_aggregation{kDefaultHistogramAggregation}; }; } // namespace configuration diff --git a/sdk/include/opentelemetry/sdk/configuration/otlp_grpc_span_exporter_configuration.h b/sdk/include/opentelemetry/sdk/configuration/otlp_grpc_span_exporter_configuration.h index 2c2d116907..d61af2f9b1 100644 --- a/sdk/include/opentelemetry/sdk/configuration/otlp_grpc_span_exporter_configuration.h +++ b/sdk/include/opentelemetry/sdk/configuration/otlp_grpc_span_exporter_configuration.h @@ -3,6 +3,7 @@ #pragma once +#include #include #include @@ -23,6 +24,8 @@ namespace configuration class OtlpGrpcSpanExporterConfiguration : public SpanExporterConfiguration { public: + static constexpr std::size_t kDefaultTimeoutMs = 10000; + void Accept(SpanExporterConfigurationVisitor *visitor) const override { visitor->VisitOtlpGrpc(this); @@ -33,7 +36,7 @@ class OtlpGrpcSpanExporterConfiguration : public SpanExporterConfiguration std::unique_ptr headers; std::string headers_list; std::string compression; - std::size_t timeout{0}; + std::size_t timeout{kDefaultTimeoutMs}; }; } // namespace configuration diff --git a/sdk/include/opentelemetry/sdk/configuration/otlp_http_log_record_exporter_configuration.h b/sdk/include/opentelemetry/sdk/configuration/otlp_http_log_record_exporter_configuration.h index 7a27dfc77d..ac008febb5 100644 --- a/sdk/include/opentelemetry/sdk/configuration/otlp_http_log_record_exporter_configuration.h +++ b/sdk/include/opentelemetry/sdk/configuration/otlp_http_log_record_exporter_configuration.h @@ -3,6 +3,7 @@ #pragma once +#include #include #include @@ -24,6 +25,8 @@ namespace configuration class OtlpHttpLogRecordExporterConfiguration : public LogRecordExporterConfiguration { public: + static constexpr std::size_t kDefaultTimeoutMs = 10000; + void Accept(LogRecordExporterConfigurationVisitor *visitor) const override { visitor->VisitOtlpHttp(this); @@ -34,7 +37,7 @@ class OtlpHttpLogRecordExporterConfiguration : public LogRecordExporterConfigura std::unique_ptr headers; std::string headers_list; std::string compression; - std::size_t timeout{0}; + std::size_t timeout{kDefaultTimeoutMs}; OtlpHttpEncoding encoding{OtlpHttpEncoding::protobuf}; }; diff --git a/sdk/include/opentelemetry/sdk/configuration/otlp_http_push_metric_exporter_configuration.h b/sdk/include/opentelemetry/sdk/configuration/otlp_http_push_metric_exporter_configuration.h index 4c71d45b46..a5da072812 100644 --- a/sdk/include/opentelemetry/sdk/configuration/otlp_http_push_metric_exporter_configuration.h +++ b/sdk/include/opentelemetry/sdk/configuration/otlp_http_push_metric_exporter_configuration.h @@ -3,6 +3,7 @@ #pragma once +#include #include #include @@ -26,6 +27,12 @@ namespace configuration class OtlpHttpPushMetricExporterConfiguration : public PushMetricExporterConfiguration { public: + static constexpr std::size_t kDefaultTimeoutMs = 10000; + static constexpr TemporalityPreference kDefaultTemporalityPreference = + TemporalityPreference::cumulative; + static constexpr DefaultHistogramAggregation kDefaultHistogramAggregation = + DefaultHistogramAggregation::explicit_bucket_histogram; + void Accept(PushMetricExporterConfigurationVisitor *visitor) const override { visitor->VisitOtlpHttp(this); @@ -36,11 +43,10 @@ class OtlpHttpPushMetricExporterConfiguration : public PushMetricExporterConfigu std::unique_ptr headers; std::string headers_list; std::string compression; - std::size_t timeout{0}; + std::size_t timeout{kDefaultTimeoutMs}; OtlpHttpEncoding encoding{OtlpHttpEncoding::protobuf}; - TemporalityPreference temporality_preference{TemporalityPreference::cumulative}; - DefaultHistogramAggregation default_histogram_aggregation{ - DefaultHistogramAggregation::explicit_bucket_histogram}; + TemporalityPreference temporality_preference{kDefaultTemporalityPreference}; + DefaultHistogramAggregation default_histogram_aggregation{kDefaultHistogramAggregation}; }; } // namespace configuration diff --git a/sdk/include/opentelemetry/sdk/configuration/otlp_http_span_exporter_configuration.h b/sdk/include/opentelemetry/sdk/configuration/otlp_http_span_exporter_configuration.h index 39353fa371..5867db0e24 100644 --- a/sdk/include/opentelemetry/sdk/configuration/otlp_http_span_exporter_configuration.h +++ b/sdk/include/opentelemetry/sdk/configuration/otlp_http_span_exporter_configuration.h @@ -3,6 +3,7 @@ #pragma once +#include #include #include @@ -24,6 +25,8 @@ namespace configuration class OtlpHttpSpanExporterConfiguration : public SpanExporterConfiguration { public: + static constexpr std::size_t kDefaultTimeoutMs = 10000; + void Accept(SpanExporterConfigurationVisitor *visitor) const override { visitor->VisitOtlpHttp(this); @@ -34,7 +37,7 @@ class OtlpHttpSpanExporterConfiguration : public SpanExporterConfiguration std::unique_ptr headers; std::string headers_list; std::string compression; - std::size_t timeout{0}; + std::size_t timeout{kDefaultTimeoutMs}; OtlpHttpEncoding encoding{OtlpHttpEncoding::protobuf}; }; diff --git a/sdk/include/opentelemetry/sdk/configuration/periodic_metric_reader_configuration.h b/sdk/include/opentelemetry/sdk/configuration/periodic_metric_reader_configuration.h index 21264ee88a..6aed2b4e25 100644 --- a/sdk/include/opentelemetry/sdk/configuration/periodic_metric_reader_configuration.h +++ b/sdk/include/opentelemetry/sdk/configuration/periodic_metric_reader_configuration.h @@ -3,6 +3,7 @@ #pragma once +#include #include #include @@ -24,13 +25,17 @@ namespace configuration class PeriodicMetricReaderConfiguration : public MetricReaderConfiguration { public: + // TODO: spec default is 60000ms for interval, using 5000ms to preserve original behavior + static constexpr std::size_t kDefaultIntervalMs = 5000; + static constexpr std::size_t kDefaultTimeoutMs = 30000; + void Accept(MetricReaderConfigurationVisitor *visitor) const override { visitor->VisitPeriodic(this); } - std::size_t interval{0}; - std::size_t timeout{0}; + std::size_t interval{kDefaultIntervalMs}; + std::size_t timeout{kDefaultTimeoutMs}; std::unique_ptr exporter; std::vector> producers; std::unique_ptr cardinality_limits; diff --git a/sdk/include/opentelemetry/sdk/configuration/prometheus_pull_metric_exporter_configuration.h b/sdk/include/opentelemetry/sdk/configuration/prometheus_pull_metric_exporter_configuration.h index c3aa03fe65..141db9250b 100644 --- a/sdk/include/opentelemetry/sdk/configuration/prometheus_pull_metric_exporter_configuration.h +++ b/sdk/include/opentelemetry/sdk/configuration/prometheus_pull_metric_exporter_configuration.h @@ -3,6 +3,7 @@ #pragma once +#include #include #include "opentelemetry/sdk/configuration/headers_configuration.h" @@ -23,17 +24,24 @@ namespace configuration class PrometheusPullMetricExporterConfiguration : public PullMetricExporterConfiguration { public: + static constexpr const char *kDefaultHost = "localhost"; + static constexpr std::size_t kDefaultPort = 9464; + static constexpr bool kDefaultWithoutScopeInfo = false; // schema: scope_info_enabled=true + static constexpr bool kDefaultWithoutTargetInfo = false; // schema: target_info_enabled=true + static constexpr TranslationStrategy kDefaultTranslationStrategy = + TranslationStrategy::UnderscoreEscapingWithSuffixes; + void Accept(PullMetricExporterConfigurationVisitor *visitor) const override { visitor->VisitPrometheus(this); } - std::string host; - std::size_t port{0}; - bool without_scope_info{false}; - bool without_target_info{false}; + std::string host{kDefaultHost}; + std::size_t port{kDefaultPort}; + bool without_scope_info{kDefaultWithoutScopeInfo}; + bool without_target_info{kDefaultWithoutTargetInfo}; std::unique_ptr with_resource_constant_labels; - TranslationStrategy translation_strategy; + TranslationStrategy translation_strategy{kDefaultTranslationStrategy}; }; } // namespace configuration diff --git a/sdk/include/opentelemetry/sdk/configuration/ryml_document_node.h b/sdk/include/opentelemetry/sdk/configuration/ryml_document_node.h index 82cdb8e683..23e559977a 100644 --- a/sdk/include/opentelemetry/sdk/configuration/ryml_document_node.h +++ b/sdk/include/opentelemetry/sdk/configuration/ryml_document_node.h @@ -70,7 +70,7 @@ class RymlDocumentNode : public DocumentNode const RymlDocument *doc_; ryml::ConstNodeRef node_; - std::size_t depth_; + std::size_t depth_{}; }; class RymlDocumentNodeConstIteratorImpl : public DocumentNodeConstIteratorImpl diff --git a/sdk/include/opentelemetry/sdk/configuration/span_limits_configuration.h b/sdk/include/opentelemetry/sdk/configuration/span_limits_configuration.h index a4624bb1a5..1664d24958 100644 --- a/sdk/include/opentelemetry/sdk/configuration/span_limits_configuration.h +++ b/sdk/include/opentelemetry/sdk/configuration/span_limits_configuration.h @@ -3,6 +3,8 @@ #pragma once +#include + #include "opentelemetry/version.h" OPENTELEMETRY_BEGIN_NAMESPACE @@ -16,12 +18,20 @@ namespace configuration class SpanLimitsConfiguration { public: - std::size_t attribute_value_length_limit; - std::size_t attribute_count_limit; - std::size_t event_count_limit; - std::size_t link_count_limit; - std::size_t event_attribute_count_limit; - std::size_t link_attribute_count_limit; + // TODO: spec default is no limit, using 4096 to preserve original behavior + static constexpr std::size_t kDefaultAttributeValueLengthLimit = 4096; + static constexpr std::size_t kDefaultAttributeCountLimit = 128; + static constexpr std::size_t kDefaultEventCountLimit = 128; + static constexpr std::size_t kDefaultLinkCountLimit = 128; + static constexpr std::size_t kDefaultEventAttributeCountLimit = 128; + static constexpr std::size_t kDefaultLinkAttributeCountLimit = 128; + + std::size_t attribute_value_length_limit{kDefaultAttributeValueLengthLimit}; + std::size_t attribute_count_limit{kDefaultAttributeCountLimit}; + std::size_t event_count_limit{kDefaultEventCountLimit}; + std::size_t link_count_limit{kDefaultLinkCountLimit}; + std::size_t event_attribute_count_limit{kDefaultEventAttributeCountLimit}; + std::size_t link_attribute_count_limit{kDefaultLinkAttributeCountLimit}; }; } // namespace configuration diff --git a/sdk/include/opentelemetry/sdk/configuration/trace_id_ratio_based_sampler_configuration.h b/sdk/include/opentelemetry/sdk/configuration/trace_id_ratio_based_sampler_configuration.h index bc19cad509..b884142a77 100644 --- a/sdk/include/opentelemetry/sdk/configuration/trace_id_ratio_based_sampler_configuration.h +++ b/sdk/include/opentelemetry/sdk/configuration/trace_id_ratio_based_sampler_configuration.h @@ -18,12 +18,15 @@ namespace configuration class TraceIdRatioBasedSamplerConfiguration : public SamplerConfiguration { public: + // TODO: spec default is 1.0, using 0.0 to preserve original behavior + static constexpr double kDefaultRatio = 0.0; + void Accept(SamplerConfigurationVisitor *visitor) const override { visitor->VisitTraceIdRatioBased(this); } - double ratio{0.0}; + double ratio{kDefaultRatio}; }; } // namespace configuration diff --git a/sdk/include/opentelemetry/sdk/configuration/view_stream_configuration.h b/sdk/include/opentelemetry/sdk/configuration/view_stream_configuration.h index 006c83d460..1f10d837c2 100644 --- a/sdk/include/opentelemetry/sdk/configuration/view_stream_configuration.h +++ b/sdk/include/opentelemetry/sdk/configuration/view_stream_configuration.h @@ -3,6 +3,7 @@ #pragma once +#include #include #include #include @@ -22,10 +23,13 @@ namespace configuration class ViewStreamConfiguration { public: + // 0 is a sentinel: inherit cardinality limit from the metric reader (schema exclusiveMinimum: 0) + static constexpr std::size_t kInheritFromReader = 0; + std::string name; std::string description; std::unique_ptr aggregation; - std::size_t aggregation_cardinality_limit; + std::size_t aggregation_cardinality_limit{kInheritFromReader}; std::unique_ptr attribute_keys; }; diff --git a/sdk/include/opentelemetry/sdk/metrics/data/metric_data.h b/sdk/include/opentelemetry/sdk/metrics/data/metric_data.h index 30fa04e47f..4be493c0ac 100644 --- a/sdk/include/opentelemetry/sdk/metrics/data/metric_data.h +++ b/sdk/include/opentelemetry/sdk/metrics/data/metric_data.h @@ -34,7 +34,7 @@ class MetricData { public: InstrumentDescriptor instrument_descriptor; - AggregationTemporality aggregation_temporality; + AggregationTemporality aggregation_temporality{AggregationTemporality::kUnspecified}; opentelemetry::common::SystemTimestamp start_ts; opentelemetry::common::SystemTimestamp end_ts; std::vector point_data_attr_; diff --git a/sdk/include/opentelemetry/sdk/metrics/meter_config.h b/sdk/include/opentelemetry/sdk/metrics/meter_config.h index e02fdd21b4..b2e2d60796 100644 --- a/sdk/include/opentelemetry/sdk/metrics/meter_config.h +++ b/sdk/include/opentelemetry/sdk/metrics/meter_config.h @@ -50,7 +50,7 @@ class OPENTELEMETRY_EXPORT MeterConfig private: explicit MeterConfig(const bool enabled = true) : enabled_(enabled) {} - bool enabled_; + bool enabled_{true}; }; } // namespace metrics } // namespace sdk diff --git a/sdk/src/CMakeLists.txt b/sdk/src/CMakeLists.txt index c922726547..e562fc0dc9 100644 --- a/sdk/src/CMakeLists.txt +++ b/sdk/src/CMakeLists.txt @@ -7,7 +7,4 @@ add_subdirectory(metrics) add_subdirectory(logs) add_subdirectory(version) add_subdirectory(resource) - -if(WITH_CONFIGURATION) - add_subdirectory(configuration) -endif() +add_subdirectory(configuration) diff --git a/sdk/src/configuration/BUILD b/sdk/src/configuration/BUILD index f9556f703c..c9b8d25928 100644 --- a/sdk/src/configuration/BUILD +++ b/sdk/src/configuration/BUILD @@ -6,13 +6,39 @@ load("@rules_cc//cc:cc_library.bzl", "cc_library") package(default_visibility = ["//visibility:public"]) cc_library( - name = "configuration", - srcs = glob(["**/*.cc"]), + name = "configuration_core", + srcs = [ + "composable_always_off_sampler_configuration.cc", + "composable_always_on_sampler_configuration.cc", + "composable_parent_threshold_sampler_configuration.cc", + "composable_probability_sampler_configuration.cc", + "composable_rule_based_sampler_configuration.cc", + "configured_sdk.cc", + "document_node.cc", + "registry.cc", + "sdk_builder.cc", + ], include_prefix = "src/configuration", deps = [ "//api", "//sdk:headers", "//sdk/src/common:wildcard_match", + ], +) + +cc_library( + name = "configuration", + srcs = [ + "configuration_parser.cc", + "ryml_document.cc", + "ryml_document_node.cc", + "yaml_configuration_parser.cc", + ], + include_prefix = "src/configuration", + deps = [ + ":configuration_core", + "//api", + "//sdk:headers", "@rapidyaml", ], ) diff --git a/sdk/src/configuration/CMakeLists.txt b/sdk/src/configuration/CMakeLists.txt index 19447fb28d..b4f9b364bb 100644 --- a/sdk/src/configuration/CMakeLists.txt +++ b/sdk/src/configuration/CMakeLists.txt @@ -2,12 +2,8 @@ # SPDX-License-Identifier: Apache-2.0 add_library( - opentelemetry_configuration - configuration_parser.cc + opentelemetry_configuration_core document_node.cc - yaml_configuration_parser.cc - ryml_document.cc - ryml_document_node.cc configured_sdk.cc sdk_builder.cc registry.cc @@ -17,24 +13,46 @@ add_library( composable_parent_threshold_sampler_configuration.cc composable_rule_based_sampler_configuration.cc) -set_target_properties(opentelemetry_configuration PROPERTIES EXPORT_NAME - configuration) -set_target_version(opentelemetry_configuration) +set_target_properties(opentelemetry_configuration_core + PROPERTIES EXPORT_NAME configuration_core) target_include_directories( - opentelemetry_configuration + opentelemetry_configuration_core PUBLIC "$" "$") target_link_libraries( - opentelemetry_configuration + opentelemetry_configuration_core PUBLIC opentelemetry_api opentelemetry_common opentelemetry_trace opentelemetry_metrics opentelemetry_logs - PRIVATE ryml::ryml) - -if(OPENTELEMETRY_INSTALL) - opentelemetry_add_pkgconfig( - configuration "OpenTelemetry SDK - Configuration" - "Components for exporting traces in the OpenTelemetry SDK." - "opentelemetry_configuration") -endif() + PRIVATE) + +if(WITH_CONFIGURATION) + + add_library( + opentelemetry_configuration + configuration_parser.cc yaml_configuration_parser.cc ryml_document.cc + ryml_document_node.cc) + + set_target_properties(opentelemetry_configuration PROPERTIES EXPORT_NAME + configuration) + set_target_version(opentelemetry_configuration) + + target_include_directories( + opentelemetry_configuration + PUBLIC "$" + "$") + + target_link_libraries( + opentelemetry_configuration + PUBLIC opentelemetry_configuration_core + PRIVATE ryml::ryml) + + if(OPENTELEMETRY_INSTALL) + opentelemetry_add_pkgconfig( + configuration "OpenTelemetry SDK - Configuration" + "Components for exporting traces in the OpenTelemetry SDK." + "opentelemetry_configuration") + endif() + +endif(WITH_CONFIGURATION) diff --git a/sdk/src/configuration/configuration_parser.cc b/sdk/src/configuration/configuration_parser.cc index 5e00cbc7de..45ddfca83d 100644 --- a/sdk/src/configuration/configuration_parser.cc +++ b/sdk/src/configuration/configuration_parser.cc @@ -356,10 +356,13 @@ std::unique_ptr ConfigurationParser::ParseAttributeLimitsConfiguration( const std::unique_ptr &node) const { - auto model = std::make_unique(); + using Config = AttributeLimitsConfiguration; + auto model = std::make_unique(); - model->attribute_value_length_limit = node->GetInteger("attribute_value_length_limit", 4096); - model->attribute_count_limit = node->GetInteger("attribute_count_limit", 128); + model->attribute_value_length_limit = + node->GetInteger("attribute_value_length_limit", Config::kDefaultAttributeValueLengthLimit); + model->attribute_count_limit = + node->GetInteger("attribute_count_limit", Config::kDefaultAttributeCountLimit); return model; } @@ -379,12 +382,13 @@ std::unique_ptr ConfigurationParser::ParseHttpTlsConfigura std::unique_ptr ConfigurationParser::ParseGrpcTlsConfiguration( const std::unique_ptr &node) const { - auto model = std::make_unique(); + using Config = GrpcTlsConfiguration; + auto model = std::make_unique(); model->ca_file = node->GetString("ca_file", ""); model->key_file = node->GetString("key_file", ""); model->cert_file = node->GetString("cert_file", ""); - model->insecure = node->GetBoolean("insecure", false); + model->insecure = node->GetBoolean("insecure", Config::kDefaultInsecure); return model; } @@ -393,7 +397,8 @@ std::unique_ptr ConfigurationParser::ParseOtlpHttpLogRecordExporterConfiguration( const std::unique_ptr &node) const { - auto model = std::make_unique(); + using Config = OtlpHttpLogRecordExporterConfiguration; + auto model = std::make_unique(); std::unique_ptr child; model->endpoint = node->GetRequiredString("endpoint"); @@ -412,7 +417,7 @@ ConfigurationParser::ParseOtlpHttpLogRecordExporterConfiguration( model->headers_list = node->GetString("headers_list", ""); model->compression = node->GetString("compression", ""); - model->timeout = node->GetInteger("timeout", 10000); + model->timeout = node->GetInteger("timeout", Config::kDefaultTimeoutMs); const std::string encoding = node->GetString("encoding", "protobuf"); model->encoding = ParseOtlpHttpEncoding(node, encoding); @@ -424,7 +429,8 @@ std::unique_ptr ConfigurationParser::ParseOtlpGrpcLogRecordExporterConfiguration( const std::unique_ptr &node) const { - auto model = std::make_unique(); + using Config = OtlpGrpcLogRecordExporterConfiguration; + auto model = std::make_unique(); std::unique_ptr child; model->endpoint = node->GetRequiredString("endpoint"); @@ -443,7 +449,7 @@ ConfigurationParser::ParseOtlpGrpcLogRecordExporterConfiguration( model->headers_list = node->GetString("headers_list", ""); model->compression = node->GetString("compression", ""); - model->timeout = node->GetInteger("timeout", 10000); + model->timeout = node->GetInteger("timeout", Config::kDefaultTimeoutMs); return model; } @@ -534,13 +540,15 @@ std::unique_ptr ConfigurationParser::ParseBatchLogRecordProcessorConfiguration( const std::unique_ptr &node) const { - auto model = std::make_unique(); + using Config = BatchLogRecordProcessorConfiguration; + auto model = std::make_unique(); std::unique_ptr child; - model->schedule_delay = node->GetInteger("schedule_delay", 5000); - model->export_timeout = node->GetInteger("export_timeout", 30000); - model->max_queue_size = node->GetInteger("max_queue_size", 2048); - model->max_export_batch_size = node->GetInteger("max_export_batch_size", 512); + model->schedule_delay = node->GetInteger("schedule_delay", Config::kDefaultScheduleDelayMs); + model->export_timeout = node->GetInteger("export_timeout", Config::kDefaultExportTimeoutMs); + model->max_queue_size = node->GetInteger("max_queue_size", Config::kDefaultMaxQueueSize); + model->max_export_batch_size = + node->GetInteger("max_export_batch_size", Config::kDefaultMaxExportBatchSize); child = node->GetRequiredChildNode("exporter"); model->exporter = ParseLogRecordExporterConfiguration(child); @@ -618,10 +626,13 @@ std::unique_ptr ConfigurationParser::ParseLogRecordLimitsConfiguration( const std::unique_ptr &node) const { - auto model = std::make_unique(); + using Config = LogRecordLimitsConfiguration; + auto model = std::make_unique(); - model->attribute_value_length_limit = node->GetInteger("attribute_value_length_limit", 4096); - model->attribute_count_limit = node->GetInteger("attribute_count_limit", 128); + model->attribute_value_length_limit = + node->GetInteger("attribute_value_length_limit", Config::kDefaultAttributeValueLengthLimit); + model->attribute_count_limit = + node->GetInteger("attribute_count_limit", Config::kDefaultAttributeCountLimit); return model; } @@ -629,13 +640,14 @@ ConfigurationParser::ParseLogRecordLimitsConfiguration( LoggerConfigConfiguration ConfigurationParser::ParseLoggerConfigConfiguration( const std::unique_ptr &node) const { - LoggerConfigConfiguration model; - model.enabled = node->GetBoolean("enabled", true); + using Config = LoggerConfigConfiguration; + Config model; + model.enabled = node->GetBoolean("enabled", Config::kDefaultEnabled); const std::string minimum_severity_str = node->GetString("minimum_severity", "trace"); model.minimum_severity = ParseSeverityNumber(node, minimum_severity_str); - model.trace_based = node->GetBoolean("trace_based", false); + model.trace_based = node->GetBoolean("trace_based", Config::kDefaultTraceBased); return model; } @@ -756,7 +768,8 @@ std::unique_ptr ConfigurationParser::ParseOtlpHttpPushMetricExporterConfiguration( const std::unique_ptr &node) const { - auto model = std::make_unique(); + using Config = OtlpHttpPushMetricExporterConfiguration; + auto model = std::make_unique(); std::unique_ptr child; model->endpoint = node->GetRequiredString("endpoint"); @@ -775,7 +788,7 @@ ConfigurationParser::ParseOtlpHttpPushMetricExporterConfiguration( model->headers_list = node->GetString("headers_list", ""); model->compression = node->GetString("compression", ""); - model->timeout = node->GetInteger("timeout", 10000); + model->timeout = node->GetInteger("timeout", Config::kDefaultTimeoutMs); const std::string temporality_preference = node->GetString("temporality_preference", "cumulative"); @@ -796,7 +809,8 @@ std::unique_ptr ConfigurationParser::ParseOtlpGrpcPushMetricExporterConfiguration( const std::unique_ptr &node) const { - auto model = std::make_unique(); + using Config = OtlpGrpcPushMetricExporterConfiguration; + auto model = std::make_unique(); std::unique_ptr child; model->endpoint = node->GetRequiredString("endpoint"); @@ -815,7 +829,7 @@ ConfigurationParser::ParseOtlpGrpcPushMetricExporterConfiguration( model->headers_list = node->GetString("headers_list", ""); model->compression = node->GetString("compression", ""); - model->timeout = node->GetInteger("timeout", 10000); + model->timeout = node->GetInteger("timeout", Config::kDefaultTimeoutMs); const std::string temporality_preference = node->GetString("temporality_preference", "cumulative"); @@ -901,13 +915,16 @@ std::unique_ptr ConfigurationParser::ParsePrometheusPullMetricExporterConfiguration( const std::unique_ptr &node) const { - auto model = std::make_unique(); + using Config = PrometheusPullMetricExporterConfiguration; + auto model = std::make_unique(); std::unique_ptr child; - model->host = node->GetString("host", "localhost"); - model->port = node->GetInteger("port", 9464); - model->without_scope_info = node->GetBoolean("without_scope_info", false); - model->without_target_info = node->GetBoolean("without_target_info", false); + model->host = node->GetString("host", Config::kDefaultHost); + model->port = node->GetInteger("port", Config::kDefaultPort); + model->without_scope_info = + node->GetBoolean("without_scope_info", Config::kDefaultWithoutScopeInfo); + model->without_target_info = + node->GetBoolean("without_target_info", Config::kDefaultWithoutTargetInfo); child = node->GetChildNode("with_resource_constant_labels"); if (child) @@ -1093,16 +1110,18 @@ std::unique_ptr ConfigurationParser::ParseCardinalityLimitsConfiguration( const std::unique_ptr &node) const { - auto model = std::make_unique(); + using Config = CardinalityLimitsConfiguration; + auto model = std::make_unique(); - model->default_limit = node->GetInteger("default", 2000); - model->counter = node->GetInteger("counter", 0); - model->gauge = node->GetInteger("gauge", 0); - model->histogram = node->GetInteger("histogram", 0); - model->observable_counter = node->GetInteger("observable_counter", 0); - model->observable_gauge = node->GetInteger("observable_gauge", 0); - model->observable_up_down_counter = node->GetInteger("observable_up_down_counter", 0); - model->up_down_counter = node->GetInteger("up_down_counter", 0); + model->default_limit = node->GetInteger("default", Config::kDefaultLimit); + model->counter = node->GetInteger("counter", Config::kInheritDefault); + model->gauge = node->GetInteger("gauge", Config::kInheritDefault); + model->histogram = node->GetInteger("histogram", Config::kInheritDefault); + model->observable_counter = node->GetInteger("observable_counter", Config::kInheritDefault); + model->observable_gauge = node->GetInteger("observable_gauge", Config::kInheritDefault); + model->observable_up_down_counter = + node->GetInteger("observable_up_down_counter", Config::kInheritDefault); + model->up_down_counter = node->GetInteger("up_down_counter", Config::kInheritDefault); return model; } @@ -1111,11 +1130,12 @@ std::unique_ptr ConfigurationParser::ParsePeriodicMetricReaderConfiguration( const std::unique_ptr &node) const { - auto model = std::make_unique(); + using Config = PeriodicMetricReaderConfiguration; + auto model = std::make_unique(); std::unique_ptr child; - model->interval = node->GetInteger("interval", 5000); - model->timeout = node->GetInteger("timeout", 30000); + model->interval = node->GetInteger("interval", Config::kDefaultIntervalMs); + model->timeout = node->GetInteger("timeout", Config::kDefaultTimeoutMs); child = node->GetRequiredChildNode("exporter"); model->exporter = ParsePushMetricExporterConfiguration(child); @@ -1320,7 +1340,8 @@ std::unique_ptr ConfigurationParser::ParseExplicitBucketHistogramAggregationConfiguration( const std::unique_ptr &node) const { - auto model = std::make_unique(); + using Config = ExplicitBucketHistogramAggregationConfiguration; + auto model = std::make_unique(); std::unique_ptr child; child = node->GetChildNode("boundaries"); @@ -1337,7 +1358,7 @@ ConfigurationParser::ParseExplicitBucketHistogramAggregationConfiguration( } } - model->record_min_max = node->GetBoolean("record_min_max", true); + model->record_min_max = node->GetBoolean("record_min_max", Config::kDefaultRecordMinMax); return model; } @@ -1346,11 +1367,12 @@ std::unique_ptr ConfigurationParser::ParseBase2ExponentialBucketHistogramAggregationConfiguration( const std::unique_ptr &node) const { - auto model = std::make_unique(); + using Config = Base2ExponentialBucketHistogramAggregationConfiguration; + auto model = std::make_unique(); - model->max_scale = node->GetInteger("max_scale", 20); - model->max_size = node->GetInteger("max_size", 160); - model->record_min_max = node->GetBoolean("record_min_max", true); + model->max_scale = node->GetInteger("max_scale", Config::kDefaultMaxScale); + model->max_size = node->GetInteger("max_size", Config::kDefaultMaxSize); + model->record_min_max = node->GetBoolean("record_min_max", Config::kDefaultRecordMinMax); return model; } @@ -1427,12 +1449,14 @@ std::unique_ptr ConfigurationParser::ParseAggregationC std::unique_ptr ConfigurationParser::ParseViewStreamConfiguration( const std::unique_ptr &node) const { - auto model = std::make_unique(); + using Config = ViewStreamConfiguration; + auto model = std::make_unique(); std::unique_ptr child; - model->name = node->GetString("name", ""); - model->description = node->GetString("description", ""); - model->aggregation_cardinality_limit = node->GetInteger("aggregation_cardinality_limit", 0); + model->name = node->GetString("name", ""); + model->description = node->GetString("description", ""); + model->aggregation_cardinality_limit = + node->GetInteger("aggregation_cardinality_limit", Config::kInheritFromReader); child = node->GetChildNode("aggregation"); if (child) @@ -1594,14 +1618,19 @@ std::unique_ptr ConfigurationParser::ParsePropagatorCon std::unique_ptr ConfigurationParser::ParseSpanLimitsConfiguration( const std::unique_ptr &node) const { - auto model = std::make_unique(); + using Config = SpanLimitsConfiguration; + auto model = std::make_unique(); - model->attribute_value_length_limit = node->GetInteger("attribute_value_length_limit", 4096); - model->attribute_count_limit = node->GetInteger("attribute_count_limit", 128); - model->event_count_limit = node->GetInteger("event_count_limit", 128); - model->link_count_limit = node->GetInteger("link_count_limit", 128); - model->event_attribute_count_limit = node->GetInteger("event_attribute_count_limit", 128); - model->link_attribute_count_limit = node->GetInteger("link_attribute_count_limit", 128); + model->attribute_value_length_limit = + node->GetInteger("attribute_value_length_limit", Config::kDefaultAttributeValueLengthLimit); + model->attribute_count_limit = + node->GetInteger("attribute_count_limit", Config::kDefaultAttributeCountLimit); + model->event_count_limit = node->GetInteger("event_count_limit", Config::kDefaultEventCountLimit); + model->link_count_limit = node->GetInteger("link_count_limit", Config::kDefaultLinkCountLimit); + model->event_attribute_count_limit = + node->GetInteger("event_attribute_count_limit", Config::kDefaultEventAttributeCountLimit); + model->link_attribute_count_limit = + node->GetInteger("link_attribute_count_limit", Config::kDefaultLinkAttributeCountLimit); return model; } @@ -1632,6 +1661,8 @@ ConfigurationParser::ParseJaegerRemoteSamplerConfiguration( const std::unique_ptr &node, size_t depth) const { + using Config = JaegerRemoteSamplerConfiguration; + auto model = std::make_unique(); std::unique_ptr child; @@ -1640,7 +1671,7 @@ ConfigurationParser::ParseJaegerRemoteSamplerConfiguration( OTEL_INTERNAL_LOG_ERROR("JaegerRemoteSamplerConfiguration: FIXME"); model->endpoint = node->GetString("endpoint", "FIXME"); - model->interval = node->GetInteger("interval", 0); + model->interval = node->GetInteger("interval", Config::kDefaultIntervalMs); child = node->GetChildNode("initial_sampler"); if (child) @@ -1703,10 +1734,11 @@ ConfigurationParser::ParseTraceIdRatioBasedSamplerConfiguration( const std::unique_ptr &node, size_t /* depth */) const { - auto model = std::make_unique(); + using Config = TraceIdRatioBasedSamplerConfiguration; + auto model = std::make_unique(); std::unique_ptr child; - model->ratio = node->GetDouble("ratio", 0); + model->ratio = node->GetDouble("ratio", Config::kDefaultRatio); return model; } @@ -1732,8 +1764,9 @@ ConfigurationParser::ParseComposableProbabilitySamplerConfiguration( const std::unique_ptr &node, size_t /* depth */) const { + using Config = ComposableProbabilitySamplerConfiguration; auto model = std::make_unique(); - model->ratio = node->GetDouble("ratio", 1.0); + model->ratio = node->GetDouble("ratio", Config::kDefaultRatio); return model; } @@ -2009,7 +2042,8 @@ std::unique_ptr ConfigurationParser::ParseOtlpHttpSpanExporterConfiguration( const std::unique_ptr &node) const { - auto model = std::make_unique(); + using Config = OtlpHttpSpanExporterConfiguration; + auto model = std::make_unique(); std::unique_ptr child; model->endpoint = node->GetRequiredString("endpoint"); @@ -2028,7 +2062,7 @@ ConfigurationParser::ParseOtlpHttpSpanExporterConfiguration( model->headers_list = node->GetString("headers_list", ""); model->compression = node->GetString("compression", ""); - model->timeout = node->GetInteger("timeout", 10000); + model->timeout = node->GetInteger("timeout", Config::kDefaultTimeoutMs); const std::string encoding = node->GetString("encoding", "protobuf"); model->encoding = ParseOtlpHttpEncoding(node, encoding); @@ -2040,7 +2074,8 @@ std::unique_ptr ConfigurationParser::ParseOtlpGrpcSpanExporterConfiguration( const std::unique_ptr &node) const { - auto model = std::make_unique(); + using Config = OtlpGrpcSpanExporterConfiguration; + auto model = std::make_unique(); std::unique_ptr child; model->endpoint = node->GetRequiredString("endpoint"); @@ -2059,7 +2094,7 @@ ConfigurationParser::ParseOtlpGrpcSpanExporterConfiguration( model->headers_list = node->GetString("headers_list", ""); model->compression = node->GetString("compression", ""); - model->timeout = node->GetInteger("timeout", 10000); + model->timeout = node->GetInteger("timeout", Config::kDefaultTimeoutMs); return model; } @@ -2149,13 +2184,15 @@ std::unique_ptr ConfigurationParser::ParseBatchSpanProcessorConfiguration( const std::unique_ptr &node) const { - auto model = std::make_unique(); + using Config = BatchSpanProcessorConfiguration; + auto model = std::make_unique(); std::unique_ptr child; - model->schedule_delay = node->GetInteger("schedule_delay", 5000); - model->export_timeout = node->GetInteger("export_timeout", 30000); - model->max_queue_size = node->GetInteger("max_queue_size", 2048); - model->max_export_batch_size = node->GetInteger("max_export_batch_size", 512); + model->schedule_delay = node->GetInteger("schedule_delay", Config::kDefaultScheduleDelayMs); + model->export_timeout = node->GetInteger("export_timeout", Config::kDefaultExportTimeoutMs); + model->max_queue_size = node->GetInteger("max_queue_size", Config::kDefaultMaxQueueSize); + model->max_export_batch_size = + node->GetInteger("max_export_batch_size", Config::kDefaultMaxExportBatchSize); child = node->GetRequiredChildNode("exporter"); model->exporter = ParseSpanExporterConfiguration(child); diff --git a/sdk/src/configuration/registry.cc b/sdk/src/configuration/registry.cc index 0671db848f..d2c8883c3f 100644 --- a/sdk/src/configuration/registry.cc +++ b/sdk/src/configuration/registry.cc @@ -7,6 +7,7 @@ #include #include "opentelemetry/baggage/propagation/baggage_propagator.h" +#include "opentelemetry/context/propagation/text_map_propagator.h" #include "opentelemetry/sdk/configuration/extension_log_record_exporter_builder.h" #include "opentelemetry/sdk/configuration/extension_log_record_processor_builder.h" #include "opentelemetry/sdk/configuration/extension_pull_metric_exporter_builder.h" diff --git a/sdk/src/configuration/sdk_builder.cc b/sdk/src/configuration/sdk_builder.cc index c077761859..4f2dad0944 100644 --- a/sdk/src/configuration/sdk_builder.cc +++ b/sdk/src/configuration/sdk_builder.cc @@ -43,6 +43,7 @@ #include "opentelemetry/sdk/configuration/console_span_exporter_configuration.h" #include "opentelemetry/sdk/configuration/double_array_attribute_value_configuration.h" #include "opentelemetry/sdk/configuration/double_attribute_value_configuration.h" +#include "opentelemetry/sdk/configuration/exemplar_filter.h" #include "opentelemetry/sdk/configuration/explicit_bucket_histogram_aggregation_configuration.h" #include "opentelemetry/sdk/configuration/extension_log_record_exporter_builder.h" #include "opentelemetry/sdk/configuration/extension_log_record_exporter_configuration.h" @@ -142,7 +143,6 @@ #include "opentelemetry/sdk/logs/processor.h" #include "opentelemetry/sdk/logs/simple_log_record_processor_factory.h" #include "opentelemetry/sdk/metrics/aggregation/aggregation_config.h" -#include "opentelemetry/sdk/metrics/exemplar/filter_type.h" #include "opentelemetry/sdk/metrics/export/metric_producer.h" #include "opentelemetry/sdk/metrics/export/periodic_exporting_metric_reader_factory.h" #include "opentelemetry/sdk/metrics/export/periodic_exporting_metric_reader_options.h" @@ -180,7 +180,7 @@ #include "src/common/wildcard_match.h" #ifdef ENABLE_METRICS_EXEMPLAR_PREVIEW -# include "opentelemetry/sdk/configuration/exemplar_filter.h" +# include "opentelemetry/sdk/metrics/exemplar/filter_type.h" #endif OPENTELEMETRY_BEGIN_NAMESPACE @@ -724,7 +724,8 @@ class AggregationConfigBuilder aggregation_type = opentelemetry::sdk::metrics::AggregationType::kSum; } - opentelemetry::sdk::metrics::AggregationType aggregation_type; + opentelemetry::sdk::metrics::AggregationType aggregation_type{ + opentelemetry::sdk::metrics::AggregationType::kDefault}; std::unique_ptr aggregation_config; private: @@ -853,7 +854,15 @@ std::unique_ptr SdkBuilder::CreateParentBase std::unique_ptr local_parent_sampled_sdk; std::unique_ptr local_parent_not_sampled_sdk; - auto root_sdk = SdkBuilder::CreateSampler(model->root); + std::unique_ptr root_sdk; + if (model->root) + { + root_sdk = SdkBuilder::CreateSampler(model->root); + } + else + { + root_sdk = opentelemetry::sdk::trace::AlwaysOnSamplerFactory::Create(); + } if (model->remote_parent_sampled != nullptr) { @@ -1055,11 +1064,7 @@ std::unique_ptr SdkBuilder::CreateBatc opentelemetry::sdk::trace::BatchSpanProcessorOptions options; options.schedule_delay_millis = std::chrono::milliseconds(model->schedule_delay); - -#ifdef LATER - options.xxx = model->export_timeout; -#endif - + options.export_timeout = std::chrono::milliseconds(model->export_timeout); options.max_queue_size = model->max_queue_size; options.max_export_batch_size = model->max_export_batch_size; @@ -1159,6 +1164,12 @@ std::unique_ptr SdkBuilder::CreateTra { sampler = CreateSampler(model->sampler); } + else + { + // Spec default: parentbased_always_on + sampler = opentelemetry::sdk::trace::ParentBasedSamplerFactory::Create( + opentelemetry::sdk::trace::AlwaysOnSamplerFactory::Create()); + } std::vector> sdk_processors; @@ -1663,7 +1674,10 @@ void SdkBuilder::AddView( std::shared_ptr sdk_aggregation_config; - sdk_aggregation_config = CreateAggregationConfig(stream->aggregation, sdk_aggregation_type); + if (stream->aggregation) + { + sdk_aggregation_config = CreateAggregationConfig(stream->aggregation, sdk_aggregation_type); + } std::unique_ptr sdk_attribute_processor; @@ -1870,6 +1884,7 @@ SdkBuilder::CreateBatchLogRecordProcessor( opentelemetry::sdk::logs::BatchLogRecordProcessorOptions options; options.schedule_delay_millis = std::chrono::milliseconds(model->schedule_delay); + options.export_timeout_millis = std::chrono::milliseconds(model->export_timeout); options.max_queue_size = model->max_queue_size; options.max_export_batch_size = model->max_export_batch_size; diff --git a/sdk/test/CMakeLists.txt b/sdk/test/CMakeLists.txt index dd957fae1f..3ea45b36e5 100644 --- a/sdk/test/CMakeLists.txt +++ b/sdk/test/CMakeLists.txt @@ -7,7 +7,4 @@ add_subdirectory(metrics) add_subdirectory(logs) add_subdirectory(resource) add_subdirectory(instrumentationscope) - -if(WITH_CONFIGURATION) - add_subdirectory(configuration) -endif() +add_subdirectory(configuration) diff --git a/sdk/test/configuration/BUILD b/sdk/test/configuration/BUILD index f16cc267cc..8dfae4ae49 100644 --- a/sdk/test/configuration/BUILD +++ b/sdk/test/configuration/BUILD @@ -162,3 +162,22 @@ cc_test( "@com_google_googletest//:gtest_main", ], ) + +cc_test( + name = "programmatic_configuration_test", + srcs = [ + "programmatic_configuration_test.cc", + ], + tags = [ + "test", + ], + deps = [ + "//api", + "//sdk:headers", + "//sdk/src/configuration:configuration_core", + "//sdk/src/logs", + "//sdk/src/metrics", + "//sdk/src/trace", + "@com_google_googletest//:gtest_main", + ], +) diff --git a/sdk/test/configuration/CMakeLists.txt b/sdk/test/configuration/CMakeLists.txt index 5385ddf0de..75d0c20b2b 100644 --- a/sdk/test/configuration/CMakeLists.txt +++ b/sdk/test/configuration/CMakeLists.txt @@ -1,21 +1,34 @@ # Copyright The OpenTelemetry Authors # SPDX-License-Identifier: Apache-2.0 -foreach( - testname - sdk_builder_test - yaml_logs_test - yaml_metrics_test - yaml_propagator_test - yaml_resource_test - yaml_test - yaml_trace_test - yaml_distribution_test) +foreach(testname sdk_builder_test programmatic_configuration_test) add_executable(${testname} "${testname}.cc") - target_link_libraries(${testname} ${GTEST_BOTH_LIBRARIES} - ${CMAKE_THREAD_LIBS_INIT} opentelemetry_configuration) + target_link_libraries( + ${testname} PRIVATE ${GTEST_BOTH_LIBRARIES} ${CMAKE_THREAD_LIBS_INIT} + opentelemetry_configuration_core) gtest_add_tests( TARGET ${testname} - TEST_PREFIX trace. + TEST_PREFIX config. TEST_LIST ${testname}) endforeach() + +if(WITH_CONFIGURATION) + foreach( + testname + yaml_logs_test + yaml_metrics_test + yaml_propagator_test + yaml_resource_test + yaml_test + yaml_trace_test + yaml_distribution_test) + add_executable(${testname} "${testname}.cc") + target_link_libraries( + ${testname} PRIVATE ${GTEST_BOTH_LIBRARIES} ${CMAKE_THREAD_LIBS_INIT} + opentelemetry_configuration) + gtest_add_tests( + TARGET ${testname} + TEST_PREFIX config. + TEST_LIST ${testname}) + endforeach() +endif() diff --git a/sdk/test/configuration/programmatic_configuration_test.cc b/sdk/test/configuration/programmatic_configuration_test.cc new file mode 100644 index 0000000000..ab3248036d --- /dev/null +++ b/sdk/test/configuration/programmatic_configuration_test.cc @@ -0,0 +1,868 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +#include + +#include +#include +#include +#include +#include +#include +#include + +#include "opentelemetry/baggage/baggage.h" +#include "opentelemetry/baggage/baggage_context.h" +#include "opentelemetry/common/key_value_iterable_view.h" +#include "opentelemetry/context/context.h" +#include "opentelemetry/context/propagation/global_propagator.h" +#include "opentelemetry/context/propagation/noop_propagator.h" +#include "opentelemetry/context/propagation/text_map_propagator.h" +#include "opentelemetry/context/runtime_context.h" +#include "opentelemetry/logs/logger.h" +#include "opentelemetry/logs/logger_provider.h" +#include "opentelemetry/logs/noop.h" +#include "opentelemetry/logs/provider.h" +#include "opentelemetry/logs/severity.h" +#include "opentelemetry/metrics/meter.h" +#include "opentelemetry/metrics/meter_provider.h" +#include "opentelemetry/metrics/noop.h" +#include "opentelemetry/metrics/provider.h" +#include "opentelemetry/metrics/sync_instruments.h" +#include "opentelemetry/nostd/shared_ptr.h" +#include "opentelemetry/nostd/span.h" +#include "opentelemetry/nostd/string_view.h" +#include "opentelemetry/nostd/variant.h" +#include "opentelemetry/trace/context.h" +#include "opentelemetry/trace/noop.h" +#include "opentelemetry/trace/provider.h" +#include "opentelemetry/trace/span.h" +#include "opentelemetry/trace/tracer.h" +#include "opentelemetry/trace/tracer_provider.h" + +#include "opentelemetry/sdk/common/exporter_utils.h" +#include "opentelemetry/sdk/common/global_log_handler.h" +#include "opentelemetry/sdk/logs/exporter.h" +#include "opentelemetry/sdk/logs/logger_provider.h" +#include "opentelemetry/sdk/logs/read_write_log_record.h" +#include "opentelemetry/sdk/metrics/data/metric_data.h" +#include "opentelemetry/sdk/metrics/data/point_data.h" +#include "opentelemetry/sdk/metrics/export/metric_producer.h" +#include "opentelemetry/sdk/metrics/instruments.h" +#include "opentelemetry/sdk/metrics/meter_provider.h" +#include "opentelemetry/sdk/metrics/push_metric_exporter.h" +#include "opentelemetry/sdk/resource/resource.h" +#include "opentelemetry/sdk/trace/exporter.h" +#include "opentelemetry/sdk/trace/span_data.h" +#include "opentelemetry/sdk/trace/tracer_provider.h" + +#include "opentelemetry/sdk/configuration/aggregation_configuration.h" +#include "opentelemetry/sdk/configuration/always_off_sampler_configuration.h" +#include "opentelemetry/sdk/configuration/base2_exponential_bucket_histogram_aggregation_configuration.h" +#include "opentelemetry/sdk/configuration/batch_log_record_processor_configuration.h" +#include "opentelemetry/sdk/configuration/batch_span_processor_configuration.h" +#include "opentelemetry/sdk/configuration/configuration.h" +#include "opentelemetry/sdk/configuration/configured_sdk.h" +#include "opentelemetry/sdk/configuration/explicit_bucket_histogram_aggregation_configuration.h" +#include "opentelemetry/sdk/configuration/extension_log_record_exporter_builder.h" +#include "opentelemetry/sdk/configuration/extension_log_record_exporter_configuration.h" +#include "opentelemetry/sdk/configuration/extension_push_metric_exporter_builder.h" +#include "opentelemetry/sdk/configuration/extension_push_metric_exporter_configuration.h" +#include "opentelemetry/sdk/configuration/extension_span_exporter_builder.h" +#include "opentelemetry/sdk/configuration/extension_span_exporter_configuration.h" +#include "opentelemetry/sdk/configuration/instrument_type.h" +#include "opentelemetry/sdk/configuration/log_record_exporter_configuration.h" +#include "opentelemetry/sdk/configuration/log_record_limits_configuration.h" +#include "opentelemetry/sdk/configuration/log_record_processor_configuration.h" +#include "opentelemetry/sdk/configuration/logger_config_configuration.h" +#include "opentelemetry/sdk/configuration/logger_configurator_configuration.h" +#include "opentelemetry/sdk/configuration/logger_matcher_and_config_configuration.h" +#include "opentelemetry/sdk/configuration/logger_provider_configuration.h" +#include "opentelemetry/sdk/configuration/meter_config_configuration.h" +#include "opentelemetry/sdk/configuration/meter_configurator_configuration.h" +#include "opentelemetry/sdk/configuration/meter_matcher_and_config_configuration.h" +#include "opentelemetry/sdk/configuration/meter_provider_configuration.h" +#include "opentelemetry/sdk/configuration/metric_reader_configuration.h" +#include "opentelemetry/sdk/configuration/parent_based_sampler_configuration.h" +#include "opentelemetry/sdk/configuration/periodic_metric_reader_configuration.h" +#include "opentelemetry/sdk/configuration/propagator_configuration.h" +#include "opentelemetry/sdk/configuration/push_metric_exporter_configuration.h" +#include "opentelemetry/sdk/configuration/registry.h" +#include "opentelemetry/sdk/configuration/resource_configuration.h" +#include "opentelemetry/sdk/configuration/sampler_configuration.h" +#include "opentelemetry/sdk/configuration/severity_number.h" +#include "opentelemetry/sdk/configuration/simple_log_record_processor_configuration.h" +#include "opentelemetry/sdk/configuration/simple_span_processor_configuration.h" +#include "opentelemetry/sdk/configuration/span_exporter_configuration.h" +#include "opentelemetry/sdk/configuration/span_processor_configuration.h" +#include "opentelemetry/sdk/configuration/tracer_config_configuration.h" +#include "opentelemetry/sdk/configuration/tracer_configurator_configuration.h" +#include "opentelemetry/sdk/configuration/tracer_matcher_and_config_configuration.h" +#include "opentelemetry/sdk/configuration/tracer_provider_configuration.h" +#include "opentelemetry/sdk/configuration/view_configuration.h" +#include "opentelemetry/sdk/configuration/view_selector_configuration.h" +#include "opentelemetry/sdk/configuration/view_stream_configuration.h" + +namespace nostd = opentelemetry::nostd; +namespace trace = opentelemetry::trace; +namespace logs = opentelemetry::logs; +namespace metrics = opentelemetry::metrics; +namespace common = opentelemetry::common; +namespace baggage = opentelemetry::baggage; +namespace propagation = opentelemetry::context::propagation; +namespace context = opentelemetry::context; +namespace common_sdk = opentelemetry::sdk::common; +namespace logs_sdk = opentelemetry::sdk::logs; +namespace metrics_sdk = opentelemetry::sdk::metrics; +namespace trace_sdk = opentelemetry::sdk::trace; +namespace config_sdk = opentelemetry::sdk::configuration; +namespace internal_log = opentelemetry::sdk::common::internal_log; + +namespace +{ +// --------------------------------------------------------------------------- +// Shared export buffers + +using LogRecordBuffer = std::vector>; +using SpanBuffer = std::vector>; +using MetricBuffer = std::vector; + +// --------------------------------------------------------------------------- +// Recording exporters + +class RecordingSpanExporter : public trace_sdk::SpanExporter +{ +public: + explicit RecordingSpanExporter(std::shared_ptr buffer) : buffer_(std::move(buffer)) {} + + std::unique_ptr MakeRecordable() noexcept override + { + return std::make_unique(); + } + + common_sdk::ExportResult Export( + const nostd::span> &spans) noexcept override + { + for (auto &span : spans) + { + buffer_->emplace_back(static_cast(span.release())); + } + return common_sdk::ExportResult::kSuccess; + } + + bool ForceFlush(std::chrono::microseconds) noexcept override { return true; } + bool Shutdown(std::chrono::microseconds) noexcept override { return true; } + +private: + std::shared_ptr buffer_; +}; + +class RecordingLogRecordExporter : public logs_sdk::LogRecordExporter +{ +public: + explicit RecordingLogRecordExporter(std::shared_ptr buffer) + : buffer_(std::move(buffer)) + {} + + std::unique_ptr MakeRecordable() noexcept override + { + return std::make_unique(); + } + + common_sdk::ExportResult Export( + const nostd::span> &records) noexcept override + { + for (auto &rec : records) + { + buffer_->emplace_back(static_cast(rec.release())); + } + return common_sdk::ExportResult::kSuccess; + } + + bool RecordableEnforcesLogRecordLimits() const noexcept override { return true; } + + bool ForceFlush(std::chrono::microseconds) noexcept override { return true; } + bool Shutdown(std::chrono::microseconds) noexcept override { return true; } + +private: + std::shared_ptr buffer_; +}; + +class RecordingPushMetricExporter : public metrics_sdk::PushMetricExporter +{ +public: + explicit RecordingPushMetricExporter(std::shared_ptr buffer) + : buffer_(std::move(buffer)) + {} + + common_sdk::ExportResult Export( + const metrics_sdk::ResourceMetrics &resource_metrics) noexcept override + { + for (const auto &scope : resource_metrics.scope_metric_data_) + { + for (const auto &metric : scope.metric_data_) + { + buffer_->emplace_back(metric); + } + } + return common_sdk::ExportResult::kSuccess; + } + + metrics_sdk::AggregationTemporality GetAggregationTemporality( + metrics_sdk::InstrumentType) const noexcept override + { + return metrics_sdk::AggregationTemporality::kCumulative; + } + + bool ForceFlush(std::chrono::microseconds) noexcept override { return true; } + bool Shutdown(std::chrono::microseconds) noexcept override { return true; } + +private: + std::shared_ptr buffer_; +}; + +// --------------------------------------------------------------------------- +// Builders for recording exporters + +class RecordingSpanExporterBuilder : public config_sdk::ExtensionSpanExporterBuilder +{ +public: + explicit RecordingSpanExporterBuilder(std::shared_ptr buffer) + : buffer_(std::move(buffer)) + {} + std::unique_ptr Build( + const config_sdk::ExtensionSpanExporterConfiguration *) const override + { + return std::make_unique(buffer_); + } + +private: + std::shared_ptr buffer_; +}; + +class RecordingLogRecordExporterBuilder : public config_sdk::ExtensionLogRecordExporterBuilder +{ +public: + explicit RecordingLogRecordExporterBuilder(std::shared_ptr buffer) + : buffer_(std::move(buffer)) + {} + std::unique_ptr Build( + const config_sdk::ExtensionLogRecordExporterConfiguration *) const override + { + return std::make_unique(buffer_); + } + +private: + std::shared_ptr buffer_; +}; + +class RecordingPushMetricExporterBuilder : public config_sdk::ExtensionPushMetricExporterBuilder +{ +public: + explicit RecordingPushMetricExporterBuilder(std::shared_ptr buffer) + : buffer_(std::move(buffer)) + {} + std::unique_ptr Build( + const config_sdk::ExtensionPushMetricExporterConfiguration *) const override + { + auto exporter = std::make_unique(buffer_); + return exporter; + } + +private: + std::shared_ptr buffer_; +}; + +// --------------------------------------------------------------------------- +// TextMapCarrier implementation for testing + +class MapCarrier : public propagation::TextMapCarrier +{ +public: + nostd::string_view Get(nostd::string_view key) const noexcept override + { + auto it = map_.find(std::string(key)); + return it != map_.end() ? nostd::string_view(it->second) : ""; + } + void Set(nostd::string_view key, nostd::string_view value) noexcept override + { + map_[std::string(key)] = std::string(value); + } + + const std::map &map() const { return map_; } + +private: + std::map map_; +}; + +//--------------------------------------------------------------------------- +// ProgrammaticConfigTest fixture + +class ProgrammaticConfigTest : public ::testing::Test +{ +protected: + void SetUp() override + { + MakeRegistry(); + + propagation::GlobalTextMapPropagator::SetGlobalPropagator( + {std::make_shared()}); + trace::Provider::SetTracerProvider({std::make_shared()}); + logs::Provider::SetLoggerProvider({std::make_shared()}); + metrics::Provider::SetMeterProvider({std::make_shared()}); + } + + void TearDown() override + { + if (sdk_) + { + sdk_->UnInstall(); + } + } + + void CreateAndInstallSdk(const std::unique_ptr &model) + { + ASSERT_TRUE(sdk_ == nullptr); + ASSERT_NO_THROW(sdk_ = config_sdk::ConfiguredSdk::Create(registry_, model)); + ASSERT_FALSE(sdk_ == nullptr); + sdk_->Install(); + } + + void MakeRegistry() + { + registry_ = std::make_shared(); + registry_->SetExtensionSpanExporterBuilder( + "recording", std::make_unique(span_buffer_)); + registry_->SetExtensionLogRecordExporterBuilder( + "recording", std::make_unique(log_buffer_)); + registry_->SetExtensionPushMetricExporterBuilder( + "recording", std::make_unique(metric_buffer_)); + } + + static std::unique_ptr MakeTracerProviderConfig() + { + auto exporter = std::make_unique(); + exporter->name = "recording"; + auto processor = std::make_unique(); + processor->exporter = std::move(exporter); + auto config = std::make_unique(); + config->processors.emplace_back(std::move(processor)); + return config; + } + + static std::unique_ptr MakeLoggerProviderConfig() + { + auto exporter = std::make_unique(); + exporter->name = "recording"; + auto processor = std::make_unique(); + processor->exporter = std::move(exporter); + auto config = std::make_unique(); + config->processors.emplace_back(std::move(processor)); + return config; + } + + static std::unique_ptr MakeMeterProviderConfig() + { + auto exporter = std::make_unique(); + exporter->name = "recording"; + auto reader = std::make_unique(); + reader->exporter = std::move(exporter); + reader->interval = 3'600'000; // milliseconds. Set to a large value and rely on ForceFlush to + // trigger collection. + reader->timeout = 60'000; // milliseconds + auto config = std::make_unique(); + config->readers.emplace_back(std::move(reader)); + return config; + } + + std::shared_ptr span_buffer_{std::make_shared()}; + std::shared_ptr log_buffer_{std::make_shared()}; + std::shared_ptr metric_buffer_{std::make_shared()}; + + std::shared_ptr registry_; + std::unique_ptr sdk_; +}; + +} // namespace + +//--------------------------------------------------------------------------- +// ConfiguredSdk common cases + +TEST_F(ProgrammaticConfigTest, ResourceAttributesFromList) +{ + auto resource_config = std::make_unique(); + resource_config->attributes_list = "service.name=test-service,service.version=1.0"; + auto model = std::make_unique(); + model->resource = std::move(resource_config); + + CreateAndInstallSdk(model); + + const auto &attributes = sdk_->resource.GetAttributes(); + ASSERT_NE(attributes.find("service.name"), attributes.end()); + EXPECT_EQ(nostd::get(attributes.at("service.name")), "test-service"); + ASSERT_NE(attributes.find("service.version"), attributes.end()); + EXPECT_EQ(nostd::get(attributes.at("service.version")), "1.0"); +} + +TEST_F(ProgrammaticConfigTest, DisabledConfigProducesNullProviders) +{ + auto model = std::make_unique(); + model->disabled = true; + model->tracer_provider = MakeTracerProviderConfig(); + model->logger_provider = MakeLoggerProviderConfig(); + model->meter_provider = MakeMeterProviderConfig(); + + CreateAndInstallSdk(model); + + EXPECT_EQ(sdk_->tracer_provider, nullptr); + EXPECT_EQ(sdk_->logger_provider, nullptr); + EXPECT_EQ(sdk_->meter_provider, nullptr); + EXPECT_EQ(sdk_->propagator, nullptr); +} + +TEST_F(ProgrammaticConfigTest, ConfiguredSdkDefaultLogLevel) +{ + // default log level is info + auto model = std::make_unique(); + model->resource = std::make_unique(); + CreateAndInstallSdk(model); + EXPECT_EQ(sdk_->log_level, internal_log::LogLevel::Info); + EXPECT_EQ(internal_log::GlobalLogHandler::GetLogLevel(), internal_log::LogLevel::Info); +} + +TEST_F(ProgrammaticConfigTest, ConfiguredSdkSetLogLevel) +{ + auto model = std::make_unique(); + model->resource = std::make_unique(); + model->log_level = config_sdk::SeverityNumber::debug; + CreateAndInstallSdk(model); + EXPECT_EQ(sdk_->log_level, internal_log::LogLevel::Debug); + EXPECT_EQ(internal_log::GlobalLogHandler::GetLogLevel(), internal_log::LogLevel::Debug); +} + +//--------------------------------------------------------------------------- +// LoggerProvider tests + +TEST_F(ProgrammaticConfigTest, LoggerProviderDefaults) +{ + auto logger_provider_config = MakeLoggerProviderConfig(); + + auto model = std::make_unique(); + model->logger_provider = std::move(logger_provider_config); + + CreateAndInstallSdk(model); + + ASSERT_NE(sdk_->logger_provider, nullptr); + + auto logger = logs::Provider::GetLoggerProvider()->GetLogger("test"); + logger->EmitLogRecord( + logs::Severity::kInfo, nostd::string_view("test-message"), + common::MakeAttributes({{"key1", "value1"}, {"key2", "value2"}, {"key3", "value3"}})); + + ASSERT_TRUE(sdk_->logger_provider->ForceFlush(std::chrono::milliseconds(5000))); + ASSERT_TRUE(sdk_->logger_provider->Shutdown(std::chrono::milliseconds(5000))); + + EXPECT_GE(log_buffer_->size(), 1); +} + +TEST_F(ProgrammaticConfigTest, LoggerProviderWithLogRecordLimits) +{ + config_sdk::LogRecordLimitsConfiguration limits; + limits.attribute_count_limit = 2; + limits.attribute_value_length_limit = 5; + + auto logger_provider_config = MakeLoggerProviderConfig(); + logger_provider_config->limits = + std::make_unique(limits); + + auto model = std::make_unique(); + model->logger_provider = std::move(logger_provider_config); + + CreateAndInstallSdk(model); + ASSERT_NE(sdk_->logger_provider, nullptr); + + auto logger = logs::Provider::GetLoggerProvider()->GetLogger("test"); + logger->EmitLogRecord( + logs::Severity::kInfo, nostd::string_view("test-message"), + common::MakeAttributes({{"key1", "value1"}, {"key2", "value2"}, {"key3", "value3"}})); + + ASSERT_TRUE(sdk_->logger_provider->ForceFlush(std::chrono::milliseconds(5000))); + ASSERT_TRUE(sdk_->logger_provider->Shutdown(std::chrono::milliseconds(5000))); + + EXPECT_GE(log_buffer_->size(), 1); + auto *record = log_buffer_->front().get(); + EXPECT_EQ(nostd::get(record->GetBody()), "test-message"); + const auto &attributes = record->GetAttributes(); + EXPECT_EQ(attributes.size(), limits.attribute_count_limit); + for (const auto &attr : attributes) + { + EXPECT_EQ(nostd::get(attr.second).size(), limits.attribute_value_length_limit); + } +} + +TEST_F(ProgrammaticConfigTest, LoggerProviderWithLoggerConfigurator) +{ + auto error_logger_matcher = config_sdk::LoggerMatcherAndConfigConfiguration(); + error_logger_matcher.name = "error_logger"; + error_logger_matcher.config.enabled = true; + error_logger_matcher.config.minimum_severity = config_sdk::SeverityNumber::error; + + auto logger_configurator = std::make_unique(); + logger_configurator->default_config.enabled = true; + logger_configurator->default_config.minimum_severity = config_sdk::SeverityNumber::info; + logger_configurator->loggers.emplace_back(std::move(error_logger_matcher)); + + auto logger_provider_config = MakeLoggerProviderConfig(); + logger_provider_config->logger_configurator = std::move(logger_configurator); + + auto model = std::make_unique(); + model->logger_provider = std::move(logger_provider_config); + + CreateAndInstallSdk(model); + ASSERT_NE(sdk_->logger_provider, nullptr); + + // The default logger should be enabled and have a minimum severity of info + auto default_logger = logs::Provider::GetLoggerProvider()->GetLogger("default_logger"); + default_logger->EmitLogRecord( + logs::Severity::kInfo, nostd::string_view("test-message"), + common::MakeAttributes({{"key1", "value1"}, {"key2", "value2"}, {"key3", "value3"}})); + EXPECT_TRUE(default_logger->Enabled(logs::Severity::kInfo)); + + // The error_logger should be enabled and have a minimum severity of error + auto error_logger = logs::Provider::GetLoggerProvider()->GetLogger("error_logger"); + error_logger->EmitLogRecord(logs::Severity::kError, nostd::string_view("test-message")); + + EXPECT_FALSE(error_logger->Enabled(logs::Severity::kInfo)); + EXPECT_TRUE(error_logger->Enabled(logs::Severity::kError)); + + ASSERT_TRUE(sdk_->logger_provider->ForceFlush(std::chrono::milliseconds(5000))); + ASSERT_TRUE(sdk_->logger_provider->Shutdown(std::chrono::milliseconds(5000))); + + EXPECT_GE(log_buffer_->size(), 2); +} + +TEST_F(ProgrammaticConfigTest, LoggerProviderWithBatchProcessor) +{ + auto exporter = std::make_unique(); + exporter->name = "recording"; + auto processor = std::make_unique(); + processor->exporter = std::move(exporter); + auto logger_provider_config = std::make_unique(); + logger_provider_config->processors.emplace_back(std::move(processor)); + + auto model = std::make_unique(); + model->logger_provider = std::move(logger_provider_config); + + CreateAndInstallSdk(model); + ASSERT_NE(sdk_->logger_provider, nullptr); + + logs::Provider::GetLoggerProvider()->GetLogger("test")->Info("test-message"); + ASSERT_TRUE(sdk_->logger_provider->ForceFlush(std::chrono::milliseconds(5000))); + ASSERT_TRUE(sdk_->logger_provider->Shutdown(std::chrono::milliseconds(5000))); + + EXPECT_GE(log_buffer_->size(), 1); +} + +//-------------------------------------------------------------------------- +// MeterProvider tests + +TEST_F(ProgrammaticConfigTest, MeterProvider) +{ + auto model = std::make_unique(); + model->meter_provider = MakeMeterProviderConfig(); + + CreateAndInstallSdk(model); + ASSERT_NE(sdk_->meter_provider, nullptr); + + metrics::Provider::GetMeterProvider() + ->GetMeter("test") + ->CreateUInt64Counter("test-counter") + ->Add(1); + + ASSERT_TRUE(sdk_->meter_provider->ForceFlush(std::chrono::milliseconds(5000))); + ASSERT_TRUE(sdk_->meter_provider->Shutdown(std::chrono::milliseconds(5000))); + + EXPECT_GE(metric_buffer_->size(), 1); +} + +TEST_F(ProgrammaticConfigTest, MeterProviderWithMeterConfigurator) +{ + auto disabled_meter_config = config_sdk::MeterMatcherAndConfigConfiguration(); + disabled_meter_config.name = "disabled-meter"; + disabled_meter_config.config.enabled = false; + + auto meter_configurator = std::make_unique(); + meter_configurator->default_config.enabled = true; + meter_configurator->meters.push_back(disabled_meter_config); + + auto model = std::make_unique(); + model->meter_provider = MakeMeterProviderConfig(); + model->meter_provider->meter_configurator = std::move(meter_configurator); + + CreateAndInstallSdk(model); + ASSERT_NE(sdk_->meter_provider, nullptr); + + auto default_meter = metrics::Provider::GetMeterProvider()->GetMeter("default-meter"); + default_meter->CreateUInt64Counter("test-counter")->Add(1); + + auto disabled_meter = metrics::Provider::GetMeterProvider()->GetMeter(disabled_meter_config.name); + disabled_meter->CreateUInt64Counter("disabled-test-counter")->Add(1); + + ASSERT_TRUE(sdk_->meter_provider->ForceFlush(std::chrono::milliseconds(5000))); + ASSERT_TRUE(sdk_->meter_provider->Shutdown(std::chrono::milliseconds(5000))); + + EXPECT_GE(metric_buffer_->size(), 1); + for (const auto &metric : *metric_buffer_) + { + EXPECT_NE(metric.instrument_descriptor.name_, "disabled-test-counter"); + } +} + +TEST_F(ProgrammaticConfigTest, MeterProviderWithViews) +{ + // View 1: Base2 exponential aggregation + const std::size_t max_scale = 10; + const std::size_t max_buckets = 135; + auto base2_histogram_aggregation = + std::make_unique(); + base2_histogram_aggregation->max_scale = max_scale; + base2_histogram_aggregation->max_size = max_buckets; + + auto base2_histogram_stream = std::make_unique(); + base2_histogram_stream->aggregation = std::move(base2_histogram_aggregation); + + auto base2_histogram_selector = std::make_unique(); + base2_histogram_selector->instrument_type = config_sdk::InstrumentType::histogram; + base2_histogram_selector->instrument_name = "exponential-histogram"; + + auto base2_histogram_view = std::make_unique(); + base2_histogram_view->selector = std::move(base2_histogram_selector); + base2_histogram_view->stream = std::move(base2_histogram_stream); + + // View 2: Explicit bucket histogram aggregation. + auto explicit_histogram_aggregation = + std::make_unique(); + explicit_histogram_aggregation->boundaries = {0.0, 10.0, 50.0, 100.0}; + explicit_histogram_aggregation->record_min_max = true; + + auto explicit_histogram_stream = std::make_unique(); + explicit_histogram_stream->aggregation = std::move(explicit_histogram_aggregation); + + auto explicit_selector = std::make_unique(); + explicit_selector->instrument_type = config_sdk::InstrumentType::histogram; + explicit_selector->instrument_name = "explicit-histogram"; + + auto explicit_histogram_view = std::make_unique(); + explicit_histogram_view->selector = std::move(explicit_selector); + explicit_histogram_view->stream = std::move(explicit_histogram_stream); + + // View 3: no aggregation set + auto default_stream = std::make_unique(); + default_stream->aggregation = nullptr; // intentionally null + + auto default_selector = std::make_unique(); + default_selector->instrument_type = config_sdk::InstrumentType::counter; + default_selector->instrument_name = "default-counter"; + + auto default_view = std::make_unique(); + default_view->selector = std::move(default_selector); + default_view->stream = std::move(default_stream); + + auto meter_provider_config = MakeMeterProviderConfig(); + meter_provider_config->views.emplace_back(std::move(base2_histogram_view)); + meter_provider_config->views.emplace_back(std::move(explicit_histogram_view)); + meter_provider_config->views.emplace_back(std::move(default_view)); + + auto model = std::make_unique(); + model->meter_provider = std::move(meter_provider_config); + + CreateAndInstallSdk(model); + ASSERT_NE(sdk_->meter_provider, nullptr); + + auto context = context::Context{}; + auto meter = metrics::Provider::GetMeterProvider()->GetMeter("test"); + meter->CreateDoubleHistogram("exponential-histogram")->Record(42.0, context); + meter->CreateDoubleHistogram("explicit-histogram")->Record(42.0, context); + meter->CreateUInt64Counter("default-counter")->Add(1, context); + ASSERT_TRUE(sdk_->meter_provider->ForceFlush(std::chrono::milliseconds(5000))); + ASSERT_TRUE(sdk_->meter_provider->Shutdown(std::chrono::milliseconds(5000))); + + // check that instances of the three data points were collected and are of the right type. + EXPECT_GE(metric_buffer_->size(), 3); + bool found_base2_histogram = false; + bool found_explicit_histogram = false; + bool found_default_counter = false; + + for (const auto &metric : *metric_buffer_) + { + auto &point_data = metric.point_data_attr_.front().point_data; + if (nostd::holds_alternative(point_data)) + { + found_base2_histogram = true; + auto &base2_point_data = + nostd::get(point_data); + EXPECT_EQ(base2_point_data.max_buckets_, max_buckets); + EXPECT_LE(base2_point_data.scale_, max_scale); + } + else if (nostd::holds_alternative(point_data)) + { + found_explicit_histogram = true; + } + else if (nostd::holds_alternative(point_data)) + { + found_default_counter = true; + } + } + + EXPECT_TRUE(found_base2_histogram); + EXPECT_TRUE(found_explicit_histogram); + EXPECT_TRUE(found_default_counter); +} + +//--------------------------------------------------------------------------- +// TracerProvider tests + +TEST_F(ProgrammaticConfigTest, TracerProviderDefaults) +{ + auto model = std::make_unique(); + model->tracer_provider = MakeTracerProviderConfig(); + + CreateAndInstallSdk(model); + ASSERT_NE(sdk_->tracer_provider, nullptr); + + auto default_tracer = trace::Provider::GetTracerProvider()->GetTracer("default-tracer"); + default_tracer->StartSpan("test-span")->End(); + + ASSERT_TRUE(sdk_->tracer_provider->ForceFlush(std::chrono::milliseconds(5000))); + ASSERT_TRUE(sdk_->tracer_provider->Shutdown(std::chrono::milliseconds(5000))); + + EXPECT_EQ(span_buffer_->size(), 1); +} + +TEST_F(ProgrammaticConfigTest, TracerProviderWithTracerConfigurator) +{ + auto disabled_tracer_matcher = config_sdk::TracerMatcherAndConfigConfiguration(); + disabled_tracer_matcher.name = "disabled-tracer"; + disabled_tracer_matcher.config.enabled = false; + + auto tracer_configurator = std::make_unique(); + tracer_configurator->default_config.enabled = true; + tracer_configurator->tracers.push_back(disabled_tracer_matcher); + + auto model = std::make_unique(); + model->tracer_provider = MakeTracerProviderConfig(); + model->tracer_provider->tracer_configurator = std::move(tracer_configurator); + + CreateAndInstallSdk(model); + ASSERT_NE(sdk_->tracer_provider, nullptr); + + auto default_tracer = trace::Provider::GetTracerProvider()->GetTracer("default-tracer"); + default_tracer->StartSpan("test-span")->End(); + + auto disabled_tracer = trace::Provider::GetTracerProvider()->GetTracer("disabled-tracer"); + disabled_tracer->StartSpan("disabled-test-span")->End(); + + ASSERT_TRUE(sdk_->tracer_provider->ForceFlush(std::chrono::milliseconds(5000))); + + ASSERT_EQ(span_buffer_->size(), 1); + EXPECT_NE(span_buffer_->at(0)->GetName(), "disabled-test-span"); +} + +TEST_F(ProgrammaticConfigTest, TracerProviderWithSampler) +{ + auto sampler = std::make_unique(); + auto model = std::make_unique(); + model->tracer_provider = MakeTracerProviderConfig(); + model->tracer_provider->sampler = std::move(sampler); + + CreateAndInstallSdk(model); + ASSERT_NE(sdk_->tracer_provider, nullptr); + + trace::Provider::GetTracerProvider()->GetTracer("test")->StartSpan("test-span")->End(); + ASSERT_TRUE(sdk_->tracer_provider->ForceFlush(std::chrono::milliseconds(5000))); + ASSERT_TRUE(sdk_->tracer_provider->Shutdown(std::chrono::milliseconds(5000))); + + EXPECT_EQ(span_buffer_->size(), 0); +} + +TEST_F(ProgrammaticConfigTest, TracerProviderWithParentBasedSamplerNullRoot) +{ + auto sampler = std::make_unique(); + sampler->root = nullptr; // explicitly null + auto model = std::make_unique(); + model->tracer_provider = MakeTracerProviderConfig(); + model->tracer_provider->sampler = std::move(sampler); + + CreateAndInstallSdk(model); + ASSERT_NE(sdk_->tracer_provider, nullptr); + + trace::Provider::GetTracerProvider()->GetTracer("test")->StartSpan("test-span")->End(); + ASSERT_TRUE(sdk_->tracer_provider->ForceFlush(std::chrono::milliseconds(5000))); + ASSERT_TRUE(sdk_->tracer_provider->Shutdown(std::chrono::milliseconds(5000))); + + EXPECT_EQ(span_buffer_->size(), 1); +} + +TEST_F(ProgrammaticConfigTest, TracerProviderWithBatchProcessor) +{ + auto exporter = std::make_unique(); + exporter->name = "recording"; + auto processor = std::make_unique(); + processor->exporter = std::move(exporter); + auto tracer_provider_config = std::make_unique(); + tracer_provider_config->processors.emplace_back(std::move(processor)); + + auto model = std::make_unique(); + model->tracer_provider = std::move(tracer_provider_config); + + CreateAndInstallSdk(model); + + trace::Provider::GetTracerProvider()->GetTracer("test")->StartSpan("test-span")->End(); + ASSERT_TRUE(sdk_->tracer_provider->ForceFlush(std::chrono::milliseconds(5000))); + ASSERT_TRUE(sdk_->tracer_provider->Shutdown(std::chrono::milliseconds(5000))); + + EXPECT_GE(span_buffer_->size(), 1); +} + +//--------------------------------------------------------------------------- +// Propagator tests + +TEST_F(ProgrammaticConfigTest, Propagators) +{ + auto propagator_config = std::make_unique(); + propagator_config->composite.emplace_back("tracecontext"); + propagator_config->composite.emplace_back("baggage"); + propagator_config->composite.emplace_back("b3"); + propagator_config->composite.emplace_back("b3multi"); + propagator_config->composite.emplace_back("jaeger"); + + auto model = std::make_unique(); + model->tracer_provider = MakeTracerProviderConfig(); + model->propagator = std::move(propagator_config); + + CreateAndInstallSdk(model); + ASSERT_NE(sdk_->propagator, nullptr); + + auto tracer = trace::Provider::GetTracerProvider()->GetTracer("test"); + + auto span = tracer->StartSpan("test-span"); + auto ctx0 = context::RuntimeContext::GetCurrent(); + auto ctx1 = trace::SetSpan(ctx0, span); + + // Add baggage so the baggage propagator has something to inject + auto baggage = baggage::Baggage::GetDefault()->Set("key", "value"); + auto ctx = baggage::SetBaggage(ctx1, baggage); + + MapCarrier carrier; + propagation::GlobalTextMapPropagator::GetGlobalPropagator()->Inject(carrier, ctx); + + ASSERT_NE(carrier.map().find("traceparent"), carrier.map().end()); // tracecontext + // traceparent format: "00-<32 hex trace_id>-<16 hex span_id>-<2 hex flags>" = 55 chars + const std::string &traceparent = carrier.map().at("traceparent"); + EXPECT_EQ(traceparent.size(), 55U); + EXPECT_EQ(traceparent.substr(0, 3), "00-"); + EXPECT_NE(carrier.map().find("baggage"), carrier.map().end()); // baggage + EXPECT_NE(carrier.map().find("b3"), carrier.map().end()); // b3 single + EXPECT_NE(carrier.map().find("X-B3-TraceId"), carrier.map().end()); // b3multi + EXPECT_NE(carrier.map().find("uber-trace-id"), carrier.map().end()); // jaeger +}