From a34a9d606ca541e37547ebb0628857c91a192835 Mon Sep 17 00:00:00 2001 From: MrPresent-Han <116052805+MrPresent-Han@users.noreply.github.com> Date: Sat, 2 Sep 2023 16:13:01 +0800 Subject: [PATCH] fix panic due to empty traceID(#26754) (#26808) Signed-off-by: MrPresent-Han --- internal/core/src/common/Tracer.cpp | 59 ++++++++++++------------- internal/core/src/common/Tracer.h | 10 ++--- internal/core/src/segcore/segment_c.cpp | 2 +- 3 files changed, 33 insertions(+), 38 deletions(-) diff --git a/internal/core/src/common/Tracer.cpp b/internal/core/src/common/Tracer.cpp index 920cf5316a..69fc899fc8 100644 --- a/internal/core/src/common/Tracer.cpp +++ b/internal/core/src/common/Tracer.cpp @@ -34,8 +34,9 @@ namespace jaeger = opentelemetry::exporter::jaeger; namespace ostream = opentelemetry::exporter::trace; namespace otlp = opentelemetry::exporter::otlp; -static const int trace_id_size = 2 * opentelemetry::trace::TraceId::kSize; static bool enable_trace = true; +static std::shared_ptr noop_trace_provider = + std::make_shared(); void initTelementry(TraceConfig* config) { @@ -57,17 +58,21 @@ initTelementry(TraceConfig* config) { LOG_SEGCORE_INFO_ << "Empty Trace"; enable_trace = false; } - auto processor = - trace_sdk::BatchSpanProcessorFactory::Create(std::move(exporter), {}); - resource::ResourceAttributes attributes = {{"service.name", "segcore"}, - {"NodeID", config->nodeID}}; - auto resource = resource::Resource::Create(attributes); - auto sampler = std::make_unique( - std::make_shared()); - std::shared_ptr provider = - trace_sdk::TracerProviderFactory::Create( - std::move(processor), resource, std::move(sampler)); - trace::Provider::SetTracerProvider(provider); + if (enable_trace) { + auto processor = trace_sdk::BatchSpanProcessorFactory::Create( + std::move(exporter), {}); + resource::ResourceAttributes attributes = {{"service.name", "segcore"}, + {"NodeID", config->nodeID}}; + auto resource = resource::Resource::Create(attributes); + auto sampler = std::make_unique( + std::make_shared()); + std::shared_ptr provider = + trace_sdk::TracerProviderFactory::Create( + std::move(processor), resource, std::move(sampler)); + trace::Provider::SetTracerProvider(provider); + } else { + trace::Provider::SetTracerProvider(noop_trace_provider); + } } std::shared_ptr @@ -79,8 +84,12 @@ GetTracer() { std::shared_ptr StartSpan(std::string name, TraceContext* parentCtx) { trace::StartSpanOptions opts; - if (parentCtx != nullptr && parentCtx->traceID != nullptr && + if (enable_trace && parentCtx != nullptr && parentCtx->traceID != nullptr && parentCtx->spanID != nullptr) { + if (isEmptyID(parentCtx->traceID, trace::TraceId::kSize) || + isEmptyID(parentCtx->spanID, trace::SpanId::kSize)) { + return noop_trace_provider->GetTracer("noop")->StartSpan("noop"); + } opts.parent = trace::SpanContext( trace::TraceId({parentCtx->traceID, trace::TraceId::kSize}), trace::SpanId({parentCtx->spanID, trace::SpanId::kSize}), @@ -105,14 +114,6 @@ CloseRootSpan() { } } -std::shared_ptr -GetRootSpan() { - if (enable_trace && local_span != nullptr) { - return local_span; - } - return nullptr; -} - void AddEvent(std::string event_label) { if (enable_trace && local_span != nullptr) { @@ -120,16 +121,14 @@ AddEvent(std::string event_label) { } } -void -logTraceContext(const std::string& extended_info, - const std::shared_ptr span) { - if (enable_trace && span != nullptr) { - char traceID[trace_id_size]; - span->GetContext().trace_id().ToLowerBase16( - nostd::span{ - &traceID[0], trace_id_size}); - LOG_SEGCORE_DEBUG_ << extended_info << ", traceID:" << traceID; +bool +isEmptyID(const uint8_t* id, int length) { + for (size_t i = 0; i < length; i++) { + if (id[i] != 0) { + return false; + } } + return true; } } // namespace milvus::tracer diff --git a/internal/core/src/common/Tracer.h b/internal/core/src/common/Tracer.h index 0412246e83..08e900f428 100644 --- a/internal/core/src/common/Tracer.h +++ b/internal/core/src/common/Tracer.h @@ -42,20 +42,16 @@ GetTracer(); std::shared_ptr StartSpan(std::string name, TraceContext* ctx = nullptr); -void -logTraceContext(const std::string& extended_info, - std::shared_ptr span); - void SetRootSpan(std::shared_ptr span); void CloseRootSpan(); -std::shared_ptr -GetRootSpan(); - void AddEvent(std::string event_label); +bool +isEmptyID(const uint8_t* id, const int length); + } // namespace milvus::tracer diff --git a/internal/core/src/segcore/segment_c.cpp b/internal/core/src/segcore/segment_c.cpp index 82f73ab887..fd7322ee34 100644 --- a/internal/core/src/segcore/segment_c.cpp +++ b/internal/core/src/segcore/segment_c.cpp @@ -115,7 +115,7 @@ Retrieve(CSegmentInterface c_segment, auto ctx = milvus::tracer::TraceContext{ c_trace.traceID, c_trace.spanID, c_trace.flag}; - auto span = milvus::tracer::StartSpan("SegcoreRetrieve", &ctx); + auto span = milvus::tracer::StartSpan("SegCoreRetrieve", &ctx); auto retrieve_result = segment->Retrieve(plan, timestamp, limit_size);