diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 00000000..796b96d1 --- /dev/null +++ b/.dockerignore @@ -0,0 +1 @@ +/build diff --git a/CMakeLists.txt b/CMakeLists.txt index 75b6e7a0..4f080a6b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -6,6 +6,9 @@ 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) HunterGate( @@ -25,7 +28,7 @@ if(CMAKE_CXX_COMPILER_ID MATCHES "Clang") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-unused-private-field") endif() -set(CMAKE_EXPORT_COMPILE_COMMANDS true) +set(CMAKE_EXPORT_COMPILE_COMMANDS ON) if(HUNTER_ENABLED) set(hunter_config "CONFIG") @@ -70,9 +73,12 @@ list(APPEND package_deps nlohmann_json) option(JAEGERTRACING_COVERAGE "Build with coverage" $ENV{COVERAGE}) option(JAEGERTRACING_BUILD_CROSSDOCK "Build crossdock" $ENV{CROSSDOCK}) +if(NOT JAEGERTRACING_BUILD_CROSSDOCK) + set(no_crossdock ON) +endif() cmake_dependent_option( JAEGERTRACING_WITH_YAML_CPP "Use yaml-cpp to parse config files" ON - "NOT JAEGERTRACING_BUILD_CROSSDOCK" ON) + "no_crossdock" ON) if(JAEGERTRACING_WITH_YAML_CPP) hunter_add_package(yaml-cpp) @@ -104,18 +110,18 @@ 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-static) + $) + target_link_libraries(crossdock PUBLIC ${JAEGERTRACING_LIB}) set(JAEGER_CROSSDOCK_URL "https://raw.githubusercontent.com/jaegertracing/jaeger/master/docker-compose/\ jaeger-docker-compose.yml") file(DOWNLOAD ${JAEGER_CROSSDOCK_URL} - "${PROJECT_SOURCE_DIR}/crossdock/jaeger-docker-compose.yml") + "${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 ${PROJECT_SOURCE_DIR}/crossdock/docker-compose.yml - -f ${PROJECT_SOURCE_DIR}/crossdock/jaeger-docker-compose.yml) + -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} kill COMMAND ${DOCKER_COMPOSE_CMD} rm --force) @@ -134,6 +140,7 @@ endif() set(SRC src/jaegertracing/Config.cpp + src/jaegertracing/DynamicLoad.cpp src/jaegertracing/LogRecord.cpp src/jaegertracing/Logging.cpp src/jaegertracing/Reference.cpp @@ -143,7 +150,6 @@ set(SRC src/jaegertracing/TraceID.cpp src/jaegertracing/Tracer.cpp src/jaegertracing/TracerFactory.cpp - src/jaegertracing/DynamicLoad.cpp src/jaegertracing/Transport.cpp src/jaegertracing/UDPTransport.cpp src/jaegertracing/baggage/BaggageSetter.cpp @@ -228,28 +234,54 @@ set(SRC src/jaegertracing/utils/UDPClient.cpp src/jaegertracing/utils/YAML.cpp) -add_library(jaegertracing SHARED ${SRC}) -target_include_directories(jaegertracing PUBLIC - $ - $) -target_link_libraries(jaegertracing ${LIBS}) -set_target_properties(jaegertracing PROPERTIES - VERSION ${PROJECT_VERSION} - SOVERSION ${PROJECT_VERSION_MAJOR}) +function(add_lib_deps lib) + target_include_directories(${lib} PUBLIC + $ + $) + target_link_libraries(${lib} PUBLIC ${LIBS}) +endfunction() + +option(JAEGERTRACING_PLUGIN "Build dynamic plugin" OFF) +if(NOT JAEGERTRACING_PLUGIN) + set(no_plugin) +endif() +cmake_dependent_option(BUILD_SHARED_LIBS "Build shared libraries" ON + "no_plugin" OFF) + +if(BUILD_SHARED_LIBS) + add_library(jaegertracing SHARED ${SRC}) + 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}) -target_include_directories(jaegertracing-static PUBLIC - $ - $) -target_link_libraries(jaegertracing-static ${LIBS}) set_target_properties(jaegertracing-static PROPERTIES OUTPUT_NAME jaegertracing) +add_lib_deps(jaegertracing-static) +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) -set(CMAKE_INCLUDE_CURRENT_DIR ON) if(BUILD_TESTING) add_subdirectory("${CMAKE_CURRENT_SOURCE_DIR}/src/jaegertracing/testutils") @@ -262,7 +294,6 @@ if(BUILD_TESTING) src/jaegertracing/TraceIDTest.cpp src/jaegertracing/TracerTest.cpp src/jaegertracing/TracerFactoryTest.cpp - src/jaegertracing/DynamicLoadTest.cpp src/jaegertracing/UDPTransportTest.cpp src/jaegertracing/baggage/BaggageTest.cpp src/jaegertracing/metrics/MetricsTest.cpp @@ -287,7 +318,7 @@ if(BUILD_TESTING) GTEST_HAS_TR1_TUPLE=0 GTEST_USE_OWN_TR1_TUPLE=0) target_link_libraries( - UnitTest testutils GTest::main jaegertracing ${LIBS}) + UnitTest testutils GTest::main ${JAEGERTRACING_LIB} ${LIBS}) add_test(NAME UnitTest COMMAND UnitTest) add_executable(DynamicallyLoadTracerTest src/jaegertracing/DynamicallyLoadTracerTest.cpp) @@ -347,7 +378,7 @@ configure_package_config_file( # * header location after install: /include/jaegertracing/Tracer.h # * headers can be included by C++ code `#include ` install( - TARGETS jaegertracing jaegertracing-static + TARGETS ${JAEGERTRACING_LIBS} EXPORT "${TARGETS_EXPORT_NAME}" LIBRARY DESTINATION "lib" ARCHIVE DESTINATION "lib" diff --git a/Dockerfile.plugin b/Dockerfile.plugin new file mode 100644 index 00000000..996810ed --- /dev/null +++ b/Dockerfile.plugin @@ -0,0 +1,9 @@ +FROM debian +RUN apt-get update +RUN apt-get install --yes build-essential curl git +RUN curl -L -O "https://cmake.org/files/v3.11/cmake-3.11.0-Linux-x86_64.sh" && \ + bash cmake-3.11.0-Linux-x86_64.sh --skip-license + +ADD . /src/jaeger-cpp-client +WORKDIR /src/jaeger-cpp-client +RUN ./scripts/build-plugin.sh diff --git a/cmake/toolchain.cmake b/cmake/toolchain.cmake index 6773c924..e286964c 100644 --- a/cmake/toolchain.cmake +++ b/cmake/toolchain.cmake @@ -1,4 +1,4 @@ -set(CMAKE_CXX_STANDARD_REQUIRED true) +set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_CXX_STANDARD 11) set(CMAKE_CXX_EXTENSIONS OFF) set(CMAKE_POSITION_INDEPENDENT_CODE ON) diff --git a/examples/config.yml b/examples/config.yml new file mode 100644 index 00000000..4f1d85f4 --- /dev/null +++ b/examples/config.yml @@ -0,0 +1,19 @@ +service_name: test-service +disabled: false +sampler: + type: probabilistic + param: 0.001 +reporter: + queueSize: 100 + bufferFlushInterval: 10 + logSpans: false + localAgentHostPort: 127.0.0.1:6831 +headers: + jaegerDebugHeader: debug-id + jaegerBaggageHeader: baggage + TraceContextHeaderName: trace-id + traceBaggageHeaderPrefix: testctx- +baggage_restrictions: + denyBaggageOnInitializationFailure: false + hostPort: 127.0.0.1:5778 + refreshInterval: 60 diff --git a/scripts/build-plugin.sh b/scripts/build-plugin.sh new file mode 100755 index 00000000..192c824d --- /dev/null +++ b/scripts/build-plugin.sh @@ -0,0 +1,32 @@ +#!/bin/bash + +set -e + +function main() { + local project_dir + project_dir="$(git rev-parse --show-toplevel)" + + mkdir -p build + cd build + export CFLAGS="$CFLAGS -march=x86-64" + export CXXFLAGS="$CXXFLAGS -march=x86-64" + + cat < export.map +{ + global: + OpenTracingMakeTracerFactory; + local: *; +}; +EOF + + cmake -DCMAKE_BUILD_TYPE=Release \ + -DJAEGERTRACING_PLUGIN=ON \ + -DBUILD_TESTING=ON \ + -DHUNTER_CONFIGURATION_TYPES=Release \ + .. + make -j3 + mv libjaegertracing_plugin.so /libjaegertracing_plugin.so + ./DynamicallyLoadTracerTest /libjaegertracing_plugin.so +} + +main diff --git a/scripts/build.sh b/scripts/build.sh index f83b2d3f..a42e14c2 100755 --- a/scripts/build.sh +++ b/scripts/build.sh @@ -18,10 +18,14 @@ function working() { } function main() { + local project_dir + project_dir=$(git rev-parse --show-toplevel) + cd "$project_dir" + mkdir -p build cd build coverage_option=${COVERAGE:+"-DJAEGERTRACING_COVERAGE=ON"} - cmake -DCMAKE_BUILD_TYPE=Debug "${coverage_option}" .. + cmake -DCMAKE_BUILD_TYPE=Debug -DBUILD_SHARED_LIBS=ON "${coverage_option}" .. make -j3 UnitTest info "Running tests..." ./UnitTest diff --git a/src/jaegertracing/DynamicLoadTest.cpp b/src/jaegertracing/DynamicLoadTest.cpp index 6eddabf1..ab69d1a7 100644 --- a/src/jaegertracing/DynamicLoadTest.cpp +++ b/src/jaegertracing/DynamicLoadTest.cpp @@ -21,6 +21,44 @@ #include namespace jaegertracing { +namespace { + +void trace(opentracing::TracerFactory& factory) +{ + std::string errorMessage; + auto result = factory.MakeTracer(R"( +service_name: test-service +disabled: false +sampler: + type: probabilistic + param: 0.001 +reporter: + queueSize: 100 + bufferFlushInterval: 10 + logSpans: false + localAgentHostPort: 127.0.0.1:6831 +headers: + jaegerDebugHeader: debug-id + jaegerBaggageHeader: baggage + TraceContextHeaderName: trace-id + traceBaggageHeaderPrefix: testctx- +baggage_restrictions: + denyBaggageOnInitializationFailure: false + hostPort: 127.0.0.1:5778 + refreshInterval: 60 +)", + errorMessage); + assert(errorMessage.empty()); + auto tracer = static_cast>(*result); + { + tracer->StartSpan("a"); + std::cout << "Started span\n"; + } + std::cout << "Finished span\n"; +} + +} // anonymous namespace + #ifdef JAEGERTRACING_WITH_YAML_CPP TEST(DynamicLoad, invalidVersion) { @@ -44,7 +82,9 @@ TEST(DynamicLoad, validVersion) ASSERT_EQ(rcode, 0); ASSERT_EQ(errorCategory, nullptr); ASSERT_NE(tracerFactory, nullptr); - delete static_cast(tracerFactory); + std::unique_ptr factory( + static_cast(tracerFactory)); + trace(*factory); } #else TEST(DynamicLoad, noYAML)