From ea40f20f6484a35792230e4d5a4f94e639666998 Mon Sep 17 00:00:00 2001 From: "FR-MUREX-COM\\mchaikhadouaihy" Date: Tue, 10 Sep 2019 11:48:49 +0200 Subject: [PATCH 1/3] Add an HTTP Sender (#165) Support an HTTP Sender that allows to connect directly to a Collector. For instance, authentication is not supported. Signed-off-by: FR-MUREX-COM\mchaikhadouaihy --- .gitignore | 4 + CMakeLists.txt | 971 +++++++++--------- README.md | 12 + .../{UDPTransport.cpp => ThriftTransport.cpp} | 36 +- .../{UDPTransport.h => ThriftTransport.h} | 131 +-- ...nsportTest.cpp => ThriftTransportTest.cpp} | 41 +- src/jaegertracing/net/Socket.h | 2 - src/jaegertracing/net/http/Method.cpp | 5 +- src/jaegertracing/net/http/Request.cpp | 8 + src/jaegertracing/net/http/Request.h | 3 + src/jaegertracing/net/http/Response.cpp | 44 +- src/jaegertracing/net/http/Response.h | 6 + src/jaegertracing/net/http/SocketReader.h | 48 + src/jaegertracing/reporters/Config.cpp | 10 +- src/jaegertracing/reporters/Config.h | 14 +- src/jaegertracing/reporters/ConfigTest.cpp | 52 + src/jaegertracing/testutils/MockAgent.cpp | 8 +- src/jaegertracing/testutils/MockAgent.h | 8 +- src/jaegertracing/testutils/TUDPTransport.h | 2 +- src/jaegertracing/testutils/TracerUtil.cpp | 144 +-- src/jaegertracing/testutils/TracerUtil.h | 97 +- src/jaegertracing/utils/HttpSender.cpp | 43 + src/jaegertracing/utils/HttpSender.h | 108 ++ src/jaegertracing/utils/HttpSenderTest.cpp | 114 ++ src/jaegertracing/utils/Sender.h | 51 + .../utils/{UDPClient.cpp => UDPSender.cpp} | 7 +- .../utils/{UDPClient.h => UDPSender.h} | 19 +- .../{UDPClientTest.cpp => UDPSenderTest.cpp} | 10 +- 28 files changed, 1234 insertions(+), 764 deletions(-) rename src/jaegertracing/{UDPTransport.cpp => ThriftTransport.cpp} (78%) rename src/jaegertracing/{UDPTransport.h => ThriftTransport.h} (61%) rename src/jaegertracing/{UDPTransportTest.cpp => ThriftTransportTest.cpp} (69%) create mode 100644 src/jaegertracing/net/http/SocketReader.h create mode 100644 src/jaegertracing/reporters/ConfigTest.cpp create mode 100644 src/jaegertracing/utils/HttpSender.cpp create mode 100644 src/jaegertracing/utils/HttpSender.h create mode 100644 src/jaegertracing/utils/HttpSenderTest.cpp create mode 100644 src/jaegertracing/utils/Sender.h rename src/jaegertracing/utils/{UDPClient.cpp => UDPSender.cpp} (88%) rename src/jaegertracing/utils/{UDPClient.h => UDPSender.h} (85%) rename src/jaegertracing/utils/{UDPClientTest.cpp => UDPSenderTest.cpp} (93%) diff --git a/.gitignore b/.gitignore index a63030df..78030249 100644 --- a/.gitignore +++ b/.gitignore @@ -42,3 +42,7 @@ # Log files *.log + +# CLion folders +cmake-build-debug +.idea diff --git a/CMakeLists.txt b/CMakeLists.txt index 5893f31c..7dd42d66 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,484 +1,487 @@ -cmake_minimum_required(VERSION 3.3) - -list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake") - -set(CMAKE_TOOLCHAIN_FILE "${CMAKE_CURRENT_SOURCE_DIR}/cmake/toolchain.cmake" - CACHE FILEPATH - "Toolchain to use for building this package and dependencies") - -set(HUNTER_CONFIGURATION_TYPES "Release;Debug" CACHE STRING - "Configuration types used when building Hunter dependencies") - -include(CMakeDependentOption) -include(HunterGate) - -option(HUNTER_BUILD_SHARED_LIBS "Build Shared Library" ON) - -HunterGate( - URL "https://github.com/ruslo/hunter/archive/v0.23.201.tar.gz" - SHA1 "29f10683f10c7b35e1f599d71542af0c2daa6a01" -) - -project(jaegertracing VERSION 0.5.0) - -option(JAEGERTRACING_WARNINGS_AS_ERRORS "Treat compiler warnings as errors" OFF) - -if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU" OR - CMAKE_CXX_COMPILER_ID MATCHES "Clang") - set(cxx_flags -Wall -pedantic) - if(JAEGERTRACING_WARNINGS_AS_ERRORS) - list(APPEND cxx_flags -Werror) - endif() -endif() - -if(CMAKE_CXX_COMPILER_ID MATCHES "Clang") - list(APPEND cxx_flags -Wno-unused-private-field) -endif() - -if(MSVC) - add_definitions(-D_SILENCE_CXX17_ITERATOR_BASE_CLASS_DEPRECATION_WARNING) - - # https://studiofreya.com/2018/01/06/visual-studio-2017-with-cpp17-and-boost/ - add_definitions(-DBOOST_CONFIG_SUPPRESS_OUTDATED_MESSAGE) - add_definitions(-D_SCL_SECURE_NO_WARNINGS) -endif() - -set(CMAKE_EXPORT_COMPILE_COMMANDS ON) - -if(HUNTER_ENABLED) - set(hunter_config "CONFIG") -else() - set(hunter_config "") -endif() - -set(package_deps) - -if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU" AND - CMAKE_CXX_COMPILER_VERSION VERSION_LESS "4.9") - message(FATAL_ERROR "Must use gcc >= 4.9") -endif() - -hunter_add_package(thrift) -find_package(thrift ${hunter_config} REQUIRED) -if(HUNTER_ENABLED) - list(APPEND LIBS thrift::thrift_static) -else() - list(APPEND LIBS ${THRIFT_LIBRARIES}) -endif() -list(APPEND package_deps thrift) - - -hunter_add_package(opentracing-cpp) -# Not `${hunter_config}` because OpenTracing provides its own -# OpenTracingConfig.cmake file -find_package(OpenTracing CONFIG REQUIRED) -# Under Windows, link dynamically with OpenTracing -if (WIN32) - list(APPEND LIBS OpenTracing::opentracing) - set(OPENTRACING_LIB OpenTracing::opentracing) -else() - list(APPEND LIBS OpenTracing::opentracing-static) - set(OPENTRACING_LIB OpenTracing::opentracing-static) -endif() -list(APPEND package_deps OpenTracing) - -hunter_add_package(nlohmann_json) -find_package(nlohmann_json CONFIG REQUIRED) -list(APPEND LIBS nlohmann_json::nlohmann_json) -list(APPEND package_deps nlohmann_json) - -option(JAEGERTRACING_BUILD_EXAMPLES "Build examples" ON) - -option(JAEGERTRACING_COVERAGE "Build with coverage" $ENV{COVERAGE}) -option(JAEGERTRACING_BUILD_CROSSDOCK "Build crossdock" $ENV{CROSSDOCK}) -cmake_dependent_option( - JAEGERTRACING_WITH_YAML_CPP "Use yaml-cpp to parse config files" ON - "NOT JAEGERTRACING_BUILD_CROSSDOCK" ON) - -if(JAEGERTRACING_WITH_YAML_CPP) - hunter_add_package(yaml-cpp) - # Not `${hunter_config}` because yaml-cpp provides its own - # yaml-cpp-config.cmake file - find_package(yaml-cpp CONFIG REQUIRED) - if(HUNTER_ENABLED) - list(APPEND LIBS yaml-cpp::yaml-cpp) - else() - list(APPEND LIBS yaml-cpp) - endif() - list(APPEND package_deps yaml-cpp) -endif() - -include(CTest) -if(BUILD_TESTING) - hunter_add_package(GTest) - find_package(GTest ${hunter_config} REQUIRED) - - if(JAEGERTRACING_COVERAGE) - include(CodeCoverage) - append_coverage_compiler_flags(cxx_flags) - append_coverage_compiler_flags(link_flags) - set(COVERAGE_EXCLUDES "${CMAKE_CURRENT_SOURCE_DIR}/src/jaegertracing/thrift-gen/*" - "*Test.cpp") - endif() -endif() - -set(SRC - src/jaegertracing/Config.cpp - src/jaegertracing/DynamicLoad.cpp - src/jaegertracing/LogRecord.cpp - src/jaegertracing/Logging.cpp - src/jaegertracing/Reference.cpp - src/jaegertracing/Span.cpp - src/jaegertracing/SpanContext.cpp - src/jaegertracing/Tag.cpp - src/jaegertracing/TraceID.cpp - src/jaegertracing/Tracer.cpp - src/jaegertracing/TracerFactory.cpp - src/jaegertracing/Transport.cpp - src/jaegertracing/UDPTransport.cpp - src/jaegertracing/baggage/BaggageSetter.cpp - src/jaegertracing/baggage/RemoteRestrictionJSON.cpp - src/jaegertracing/baggage/RemoteRestrictionManager.cpp - src/jaegertracing/baggage/Restriction.cpp - src/jaegertracing/baggage/RestrictionManager.cpp - src/jaegertracing/baggage/RestrictionsConfig.cpp - src/jaegertracing/metrics/Counter.cpp - src/jaegertracing/metrics/Gauge.cpp - src/jaegertracing/metrics/InMemoryStatsReporter.cpp - src/jaegertracing/metrics/Metric.cpp - src/jaegertracing/metrics/Metrics.cpp - src/jaegertracing/metrics/NullCounter.cpp - src/jaegertracing/metrics/NullGauge.cpp - src/jaegertracing/metrics/NullStatsFactory.cpp - src/jaegertracing/metrics/NullStatsReporter.cpp - src/jaegertracing/metrics/NullTimer.cpp - src/jaegertracing/metrics/StatsFactory.cpp - src/jaegertracing/metrics/StatsFactoryImpl.cpp - src/jaegertracing/metrics/StatsReporter.cpp - src/jaegertracing/metrics/Timer.cpp - src/jaegertracing/net/IPAddress.cpp - src/jaegertracing/net/Socket.cpp - src/jaegertracing/net/URI.cpp - src/jaegertracing/net/http/Error.cpp - src/jaegertracing/net/http/Header.cpp - src/jaegertracing/net/http/Method.cpp - src/jaegertracing/net/http/Request.cpp - src/jaegertracing/net/http/Response.cpp - src/jaegertracing/platform/Endian.cpp - src/jaegertracing/platform/Hostname.cpp - src/jaegertracing/propagation/Extractor.cpp - src/jaegertracing/propagation/HeadersConfig.cpp - src/jaegertracing/propagation/Injector.cpp - src/jaegertracing/propagation/Propagator.cpp - src/jaegertracing/reporters/CompositeReporter.cpp - src/jaegertracing/reporters/Config.cpp - src/jaegertracing/reporters/InMemoryReporter.cpp - src/jaegertracing/reporters/LoggingReporter.cpp - src/jaegertracing/reporters/NullReporter.cpp - src/jaegertracing/reporters/RemoteReporter.cpp - src/jaegertracing/reporters/Reporter.cpp - src/jaegertracing/samplers/AdaptiveSampler.cpp - src/jaegertracing/samplers/Config.cpp - src/jaegertracing/samplers/ConstSampler.cpp - src/jaegertracing/samplers/GuaranteedThroughputProbabilisticSampler.cpp - src/jaegertracing/samplers/ProbabilisticSampler.cpp - src/jaegertracing/samplers/RateLimitingSampler.cpp - src/jaegertracing/samplers/RemoteSamplingJSON.cpp - src/jaegertracing/samplers/RemotelyControlledSampler.cpp - src/jaegertracing/samplers/Sampler.cpp - src/jaegertracing/samplers/SamplingStatus.cpp - src/jaegertracing/thrift-gen/Agent.cpp - src/jaegertracing/thrift-gen/AggregationValidator.cpp - src/jaegertracing/thrift-gen/BaggageRestrictionManager.cpp - src/jaegertracing/thrift-gen/Collector.cpp - src/jaegertracing/thrift-gen/Dependency.cpp - src/jaegertracing/thrift-gen/SamplingManager.cpp - src/jaegertracing/thrift-gen/ZipkinCollector.cpp - src/jaegertracing/thrift-gen/agent_constants.cpp - src/jaegertracing/thrift-gen/agent_types.cpp - src/jaegertracing/thrift-gen/aggregation_validator_constants.cpp - src/jaegertracing/thrift-gen/aggregation_validator_types.cpp - src/jaegertracing/thrift-gen/baggage_constants.cpp - src/jaegertracing/thrift-gen/baggage_types.cpp - src/jaegertracing/thrift-gen/dependency_constants.cpp - src/jaegertracing/thrift-gen/dependency_types.cpp - src/jaegertracing/thrift-gen/jaeger_constants.cpp - src/jaegertracing/thrift-gen/jaeger_types.cpp - src/jaegertracing/thrift-gen/sampling_constants.cpp - src/jaegertracing/thrift-gen/sampling_types.cpp - src/jaegertracing/thrift-gen/zipkincore_constants.cpp - src/jaegertracing/thrift-gen/zipkincore_types.cpp - src/jaegertracing/utils/ErrorUtil.cpp - src/jaegertracing/utils/HexParsing.cpp - src/jaegertracing/utils/RateLimiter.cpp - src/jaegertracing/utils/UDPClient.cpp - src/jaegertracing/utils/YAML.cpp - src/jaegertracing/ThriftMethods.cpp) - -if(JAEGERTRACING_BUILD_CROSSDOCK) - list(APPEND SRC - src/jaegertracing/thrift-gen/TracedService.cpp - src/jaegertracing/thrift-gen/tracetest_constants.cpp - src/jaegertracing/thrift-gen/tracetest_types.cpp) -endif() - -function(add_lib_deps lib) - target_include_directories(${lib} PUBLIC - $ - $) - target_link_libraries(${lib} PUBLIC ${link_flags} ${LIBS}) - target_compile_options(${lib} PUBLIC ${cxx_flags}) -endfunction() - -function(update_path_for_test atest) - if(WIN32) - # If dependent library is a DLL we have to add location of DLL to PATH - set(new_path "") - - foreach(LIB OpenTracing::opentracing yaml-cpp::yaml-cpp GTest::main) - list(APPEND new_path $) - endforeach() - list(APPEND new_path $ENV{PATH}) - string(REPLACE ";" "\\;" new_path "${new_path}") - - set_tests_properties(${atest} PROPERTIES ENVIRONMENT "PATH=${new_path}") - endif() -endfunction() - -option(JAEGERTRACING_PLUGIN "Build dynamic plugin" OFF) -cmake_dependent_option(BUILD_SHARED_LIBS "Build shared libraries" ON - "NOT JAEGERTRACING_PLUGIN" OFF) - -if(BUILD_SHARED_LIBS) - add_library(jaegertracing SHARED ${SRC}) - if (WIN32) - target_compile_definitions(jaegertracing PUBLIC YAML_CPP_DLL) - target_link_libraries(jaegertracing PUBLIC Iphlpapi Ws2_32) - endif() - add_lib_deps(jaegertracing) - set_target_properties(jaegertracing PROPERTIES - VERSION ${PROJECT_VERSION} - SOVERSION ${PROJECT_VERSION_MAJOR}) - set(JAEGERTRACING_LIB jaegertracing) - list(APPEND JAEGERTRACING_LIBS jaegertracing) -endif() - - -if(JAEGERTRACING_PLUGIN) - file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/export.map - "{ global: OpenTracingMakeTracerFactory; local: *; };") - add_library(jaegertracing_plugin MODULE ${SRC}) - add_lib_deps(jaegertracing_plugin) - target_link_libraries(jaegertracing_plugin PUBLIC - -static-libgcc - -static-libstdc++ - -Wl,--version-script=${CMAKE_CURRENT_BINARY_DIR}/export.map) -endif() - -add_library(jaegertracing-static STATIC ${SRC}) -if (NOT WIN32) - #on windows, the shared library generate also a .lib file - set_target_properties(jaegertracing-static PROPERTIES OUTPUT_NAME jaegertracing) -endif() - -add_lib_deps(jaegertracing-static) -if (WIN32) - target_link_libraries(jaegertracing-static PUBLIC Iphlpapi Ws2_32) -endif() - -if(NOT JAEGERTRACING_LIB) - set(JAEGERTRACING_LIB jaegertracing-static) -endif() -list(APPEND JAEGERTRACING_LIBS jaegertracing-static) - -configure_file( - src/jaegertracing/Constants.h.in - src/jaegertracing/Constants.h - @ONLY) - -if(JAEGERTRACING_BUILD_EXAMPLES) - add_executable(app examples/App.cpp) - target_link_libraries(app PUBLIC ${JAEGERTRACING_LIB}) -endif() - -if(BUILD_TESTING) - add_library(testutils - src/jaegertracing/testutils/TUDPTransport.cpp - src/jaegertracing/testutils/SamplingManager.cpp - src/jaegertracing/testutils/MockAgent.cpp - src/jaegertracing/testutils/TracerUtil.cpp) - target_link_libraries(testutils PUBLIC ${JAEGERTRACING_LIB}) - - add_executable(UnitTest - src/jaegertracing/ConfigTest.cpp - src/jaegertracing/ReferenceTest.cpp - src/jaegertracing/SpanContextTest.cpp - src/jaegertracing/SpanTest.cpp - src/jaegertracing/TagTest.cpp - src/jaegertracing/TraceIDTest.cpp - src/jaegertracing/TracerFactoryTest.cpp - src/jaegertracing/TracerTest.cpp - src/jaegertracing/UDPTransportTest.cpp - src/jaegertracing/baggage/BaggageTest.cpp - src/jaegertracing/metrics/MetricsTest.cpp - src/jaegertracing/metrics/NullStatsFactoryTest.cpp - src/jaegertracing/net/IPAddressTest.cpp - src/jaegertracing/net/SocketTest.cpp - src/jaegertracing/net/URITest.cpp - src/jaegertracing/net/http/HeaderTest.cpp - src/jaegertracing/net/http/MethodTest.cpp - src/jaegertracing/net/http/ResponseTest.cpp - src/jaegertracing/propagation/PropagatorTest.cpp - src/jaegertracing/reporters/ReporterTest.cpp - src/jaegertracing/samplers/SamplerTest.cpp - src/jaegertracing/testutils/MockAgentTest.cpp - src/jaegertracing/testutils/TUDPTransportTest.cpp - src/jaegertracing/utils/ErrorUtilTest.cpp - src/jaegertracing/utils/RateLimiterTest.cpp - src/jaegertracing/utils/UDPClientTest.cpp) - target_link_libraries( - UnitTest PRIVATE testutils GTest::main ${JAEGERTRACING_LIB}) - add_test(NAME UnitTest COMMAND UnitTest) - - update_path_for_test(UnitTest) - - if(TARGET jaegertracing) - add_executable(DynamicallyLoadTracerTest - src/jaegertracing/DynamicallyLoadTracerTest.cpp) - - target_include_directories(DynamicallyLoadTracerTest PUBLIC - $ - $) - target_link_libraries( - DynamicallyLoadTracerTest ${OPENTRACING_LIB} GTest::main) - add_test(NAME DynamicallyLoadTracerTest - COMMAND DynamicallyLoadTracerTest $) - update_path_for_test(DynamicallyLoadTracerTest) - if(JAEGERTRACING_COVERAGE) - setup_target_for_coverage(NAME UnitTestCoverage - EXECUTABLE UnitTest - DEPENDENCIES UnitTest) - endif() - endif() -endif() - - - -if(JAEGERTRACING_BUILD_CROSSDOCK) - set(CROSSDOCK_SRC crossdock/Server.cpp) - add_executable(crossdock ${CROSSDOCK_SRC}) - target_include_directories(crossdock PUBLIC - $) - target_link_libraries(crossdock PUBLIC ${JAEGERTRACING_LIB}) - - string(CONCAT JAEGER_CROSSDOCK_URL - "https://raw.githubusercontent.com/" - "jaegertracing/jaeger/master/docker-compose/jaeger-docker-compose.yml") - file(DOWNLOAD ${JAEGER_CROSSDOCK_URL} - "${CMAKE_CURRENT_SOURCE_DIR}/crossdock/jaeger-docker-compose.yml") - find_program(DOCKER_COMPOSE_EXE docker-compose REQUIRED) - set(DOCKER_COMPOSE_CMD ${DOCKER_COMPOSE_EXE} - -f ${CMAKE_CURRENT_SOURCE_DIR}/crossdock/docker-compose.yml - -f ${CMAKE_CURRENT_SOURCE_DIR}/crossdock/jaeger-docker-compose.yml) - add_custom_target(crossdock-kill - COMMAND ${DOCKER_COMPOSE_CMD} down) - add_custom_target(crossdock-run - COMMAND ${DOCKER_COMPOSE_CMD} build - COMMAND ${DOCKER_COMPOSE_CMD} run crossdock - DEPENDS crossdock-kill - WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}) - add_custom_target(crossdock-fresh - COMMAND ${DOCKER_COMPOSE_CMD} build --pull --no-cache - COMMAND ${DOCKER_COMPOSE_CMD} run crossdock - DEPENDS crossdock-kill - WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}) - add_custom_target(crossdock-logs - COMMAND ${DOCKER_COMPOSE_CMD} logs) -endif() - - - -# Installation (https://github.com/forexample/package-example) - -# Introduce variables: -# * CMAKE_INSTALL_LIBDIR -# * CMAKE_INSTALL_BINDIR -# * CMAKE_INSTALL_INCLUDEDIR -include(GNUInstallDirs) - -# Layout. This works for all platforms: -# * /lib*/cmake/ -# * /lib*/ -# * /include/ -set(config_install_dir "${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}") - -set(generated_dir "${CMAKE_CURRENT_BINARY_DIR}/generated") - -# Configuration -set(version_config "${generated_dir}/${PROJECT_NAME}ConfigVersion.cmake") -set(project_config "${generated_dir}/${PROJECT_NAME}Config.cmake") -set(TARGETS_EXPORT_NAME "${PROJECT_NAME}Targets") -set(namespace "${PROJECT_NAME}::") - -# Include module with fuction 'write_basic_package_version_file' -include(CMakePackageConfigHelpers) - -# Configure 'ConfigVersion.cmake' -# Use: -# * PROJECT_VERSION -write_basic_package_version_file( - "${version_config}" COMPATIBILITY SameMajorVersion -) - -# Configure 'Config.cmake' -# Use variables: -# * TARGETS_EXPORT_NAME -# * PROJECT_NAME -configure_package_config_file( - "cmake/Config.cmake.in" - "${project_config}" - INSTALL_DESTINATION "${config_install_dir}" -) - -# Targets: -# * /lib*/libjaegertracing.a -# * /lib*/libjaegertracing.so -# * header location after install: /include/jaegertracing/Tracer.h -# * headers can be included by C++ code `#include ` -install( - TARGETS ${JAEGERTRACING_LIBS} - EXPORT "${TARGETS_EXPORT_NAME}" - LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}" - ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}" - RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}" - INCLUDES DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}" -) - -# Headers: -# * src/jaegertracing/Tracer.h -> /include/jaegertracing/Tracer.h -install(DIRECTORY "src/jaegertracing" - DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}" - FILES_MATCHING - PATTERN "*.h" - PATTERN "testutils/*.h" EXCLUDE) - -# * build/src/jaegertracing/Constants.h -> -# /include/jaegertracing/Constants.h -install(FILES "${CMAKE_CURRENT_BINARY_DIR}/src/jaegertracing/Constants.h" - DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/jaegertracing") - -# Config -# * /lib*/cmake/jaegertracing/jaegertracingConfig.cmake -# * /lib*/cmake/jaegertracing/jaegertracingConfigVersion.cmake -install( - FILES "${project_config}" "${version_config}" - DESTINATION "${config_install_dir}" -) - -# Config -# * /lib*/cmake/jaegertracing/jaegertracingTargets.cmake -install( - EXPORT "${TARGETS_EXPORT_NAME}" - NAMESPACE "${namespace}" - DESTINATION "${config_install_dir}" -) +cmake_minimum_required(VERSION 3.3) + +list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake") + +set(CMAKE_TOOLCHAIN_FILE "${CMAKE_CURRENT_SOURCE_DIR}/cmake/toolchain.cmake" + CACHE FILEPATH + "Toolchain to use for building this package and dependencies") + +set(HUNTER_CONFIGURATION_TYPES "Release;Debug" CACHE STRING + "Configuration types used when building Hunter dependencies") + +include(CMakeDependentOption) +include(HunterGate) + +option(HUNTER_BUILD_SHARED_LIBS "Build Shared Library" ON) + +HunterGate( + URL "https://github.com/ruslo/hunter/archive/v0.23.201.tar.gz" + SHA1 "29f10683f10c7b35e1f599d71542af0c2daa6a01" +) + +project(jaegertracing VERSION 0.5.0) + +option(JAEGERTRACING_WARNINGS_AS_ERRORS "Treat compiler warnings as errors" OFF) + +if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU" OR + CMAKE_CXX_COMPILER_ID MATCHES "Clang") + set(cxx_flags -Wall -pedantic) + if(JAEGERTRACING_WARNINGS_AS_ERRORS) + list(APPEND cxx_flags -Werror) + endif() +endif() + +if(CMAKE_CXX_COMPILER_ID MATCHES "Clang") + list(APPEND cxx_flags -Wno-unused-private-field) +endif() + +if(MSVC) + add_definitions(-D_SILENCE_CXX17_ITERATOR_BASE_CLASS_DEPRECATION_WARNING) + + # https://studiofreya.com/2018/01/06/visual-studio-2017-with-cpp17-and-boost/ + add_definitions(-DBOOST_CONFIG_SUPPRESS_OUTDATED_MESSAGE) + add_definitions(-D_SCL_SECURE_NO_WARNINGS) +endif() + +set(CMAKE_EXPORT_COMPILE_COMMANDS ON) + +if(HUNTER_ENABLED) + set(hunter_config "CONFIG") +else() + set(hunter_config "") +endif() + +set(package_deps) + +if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU" AND + CMAKE_CXX_COMPILER_VERSION VERSION_LESS "4.9") + message(FATAL_ERROR "Must use gcc >= 4.9") +endif() + +hunter_add_package(thrift) +find_package(thrift ${hunter_config} REQUIRED) +if(HUNTER_ENABLED) + list(APPEND LIBS thrift::thrift_static) +else() + list(APPEND LIBS ${THRIFT_LIBRARIES}) +endif() +list(APPEND package_deps thrift) + + +hunter_add_package(opentracing-cpp) +# Not `${hunter_config}` because OpenTracing provides its own +# OpenTracingConfig.cmake file +find_package(OpenTracing CONFIG REQUIRED) +# Under Windows, link dynamically with OpenTracing +if (WIN32) + list(APPEND LIBS OpenTracing::opentracing) + set(OPENTRACING_LIB OpenTracing::opentracing) +else() + list(APPEND LIBS OpenTracing::opentracing-static) + set(OPENTRACING_LIB OpenTracing::opentracing-static) +endif() +list(APPEND package_deps OpenTracing) + +hunter_add_package(nlohmann_json) +find_package(nlohmann_json CONFIG REQUIRED) +list(APPEND LIBS nlohmann_json::nlohmann_json) +list(APPEND package_deps nlohmann_json) + +option(JAEGERTRACING_BUILD_EXAMPLES "Build examples" ON) + +option(JAEGERTRACING_COVERAGE "Build with coverage" $ENV{COVERAGE}) +option(JAEGERTRACING_BUILD_CROSSDOCK "Build crossdock" $ENV{CROSSDOCK}) +cmake_dependent_option( + JAEGERTRACING_WITH_YAML_CPP "Use yaml-cpp to parse config files" ON + "NOT JAEGERTRACING_BUILD_CROSSDOCK" ON) + +if(JAEGERTRACING_WITH_YAML_CPP) + hunter_add_package(yaml-cpp) + # Not `${hunter_config}` because yaml-cpp provides its own + # yaml-cpp-config.cmake file + find_package(yaml-cpp CONFIG REQUIRED) + if(HUNTER_ENABLED) + list(APPEND LIBS yaml-cpp::yaml-cpp) + else() + list(APPEND LIBS yaml-cpp) + endif() + list(APPEND package_deps yaml-cpp) +endif() + +include(CTest) +if(BUILD_TESTING) + hunter_add_package(GTest) + find_package(GTest ${hunter_config} REQUIRED) + + if(JAEGERTRACING_COVERAGE) + include(CodeCoverage) + append_coverage_compiler_flags(cxx_flags) + append_coverage_compiler_flags(link_flags) + set(COVERAGE_EXCLUDES "${CMAKE_CURRENT_SOURCE_DIR}/src/jaegertracing/thrift-gen/*" + "*Test.cpp") + endif() +endif() + +set(SRC + src/jaegertracing/Config.cpp + src/jaegertracing/DynamicLoad.cpp + src/jaegertracing/LogRecord.cpp + src/jaegertracing/Logging.cpp + src/jaegertracing/Reference.cpp + src/jaegertracing/Span.cpp + src/jaegertracing/SpanContext.cpp + src/jaegertracing/Tag.cpp + src/jaegertracing/TraceID.cpp + src/jaegertracing/Tracer.cpp + src/jaegertracing/TracerFactory.cpp + src/jaegertracing/Transport.cpp + src/jaegertracing/ThriftTransport.cpp + src/jaegertracing/baggage/BaggageSetter.cpp + src/jaegertracing/baggage/RemoteRestrictionJSON.cpp + src/jaegertracing/baggage/RemoteRestrictionManager.cpp + src/jaegertracing/baggage/Restriction.cpp + src/jaegertracing/baggage/RestrictionManager.cpp + src/jaegertracing/baggage/RestrictionsConfig.cpp + src/jaegertracing/metrics/Counter.cpp + src/jaegertracing/metrics/Gauge.cpp + src/jaegertracing/metrics/InMemoryStatsReporter.cpp + src/jaegertracing/metrics/Metric.cpp + src/jaegertracing/metrics/Metrics.cpp + src/jaegertracing/metrics/NullCounter.cpp + src/jaegertracing/metrics/NullGauge.cpp + src/jaegertracing/metrics/NullStatsFactory.cpp + src/jaegertracing/metrics/NullStatsReporter.cpp + src/jaegertracing/metrics/NullTimer.cpp + src/jaegertracing/metrics/StatsFactory.cpp + src/jaegertracing/metrics/StatsFactoryImpl.cpp + src/jaegertracing/metrics/StatsReporter.cpp + src/jaegertracing/metrics/Timer.cpp + src/jaegertracing/net/IPAddress.cpp + src/jaegertracing/net/Socket.cpp + src/jaegertracing/net/URI.cpp + src/jaegertracing/net/http/Error.cpp + src/jaegertracing/net/http/Header.cpp + src/jaegertracing/net/http/Method.cpp + src/jaegertracing/net/http/Request.cpp + src/jaegertracing/net/http/Response.cpp + src/jaegertracing/platform/Endian.cpp + src/jaegertracing/platform/Hostname.cpp + src/jaegertracing/propagation/Extractor.cpp + src/jaegertracing/propagation/HeadersConfig.cpp + src/jaegertracing/propagation/Injector.cpp + src/jaegertracing/propagation/Propagator.cpp + src/jaegertracing/reporters/CompositeReporter.cpp + src/jaegertracing/reporters/Config.cpp + src/jaegertracing/reporters/InMemoryReporter.cpp + src/jaegertracing/reporters/LoggingReporter.cpp + src/jaegertracing/reporters/NullReporter.cpp + src/jaegertracing/reporters/RemoteReporter.cpp + src/jaegertracing/reporters/Reporter.cpp + src/jaegertracing/samplers/AdaptiveSampler.cpp + src/jaegertracing/samplers/Config.cpp + src/jaegertracing/samplers/ConstSampler.cpp + src/jaegertracing/samplers/GuaranteedThroughputProbabilisticSampler.cpp + src/jaegertracing/samplers/ProbabilisticSampler.cpp + src/jaegertracing/samplers/RateLimitingSampler.cpp + src/jaegertracing/samplers/RemoteSamplingJSON.cpp + src/jaegertracing/samplers/RemotelyControlledSampler.cpp + src/jaegertracing/samplers/Sampler.cpp + src/jaegertracing/samplers/SamplingStatus.cpp + src/jaegertracing/thrift-gen/Agent.cpp + src/jaegertracing/thrift-gen/AggregationValidator.cpp + src/jaegertracing/thrift-gen/BaggageRestrictionManager.cpp + src/jaegertracing/thrift-gen/Collector.cpp + src/jaegertracing/thrift-gen/Dependency.cpp + src/jaegertracing/thrift-gen/SamplingManager.cpp + src/jaegertracing/thrift-gen/ZipkinCollector.cpp + src/jaegertracing/thrift-gen/agent_constants.cpp + src/jaegertracing/thrift-gen/agent_types.cpp + src/jaegertracing/thrift-gen/aggregation_validator_constants.cpp + src/jaegertracing/thrift-gen/aggregation_validator_types.cpp + src/jaegertracing/thrift-gen/baggage_constants.cpp + src/jaegertracing/thrift-gen/baggage_types.cpp + src/jaegertracing/thrift-gen/dependency_constants.cpp + src/jaegertracing/thrift-gen/dependency_types.cpp + src/jaegertracing/thrift-gen/jaeger_constants.cpp + src/jaegertracing/thrift-gen/jaeger_types.cpp + src/jaegertracing/thrift-gen/sampling_constants.cpp + src/jaegertracing/thrift-gen/sampling_types.cpp + src/jaegertracing/thrift-gen/zipkincore_constants.cpp + src/jaegertracing/thrift-gen/zipkincore_types.cpp + src/jaegertracing/utils/ErrorUtil.cpp + src/jaegertracing/utils/HexParsing.cpp + src/jaegertracing/utils/RateLimiter.cpp + src/jaegertracing/utils/UDPSender.cpp + src/jaegertracing/utils/HttpSender.cpp + src/jaegertracing/utils/YAML.cpp + src/jaegertracing/ThriftMethods.cpp) + +if(JAEGERTRACING_BUILD_CROSSDOCK) + list(APPEND SRC + src/jaegertracing/thrift-gen/TracedService.cpp + src/jaegertracing/thrift-gen/tracetest_constants.cpp + src/jaegertracing/thrift-gen/tracetest_types.cpp) +endif() + +function(add_lib_deps lib) + target_include_directories(${lib} PUBLIC + $ + $) + target_link_libraries(${lib} PUBLIC ${link_flags} ${LIBS}) + target_compile_options(${lib} PUBLIC ${cxx_flags}) +endfunction() + +function(update_path_for_test atest) + if(WIN32) + # If dependent library is a DLL we have to add location of DLL to PATH + set(new_path "") + + foreach(LIB OpenTracing::opentracing yaml-cpp::yaml-cpp GTest::main) + list(APPEND new_path $) + endforeach() + list(APPEND new_path $ENV{PATH}) + string(REPLACE ";" "\\;" new_path "${new_path}") + + set_tests_properties(${atest} PROPERTIES ENVIRONMENT "PATH=${new_path}") + endif() +endfunction() + +option(JAEGERTRACING_PLUGIN "Build dynamic plugin" OFF) +cmake_dependent_option(BUILD_SHARED_LIBS "Build shared libraries" ON + "NOT JAEGERTRACING_PLUGIN" OFF) + +if(BUILD_SHARED_LIBS) + add_library(jaegertracing SHARED ${SRC}) + if (WIN32) + target_compile_definitions(jaegertracing PUBLIC YAML_CPP_DLL) + target_link_libraries(jaegertracing PUBLIC Iphlpapi Ws2_32) + endif() + add_lib_deps(jaegertracing) + set_target_properties(jaegertracing PROPERTIES + VERSION ${PROJECT_VERSION} + SOVERSION ${PROJECT_VERSION_MAJOR}) + set(JAEGERTRACING_LIB jaegertracing) + list(APPEND JAEGERTRACING_LIBS jaegertracing) +endif() + + +if(JAEGERTRACING_PLUGIN) + file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/export.map + "{ global: OpenTracingMakeTracerFactory; local: *; };") + add_library(jaegertracing_plugin MODULE ${SRC}) + add_lib_deps(jaegertracing_plugin) + target_link_libraries(jaegertracing_plugin PUBLIC + -static-libgcc + -static-libstdc++ + -Wl,--version-script=${CMAKE_CURRENT_BINARY_DIR}/export.map) +endif() + +add_library(jaegertracing-static STATIC ${SRC}) +if (NOT WIN32) + #on windows, the shared library generate also a .lib file + set_target_properties(jaegertracing-static PROPERTIES OUTPUT_NAME jaegertracing) +endif() + +add_lib_deps(jaegertracing-static) +if (WIN32) + target_link_libraries(jaegertracing-static PUBLIC Iphlpapi Ws2_32) +endif() + +if(NOT JAEGERTRACING_LIB) + set(JAEGERTRACING_LIB jaegertracing-static) +endif() +list(APPEND JAEGERTRACING_LIBS jaegertracing-static) + +configure_file( + src/jaegertracing/Constants.h.in + src/jaegertracing/Constants.h + @ONLY) + +if(JAEGERTRACING_BUILD_EXAMPLES) + add_executable(app examples/App.cpp) + target_link_libraries(app PUBLIC ${JAEGERTRACING_LIB}) +endif() + +if(BUILD_TESTING) + add_library(testutils + src/jaegertracing/testutils/TUDPTransport.cpp + src/jaegertracing/testutils/SamplingManager.cpp + src/jaegertracing/testutils/MockAgent.cpp + src/jaegertracing/testutils/TracerUtil.cpp) + target_link_libraries(testutils PUBLIC ${JAEGERTRACING_LIB}) + + add_executable(UnitTest + src/jaegertracing/ConfigTest.cpp + src/jaegertracing/ReferenceTest.cpp + src/jaegertracing/SpanContextTest.cpp + src/jaegertracing/SpanTest.cpp + src/jaegertracing/TagTest.cpp + src/jaegertracing/TraceIDTest.cpp + src/jaegertracing/TracerFactoryTest.cpp + src/jaegertracing/TracerTest.cpp + src/jaegertracing/ThriftTransportTest.cpp + src/jaegertracing/baggage/BaggageTest.cpp + src/jaegertracing/metrics/MetricsTest.cpp + src/jaegertracing/metrics/NullStatsFactoryTest.cpp + src/jaegertracing/net/IPAddressTest.cpp + src/jaegertracing/net/SocketTest.cpp + src/jaegertracing/net/URITest.cpp + src/jaegertracing/net/http/HeaderTest.cpp + src/jaegertracing/net/http/MethodTest.cpp + src/jaegertracing/net/http/ResponseTest.cpp + src/jaegertracing/propagation/PropagatorTest.cpp + src/jaegertracing/reporters/ConfigTest.cpp + src/jaegertracing/reporters/ReporterTest.cpp + src/jaegertracing/samplers/SamplerTest.cpp + src/jaegertracing/testutils/MockAgentTest.cpp + src/jaegertracing/testutils/TUDPTransportTest.cpp + src/jaegertracing/utils/ErrorUtilTest.cpp + src/jaegertracing/utils/RateLimiterTest.cpp + src/jaegertracing/utils/UDPSenderTest.cpp + src/jaegertracing/utils/HttpSenderTest.cpp) + target_link_libraries( + UnitTest PRIVATE testutils GTest::main ${JAEGERTRACING_LIB}) + add_test(NAME UnitTest COMMAND UnitTest) + + update_path_for_test(UnitTest) + + if(TARGET jaegertracing) + add_executable(DynamicallyLoadTracerTest + src/jaegertracing/DynamicallyLoadTracerTest.cpp) + + target_include_directories(DynamicallyLoadTracerTest PUBLIC + $ + $) + target_link_libraries( + DynamicallyLoadTracerTest ${OPENTRACING_LIB} GTest::main) + add_test(NAME DynamicallyLoadTracerTest + COMMAND DynamicallyLoadTracerTest $) + update_path_for_test(DynamicallyLoadTracerTest) + if(JAEGERTRACING_COVERAGE) + setup_target_for_coverage(NAME UnitTestCoverage + EXECUTABLE UnitTest + DEPENDENCIES UnitTest) + endif() + endif() +endif() + + + +if(JAEGERTRACING_BUILD_CROSSDOCK) + set(CROSSDOCK_SRC crossdock/Server.cpp) + add_executable(crossdock ${CROSSDOCK_SRC}) + target_include_directories(crossdock PUBLIC + $) + target_link_libraries(crossdock PUBLIC ${JAEGERTRACING_LIB}) + + string(CONCAT JAEGER_CROSSDOCK_URL + "https://raw.githubusercontent.com/" + "jaegertracing/jaeger/master/docker-compose/jaeger-docker-compose.yml") + file(DOWNLOAD ${JAEGER_CROSSDOCK_URL} + "${CMAKE_CURRENT_SOURCE_DIR}/crossdock/jaeger-docker-compose.yml") + find_program(DOCKER_COMPOSE_EXE docker-compose REQUIRED) + set(DOCKER_COMPOSE_CMD ${DOCKER_COMPOSE_EXE} + -f ${CMAKE_CURRENT_SOURCE_DIR}/crossdock/docker-compose.yml + -f ${CMAKE_CURRENT_SOURCE_DIR}/crossdock/jaeger-docker-compose.yml) + add_custom_target(crossdock-kill + COMMAND ${DOCKER_COMPOSE_CMD} down) + add_custom_target(crossdock-run + COMMAND ${DOCKER_COMPOSE_CMD} build + COMMAND ${DOCKER_COMPOSE_CMD} run crossdock + DEPENDS crossdock-kill + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}) + add_custom_target(crossdock-fresh + COMMAND ${DOCKER_COMPOSE_CMD} build --pull --no-cache + COMMAND ${DOCKER_COMPOSE_CMD} run crossdock + DEPENDS crossdock-kill + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}) + add_custom_target(crossdock-logs + COMMAND ${DOCKER_COMPOSE_CMD} logs) +endif() + + + +# Installation (https://github.com/forexample/package-example) + +# Introduce variables: +# * CMAKE_INSTALL_LIBDIR +# * CMAKE_INSTALL_BINDIR +# * CMAKE_INSTALL_INCLUDEDIR +include(GNUInstallDirs) + +# Layout. This works for all platforms: +# * /lib*/cmake/ +# * /lib*/ +# * /include/ +set(config_install_dir "${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}") + +set(generated_dir "${CMAKE_CURRENT_BINARY_DIR}/generated") + +# Configuration +set(version_config "${generated_dir}/${PROJECT_NAME}ConfigVersion.cmake") +set(project_config "${generated_dir}/${PROJECT_NAME}Config.cmake") +set(TARGETS_EXPORT_NAME "${PROJECT_NAME}Targets") +set(namespace "${PROJECT_NAME}::") + +# Include module with fuction 'write_basic_package_version_file' +include(CMakePackageConfigHelpers) + +# Configure 'ConfigVersion.cmake' +# Use: +# * PROJECT_VERSION +write_basic_package_version_file( + "${version_config}" COMPATIBILITY SameMajorVersion +) + +# Configure 'Config.cmake' +# Use variables: +# * TARGETS_EXPORT_NAME +# * PROJECT_NAME +configure_package_config_file( + "cmake/Config.cmake.in" + "${project_config}" + INSTALL_DESTINATION "${config_install_dir}" +) + +# Targets: +# * /lib*/libjaegertracing.a +# * /lib*/libjaegertracing.so +# * header location after install: /include/jaegertracing/Tracer.h +# * headers can be included by C++ code `#include ` +install( + TARGETS ${JAEGERTRACING_LIBS} + EXPORT "${TARGETS_EXPORT_NAME}" + LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}" + ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}" + RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}" + INCLUDES DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}" +) + +# Headers: +# * src/jaegertracing/Tracer.h -> /include/jaegertracing/Tracer.h +install(DIRECTORY "src/jaegertracing" + DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}" + FILES_MATCHING + PATTERN "*.h" + PATTERN "testutils/*.h" EXCLUDE) + +# * build/src/jaegertracing/Constants.h -> +# /include/jaegertracing/Constants.h +install(FILES "${CMAKE_CURRENT_BINARY_DIR}/src/jaegertracing/Constants.h" + DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/jaegertracing") + +# Config +# * /lib*/cmake/jaegertracing/jaegertracingConfig.cmake +# * /lib*/cmake/jaegertracing/jaegertracingConfigVersion.cmake +install( + FILES "${project_config}" "${version_config}" + DESTINATION "${config_install_dir}" +) + +# Config +# * /lib*/cmake/jaegertracing/jaegertracingTargets.cmake +install( + EXPORT "${TARGETS_EXPORT_NAME}" + NAMESPACE "${namespace}" + DESTINATION "${config_install_dir}" +) diff --git a/README.md b/README.md index f39b54a0..378cf91c 100644 --- a/README.md +++ b/README.md @@ -66,6 +66,18 @@ repoter: NOTE: It is not recommended to use a remote host for UDP connections. +### Connecting directly to the Collector + +In case the client should connect directly to the collector instead of going through an agent, it's necessary update the reporter configuration + +```yml +repoter: + endpoint: http://collectorhost:collectorport/api/traces +``` +where collectorhost and collectorport are placeholders respectively for your Collector host and port. + +Note that if both localAgentHostPort and endpoint are specified, the endpoint will be used. + ### Updating Sampling Server URL The default sampling collector URL is `http://127.0.0.1:5778/sampling`. Similar to UDP address above, you can use a different URL by updating the sampler configuration. diff --git a/src/jaegertracing/UDPTransport.cpp b/src/jaegertracing/ThriftTransport.cpp similarity index 78% rename from src/jaegertracing/UDPTransport.cpp rename to src/jaegertracing/ThriftTransport.cpp index 34e47101..1fce1b3d 100644 --- a/src/jaegertracing/UDPTransport.cpp +++ b/src/jaegertracing/ThriftTransport.cpp @@ -14,7 +14,7 @@ * limitations under the License. */ -#include "jaegertracing/UDPTransport.h" +#include "jaegertracing/ThriftTransport.h" #include "jaegertracing/Span.h" #include "jaegertracing/Tag.h" @@ -23,8 +23,6 @@ #include #include #include -#include -#include #include #ifdef _MSC_VER @@ -42,11 +40,10 @@ namespace { constexpr auto kEmitBatchOverhead = 30; template -int calcSizeOfSerializedThrift(const ThriftType& base, int maxPacketSize) +int calcSizeOfSerializedThrift(apache::thrift::protocol::TProtocolFactory& factory, const ThriftType& base, int maxPacketSize) { std::shared_ptr buffer( new apache::thrift::transport::TMemoryBuffer(maxPacketSize)); - apache::thrift::protocol::TCompactProtocolFactory factory; auto protocol = factory.getProtocol(buffer); base.write(protocol.get()); uint8_t* data = nullptr; @@ -57,15 +54,28 @@ int calcSizeOfSerializedThrift(const ThriftType& base, int maxPacketSize) } // anonymous namespace -UDPTransport::UDPTransport(const net::IPAddress& ip, int maxPacketSize) - : _client(new utils::UDPClient(ip, maxPacketSize)) +ThriftTransport::ThriftTransport(const net::IPAddress& ip, + int maxPacketSize) + : _sender(new utils::UDPSender(ip, maxPacketSize)) , _maxSpanBytes(0) , _byteBufferSize(0) , _processByteSize(0) + , _protocolFactory(_sender->protocolFactory()) { } -int UDPTransport::append(const Span& span) +ThriftTransport::ThriftTransport(const net::URI& endpoint, + int maxPacketSize) + : _sender(new utils::HttpSender(endpoint, maxPacketSize)) + , _maxSpanBytes(0) + , _byteBufferSize(0) + , _processByteSize(0) + , _protocolFactory(_sender->protocolFactory()) +{ +} + + +int ThriftTransport::append(const Span& span) { if (_process.serviceName.empty()) { const auto& tracer = static_cast(span.tracer()); @@ -85,14 +95,14 @@ int UDPTransport::append(const Span& span) _process.__set_tags(thriftTags); _processByteSize = - calcSizeOfSerializedThrift(_process, _client->maxPacketSize()); + calcSizeOfSerializedThrift(*_protocolFactory, _process, _sender->maxPacketSize()); _maxSpanBytes = - _client->maxPacketSize() - _processByteSize - kEmitBatchOverhead; + _sender->maxPacketSize() - _processByteSize - kEmitBatchOverhead; } thrift::Span jaegerSpan; span.thrift(jaegerSpan); const auto spanSize = - calcSizeOfSerializedThrift(jaegerSpan, _client->maxPacketSize()); + calcSizeOfSerializedThrift(*_protocolFactory, jaegerSpan, _sender->maxPacketSize()); if (spanSize > _maxSpanBytes) { std::ostringstream oss; throw Transport::Exception("Span is too large", 1); @@ -114,7 +124,7 @@ int UDPTransport::append(const Span& span) return flushed; } -int UDPTransport::flush() +int ThriftTransport::flush() { if (_spanBuffer.empty()) { return 0; @@ -125,7 +135,7 @@ int UDPTransport::flush() batch.__set_spans(_spanBuffer); try { - _client->emitBatch(batch); + _sender->emitBatch(batch); } catch (const std::system_error& ex) { std::ostringstream oss; oss << "Could not send span " << ex.what() diff --git a/src/jaegertracing/UDPTransport.h b/src/jaegertracing/ThriftTransport.h similarity index 61% rename from src/jaegertracing/UDPTransport.h rename to src/jaegertracing/ThriftTransport.h index 72bc9b15..8e923077 100644 --- a/src/jaegertracing/UDPTransport.h +++ b/src/jaegertracing/ThriftTransport.h @@ -1,64 +1,67 @@ -/* - * Copyright (c) 2017-2018 Uber Technologies, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef JAEGERTRACING_UDPTRANSPORT_H -#define JAEGERTRACING_UDPTRANSPORT_H - -#include "jaegertracing/Compilers.h" -#include "jaegertracing/Span.h" -#include "jaegertracing/Transport.h" -#include "jaegertracing/thrift-gen/jaeger_types.h" -#include "jaegertracing/utils/UDPClient.h" - -namespace jaegertracing { - -class UDPTransport : public Transport { - public: - UDPTransport(const net::IPAddress& ip, int maxPacketSize); - - ~UDPTransport() { close(); } - - int append(const Span& span) override; - - int flush() override; - - void close() override { _client->close(); } - - protected: - void setClient(std::unique_ptr&& client) - { - _client = std::move(client); - } - - private: - void resetBuffers() - { - _spanBuffer.clear(); - _byteBufferSize = _processByteSize; - } - - std::unique_ptr _client; - int _maxSpanBytes; - int _byteBufferSize; - std::vector _spanBuffer; - std::shared_ptr _protocol; - thrift::Process _process; - int _processByteSize; -}; - -} // namespace jaegertracing - -#endif // JAEGERTRACING_UDPTRANSPORT_H +/* + * Copyright (c) 2017-2018 Uber Technologies, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef JAEGERTRACING_THRIFTTRANSPORT_H +#define JAEGERTRACING_THRIFTTRANSPORT_H + +#include "jaegertracing/Compilers.h" +#include "jaegertracing/Span.h" +#include "jaegertracing/Transport.h" +#include "jaegertracing/thrift-gen/jaeger_types.h" +#include "jaegertracing/utils/UDPSender.h" +#include "jaegertracing/utils/HttpSender.h" + +namespace jaegertracing { + +class ThriftTransport : public Transport { + public: + ThriftTransport(const net::IPAddress& ip, int maxPacketSize); + + ThriftTransport(const net::URI& endpoint, int maxPacketSize); + + ~ThriftTransport() { close(); } + + int append(const Span& span) override; + + int flush() override; + + void close() override { _sender->close(); } + + protected: + void setClient(std::unique_ptr&& client) + { + _sender = std::move(client); + } + + private: + void resetBuffers() + { + _spanBuffer.clear(); + _byteBufferSize = _processByteSize; + } + + std::unique_ptr _sender; + int _maxSpanBytes; + int _byteBufferSize; + std::vector _spanBuffer; + thrift::Process _process; + int _processByteSize; + std::unique_ptr _protocolFactory; +}; + +} // namespace jaegertracing + +#endif //JAEGERTRACING_THRIFTTRANSPORT_H diff --git a/src/jaegertracing/UDPTransportTest.cpp b/src/jaegertracing/ThriftTransportTest.cpp similarity index 69% rename from src/jaegertracing/UDPTransportTest.cpp rename to src/jaegertracing/ThriftTransportTest.cpp index b7c31a69..5bc9d5ec 100644 --- a/src/jaegertracing/UDPTransportTest.cpp +++ b/src/jaegertracing/ThriftTransportTest.cpp @@ -16,23 +16,22 @@ #include -#include "jaegertracing/Config.h" #include "jaegertracing/Tracer.h" -#include "jaegertracing/UDPTransport.h" +#include "jaegertracing/ThriftTransport.h" #include "jaegertracing/testutils/TracerUtil.h" #include "jaegertracing/utils/ErrorUtil.h" namespace jaegertracing { namespace { -class MockUDPClient : public utils::UDPClient { +class MockUDPSender : public utils::UDPSender { public: enum class ExceptionType { kSystemError, kException, kString }; - MockUDPClient(const net::IPAddress& serverAddr, + MockUDPSender(const net::IPAddress& serverAddr, int maxPacketSize, ExceptionType type) - : UDPClient(serverAddr, maxPacketSize) + : UDPSender(serverAddr, maxPacketSize) , _type(type) { } @@ -55,27 +54,27 @@ class MockUDPClient : public utils::UDPClient { ExceptionType _type; }; -class MockUDPTransport : public UDPTransport { +class MockThriftTransport : public ThriftTransport { public: - MockUDPTransport(const net::IPAddress& ip, + MockThriftTransport(const net::IPAddress& ip, int maxPacketSize, - MockUDPClient::ExceptionType type) - : UDPTransport(ip, maxPacketSize) + MockUDPSender::ExceptionType type) + : ThriftTransport(ip, maxPacketSize) { - setClient(std::unique_ptr( - new MockUDPClient(ip, maxPacketSize, type))); + setClient(std::unique_ptr( + new MockUDPSender(ip, maxPacketSize, type))); } }; } // anonymous namespace -TEST(UDPTransport, testManyMessages) +TEST(ThriftTransport, testManyMessages) { const auto handle = testutils::TracerUtil::installGlobalTracer(); const auto tracer = std::static_pointer_cast(opentracing::Tracer::Global()); - UDPTransport sender(handle->_mockAgent->spanServerAddress(), 0); + ThriftTransport sender(handle->_mockAgent->spanServerAddress(), 0); constexpr auto kNumMessages = 2000; const auto logger = logging::consoleLogger(); for (auto i = 0; i < kNumMessages; ++i) { @@ -85,7 +84,7 @@ TEST(UDPTransport, testManyMessages) } } -TEST(UDPTransport, testExceptions) +TEST(ThriftTransport, testExceptions) { const auto handle = testutils::TracerUtil::installGlobalTracer(); const auto tracer = @@ -94,15 +93,15 @@ TEST(UDPTransport, testExceptions) Span span(tracer); span.SetOperationName("test"); - const MockUDPClient::ExceptionType exceptionTypes[] = { - MockUDPClient::ExceptionType::kSystemError, - MockUDPClient::ExceptionType::kException, - MockUDPClient::ExceptionType::kString + const MockUDPSender::ExceptionType exceptionTypes[] = { + MockUDPSender::ExceptionType::kSystemError, + MockUDPSender::ExceptionType::kException, + MockUDPSender::ExceptionType::kString }; for (auto type : exceptionTypes) { - MockUDPTransport sender(net::IPAddress::v4("localhost", 0), 0, type); - sender.append(span); - ASSERT_THROW(sender.flush(), Transport::Exception); + MockThriftTransport transport(net::IPAddress::v4("localhost", 0), 0, type); + transport.append(span); + ASSERT_THROW(transport.flush(), Transport::Exception); } } diff --git a/src/jaegertracing/net/Socket.h b/src/jaegertracing/net/Socket.h index 9da8679e..ee936fcf 100644 --- a/src/jaegertracing/net/Socket.h +++ b/src/jaegertracing/net/Socket.h @@ -235,8 +235,6 @@ class Socket { resolveAddress(const std::string& host, int port, int family, int type); }; -static constexpr auto kUDPPacketMaxLength = 65000; - } // namespace net } // namespace jaegertracing diff --git a/src/jaegertracing/net/http/Method.cpp b/src/jaegertracing/net/http/Method.cpp index f4f1d2db..210f40b3 100644 --- a/src/jaegertracing/net/http/Method.cpp +++ b/src/jaegertracing/net/http/Method.cpp @@ -30,9 +30,8 @@ Method parseMethod(const std::string& methodName) "POST", "PUT", "DELETE", "TRACE", "CONNECT" }; #else - static constexpr auto kMethodNames = { "OPTIONS", "GET", "HEAD", - "POST", "PUT", "DELETE", - "TRACE", "CONNECT" }; + static auto kMethodNames = { "OPTIONS", "GET", "HEAD", "POST", + "PUT", "DELETE", "TRACE", "CONNECT" }; #endif diff --git a/src/jaegertracing/net/http/Request.cpp b/src/jaegertracing/net/http/Request.cpp index 55758cb1..bd0d7556 100644 --- a/src/jaegertracing/net/http/Request.cpp +++ b/src/jaegertracing/net/http/Request.cpp @@ -15,6 +15,7 @@ */ #include "jaegertracing/net/http/Request.h" +#include "jaegertracing/net/http/SocketReader.h" #include @@ -22,6 +23,13 @@ namespace jaegertracing { namespace net { namespace http { +Request Request::read(Socket & socket) +{ + std::string response = SocketReader::read(socket); + std::istringstream responseStream(response); + return Request::parse(responseStream); +} + Request Request::parse(std::istream& in) { const std::regex requestLinePattern( diff --git a/src/jaegertracing/net/http/Request.h b/src/jaegertracing/net/http/Request.h index c12a891e..3e5f5a9c 100644 --- a/src/jaegertracing/net/http/Request.h +++ b/src/jaegertracing/net/http/Request.h @@ -18,6 +18,7 @@ #define JAEGERTRACING_NET_HTTP_REQUEST_H #include "jaegertracing/net/URI.h" +#include "jaegertracing/net/Socket.h" #include "jaegertracing/net/http/Error.h" #include "jaegertracing/net/http/Header.h" #include "jaegertracing/net/http/Method.h" @@ -30,6 +31,8 @@ class Request { public: static Request parse(std::istream& in); + static Request read(Socket& in); + Request() : _method() , _target() diff --git a/src/jaegertracing/net/http/Response.cpp b/src/jaegertracing/net/http/Response.cpp index 2a1a80d8..6de74e74 100644 --- a/src/jaegertracing/net/http/Response.cpp +++ b/src/jaegertracing/net/http/Response.cpp @@ -15,21 +15,8 @@ */ #include "jaegertracing/net/http/Response.h" +#include "jaegertracing/net/http/SocketReader.h" -#ifdef WIN32 -#include -#include -#include -#include -#elif UNIX -#include -#include -#include -#include -#include -#endif - -#include #include #include #include @@ -68,6 +55,13 @@ Response Response::parse(std::istream& in) return response; } +Response read(Socket & socket) +{ + std::string response = SocketReader::read(socket); + std::istringstream responseStream(response); + return Response::parse(responseStream); +} + Response get(const URI& uri) { Socket socket; @@ -92,27 +86,7 @@ Response get(const URI& uri) throw std::system_error(errno, std::system_category(), oss.str()); } - constexpr auto kBufferSize = 256; - std::array buffer; -#ifdef WIN32 - auto numRead = ::recv(socket.handle(), &buffer[0], buffer.size(), 0); -#else - auto numRead = ::read(socket.handle(), &buffer[0], buffer.size()); -#endif - std::string response; - while (numRead > 0) { - response.append(&buffer[0], numRead); - if (numRead < static_cast(buffer.size())) { - break; - } -#ifdef WIN32 - numRead = ::recv(socket.handle(), &buffer[0], buffer.size(), 0); -#else - numRead = ::read(socket.handle(), &buffer[0], buffer.size()); -#endif - } - std::istringstream responseStream(response); - return Response::parse(responseStream); + return read(socket); } } // namespace http diff --git a/src/jaegertracing/net/http/Response.h b/src/jaegertracing/net/http/Response.h index c9359059..59a0fe9b 100644 --- a/src/jaegertracing/net/http/Response.h +++ b/src/jaegertracing/net/http/Response.h @@ -18,6 +18,7 @@ #define JAEGERTRACING_NET_HTTP_RESPONSE_H #include "jaegertracing/net/URI.h" +#include "jaegertracing/net/Socket.h" #include "jaegertracing/net/http/Error.h" #include "jaegertracing/net/http/Header.h" #include "jaegertracing/net/http/Method.h" @@ -57,6 +58,11 @@ class Response { Response get(const URI& uri); +/** + * Reads http response from a socket + */ +Response read(Socket& socket); + } // namespace http } // namespace net } // namespace jaegertracing diff --git a/src/jaegertracing/net/http/SocketReader.h b/src/jaegertracing/net/http/SocketReader.h new file mode 100644 index 00000000..cbaaf21c --- /dev/null +++ b/src/jaegertracing/net/http/SocketReader.h @@ -0,0 +1,48 @@ +/* + * Copyright (c) 2018, The Jaeger Authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef JAEGERTRACING_NET_HTTP_SOCKET_READER_H +#define JAEGERTRACING_NET_HTTP_SOCKET_READER_H + +#include "jaegertracing/net/Socket.h" + +namespace jaegertracing { +namespace net { +namespace http { + +class SocketReader { + public: + static std::string read(Socket& socket) { + constexpr auto kBufferSize = 1024; + std::array buffer{}; + auto numRead = ::recv(socket.handle(), &buffer[0], buffer.size(), 0); + std::string response; + while (numRead > 0) { + response.append(&buffer[0], numRead); + if (numRead < static_cast(buffer.size())) { + break; + } + numRead = ::recv(socket.handle(), &buffer[0], buffer.size(), 0); + } + return response; + } +}; + +} // namespace http +} // namespace net +} // namespace jaegertracing + +#endif // JAEGERTRACING_NET_HTTP_SOCKET_READER_H diff --git a/src/jaegertracing/reporters/Config.cpp b/src/jaegertracing/reporters/Config.cpp index e8a00c3f..e25090f6 100644 --- a/src/jaegertracing/reporters/Config.cpp +++ b/src/jaegertracing/reporters/Config.cpp @@ -15,7 +15,7 @@ */ #include "jaegertracing/reporters/Config.h" -#include "jaegertracing/UDPTransport.h" +#include "jaegertracing/ThriftTransport.h" #include "jaegertracing/reporters/CompositeReporter.h" #include "jaegertracing/reporters/LoggingReporter.h" #include "jaegertracing/reporters/RemoteReporter.h" @@ -25,13 +25,17 @@ namespace reporters { constexpr int Config::kDefaultQueueSize; constexpr const char* Config::kDefaultLocalAgentHostPort; +constexpr const char* Config::kDefaultEndpoint; std::unique_ptr Config::makeReporter(const std::string& serviceName, logging::Logger& logger, metrics::Metrics& metrics) const { - std::unique_ptr sender( - new UDPTransport(net::IPAddress::v4(_localAgentHostPort), 0)); + + std::unique_ptr sender( + !_endpoint.empty() + ? new ThriftTransport(net::URI::parse(_endpoint), 0) + : new ThriftTransport(net::IPAddress::v4(_localAgentHostPort), 0)); std::unique_ptr remoteReporter(new RemoteReporter( _bufferFlushInterval, _queueSize, std::move(sender), logger, metrics)); if (_logSpans) { diff --git a/src/jaegertracing/reporters/Config.h b/src/jaegertracing/reporters/Config.h index 3c67ee0f..0af6cafd 100644 --- a/src/jaegertracing/reporters/Config.h +++ b/src/jaegertracing/reporters/Config.h @@ -35,6 +35,7 @@ class Config { static constexpr auto kDefaultQueueSize = 100; static constexpr auto kDefaultLocalAgentHostPort = "127.0.0.1:6831"; + static constexpr auto kDefaultEndpoint = ""; static Clock::duration defaultBufferFlushInterval() { @@ -58,8 +59,10 @@ class Config { utils::yaml::findOrDefault(configYAML, "logSpans", false); const auto localAgentHostPort = utils::yaml::findOrDefault( configYAML, "localAgentHostPort", ""); + const auto endpoint = utils::yaml::findOrDefault( + configYAML, "endpoint", ""); return Config( - queueSize, bufferFlushInterval, logSpans, localAgentHostPort); + queueSize, bufferFlushInterval, logSpans, localAgentHostPort, endpoint); } #endif // JAEGERTRACING_WITH_YAML_CPP @@ -69,7 +72,7 @@ class Config { const Clock::duration& bufferFlushInterval = defaultBufferFlushInterval(), bool logSpans = false, - const std::string& localAgentHostPort = kDefaultLocalAgentHostPort) + const std::string& localAgentHostPort = kDefaultLocalAgentHostPort, const std::string& endpoint = kDefaultEndpoint) : _queueSize(queueSize > 0 ? queueSize : kDefaultQueueSize) , _bufferFlushInterval(bufferFlushInterval.count() > 0 ? bufferFlushInterval @@ -78,6 +81,7 @@ class Config { , _localAgentHostPort(localAgentHostPort.empty() ? kDefaultLocalAgentHostPort : localAgentHostPort) + , _endpoint(endpoint) { } @@ -99,11 +103,17 @@ class Config { return _localAgentHostPort; } + const std::string& endpoint() const + { + return _endpoint; + } + private: int _queueSize; Clock::duration _bufferFlushInterval; bool _logSpans; std::string _localAgentHostPort; + std::string _endpoint; }; } // namespace reporters diff --git a/src/jaegertracing/reporters/ConfigTest.cpp b/src/jaegertracing/reporters/ConfigTest.cpp new file mode 100644 index 00000000..76317791 --- /dev/null +++ b/src/jaegertracing/reporters/ConfigTest.cpp @@ -0,0 +1,52 @@ +/* + * Copyright (c) 2019, The Jaeger Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include + +#include + +#include + +#include "jaegertracing/reporters/Config.h" + +namespace jaegertracing { +namespace reporters { + +TEST(Config, testLoadConfig) +{ + std::string yamlConfig = + "disabled: false\n" + "reporter:\n" + " logSpans: true\n" + " bufferFlushInterval: 88\n" + " localAgentHostPort: ahost:22\n" + " endpoint: http://somehost:33/api/traces\n" + "sampler:\n" + " type: const\n" + " param: 1"; + + auto configYAML = YAML::Load(yamlConfig); + auto reporterYAML = configYAML["reporter"]; + auto config = jaegertracing::reporters::Config::parse(reporterYAML); + + ASSERT_EQ(true, config.logSpans()); + ASSERT_EQ(std::chrono::seconds(88), config.bufferFlushInterval()); + ASSERT_EQ(std::string("ahost:22"), config.localAgentHostPort()); + ASSERT_EQ(std::string("http://somehost:33/api/traces"), config.endpoint()); +} + +} // namespace reporters +} // namespace jaegertracing diff --git a/src/jaegertracing/testutils/MockAgent.cpp b/src/jaegertracing/testutils/MockAgent.cpp index c7a147e3..a3721820 100644 --- a/src/jaegertracing/testutils/MockAgent.cpp +++ b/src/jaegertracing/testutils/MockAgent.cpp @@ -29,7 +29,7 @@ #include "jaegertracing/net/http/Response.h" #include "jaegertracing/samplers/RemoteSamplingJSON.h" #include "jaegertracing/utils/ErrorUtil.h" -#include "jaegertracing/utils/UDPClient.h" +#include "jaegertracing/utils/UDPSender.h" #ifdef _MSC_VER #pragma warning(disable : 4267) @@ -111,17 +111,17 @@ void MockAgent::serveUDP(std::promise& started) agent::thrift::AgentProcessor handler(iface); TCompactProtocolFactory protocolFactory; std::shared_ptr trans( - new TMemoryBuffer(net::kUDPPacketMaxLength)); + new TMemoryBuffer(utils::UDPSender::kUDPPacketMaxLength)); // Notify main thread that setup is done. _servingUDP = true; started.set_value(); - std::array buffer; + std::array buffer; while (isServingUDP()) { try { const auto numRead = - _transport.read(&buffer[0], net::kUDPPacketMaxLength); + _transport.read(&buffer[0], utils::UDPSender::kUDPPacketMaxLength); if (numRead > 0) { trans->write(&buffer[0], numRead); auto protocol = protocolFactory.getProtocol(trans); diff --git a/src/jaegertracing/testutils/MockAgent.h b/src/jaegertracing/testutils/MockAgent.h index 10c40520..b76d303a 100644 --- a/src/jaegertracing/testutils/MockAgent.h +++ b/src/jaegertracing/testutils/MockAgent.h @@ -25,7 +25,7 @@ #include "jaegertracing/testutils/TUDPTransport.h" #include "jaegertracing/thrift-gen/Agent.h" #include "jaegertracing/thrift-gen/jaeger_types.h" -#include "jaegertracing/utils/UDPClient.h" +#include "jaegertracing/utils/UDPSender.h" #include #include #include @@ -104,10 +104,10 @@ class MockAgent : public agent::thrift::AgentIf, net::IPAddress spanServerAddress() const { return _transport.addr(); } - std::unique_ptr spanServerClient() + std::unique_ptr spanServerClient() { - return std::unique_ptr( - new utils::UDPClient(spanServerAddress(), 0)); + return std::unique_ptr( + new utils::UDPSender(spanServerAddress(), 0)); } net::IPAddress samplingServerAddress() const { return _httpAddress; } diff --git a/src/jaegertracing/testutils/TUDPTransport.h b/src/jaegertracing/testutils/TUDPTransport.h index 91816354..fe543006 100644 --- a/src/jaegertracing/testutils/TUDPTransport.h +++ b/src/jaegertracing/testutils/TUDPTransport.h @@ -27,7 +27,7 @@ #include -#include "jaegertracing/utils/UDPClient.h" +#include "jaegertracing/utils/UDPSender.h" namespace jaegertracing { namespace testutils { diff --git a/src/jaegertracing/testutils/TracerUtil.cpp b/src/jaegertracing/testutils/TracerUtil.cpp index 3f5031f8..ffa65c1f 100644 --- a/src/jaegertracing/testutils/TracerUtil.cpp +++ b/src/jaegertracing/testutils/TracerUtil.cpp @@ -1,62 +1,82 @@ -/* - * Copyright (c) 2017 Uber Technologies, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "jaegertracing/testutils/TracerUtil.h" -#include "jaegertracing/Config.h" -#include "jaegertracing/Logging.h" -#include "jaegertracing/Tracer.h" -#include "jaegertracing/baggage/RestrictionsConfig.h" -#include "jaegertracing/net/IPAddress.h" -#include "jaegertracing/propagation/HeadersConfig.h" -#include "jaegertracing/reporters/Config.h" -#include "jaegertracing/samplers/Config.h" -#include -#include -#include - -namespace jaegertracing { -namespace testutils { -namespace TracerUtil { - -std::shared_ptr installGlobalTracer() -{ - std::unique_ptr handle(new ResourceHandle()); - handle->_mockAgent->start(); - std::ostringstream samplingServerURLStream; - samplingServerURLStream - << "http://" << handle->_mockAgent->samplingServerAddress().authority(); - Config config( - false, - samplers::Config("const", - 1, - samplingServerURLStream.str(), - 0, - samplers::Config::Clock::duration()), - reporters::Config(0, - reporters::Config::Clock::duration(), - false, - handle->_mockAgent->spanServerAddress().authority()), - propagation::HeadersConfig(), - baggage::RestrictionsConfig()); - - auto tracer = Tracer::make("test-service", config, logging::nullLogger()); - opentracing::Tracer::InitGlobal(tracer); - return std::move(handle); -} - -} // namespace TracerUtil -} // namespace testutils -} // namespace jaegertracing +/* + * Copyright (c) 2017 Uber Technologies, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "jaegertracing/testutils/TracerUtil.h" +#include "jaegertracing/Config.h" +#include "jaegertracing/Logging.h" +#include "jaegertracing/Tracer.h" +#include "jaegertracing/baggage/RestrictionsConfig.h" +#include "jaegertracing/net/IPAddress.h" +#include "jaegertracing/propagation/HeadersConfig.h" +#include "jaegertracing/reporters/Config.h" +#include "jaegertracing/samplers/Config.h" +#include +#include +#include + +namespace jaegertracing { +namespace testutils { +namespace TracerUtil { + +std::shared_ptr installGlobalTracer() +{ + std::unique_ptr handle(new ResourceHandle()); + handle->_mockAgent->start(); + std::ostringstream samplingServerURLStream; + samplingServerURLStream + << "http://" << handle->_mockAgent->samplingServerAddress().authority(); + Config config( + false, + samplers::Config("const", + 1, + samplingServerURLStream.str(), + 0, + samplers::Config::Clock::duration()), + reporters::Config(0, + reporters::Config::Clock::duration(), + false, + handle->_mockAgent->spanServerAddress().authority()), + propagation::HeadersConfig(), + baggage::RestrictionsConfig()); + + auto tracer = Tracer::make("test-service", config, logging::nullLogger()); + opentracing::Tracer::InitGlobal(tracer); + return std::move(handle); +} + +std::shared_ptr buildTracer(const std::string& endpoint) +{ + std::ostringstream samplingServerURLStream; + Config config( + false, + samplers::Config("const", + 1, + samplingServerURLStream.str(), + 0, + samplers::Config::Clock::duration()), + reporters::Config(0, + std::chrono::milliseconds(100), + false, "", endpoint), + propagation::HeadersConfig(), + baggage::RestrictionsConfig()); + + auto tracer = Tracer::make("test-service", config, logging::nullLogger()); + return tracer; +} + +} // namespace TracerUtil +} // namespace testutils +} // namespace jaegertracing diff --git a/src/jaegertracing/testutils/TracerUtil.h b/src/jaegertracing/testutils/TracerUtil.h index b755d5b1..a61e5700 100644 --- a/src/jaegertracing/testutils/TracerUtil.h +++ b/src/jaegertracing/testutils/TracerUtil.h @@ -1,47 +1,50 @@ -/* - * Copyright (c) 2017 Uber Technologies, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef JAEGERTRACING_TESTUTILS_TRACERUTIL_H -#define JAEGERTRACING_TESTUTILS_TRACERUTIL_H - -#include "jaegertracing/Tracer.h" -#include "jaegertracing/testutils/MockAgent.h" - -namespace jaegertracing { -namespace testutils { -namespace TracerUtil { - -struct ResourceHandle { - ResourceHandle() - : _mockAgent(testutils::MockAgent::make()) - { - } - - ~ResourceHandle() - { - opentracing::Tracer::InitGlobal(opentracing::MakeNoopTracer()); - } - - std::shared_ptr _mockAgent; -}; - -std::shared_ptr installGlobalTracer(); - -} // namespace TracerUtil -} // namespace testutils -} // namespace jaegertracing - -#endif // JAEGERTRACING_TESTUTILS_TRACERUTIL_H +/* + * Copyright (c) 2017 Uber Technologies, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef JAEGERTRACING_TESTUTILS_TRACERUTIL_H +#define JAEGERTRACING_TESTUTILS_TRACERUTIL_H + +#include + +#include "jaegertracing/Tracer.h" +#include "jaegertracing/testutils/MockAgent.h" + +namespace jaegertracing { +namespace testutils { +namespace TracerUtil { + +struct ResourceHandle { + ResourceHandle() + : _mockAgent(testutils::MockAgent::make()) + { + } + + ~ResourceHandle() + { + opentracing::Tracer::InitGlobal(opentracing::MakeNoopTracer()); + } + + std::shared_ptr _mockAgent; +}; + +std::shared_ptr installGlobalTracer(); +std::shared_ptr buildTracer(const std::string& endpoint); + +} // namespace TracerUtil +} // namespace testutils +} // namespace jaegertracing + +#endif // JAEGERTRACING_TESTUTILS_TRACERUTIL_H diff --git a/src/jaegertracing/utils/HttpSender.cpp b/src/jaegertracing/utils/HttpSender.cpp new file mode 100644 index 00000000..c7676db9 --- /dev/null +++ b/src/jaegertracing/utils/HttpSender.cpp @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2019, The Jaeger Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "jaegertracing/utils/HttpSender.h" +#include +#include + +namespace jaegertracing { +namespace utils { + +HttpSender::HttpSender(const net::URI& endpoint, int maxPacketSize) + : Sender(maxPacketSize == 0 ? kHttpPacketMaxLength : maxPacketSize) + , _buffer(new apache::thrift::transport::TMemoryBuffer(_maxPacketSize)) + , _serverAddr(net::IPAddress::v4(endpoint._host, endpoint._port)) + , _httpClient(new ::apache::thrift::transport::THttpClient( + _buffer, endpoint._host, endpoint._path + "?format=jaeger.thrift")) +{ + using TProtocolFactory = apache::thrift::protocol::TProtocolFactory; + using TBinaryProtocolFactory = + apache::thrift::protocol::TBinaryProtocolFactory; + + _socket.open(AF_INET, SOCK_STREAM); + _socket.connect(_serverAddr); + std::shared_ptr protocolFactory( + new TBinaryProtocolFactory()); + _protocol = protocolFactory->getProtocol(_httpClient); +} + +} // namespace utils +} // namespace jaegertracing diff --git a/src/jaegertracing/utils/HttpSender.h b/src/jaegertracing/utils/HttpSender.h new file mode 100644 index 00000000..086cd204 --- /dev/null +++ b/src/jaegertracing/utils/HttpSender.h @@ -0,0 +1,108 @@ +/* + * Copyright (c) 2019, The Jaeger Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef JAEGERTRACING_UTILS_UDPCLIENT5_H +#define JAEGERTRACING_UTILS_UDPCLIENT5_H + +#include +#include +#include +#include + +#include "jaegertracing/Compilers.h" + +#include "jaegertracing/utils/Sender.h" + +#include "jaegertracing/net/IPAddress.h" +#include "jaegertracing/net/Socket.h" +#include "jaegertracing/net/http/Response.h" + +#include +#include +#include + +namespace jaegertracing { +namespace utils { + +class HttpSender : public Sender { + public: + HttpSender(const net::URI& endpoint, int maxPacketSize); + + ~HttpSender() { close(); } + + void emitBatch(const thrift::Batch& batch) override + { + // Resets the buffer to write a new batch + _buffer->resetBuffer(); + + // Does the serialisation to Thrift + auto oprot = _protocol.get(); + batch.write(oprot); + oprot->writeMessageEnd(); + oprot->getTransport()->writeEnd(); + oprot->getTransport()->flush(); + + uint8_t* data = nullptr; + uint32_t size = 0; + _buffer->getBuffer(&data, &size); + if (static_cast(size) > _maxPacketSize) { + std::ostringstream oss; + oss << "Data does not fit within one HTTP message" + ", size " + << size << ", max " << _maxPacketSize << ", spans " + << batch.spans.size(); + throw std::logic_error(oss.str()); + } + + // Sends the HTTP message + const auto numWritten = ::send(_socket.handle(), reinterpret_cast(data), sizeof(uint8_t) * size, 0); + + if (static_cast(numWritten) != size) { + std::ostringstream oss; + oss << "Failed to write message, numWritten=" << numWritten << ", size=" << size; + throw std::system_error(errno, std::system_category(), oss.str()); + } + + // Waits for response. Check that the server acknowledged + // and returned a green status [200, 201, 202, 203, 204] + net::http::Response response = net::http::read(_socket); + if (response.statusCode() < 200 && response.statusCode() > 204) { + std::ostringstream oss; + oss << "Failed to write message, HTTP error " << response.statusCode() << response.reason(); + throw std::system_error(errno, std::system_category(), oss.str()); + } + } + + std::unique_ptr + protocolFactory() const override + { + return std::unique_ptr( + new apache::thrift::protocol::TBinaryProtocolFactory()); + } + + private: + std::shared_ptr _buffer; + net::IPAddress _serverAddr; + std::shared_ptr<::apache::thrift::transport::THttpClient> _httpClient; + std::shared_ptr _protocol; + + static constexpr auto kHttpPacketMaxLength = 1048576; +}; + +} // namespace utils +} // namespace jaegertracing + +#endif // JAEGERTRACING_UTILS_UDPCLIENT_H diff --git a/src/jaegertracing/utils/HttpSenderTest.cpp b/src/jaegertracing/utils/HttpSenderTest.cpp new file mode 100644 index 00000000..b1fcae63 --- /dev/null +++ b/src/jaegertracing/utils/HttpSenderTest.cpp @@ -0,0 +1,114 @@ +/* + * Copyright (c) 2017 Uber Technologies, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "jaegertracing/net/IPAddress.h" +#include "jaegertracing/testutils/TracerUtil.h" +#include +#include +#include +#include +#include +#include +#include +#include + +#include "jaegertracing/net/Socket.h" +#include "jaegertracing/net/http/Request.h" +#include "jaegertracing/net/http/Response.h" +#include +#include + +namespace jaegertracing { + +namespace utils { + +TEST(HttpSender, testBigMessage) +{ + net::IPAddress serverAddr; + std::promise started; + + std::string target; + net::http::Method method; + std::string contentType; + std::string acceptType; + + std::thread serverThread( + [&serverAddr, &started, &target, &method, &contentType, &acceptType]() { + net::Socket socket; + socket.open(AF_INET, SOCK_STREAM); + socket.bind(net::IPAddress::v4("127.0.0.1", 0)); + ::sockaddr_storage addrStorage; + ::socklen_t addrLen = sizeof(addrStorage); + const auto returnCode = + ::getsockname(socket.handle(), + reinterpret_cast<::sockaddr*>(&addrStorage), + &addrLen); + ASSERT_EQ(0, returnCode); + serverAddr = net::IPAddress(addrStorage, addrLen); + + // Listening to the port + socket.listen(); + + // Unblocking the client + started.set_value(); + + // Waiting for the client to connect + auto clientSocket = socket.accept(); + + net::http::Request request = net::http::Request::read(clientSocket); + + target = request.target(); + method = request.method(); + + for (auto tata : request.headers()) { + if (tata.key() == "Content-Type") { + contentType = tata.value(); + } + + if (tata.key() == "Accept") { + acceptType = tata.value(); + } + } + + std::string answer( + "HTTP/1.1 202 Accepted\r\nDate: Tue, 10 Sep 2019 09:03:26 " + "GMT\r\nContent-Length: 0\r\n\r\n"); + + const auto numWritten = + ::send(clientSocket.handle(), answer.c_str(), answer.size(), 0); + }); + + started.get_future().wait(); + + std::ostringstream oss; + oss << "http://127.0.0.1:" << serverAddr.port() << "/api/traces"; + std::shared_ptr tracer = + ::jaegertracing::testutils::TracerUtil::buildTracer(oss.str()); + + { + auto span1 = tracer->StartSpan("tracedFunction"); + } + + serverThread.join(); + + ASSERT_EQ(std::string("/api/traces?format=jaeger.thrift"), target); + ASSERT_EQ(net::http::Method::POST, method); + ASSERT_EQ(std::string("application/x-thrift"), contentType); + ASSERT_EQ(std::string("application/x-thrift"), acceptType); +} + +} // namespace utils +} // namespace jaegertracing diff --git a/src/jaegertracing/utils/Sender.h b/src/jaegertracing/utils/Sender.h new file mode 100644 index 00000000..90337be8 --- /dev/null +++ b/src/jaegertracing/utils/Sender.h @@ -0,0 +1,51 @@ +/* + * Copyright (c) 2019, The Jaeger Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef JAEGERTRACING_UTILS_SENDER_H +#define JAEGERTRACING_UTILS_SENDER_H + +#include "jaegertracing/net/Socket.h" +#include "jaegertracing/thrift-gen/jaeger_types.h" + +namespace jaegertracing { +namespace utils { + +class Sender { + public: + Sender(int maxPacketSize) + : _maxPacketSize(maxPacketSize) + { + } + + virtual ~Sender() { close(); } + + virtual void emitBatch(const thrift::Batch& batch) = 0; + + int maxPacketSize() const { return _maxPacketSize; } + + void close() { _socket.close(); } + + virtual std::unique_ptr< apache::thrift::protocol::TProtocolFactory > protocolFactory() const = 0; + + protected: + int _maxPacketSize; + net::Socket _socket; +}; + +} // namespace utils +} // namespace jaegertracing + +#endif // JAEGERTRACING_UTILS_SENDER_H diff --git a/src/jaegertracing/utils/UDPClient.cpp b/src/jaegertracing/utils/UDPSender.cpp similarity index 88% rename from src/jaegertracing/utils/UDPClient.cpp rename to src/jaegertracing/utils/UDPSender.cpp index 45021345..479edd09 100644 --- a/src/jaegertracing/utils/UDPClient.cpp +++ b/src/jaegertracing/utils/UDPSender.cpp @@ -14,18 +14,17 @@ * limitations under the License. */ -#include "jaegertracing/utils/UDPClient.h" +#include "jaegertracing/utils/UDPSender.h" #include #include namespace jaegertracing { namespace utils { -UDPClient::UDPClient(const net::IPAddress& serverAddr, int maxPacketSize) - : _maxPacketSize(maxPacketSize == 0 ? net::kUDPPacketMaxLength +UDPSender::UDPSender(const net::IPAddress& serverAddr, int maxPacketSize) + : Sender(maxPacketSize == 0 ? kUDPPacketMaxLength : maxPacketSize) , _buffer(new apache::thrift::transport::TMemoryBuffer(_maxPacketSize)) - , _socket() , _serverAddr(serverAddr) , _client() { diff --git a/src/jaegertracing/utils/UDPClient.h b/src/jaegertracing/utils/UDPSender.h similarity index 85% rename from src/jaegertracing/utils/UDPClient.h rename to src/jaegertracing/utils/UDPSender.h index 1ab51855..dba5fd7a 100644 --- a/src/jaegertracing/utils/UDPClient.h +++ b/src/jaegertracing/utils/UDPSender.h @@ -27,21 +27,22 @@ #include #include +#include "jaegertracing/utils/Sender.h" + #include "jaegertracing/net/IPAddress.h" -#include "jaegertracing/net/Socket.h" #include "jaegertracing/thrift-gen/Agent.h" namespace jaegertracing { namespace utils { -class UDPClient : public agent::thrift::AgentIf { +class UDPSender : public Sender { public: - UDPClient(const net::IPAddress& serverAddr, int maxPacketSize); + static constexpr auto kUDPPacketMaxLength = 65000; - ~UDPClient() { close(); } + UDPSender(const net::IPAddress& serverAddr, int maxPacketSize); void emitZipkinBatch( - const std::vector& spans) override + const std::vector& spans) { throw std::logic_error("emitZipkinBatch not implemented"); } @@ -71,14 +72,12 @@ class UDPClient : public agent::thrift::AgentIf { } } - int maxPacketSize() const { return _maxPacketSize; } - - void close() { _socket.close(); } + std::unique_ptr< apache::thrift::protocol::TProtocolFactory > protocolFactory() const override { + return std::unique_ptr(new apache::thrift::protocol::TCompactProtocolFactory()); + } private: - int _maxPacketSize; std::shared_ptr _buffer; - net::Socket _socket; net::IPAddress _serverAddr; std::unique_ptr _client; }; diff --git a/src/jaegertracing/utils/UDPClientTest.cpp b/src/jaegertracing/utils/UDPSenderTest.cpp similarity index 93% rename from src/jaegertracing/utils/UDPClientTest.cpp rename to src/jaegertracing/utils/UDPSenderTest.cpp index 6cdfb5e3..fc927967 100644 --- a/src/jaegertracing/utils/UDPClientTest.cpp +++ b/src/jaegertracing/utils/UDPSenderTest.cpp @@ -18,7 +18,7 @@ #include "jaegertracing/net/Socket.h" #include "jaegertracing/thrift-gen/jaeger_types.h" #include "jaegertracing/thrift-gen/zipkincore_types.h" -#include "jaegertracing/utils/UDPClient.h" +#include "jaegertracing/utils/UDPSender.h" #include #include #include @@ -28,7 +28,7 @@ namespace jaegertracing { namespace utils { -TEST(UDPClient, testZipkinMessage) +TEST(UDPSender, testZipkinMessage) { net::IPAddress serverAddr; std::promise started; @@ -48,13 +48,13 @@ TEST(UDPClient, testZipkinMessage) }); started.get_future().wait(); - UDPClient udpClient(serverAddr, 0); + UDPSender udpClient(serverAddr, 0); using ZipkinBatch = std::vector; ASSERT_THROW(udpClient.emitZipkinBatch(ZipkinBatch()), std::logic_error); serverThread.join(); } -TEST(UDPClient, testBigMessage) +TEST(UDPSender, testBigMessage) { net::IPAddress serverAddr; std::promise started; @@ -74,7 +74,7 @@ TEST(UDPClient, testBigMessage) }); started.get_future().wait(); - UDPClient udpClient(serverAddr, 1); + UDPSender udpClient(serverAddr, 1); ASSERT_THROW(udpClient.emitBatch(thrift::Batch()), std::logic_error); serverThread.join(); } From bfc01a04bfe9071a317c540d44debfaad86fc54f Mon Sep 17 00:00:00 2001 From: "FR-MUREX-COM\\mchaikhadouaihy" Date: Sun, 15 Sep 2019 23:20:46 +0200 Subject: [PATCH 2/3] * Rename Http/UDP senders to Http/UDP Transporters * Rename ThriftTransporter to ThriftSender * Add Integration Test for http Signed-off-by: FR-MUREX-COM\mchaikhadouaihy --- CMakeLists.txt | 10 ++--- README.md | 5 +-- crossdock/Server.cpp | 27 +++++++++--- crossdock/Server.h | 1 + crossdock/docker-compose.yml | 28 +++++++++---- src/jaegertracing/{Transport.h => Sender.h} | 10 ++--- .../{ThriftTransport.cpp => ThriftSender.cpp} | 42 +++++++------------ .../{ThriftTransport.h => ThriftSender.h} | 27 ++++++------ ...TransportTest.cpp => ThriftSenderTest.cpp} | 29 ++++++------- src/jaegertracing/Transport.cpp | 2 +- src/jaegertracing/reporters/Config.cpp | 15 ++++--- src/jaegertracing/reporters/Config.h | 3 ++ .../reporters/RemoteReporter.cpp | 6 +-- src/jaegertracing/reporters/RemoteReporter.h | 6 +-- src/jaegertracing/reporters/ReporterTest.cpp | 6 +-- src/jaegertracing/testutils/MockAgent.cpp | 8 ++-- src/jaegertracing/testutils/MockAgent.h | 8 ++-- src/jaegertracing/testutils/TUDPTransport.h | 2 +- src/jaegertracing/utils/ErrorUtil.h | 4 +- src/jaegertracing/utils/ErrorUtilTest.cpp | 4 +- .../{HttpSender.cpp => HttpTransporter.cpp} | 6 +-- .../utils/{HttpSender.h => HttpTransporter.h} | 18 +++----- ...SenderTest.cpp => HttpTransporterTest.cpp} | 15 ++++--- .../utils/{Sender.h => Transport.h} | 9 ++-- src/jaegertracing/utils/UDPSenderTest.cpp | 6 +-- .../{UDPSender.cpp => UDPTransporter.cpp} | 8 ++-- .../utils/{UDPSender.h => UDPTransporter.h} | 8 ++-- 27 files changed, 165 insertions(+), 148 deletions(-) rename src/jaegertracing/{Transport.h => Sender.h} (88%) rename src/jaegertracing/{ThriftTransport.cpp => ThriftSender.cpp} (77%) rename src/jaegertracing/{ThriftTransport.h => ThriftSender.h} (63%) rename src/jaegertracing/{ThriftTransportTest.cpp => ThriftSenderTest.cpp} (76%) rename src/jaegertracing/utils/{HttpSender.cpp => HttpTransporter.cpp} (85%) rename src/jaegertracing/utils/{HttpSender.h => HttpTransporter.h} (82%) rename src/jaegertracing/utils/{HttpSenderTest.cpp => HttpTransporterTest.cpp} (86%) rename src/jaegertracing/utils/{Sender.h => Transport.h} (82%) rename src/jaegertracing/utils/{UDPSender.cpp => UDPTransporter.cpp} (85%) rename src/jaegertracing/utils/{UDPSender.h => UDPTransporter.h} (92%) diff --git a/CMakeLists.txt b/CMakeLists.txt index 7dd42d66..b385e914 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -135,7 +135,7 @@ set(SRC src/jaegertracing/Tracer.cpp src/jaegertracing/TracerFactory.cpp src/jaegertracing/Transport.cpp - src/jaegertracing/ThriftTransport.cpp + src/jaegertracing/ThriftSender.cpp src/jaegertracing/baggage/BaggageSetter.cpp src/jaegertracing/baggage/RemoteRestrictionJSON.cpp src/jaegertracing/baggage/RemoteRestrictionManager.cpp @@ -211,8 +211,8 @@ set(SRC src/jaegertracing/utils/ErrorUtil.cpp src/jaegertracing/utils/HexParsing.cpp src/jaegertracing/utils/RateLimiter.cpp - src/jaegertracing/utils/UDPSender.cpp - src/jaegertracing/utils/HttpSender.cpp + src/jaegertracing/utils/UDPTransporter.cpp + src/jaegertracing/utils/HttpTransporter.cpp src/jaegertracing/utils/YAML.cpp src/jaegertracing/ThriftMethods.cpp) @@ -319,7 +319,7 @@ if(BUILD_TESTING) src/jaegertracing/TraceIDTest.cpp src/jaegertracing/TracerFactoryTest.cpp src/jaegertracing/TracerTest.cpp - src/jaegertracing/ThriftTransportTest.cpp + src/jaegertracing/ThriftSenderTest.cpp src/jaegertracing/baggage/BaggageTest.cpp src/jaegertracing/metrics/MetricsTest.cpp src/jaegertracing/metrics/NullStatsFactoryTest.cpp @@ -338,7 +338,7 @@ if(BUILD_TESTING) src/jaegertracing/utils/ErrorUtilTest.cpp src/jaegertracing/utils/RateLimiterTest.cpp src/jaegertracing/utils/UDPSenderTest.cpp - src/jaegertracing/utils/HttpSenderTest.cpp) + src/jaegertracing/utils/HttpTransporterTest.cpp) target_link_libraries( UnitTest PRIVATE testutils GTest::main ${JAEGERTRACING_LIB}) add_test(NAME UnitTest COMMAND UnitTest) diff --git a/README.md b/README.md index 378cf91c..9421949b 100644 --- a/README.md +++ b/README.md @@ -72,11 +72,10 @@ In case the client should connect directly to the collector instead of going thr ```yml repoter: - endpoint: http://collectorhost:collectorport/api/traces + endpoint: http://${collectorhost}:${collectorport}/api/traces ``` -where collectorhost and collectorport are placeholders respectively for your Collector host and port. -Note that if both localAgentHostPort and endpoint are specified, the endpoint will be used. +Note that if both `localAgentHostPort` and `endpoint` are specified, the `endpoint` will be used. ### Updating Sampling Server URL diff --git a/crossdock/Server.cpp b/crossdock/Server.cpp index cc6836e5..5ba85b74 100644 --- a/crossdock/Server.cpp +++ b/crossdock/Server.cpp @@ -483,8 +483,10 @@ class Server::EndToEndHandler { using TracerPtr = std::shared_ptr; EndToEndHandler(const std::string& agentHostPort, + const std::string& collectorEndpoint, const std::string& samplingServerURL) : _agentHostPort(agentHostPort) + , _collectorEndpoint(collectorEndpoint) , _samplingServerURL(samplingServerURL) { } @@ -515,7 +517,8 @@ class Server::EndToEndHandler { reporters::Config(reporters::Config::kDefaultQueueSize, std::chrono::seconds(1), false, - _agentHostPort)); + _agentHostPort, + _collectorEndpoint)); } TracerPtr init(const std::string& samplerType) @@ -527,6 +530,7 @@ class Server::EndToEndHandler { } std::string _agentHostPort; + std::string _collectorEndpoint; std::string _samplingServerURL; std::unordered_map _tracers; std::mutex _mutex; @@ -535,6 +539,7 @@ class Server::EndToEndHandler { Server::Server(const net::IPAddress& clientIP, const net::IPAddress& serverIP, const std::string& agentHostPort, + const std::string& collectorEndpoint, const std::string& samplingServerURL) : _logger(logging::consoleLogger()) , _tracer(Tracer::make(kDefaultTracerServiceName, Config(), _logger)) @@ -550,7 +555,7 @@ Server::Server(const net::IPAddress& clientIP, [this](const net::http::Request& request) { return handleRequest(request); })) - , _handler(new EndToEndHandler(agentHostPort, samplingServerURL)) + , _handler(new EndToEndHandler(agentHostPort, collectorEndpoint, samplingServerURL)) { } @@ -764,13 +769,24 @@ std::string Server::generateTraces(const net::http::Request& requestHTTP) int main() { + const auto rawSenderType = std::getenv("SENDER"); + const std::string senderType(rawSenderType ? rawSenderType : ""); + + if (senderType.empty()) { + std::cerr << "env SENDER is not specified!\n"; + return 1; + } + const auto rawAgentHostPort = std::getenv("AGENT_HOST_PORT"); const std::string agentHostPort(rawAgentHostPort ? rawAgentHostPort : ""); - if (agentHostPort.empty()) { - std::cerr << "env AGENT_HOST_PORT is not specified!\n"; - return 1; + + if (agentHostPort.empty() && senderType == "udp") { + std::cerr << "env AGENT_HOST_PORT is not specified!\n"; + return 1; } + const std::string collectorEndpoint(senderType == "http" ? "http://jaeger-collector:14268/api/traces" : ""); + const auto rawSamplingServerURL = std::getenv("SAMPLING_SERVER_URL"); const std::string samplingServerURL( rawSamplingServerURL ? rawSamplingServerURL : ""); @@ -783,6 +799,7 @@ int main() jaegertracing::net::IPAddress::v4("0.0.0.0:8080"), jaegertracing::net::IPAddress::v4("0.0.0.0:8081"), agentHostPort, + collectorEndpoint, samplingServerURL); server.serve(); diff --git a/crossdock/Server.h b/crossdock/Server.h index f88b8ae6..e02d3229 100644 --- a/crossdock/Server.h +++ b/crossdock/Server.h @@ -48,6 +48,7 @@ class Server { Server(const net::IPAddress& clientIP, const net::IPAddress& serverIP, const std::string& agentHostPort, + const std::string& collectorEndpoint, const std::string& samplingServerURL); ~Server(); diff --git a/crossdock/docker-compose.yml b/crossdock/docker-compose.yml index 2bf62506..550f0799 100644 --- a/crossdock/docker-compose.yml +++ b/crossdock/docker-compose.yml @@ -6,25 +6,26 @@ services: links: - test_driver - go - - cpp + - cpp-udp + - cpp-http environment: - - WAIT_FOR=test_driver,go,cpp + - WAIT_FOR=test_driver,go,cpp-udp,cpp-http - WAIT_FOR_TIMEOUT=60s - CALL_TIMEOUT=60s - AXIS_CLIENT=go - - AXIS_S1NAME=go,cpp + - AXIS_S1NAME=go,cpp-udp - AXIS_SAMPLED=true,false - - AXIS_S2NAME=go,cpp + - AXIS_S2NAME=go,cpp-udp - AXIS_S2TRANSPORT=http - - AXIS_S3NAME=go,cpp + - AXIS_S3NAME=go,cpp-udp - AXIS_S3TRANSPORT=http - BEHAVIOR_TRACE=client,s1name,sampled,s2name,s2transport,s3name,s3transport - AXIS_TESTDRIVER=test_driver - - AXIS_SERVICES=cpp + - AXIS_SERVICES=cpp-udp,cpp-http - BEHAVIOR_ENDTOEND=testdriver,services @@ -35,7 +36,7 @@ services: ports: - "8080-8082" - cpp: + cpp-udp: depends_on: - test_driver build: @@ -43,6 +44,19 @@ services: dockerfile: crossdock/Dockerfile ports: - "8080-8082" + environment: + - SENDER=udp + + cpp-http: + depends_on: + - test_driver + build: + context: $PWD + dockerfile: crossdock/Dockerfile + ports: + - "8080-8082" + environment: + - SENDER=http test_driver: image: jaegertracing/test-driver diff --git a/src/jaegertracing/Transport.h b/src/jaegertracing/Sender.h similarity index 88% rename from src/jaegertracing/Transport.h rename to src/jaegertracing/Sender.h index a3ca0fef..176cfd05 100644 --- a/src/jaegertracing/Transport.h +++ b/src/jaegertracing/Sender.h @@ -14,8 +14,8 @@ * limitations under the License. */ -#ifndef JAEGERTRACING_TRANSPORT_H -#define JAEGERTRACING_TRANSPORT_H +#ifndef JAEGERTRACING_SENDER_H +#define JAEGERTRACING_SENDER_H #include #include @@ -26,7 +26,7 @@ namespace jaegertracing { class Span; -class Transport { +class Sender { public: class Exception : public std::runtime_error { public: @@ -42,7 +42,7 @@ class Transport { int _numFailed; }; - virtual ~Transport() = default; + virtual ~Sender() = default; virtual int append(const Span& span) = 0; @@ -53,4 +53,4 @@ class Transport { } // namespace jaegertracing -#endif // JAEGERTRACING_TRANSPORT_H +#endif //JAEGERTRACING_SENDER_H diff --git a/src/jaegertracing/ThriftTransport.cpp b/src/jaegertracing/ThriftSender.cpp similarity index 77% rename from src/jaegertracing/ThriftTransport.cpp rename to src/jaegertracing/ThriftSender.cpp index 1fce1b3d..5db28835 100644 --- a/src/jaegertracing/ThriftTransport.cpp +++ b/src/jaegertracing/ThriftSender.cpp @@ -14,7 +14,7 @@ * limitations under the License. */ -#include "jaegertracing/ThriftTransport.h" +#include "jaegertracing/ThriftSender.h" #include "jaegertracing/Span.h" #include "jaegertracing/Tag.h" @@ -54,28 +54,16 @@ int calcSizeOfSerializedThrift(apache::thrift::protocol::TProtocolFactory& facto } // anonymous namespace -ThriftTransport::ThriftTransport(const net::IPAddress& ip, - int maxPacketSize) - : _sender(new utils::UDPSender(ip, maxPacketSize)) +ThriftSender::ThriftSender(std::unique_ptr&& transporter) + : _transporter(std::move(transporter)) , _maxSpanBytes(0) , _byteBufferSize(0) , _processByteSize(0) - , _protocolFactory(_sender->protocolFactory()) + , _protocolFactory(_transporter->protocolFactory()) { } -ThriftTransport::ThriftTransport(const net::URI& endpoint, - int maxPacketSize) - : _sender(new utils::HttpSender(endpoint, maxPacketSize)) - , _maxSpanBytes(0) - , _byteBufferSize(0) - , _processByteSize(0) - , _protocolFactory(_sender->protocolFactory()) -{ -} - - -int ThriftTransport::append(const Span& span) +int ThriftSender::append(const Span& span) { if (_process.serviceName.empty()) { const auto& tracer = static_cast(span.tracer()); @@ -95,17 +83,17 @@ int ThriftTransport::append(const Span& span) _process.__set_tags(thriftTags); _processByteSize = - calcSizeOfSerializedThrift(*_protocolFactory, _process, _sender->maxPacketSize()); + calcSizeOfSerializedThrift(*_protocolFactory, _process, _transporter->maxPacketSize()); _maxSpanBytes = - _sender->maxPacketSize() - _processByteSize - kEmitBatchOverhead; + _transporter->maxPacketSize() - _processByteSize - kEmitBatchOverhead; } thrift::Span jaegerSpan; span.thrift(jaegerSpan); const auto spanSize = - calcSizeOfSerializedThrift(*_protocolFactory, jaegerSpan, _sender->maxPacketSize()); + calcSizeOfSerializedThrift(*_protocolFactory, jaegerSpan, _transporter->maxPacketSize()); if (spanSize > _maxSpanBytes) { std::ostringstream oss; - throw Transport::Exception("Span is too large", 1); + throw Sender::Exception("Span is too large", 1); } _byteBufferSize += spanSize; @@ -124,7 +112,7 @@ int ThriftTransport::append(const Span& span) return flushed; } -int ThriftTransport::flush() +int ThriftSender::flush() { if (_spanBuffer.empty()) { return 0; @@ -135,19 +123,19 @@ int ThriftTransport::flush() batch.__set_spans(_spanBuffer); try { - _sender->emitBatch(batch); + _transporter->emitBatch(batch); } catch (const std::system_error& ex) { std::ostringstream oss; oss << "Could not send span " << ex.what() << ", code=" << ex.code().value(); - throw Transport::Exception(oss.str(), _spanBuffer.size()); + throw Sender::Exception(oss.str(), _spanBuffer.size()); } catch (const std::exception& ex) { std::ostringstream oss; oss << "Could not send span " << ex.what(); - throw Transport::Exception(oss.str(), _spanBuffer.size()); + throw Sender::Exception(oss.str(), _spanBuffer.size()); } catch (...) { - throw Transport::Exception("Could not send span, unknown error", - _spanBuffer.size()); + throw Sender::Exception("Could not send span, unknown error", + _spanBuffer.size()); } resetBuffers(); diff --git a/src/jaegertracing/ThriftTransport.h b/src/jaegertracing/ThriftSender.h similarity index 63% rename from src/jaegertracing/ThriftTransport.h rename to src/jaegertracing/ThriftSender.h index 8e923077..549463dd 100644 --- a/src/jaegertracing/ThriftTransport.h +++ b/src/jaegertracing/ThriftSender.h @@ -14,36 +14,33 @@ * limitations under the License. */ -#ifndef JAEGERTRACING_THRIFTTRANSPORT_H -#define JAEGERTRACING_THRIFTTRANSPORT_H +#ifndef JAEGERTRACING_THRIFTSENDER_H +#define JAEGERTRACING_THRIFTSENDER_H #include "jaegertracing/Compilers.h" #include "jaegertracing/Span.h" -#include "jaegertracing/Transport.h" +#include "jaegertracing/Sender.h" #include "jaegertracing/thrift-gen/jaeger_types.h" -#include "jaegertracing/utils/UDPSender.h" -#include "jaegertracing/utils/HttpSender.h" +#include "jaegertracing/utils/Transport.h" namespace jaegertracing { -class ThriftTransport : public Transport { +class ThriftSender : public Sender { public: - ThriftTransport(const net::IPAddress& ip, int maxPacketSize); + ThriftSender(std::unique_ptr&& transporter); - ThriftTransport(const net::URI& endpoint, int maxPacketSize); - - ~ThriftTransport() { close(); } + ~ThriftSender() { close(); } int append(const Span& span) override; int flush() override; - void close() override { _sender->close(); } + void close() override { _transporter->close(); } protected: - void setClient(std::unique_ptr&& client) + void setClient(std::unique_ptr&& client) { - _sender = std::move(client); + _transporter = std::move(client); } private: @@ -53,7 +50,7 @@ class ThriftTransport : public Transport { _byteBufferSize = _processByteSize; } - std::unique_ptr _sender; + std::unique_ptr _transporter; int _maxSpanBytes; int _byteBufferSize; std::vector _spanBuffer; @@ -64,4 +61,4 @@ class ThriftTransport : public Transport { } // namespace jaegertracing -#endif //JAEGERTRACING_THRIFTTRANSPORT_H +#endif //JAEGERTRACING_THRIFTSENDER_H diff --git a/src/jaegertracing/ThriftTransportTest.cpp b/src/jaegertracing/ThriftSenderTest.cpp similarity index 76% rename from src/jaegertracing/ThriftTransportTest.cpp rename to src/jaegertracing/ThriftSenderTest.cpp index 5bc9d5ec..b5b0b6d6 100644 --- a/src/jaegertracing/ThriftTransportTest.cpp +++ b/src/jaegertracing/ThriftSenderTest.cpp @@ -17,21 +17,21 @@ #include #include "jaegertracing/Tracer.h" -#include "jaegertracing/ThriftTransport.h" +#include "jaegertracing/ThriftSender.h" #include "jaegertracing/testutils/TracerUtil.h" #include "jaegertracing/utils/ErrorUtil.h" namespace jaegertracing { namespace { -class MockUDPSender : public utils::UDPSender { +class MockUDPSender : public utils::UDPTransporter { public: enum class ExceptionType { kSystemError, kException, kString }; MockUDPSender(const net::IPAddress& serverAddr, int maxPacketSize, ExceptionType type) - : UDPSender(serverAddr, maxPacketSize) + : UDPTransporter(serverAddr, maxPacketSize) , _type(type) { } @@ -54,27 +54,28 @@ class MockUDPSender : public utils::UDPSender { ExceptionType _type; }; -class MockThriftTransport : public ThriftTransport { +class MockThriftSender : public ThriftSender { public: - MockThriftTransport(const net::IPAddress& ip, + MockThriftSender(const net::IPAddress& ip, int maxPacketSize, MockUDPSender::ExceptionType type) - : ThriftTransport(ip, maxPacketSize) + : ThriftSender(std::unique_ptr(new MockUDPSender(ip, maxPacketSize, type))) { - setClient(std::unique_ptr( - new MockUDPSender(ip, maxPacketSize, type))); } }; } // anonymous namespace -TEST(ThriftTransport, testManyMessages) +TEST(ThriftSender, testManyMessages) { const auto handle = testutils::TracerUtil::installGlobalTracer(); const auto tracer = std::static_pointer_cast(opentracing::Tracer::Global()); - ThriftTransport sender(handle->_mockAgent->spanServerAddress(), 0); + std::unique_ptr transporter( + new utils::UDPTransporter(handle->_mockAgent->spanServerAddress(), 0)); + ThriftSender sender( + std::forward>(transporter)); constexpr auto kNumMessages = 2000; const auto logger = logging::consoleLogger(); for (auto i = 0; i < kNumMessages; ++i) { @@ -84,7 +85,7 @@ TEST(ThriftTransport, testManyMessages) } } -TEST(ThriftTransport, testExceptions) +TEST(ThriftSender, testExceptions) { const auto handle = testutils::TracerUtil::installGlobalTracer(); const auto tracer = @@ -99,9 +100,9 @@ TEST(ThriftTransport, testExceptions) MockUDPSender::ExceptionType::kString }; for (auto type : exceptionTypes) { - MockThriftTransport transport(net::IPAddress::v4("localhost", 0), 0, type); - transport.append(span); - ASSERT_THROW(transport.flush(), Transport::Exception); + MockThriftSender mockSender(net::IPAddress::v4("localhost", 0), 0, type); + mockSender.append(span); + ASSERT_THROW(mockSender.flush(), Sender::Exception); } } diff --git a/src/jaegertracing/Transport.cpp b/src/jaegertracing/Transport.cpp index d271d735..1456bc22 100644 --- a/src/jaegertracing/Transport.cpp +++ b/src/jaegertracing/Transport.cpp @@ -14,4 +14,4 @@ * limitations under the License. */ -#include "jaegertracing/Transport.h" +#include "jaegertracing/Sender.h" diff --git a/src/jaegertracing/reporters/Config.cpp b/src/jaegertracing/reporters/Config.cpp index e25090f6..72a7fe4d 100644 --- a/src/jaegertracing/reporters/Config.cpp +++ b/src/jaegertracing/reporters/Config.cpp @@ -15,7 +15,7 @@ */ #include "jaegertracing/reporters/Config.h" -#include "jaegertracing/ThriftTransport.h" +#include "jaegertracing/ThriftSender.h" #include "jaegertracing/reporters/CompositeReporter.h" #include "jaegertracing/reporters/LoggingReporter.h" #include "jaegertracing/reporters/RemoteReporter.h" @@ -32,10 +32,15 @@ std::unique_ptr Config::makeReporter(const std::string& serviceName, metrics::Metrics& metrics) const { - std::unique_ptr sender( - !_endpoint.empty() - ? new ThriftTransport(net::URI::parse(_endpoint), 0) - : new ThriftTransport(net::IPAddress::v4(_localAgentHostPort), 0)); + std::unique_ptr transporter = + _endpoint.empty() + ? (std::unique_ptr(new utils::UDPTransporter( + net::IPAddress::v4(_localAgentHostPort), 0))) + : (std::unique_ptr( + new utils::HttpTransporter(net::URI::parse(_endpoint), 0))); + + std::unique_ptr sender(new ThriftSender( + std::forward>(transporter))); std::unique_ptr remoteReporter(new RemoteReporter( _bufferFlushInterval, _queueSize, std::move(sender), logger, metrics)); if (_logSpans) { diff --git a/src/jaegertracing/reporters/Config.h b/src/jaegertracing/reporters/Config.h index 0af6cafd..985ab277 100644 --- a/src/jaegertracing/reporters/Config.h +++ b/src/jaegertracing/reporters/Config.h @@ -20,11 +20,14 @@ #include #include #include +#include #include "jaegertracing/Logging.h" #include "jaegertracing/metrics/Metrics.h" #include "jaegertracing/reporters/Reporter.h" #include "jaegertracing/utils/YAML.h" +#include "jaegertracing/utils/HttpTransporter.h" +#include "jaegertracing/utils/UDPTransporter.h" namespace jaegertracing { namespace reporters { diff --git a/src/jaegertracing/reporters/RemoteReporter.cpp b/src/jaegertracing/reporters/RemoteReporter.cpp index e26c6268..d8378df5 100644 --- a/src/jaegertracing/reporters/RemoteReporter.cpp +++ b/src/jaegertracing/reporters/RemoteReporter.cpp @@ -26,7 +26,7 @@ namespace reporters { RemoteReporter::RemoteReporter(const Clock::duration& bufferFlushInterval, int fixedQueueSize, - std::unique_ptr&& sender, + std::unique_ptr&& sender, logging::Logger& logger, metrics::Metrics& metrics) : _bufferFlushInterval(bufferFlushInterval) @@ -115,7 +115,7 @@ void RemoteReporter::sendSpan(const Span& span) noexcept _metrics.reporterSuccess().inc(flushed); _metrics.reporterQueueLength().update(_queueLength); } - } catch (const Transport::Exception& ex) { + } catch (const Sender::Exception& ex) { _metrics.reporterFailure().inc(ex.numFailed()); std::ostringstream oss; oss << "error reporting span " << span.operationName() << ": " @@ -131,7 +131,7 @@ void RemoteReporter::flush() noexcept if (flushed > 0) { _metrics.reporterSuccess().inc(flushed); } - } catch (const Transport::Exception& ex) { + } catch (const Sender::Exception& ex) { _metrics.reporterFailure().inc(ex.numFailed()); _logger.error(ex.what()); } diff --git a/src/jaegertracing/reporters/RemoteReporter.h b/src/jaegertracing/reporters/RemoteReporter.h index fcb4ccd2..e8648970 100644 --- a/src/jaegertracing/reporters/RemoteReporter.h +++ b/src/jaegertracing/reporters/RemoteReporter.h @@ -27,7 +27,7 @@ #include "jaegertracing/Logging.h" #include "jaegertracing/Span.h" -#include "jaegertracing/Transport.h" +#include "jaegertracing/Sender.h" #include "jaegertracing/metrics/Metrics.h" #include "jaegertracing/reporters/Reporter.h" @@ -40,7 +40,7 @@ class RemoteReporter : public Reporter { RemoteReporter(const Clock::duration& bufferFlushInterval, int fixedQueueSize, - std::unique_ptr&& sender, + std::unique_ptr&& sender, logging::Logger& logger, metrics::Metrics& metrics); @@ -64,7 +64,7 @@ class RemoteReporter : public Reporter { Clock::duration _bufferFlushInterval; int _fixedQueueSize; - std::unique_ptr _sender; + std::unique_ptr _sender; logging::Logger& _logger; metrics::Metrics& _metrics; std::deque _queue; diff --git a/src/jaegertracing/reporters/ReporterTest.cpp b/src/jaegertracing/reporters/ReporterTest.cpp index abcf8e0d..1c555246 100644 --- a/src/jaegertracing/reporters/ReporterTest.cpp +++ b/src/jaegertracing/reporters/ReporterTest.cpp @@ -18,7 +18,7 @@ #include "jaegertracing/Logging.h" #include "jaegertracing/Tracer.h" -#include "jaegertracing/Transport.h" +#include "jaegertracing/Sender.h" #include "jaegertracing/reporters/CompositeReporter.h" #include "jaegertracing/reporters/InMemoryReporter.h" #include "jaegertracing/reporters/LoggingReporter.h" @@ -30,7 +30,7 @@ namespace jaegertracing { namespace reporters { namespace { -class FakeTransport : public Transport { +class FakeTransport : public Sender { public: FakeTransport(std::vector& spans, std::mutex& mutex) : _spans(spans) @@ -68,7 +68,7 @@ TEST(Reporter, testRemoteReporter) RemoteReporter reporter( std::chrono::milliseconds(1), kFixedQueueSize, - std::unique_ptr(new FakeTransport(spans, mutex)), + std::unique_ptr(new FakeTransport(spans, mutex)), *logger, *metrics); constexpr auto kNumReports = 100; diff --git a/src/jaegertracing/testutils/MockAgent.cpp b/src/jaegertracing/testutils/MockAgent.cpp index a3721820..3af881b0 100644 --- a/src/jaegertracing/testutils/MockAgent.cpp +++ b/src/jaegertracing/testutils/MockAgent.cpp @@ -29,7 +29,7 @@ #include "jaegertracing/net/http/Response.h" #include "jaegertracing/samplers/RemoteSamplingJSON.h" #include "jaegertracing/utils/ErrorUtil.h" -#include "jaegertracing/utils/UDPSender.h" +#include "jaegertracing/utils/UDPTransporter.h" #ifdef _MSC_VER #pragma warning(disable : 4267) @@ -111,17 +111,17 @@ void MockAgent::serveUDP(std::promise& started) agent::thrift::AgentProcessor handler(iface); TCompactProtocolFactory protocolFactory; std::shared_ptr trans( - new TMemoryBuffer(utils::UDPSender::kUDPPacketMaxLength)); + new TMemoryBuffer(utils::UDPTransporter::kUDPPacketMaxLength)); // Notify main thread that setup is done. _servingUDP = true; started.set_value(); - std::array buffer; + std::array buffer; while (isServingUDP()) { try { const auto numRead = - _transport.read(&buffer[0], utils::UDPSender::kUDPPacketMaxLength); + _transport.read(&buffer[0], utils::UDPTransporter::kUDPPacketMaxLength); if (numRead > 0) { trans->write(&buffer[0], numRead); auto protocol = protocolFactory.getProtocol(trans); diff --git a/src/jaegertracing/testutils/MockAgent.h b/src/jaegertracing/testutils/MockAgent.h index b76d303a..6a761ada 100644 --- a/src/jaegertracing/testutils/MockAgent.h +++ b/src/jaegertracing/testutils/MockAgent.h @@ -25,7 +25,7 @@ #include "jaegertracing/testutils/TUDPTransport.h" #include "jaegertracing/thrift-gen/Agent.h" #include "jaegertracing/thrift-gen/jaeger_types.h" -#include "jaegertracing/utils/UDPSender.h" +#include "jaegertracing/utils/UDPTransporter.h" #include #include #include @@ -104,10 +104,10 @@ class MockAgent : public agent::thrift::AgentIf, net::IPAddress spanServerAddress() const { return _transport.addr(); } - std::unique_ptr spanServerClient() + std::unique_ptr spanServerClient() { - return std::unique_ptr( - new utils::UDPSender(spanServerAddress(), 0)); + return std::unique_ptr( + new utils::UDPTransporter(spanServerAddress(), 0)); } net::IPAddress samplingServerAddress() const { return _httpAddress; } diff --git a/src/jaegertracing/testutils/TUDPTransport.h b/src/jaegertracing/testutils/TUDPTransport.h index fe543006..ceee2815 100644 --- a/src/jaegertracing/testutils/TUDPTransport.h +++ b/src/jaegertracing/testutils/TUDPTransport.h @@ -27,7 +27,7 @@ #include -#include "jaegertracing/utils/UDPSender.h" +#include "jaegertracing/utils/UDPTransporter.h" namespace jaegertracing { namespace testutils { diff --git a/src/jaegertracing/utils/ErrorUtil.h b/src/jaegertracing/utils/ErrorUtil.h index 2ca7425c..d61e1c06 100644 --- a/src/jaegertracing/utils/ErrorUtil.h +++ b/src/jaegertracing/utils/ErrorUtil.h @@ -18,7 +18,7 @@ #define JAEGERTRACING_UTILS_ERRORUTIL_H #include "jaegertracing/Logging.h" -#include "jaegertracing/Transport.h" +#include "jaegertracing/Sender.h" #include #include #include @@ -31,7 +31,7 @@ inline void logError(logging::Logger& logger, const std::string& message) { try { throw; - } catch (const Transport::Exception& ex) { + } catch (const Sender::Exception& ex) { std::ostringstream oss; oss << message << ": " << ex.what() << ", numFailed=" << ex.numFailed(); logger.error(oss.str()); diff --git a/src/jaegertracing/utils/ErrorUtilTest.cpp b/src/jaegertracing/utils/ErrorUtilTest.cpp index 28bab956..02a64c7a 100644 --- a/src/jaegertracing/utils/ErrorUtilTest.cpp +++ b/src/jaegertracing/utils/ErrorUtilTest.cpp @@ -15,7 +15,7 @@ */ #include "jaegertracing/Logging.h" -#include "jaegertracing/Transport.h" +#include "jaegertracing/Sender.h" #include "jaegertracing/utils/ErrorUtil.h" #include #include @@ -59,7 +59,7 @@ TEST(ErrorUtil, test) TestLogger logger; std::runtime_error stdEx("runtime error"); std::system_error sysEx(-1, std::generic_category()); - Transport::Exception transportEx("test", 5); + Sender::Exception transportEx("test", 5); for (auto i = 0; i < 4; ++i) { try { switch (i) { diff --git a/src/jaegertracing/utils/HttpSender.cpp b/src/jaegertracing/utils/HttpTransporter.cpp similarity index 85% rename from src/jaegertracing/utils/HttpSender.cpp rename to src/jaegertracing/utils/HttpTransporter.cpp index c7676db9..7c1b6509 100644 --- a/src/jaegertracing/utils/HttpSender.cpp +++ b/src/jaegertracing/utils/HttpTransporter.cpp @@ -14,15 +14,15 @@ * limitations under the License. */ -#include "jaegertracing/utils/HttpSender.h" +#include "jaegertracing/utils/HttpTransporter.h" #include #include namespace jaegertracing { namespace utils { -HttpSender::HttpSender(const net::URI& endpoint, int maxPacketSize) - : Sender(maxPacketSize == 0 ? kHttpPacketMaxLength : maxPacketSize) +HttpTransporter::HttpTransporter(const net::URI& endpoint, int maxPacketSize) + : Transport(maxPacketSize == 0 ? kHttpPacketMaxLength : maxPacketSize) , _buffer(new apache::thrift::transport::TMemoryBuffer(_maxPacketSize)) , _serverAddr(net::IPAddress::v4(endpoint._host, endpoint._port)) , _httpClient(new ::apache::thrift::transport::THttpClient( diff --git a/src/jaegertracing/utils/HttpSender.h b/src/jaegertracing/utils/HttpTransporter.h similarity index 82% rename from src/jaegertracing/utils/HttpSender.h rename to src/jaegertracing/utils/HttpTransporter.h index 086cd204..ceb93805 100644 --- a/src/jaegertracing/utils/HttpSender.h +++ b/src/jaegertracing/utils/HttpTransporter.h @@ -24,7 +24,7 @@ #include "jaegertracing/Compilers.h" -#include "jaegertracing/utils/Sender.h" +#include "jaegertracing/utils/Transport.h" #include "jaegertracing/net/IPAddress.h" #include "jaegertracing/net/Socket.h" @@ -37,11 +37,11 @@ namespace jaegertracing { namespace utils { -class HttpSender : public Sender { +class HttpTransporter : public Transport { public: - HttpSender(const net::URI& endpoint, int maxPacketSize); + HttpTransporter(const net::URI& endpoint, int maxPacketSize); - ~HttpSender() { close(); } + ~HttpTransporter() { close(); } void emitBatch(const thrift::Batch& batch) override { @@ -58,14 +58,6 @@ class HttpSender : public Sender { uint8_t* data = nullptr; uint32_t size = 0; _buffer->getBuffer(&data, &size); - if (static_cast(size) > _maxPacketSize) { - std::ostringstream oss; - oss << "Data does not fit within one HTTP message" - ", size " - << size << ", max " << _maxPacketSize << ", spans " - << batch.spans.size(); - throw std::logic_error(oss.str()); - } // Sends the HTTP message const auto numWritten = ::send(_socket.handle(), reinterpret_cast(data), sizeof(uint8_t) * size, 0); @@ -99,7 +91,7 @@ class HttpSender : public Sender { std::shared_ptr<::apache::thrift::transport::THttpClient> _httpClient; std::shared_ptr _protocol; - static constexpr auto kHttpPacketMaxLength = 1048576; + static constexpr auto kHttpPacketMaxLength = 1024 * 1024; // 1MB }; } // namespace utils diff --git a/src/jaegertracing/utils/HttpSenderTest.cpp b/src/jaegertracing/utils/HttpTransporterTest.cpp similarity index 86% rename from src/jaegertracing/utils/HttpSenderTest.cpp rename to src/jaegertracing/utils/HttpTransporterTest.cpp index b1fcae63..81d4507f 100644 --- a/src/jaegertracing/utils/HttpSenderTest.cpp +++ b/src/jaegertracing/utils/HttpTransporterTest.cpp @@ -35,7 +35,7 @@ namespace jaegertracing { namespace utils { -TEST(HttpSender, testBigMessage) +TEST(HttpTransporter, testSpanReporting) { net::IPAddress serverAddr; std::promise started; @@ -73,13 +73,13 @@ TEST(HttpSender, testBigMessage) target = request.target(); method = request.method(); - for (auto tata : request.headers()) { - if (tata.key() == "Content-Type") { - contentType = tata.value(); + for (auto header : request.headers()) { + if (header.key() == "Content-Type") { + contentType = header.value(); } - if (tata.key() == "Accept") { - acceptType = tata.value(); + if (header.key() == "Accept") { + acceptType = header.value(); } } @@ -87,8 +87,7 @@ TEST(HttpSender, testBigMessage) "HTTP/1.1 202 Accepted\r\nDate: Tue, 10 Sep 2019 09:03:26 " "GMT\r\nContent-Length: 0\r\n\r\n"); - const auto numWritten = - ::send(clientSocket.handle(), answer.c_str(), answer.size(), 0); + ::send(clientSocket.handle(), answer.c_str(), answer.size(), 0); }); started.get_future().wait(); diff --git a/src/jaegertracing/utils/Sender.h b/src/jaegertracing/utils/Transport.h similarity index 82% rename from src/jaegertracing/utils/Sender.h rename to src/jaegertracing/utils/Transport.h index 90337be8..8f057068 100644 --- a/src/jaegertracing/utils/Sender.h +++ b/src/jaegertracing/utils/Transport.h @@ -23,14 +23,14 @@ namespace jaegertracing { namespace utils { -class Sender { +class Transport { public: - Sender(int maxPacketSize) + Transport(int maxPacketSize) : _maxPacketSize(maxPacketSize) { } - virtual ~Sender() { close(); } + virtual ~Transport() { close(); } virtual void emitBatch(const thrift::Batch& batch) = 0; @@ -38,7 +38,8 @@ class Sender { void close() { _socket.close(); } - virtual std::unique_ptr< apache::thrift::protocol::TProtocolFactory > protocolFactory() const = 0; + virtual std::unique_ptr + protocolFactory() const = 0; protected: int _maxPacketSize; diff --git a/src/jaegertracing/utils/UDPSenderTest.cpp b/src/jaegertracing/utils/UDPSenderTest.cpp index fc927967..f59586b4 100644 --- a/src/jaegertracing/utils/UDPSenderTest.cpp +++ b/src/jaegertracing/utils/UDPSenderTest.cpp @@ -18,7 +18,7 @@ #include "jaegertracing/net/Socket.h" #include "jaegertracing/thrift-gen/jaeger_types.h" #include "jaegertracing/thrift-gen/zipkincore_types.h" -#include "jaegertracing/utils/UDPSender.h" +#include "jaegertracing/utils/UDPTransporter.h" #include #include #include @@ -48,7 +48,7 @@ TEST(UDPSender, testZipkinMessage) }); started.get_future().wait(); - UDPSender udpClient(serverAddr, 0); + UDPTransporter udpClient(serverAddr, 0); using ZipkinBatch = std::vector; ASSERT_THROW(udpClient.emitZipkinBatch(ZipkinBatch()), std::logic_error); serverThread.join(); @@ -74,7 +74,7 @@ TEST(UDPSender, testBigMessage) }); started.get_future().wait(); - UDPSender udpClient(serverAddr, 1); + UDPTransporter udpClient(serverAddr, 1); ASSERT_THROW(udpClient.emitBatch(thrift::Batch()), std::logic_error); serverThread.join(); } diff --git a/src/jaegertracing/utils/UDPSender.cpp b/src/jaegertracing/utils/UDPTransporter.cpp similarity index 85% rename from src/jaegertracing/utils/UDPSender.cpp rename to src/jaegertracing/utils/UDPTransporter.cpp index 479edd09..d8bbeda3 100644 --- a/src/jaegertracing/utils/UDPSender.cpp +++ b/src/jaegertracing/utils/UDPTransporter.cpp @@ -14,16 +14,16 @@ * limitations under the License. */ -#include "jaegertracing/utils/UDPSender.h" +#include "jaegertracing/utils/UDPTransporter.h" #include #include namespace jaegertracing { namespace utils { -UDPSender::UDPSender(const net::IPAddress& serverAddr, int maxPacketSize) - : Sender(maxPacketSize == 0 ? kUDPPacketMaxLength - : maxPacketSize) +UDPTransporter::UDPTransporter(const net::IPAddress& serverAddr, int maxPacketSize) + : Transport(maxPacketSize == 0 ? kUDPPacketMaxLength + : maxPacketSize) , _buffer(new apache::thrift::transport::TMemoryBuffer(_maxPacketSize)) , _serverAddr(serverAddr) , _client() diff --git a/src/jaegertracing/utils/UDPSender.h b/src/jaegertracing/utils/UDPTransporter.h similarity index 92% rename from src/jaegertracing/utils/UDPSender.h rename to src/jaegertracing/utils/UDPTransporter.h index dba5fd7a..dfd64247 100644 --- a/src/jaegertracing/utils/UDPSender.h +++ b/src/jaegertracing/utils/UDPTransporter.h @@ -27,7 +27,7 @@ #include #include -#include "jaegertracing/utils/Sender.h" +#include "jaegertracing/utils/Transport.h" #include "jaegertracing/net/IPAddress.h" #include "jaegertracing/thrift-gen/Agent.h" @@ -35,11 +35,11 @@ namespace jaegertracing { namespace utils { -class UDPSender : public Sender { +class UDPTransporter : public Transport { public: - static constexpr auto kUDPPacketMaxLength = 65000; + static constexpr auto kUDPPacketMaxLength = 65000; - UDPSender(const net::IPAddress& serverAddr, int maxPacketSize); + UDPTransporter(const net::IPAddress& serverAddr, int maxPacketSize); void emitZipkinBatch( const std::vector& spans) From 53a2f88081157e04ab6fe8c0c71ec5302d97809d Mon Sep 17 00:00:00 2001 From: "FR-MUREX-COM\\mchaikhadouaihy" Date: Mon, 16 Sep 2019 23:15:01 +0200 Subject: [PATCH 3/3] Make HTTP capital to be inline with UDP. Signed-off-by: FR-MUREX-COM\mchaikhadouaihy --- CMakeLists.txt | 6 +++--- src/jaegertracing/{Transport.cpp => Sender.cpp} | 0 src/jaegertracing/reporters/Config.cpp | 3 +-- src/jaegertracing/reporters/Config.h | 2 +- .../utils/{HttpTransporter.cpp => HTTPTransporter.cpp} | 4 ++-- .../utils/{HttpTransporter.h => HTTPTransporter.h} | 6 +++--- .../{HttpTransporterTest.cpp => HTTPTransporterTest.cpp} | 2 +- 7 files changed, 11 insertions(+), 12 deletions(-) rename src/jaegertracing/{Transport.cpp => Sender.cpp} (100%) rename src/jaegertracing/utils/{HttpTransporter.cpp => HTTPTransporter.cpp} (90%) rename src/jaegertracing/utils/{HttpTransporter.h => HTTPTransporter.h} (93%) rename src/jaegertracing/utils/{HttpTransporterTest.cpp => HTTPTransporterTest.cpp} (95%) diff --git a/CMakeLists.txt b/CMakeLists.txt index b385e914..fce8b09b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -134,7 +134,7 @@ set(SRC src/jaegertracing/TraceID.cpp src/jaegertracing/Tracer.cpp src/jaegertracing/TracerFactory.cpp - src/jaegertracing/Transport.cpp + src/jaegertracing/Sender.cpp src/jaegertracing/ThriftSender.cpp src/jaegertracing/baggage/BaggageSetter.cpp src/jaegertracing/baggage/RemoteRestrictionJSON.cpp @@ -212,7 +212,7 @@ set(SRC src/jaegertracing/utils/HexParsing.cpp src/jaegertracing/utils/RateLimiter.cpp src/jaegertracing/utils/UDPTransporter.cpp - src/jaegertracing/utils/HttpTransporter.cpp + src/jaegertracing/utils/HTTPTransporter.cpp src/jaegertracing/utils/YAML.cpp src/jaegertracing/ThriftMethods.cpp) @@ -338,7 +338,7 @@ if(BUILD_TESTING) src/jaegertracing/utils/ErrorUtilTest.cpp src/jaegertracing/utils/RateLimiterTest.cpp src/jaegertracing/utils/UDPSenderTest.cpp - src/jaegertracing/utils/HttpTransporterTest.cpp) + src/jaegertracing/utils/HTTPTransporterTest.cpp) target_link_libraries( UnitTest PRIVATE testutils GTest::main ${JAEGERTRACING_LIB}) add_test(NAME UnitTest COMMAND UnitTest) diff --git a/src/jaegertracing/Transport.cpp b/src/jaegertracing/Sender.cpp similarity index 100% rename from src/jaegertracing/Transport.cpp rename to src/jaegertracing/Sender.cpp diff --git a/src/jaegertracing/reporters/Config.cpp b/src/jaegertracing/reporters/Config.cpp index 72a7fe4d..e2de49dd 100644 --- a/src/jaegertracing/reporters/Config.cpp +++ b/src/jaegertracing/reporters/Config.cpp @@ -31,13 +31,12 @@ std::unique_ptr Config::makeReporter(const std::string& serviceName, logging::Logger& logger, metrics::Metrics& metrics) const { - std::unique_ptr transporter = _endpoint.empty() ? (std::unique_ptr(new utils::UDPTransporter( net::IPAddress::v4(_localAgentHostPort), 0))) : (std::unique_ptr( - new utils::HttpTransporter(net::URI::parse(_endpoint), 0))); + new utils::HTTPTransporter(net::URI::parse(_endpoint), 0))); std::unique_ptr sender(new ThriftSender( std::forward>(transporter))); diff --git a/src/jaegertracing/reporters/Config.h b/src/jaegertracing/reporters/Config.h index 985ab277..57004195 100644 --- a/src/jaegertracing/reporters/Config.h +++ b/src/jaegertracing/reporters/Config.h @@ -26,7 +26,7 @@ #include "jaegertracing/metrics/Metrics.h" #include "jaegertracing/reporters/Reporter.h" #include "jaegertracing/utils/YAML.h" -#include "jaegertracing/utils/HttpTransporter.h" +#include "jaegertracing/utils/HTTPTransporter.h" #include "jaegertracing/utils/UDPTransporter.h" namespace jaegertracing { diff --git a/src/jaegertracing/utils/HttpTransporter.cpp b/src/jaegertracing/utils/HTTPTransporter.cpp similarity index 90% rename from src/jaegertracing/utils/HttpTransporter.cpp rename to src/jaegertracing/utils/HTTPTransporter.cpp index 7c1b6509..4a3a1c37 100644 --- a/src/jaegertracing/utils/HttpTransporter.cpp +++ b/src/jaegertracing/utils/HTTPTransporter.cpp @@ -14,14 +14,14 @@ * limitations under the License. */ -#include "jaegertracing/utils/HttpTransporter.h" +#include "jaegertracing/utils/HTTPTransporter.h" #include #include namespace jaegertracing { namespace utils { -HttpTransporter::HttpTransporter(const net::URI& endpoint, int maxPacketSize) +HTTPTransporter::HTTPTransporter(const net::URI& endpoint, int maxPacketSize) : Transport(maxPacketSize == 0 ? kHttpPacketMaxLength : maxPacketSize) , _buffer(new apache::thrift::transport::TMemoryBuffer(_maxPacketSize)) , _serverAddr(net::IPAddress::v4(endpoint._host, endpoint._port)) diff --git a/src/jaegertracing/utils/HttpTransporter.h b/src/jaegertracing/utils/HTTPTransporter.h similarity index 93% rename from src/jaegertracing/utils/HttpTransporter.h rename to src/jaegertracing/utils/HTTPTransporter.h index ceb93805..5340d242 100644 --- a/src/jaegertracing/utils/HttpTransporter.h +++ b/src/jaegertracing/utils/HTTPTransporter.h @@ -37,11 +37,11 @@ namespace jaegertracing { namespace utils { -class HttpTransporter : public Transport { +class HTTPTransporter : public Transport { public: - HttpTransporter(const net::URI& endpoint, int maxPacketSize); + HTTPTransporter(const net::URI& endpoint, int maxPacketSize); - ~HttpTransporter() { close(); } + ~HTTPTransporter() { close(); } void emitBatch(const thrift::Batch& batch) override { diff --git a/src/jaegertracing/utils/HttpTransporterTest.cpp b/src/jaegertracing/utils/HTTPTransporterTest.cpp similarity index 95% rename from src/jaegertracing/utils/HttpTransporterTest.cpp rename to src/jaegertracing/utils/HTTPTransporterTest.cpp index 81d4507f..1bc5501b 100644 --- a/src/jaegertracing/utils/HttpTransporterTest.cpp +++ b/src/jaegertracing/utils/HTTPTransporterTest.cpp @@ -35,7 +35,7 @@ namespace jaegertracing { namespace utils { -TEST(HttpTransporter, testSpanReporting) +TEST(HTTPTransporter, testSpanReporting) { net::IPAddress serverAddr; std::promise started;