diff --git a/source/extensions/tracers/zipkin/span_context_extractor.cc b/source/extensions/tracers/zipkin/span_context_extractor.cc index 6343b1e6e0a24..9779a4d5faaa3 100644 --- a/source/extensions/tracers/zipkin/span_context_extractor.cc +++ b/source/extensions/tracers/zipkin/span_context_extractor.cc @@ -105,7 +105,7 @@ std::pair SpanContextExtractor::extractSpanContext(bool is_sa } auto b3_parent_id_entry = request_headers_.get(ZipkinCoreConstants::get().X_B3_PARENT_SPAN_ID); - if (b3_parent_id_entry) { + if (b3_parent_id_entry && b3_parent_id_entry->value().size() > 0) { const std::string pspid = b3_parent_id_entry->value().c_str(); if (!StringUtil::atoull(pspid.c_str(), parent_id, 16)) { throw ExtractorException(fmt::format("Invalid parent span id {}", pspid.c_str())); diff --git a/test/extensions/tracers/zipkin/zipkin_tracer_impl_test.cc b/test/extensions/tracers/zipkin/zipkin_tracer_impl_test.cc index 06fe1367a489f..e538860b509f1 100644 --- a/test/extensions/tracers/zipkin/zipkin_tracer_impl_test.cc +++ b/test/extensions/tracers/zipkin/zipkin_tracer_impl_test.cc @@ -496,6 +496,27 @@ TEST_F(ZipkinDriverTest, ZipkinSpanContextFromB3HeadersTest) { EXPECT_TRUE(zipkin_span->span().sampled()); } +TEST_F(ZipkinDriverTest, ZipkinSpanContextFromB3HeadersEmptyParentSpanTest) { + setupValidDriver(); + + // Root span so have same trace and span id + const std::string id = Hex::uint64ToHex(generateRandom64()); + request_headers_.addReferenceKey(ZipkinCoreConstants::get().X_B3_TRACE_ID, id); + request_headers_.addReferenceKey(ZipkinCoreConstants::get().X_B3_SPAN_ID, id); + request_headers_.addReferenceKey(ZipkinCoreConstants::get().X_B3_SAMPLED, + ZipkinCoreConstants::get().SAMPLED); + + // Set parent span id to empty string, to ensure it is ignored + const std::string parent_span_id = ""; + request_headers_.addReferenceKey(ZipkinCoreConstants::get().X_B3_PARENT_SPAN_ID, parent_span_id); + + Tracing::SpanPtr span = driver_->startSpan(config_, request_headers_, operation_name_, + start_time_, {Tracing::Reason::Sampling, true}); + + ZipkinSpanPtr zipkin_span(dynamic_cast(span.release())); + EXPECT_TRUE(zipkin_span->span().sampled()); +} + TEST_F(ZipkinDriverTest, ZipkinSpanContextFromB3Headers128TraceIdTest) { setupValidDriver();