diff --git a/exporters/jaeger/BUILD b/exporters/jaeger/BUILD index 7ccca66f50..49e60cfb1d 100644 --- a/exporters/jaeger/BUILD +++ b/exporters/jaeger/BUILD @@ -129,6 +129,7 @@ cc_test( deps = [ ":opentelemetry_exporter_jaeger_trace", "//sdk/src/resource", + "//sdk/src/trace", "@com_google_googletest//:gtest_main", ], ) diff --git a/exporters/jaeger/CMakeLists.txt b/exporters/jaeger/CMakeLists.txt index 5ae830aa60..b6108013d6 100644 --- a/exporters/jaeger/CMakeLists.txt +++ b/exporters/jaeger/CMakeLists.txt @@ -82,7 +82,7 @@ if(BUILD_TESTING) endif() target_link_libraries( jaeger_exporter_test ${GTEST_BOTH_LIBRARIES} ${CMAKE_THREAD_LIBS_INIT} - ${GMOCK_LIB} opentelemetry_exporter_jaeger_trace) + ${GMOCK_LIB} opentelemetry_trace opentelemetry_exporter_jaeger_trace) target_include_directories(jaeger_exporter_test PRIVATE ${CMAKE_CURRENT_LIST_DIR}/src) diff --git a/exporters/jaeger/test/jaeger_exporter_test.cc b/exporters/jaeger/test/jaeger_exporter_test.cc index ab680e35fc..7f86f877bc 100644 --- a/exporters/jaeger/test/jaeger_exporter_test.cc +++ b/exporters/jaeger/test/jaeger_exporter_test.cc @@ -4,6 +4,8 @@ #include #include #include +#include "opentelemetry/sdk/trace/batch_span_processor.h" +#include "opentelemetry/sdk/trace/tracer_provider.h" #ifdef BAZEL_BUILD # include "exporters/jaeger/src/thrift_sender.h" @@ -28,6 +30,15 @@ namespace exporter namespace jaeger { +namespace trace_api = opentelemetry::trace; +namespace resource = opentelemetry::sdk::resource; + +template +static nostd::span MakeSpan(T (&array)[N]) +{ + return nostd::span(array); +} + class JaegerExporterTestPeer : public ::testing::Test { public: @@ -49,6 +60,58 @@ class MockThriftSender : public ThriftSender MOCK_METHOD(int, Append, (std::unique_ptr &&), (noexcept, override)); }; +class MockTransport : public Transport +{ +public: + MOCK_METHOD(int, EmitBatch, (const thrift::Batch &), (override)); + MOCK_METHOD(uint32_t, MaxPacketSize, (), (const, override)); +}; + +// Create spans, let processor call Export() +TEST_F(JaegerExporterTestPeer, ExportIntegrationTest) +{ + auto mock_transport = new MockTransport; + auto mock_thrift_sender = new ThriftSender(std::unique_ptr{mock_transport}); + auto exporter = GetExporter(std::unique_ptr{mock_thrift_sender}); + + resource::ResourceAttributes resource_attributes = {{"service.name", "unit_test_service"}, + {"tenant.id", "test_user"}}; + resource_attributes["bool_value"] = true; + resource_attributes["int32_value"] = static_cast(1); + resource_attributes["uint32_value"] = static_cast(2); + resource_attributes["int64_value"] = static_cast(0x1100000000LL); + resource_attributes["double_value"] = static_cast(3.1); + auto resource = resource::Resource::Create(resource_attributes); + + auto processor_opts = sdk::trace::BatchSpanProcessorOptions(); + processor_opts.max_export_batch_size = 5; + processor_opts.max_queue_size = 5; + processor_opts.schedule_delay_millis = std::chrono::milliseconds(256); + auto processor = std::unique_ptr( + new sdk::trace::BatchSpanProcessor(std::move(exporter), processor_opts)); + auto provider = nostd::shared_ptr( + new sdk::trace::TracerProvider(std::move(processor), resource)); + + EXPECT_CALL(*mock_transport, EmitBatch(_)).Times(Exactly(1)).WillOnce(Return(1)); + + auto tracer = provider->GetTracer("test"); + auto parent_span = tracer->StartSpan("Test parent span"); + + trace_api::StartSpanOptions child_span_opts = {}; + child_span_opts.parent = parent_span->GetContext(); + auto child_span = tracer->StartSpan("Test child span", child_span_opts); + + child_span->End(); + parent_span->End(); + + auto parent_ctx = parent_span->GetContext(); + auto child_ctx = child_span->GetContext(); + EXPECT_EQ(parent_ctx.trace_id(), child_ctx.trace_id()); + EXPECT_EQ(parent_ctx.trace_state(), child_ctx.trace_state()); + ASSERT_TRUE(parent_ctx.IsValid()); + ASSERT_TRUE(child_ctx.IsValid()); +} + TEST_F(JaegerExporterTestPeer, ShutdownTest) { auto mock_thrift_sender = new MockThriftSender;