From a99143dd529896c5bbdde54bcc3ec6a637b9421d Mon Sep 17 00:00:00 2001 From: Cai Yudong Date: Mon, 11 Mar 2024 14:21:01 +0800 Subject: [PATCH] fix: Save traceID and spanID as hex string into search config (#31071) Issue: #30961 Signed-off-by: Yudong Cai --- internal/core/src/common/Tracer.cpp | 34 ++++++++++--- internal/core/src/common/Tracer.h | 10 +++- internal/core/src/index/VectorIndex.h | 4 +- internal/core/src/query/SearchBruteForce.cpp | 4 +- internal/core/unittest/test_tracer.cpp | 51 ++++++++++++++++++-- 5 files changed, 87 insertions(+), 16 deletions(-) diff --git a/internal/core/src/common/Tracer.cpp b/internal/core/src/common/Tracer.cpp index 237c554f65..c86e39590e 100644 --- a/internal/core/src/common/Tracer.cpp +++ b/internal/core/src/common/Tracer.cpp @@ -12,6 +12,8 @@ #include "Tracer.h" #include "log/Log.h" +#include +#include #include #include "opentelemetry/exporters/jaeger/jaeger_exporter_factory.h" @@ -149,20 +151,40 @@ EmptySpanID(const TraceContext* ctx) { } std::string -GetTraceIDAsStr(const TraceContext* ctx) { +BytesToHex(const uint8_t* input, const size_t len) { + std::stringstream ss; + ss << std::hex << std::setfill('0'); + for (size_t i = 0; i < len; i++) { + ss << std::setw(2) << static_cast(input[i]); + } + return ss.str(); +} + +std::string +HexToString(const std::string& input) { + std::string output; + std::stringstream ss; + for (size_t i = 0; i < input.length(); i += 2) { + std::string byteString = input.substr(i, 2); + char byte = static_cast(std::stoi(byteString, nullptr, 16)); + output += byte; + } + return output; +} + +std::string +GetTraceIDAsHex(const TraceContext* ctx) { if (ctx != nullptr && !EmptyTraceID(ctx)) { - return std::string((char*)ctx->traceID, - opentelemetry::trace::TraceId::kSize); + return BytesToHex(ctx->traceID, opentelemetry::trace::TraceId::kSize); } else { return std::string(); } } std::string -GetSpanIDAsStr(const TraceContext* ctx) { +GetSpanIDAsHex(const TraceContext* ctx) { if (ctx != nullptr && !EmptySpanID(ctx)) { - return std::string((char*)ctx->spanID, - opentelemetry::trace::SpanId::kSize); + return BytesToHex(ctx->spanID, opentelemetry::trace::SpanId::kSize); } else { return std::string(); } diff --git a/internal/core/src/common/Tracer.h b/internal/core/src/common/Tracer.h index 75ebecc8c1..d4fc1573ca 100644 --- a/internal/core/src/common/Tracer.h +++ b/internal/core/src/common/Tracer.h @@ -62,9 +62,15 @@ bool EmptySpanID(const TraceContext* ctx); std::string -GetTraceIDAsStr(const TraceContext* ctx); +BytesToHex(const uint8_t* input, const size_t len); std::string -GetSpanIDAsStr(const TraceContext* ctx); +HexToString(const std::string& input); + +std::string +GetTraceIDAsHex(const TraceContext* ctx); + +std::string +GetSpanIDAsHex(const TraceContext* ctx); } // namespace milvus::tracer diff --git a/internal/core/src/index/VectorIndex.h b/internal/core/src/index/VectorIndex.h index 87bfbab7b1..b1f2685927 100644 --- a/internal/core/src/index/VectorIndex.h +++ b/internal/core/src/index/VectorIndex.h @@ -124,9 +124,9 @@ class VectorIndex : public IndexBase { // if (search_info.trace_ctx_.traceID != nullptr && // search_info.trace_ctx_.spanID != nullptr) { // search_cfg[knowhere::meta::TRACE_ID] = - // tracer::GetTraceIDAsStr(&search_info.trace_ctx_); + // tracer::GetTraceIDAsHex(&search_info.trace_ctx_); // search_cfg[knowhere::meta::SPAN_ID] = - // tracer::GetSpanIDAsStr(&search_info.trace_ctx_); + // tracer::GetSpanIDAsHex(&search_info.trace_ctx_); // search_cfg[knowhere::meta::TRACE_FLAGS] = // search_info.trace_ctx_.traceFlags; // } diff --git a/internal/core/src/query/SearchBruteForce.cpp b/internal/core/src/query/SearchBruteForce.cpp index d4bd997510..0ab057273b 100644 --- a/internal/core/src/query/SearchBruteForce.cpp +++ b/internal/core/src/query/SearchBruteForce.cpp @@ -54,9 +54,9 @@ PrepareBFSearchParams(const SearchInfo& search_info) { // if (search_info.trace_ctx_.traceID != nullptr && // search_info.trace_ctx_.spanID != nullptr) { // search_cfg[knowhere::meta::TRACE_ID] = - // tracer::GetTraceIDAsStr(&search_info.trace_ctx_); + // tracer::GetTraceIDAsHex(&search_info.trace_ctx_); // search_cfg[knowhere::meta::SPAN_ID] = - // tracer::GetSpanIDAsStr(&search_info.trace_ctx_); + // tracer::GetSpanIDAsHex(&search_info.trace_ctx_); // search_cfg[knowhere::meta::TRACE_FLAGS] = // search_info.trace_ctx_.traceFlags; // } diff --git a/internal/core/unittest/test_tracer.cpp b/internal/core/unittest/test_tracer.cpp index d694dc0cfe..1808fdfa59 100644 --- a/internal/core/unittest/test_tracer.cpp +++ b/internal/core/unittest/test_tracer.cpp @@ -12,10 +12,12 @@ #include #include -#include +#include #include "common/Tracer.h" #include "common/EasyAssert.h" +#include "knowhere/comp/index_param.h" +#include "knowhere/config.h" using namespace milvus; using namespace milvus::tracer; @@ -27,7 +29,7 @@ TEST(Tracer, Init) { config->nodeID = 1; initTelemetry(*config); auto span = StartSpan("test"); - Assert(span->IsRecording()); + ASSERT_TRUE(span->IsRecording()); config = std::make_shared(); config->exporter = "jaeger"; @@ -35,7 +37,7 @@ TEST(Tracer, Init) { config->nodeID = 1; initTelemetry(*config); span = StartSpan("test"); - Assert(span->IsRecording()); + ASSERT_TRUE(span->IsRecording()); } TEST(Tracer, Span) { @@ -66,7 +68,48 @@ TEST(Tracer, Span) { ctx->traceFlags = 1; auto span = StartSpan("test", ctx.get()); - Assert(span->GetContext().trace_id() == trace::TraceId({ctx->traceID, 16})); + ASSERT_TRUE(span->GetContext().trace_id() == + trace::TraceId({ctx->traceID, 16})); + + delete[] ctx->traceID; + delete[] ctx->spanID; +} + +TEST(Tracer, Hex) { + auto ctx = std::make_shared(); + ctx->traceID = new uint8_t[16]{0x01, + 0x23, + 0x45, + 0x67, + 0x89, + 0xab, + 0xcd, + 0xef, + 0xfe, + 0xdc, + 0xba, + 0x98, + 0x76, + 0x54, + 0x32, + 0x10}; + ctx->spanID = + new uint8_t[8]{0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef}; + ctx->traceFlags = 1; + + knowhere::Json search_cfg = {}; + + // save trace context into search conf + search_cfg[knowhere::meta::TRACE_ID] = tracer::GetTraceIDAsHex(ctx.get()); + search_cfg[knowhere::meta::SPAN_ID] = tracer::GetSpanIDAsHex(ctx.get()); + search_cfg[knowhere::meta::TRACE_FLAGS] = ctx->traceFlags; + std::cout << "search config: " << search_cfg.dump() << std::endl; + + auto trace_id_str = HexToString(search_cfg[knowhere::meta::TRACE_ID]); + auto span_id_str = HexToString(search_cfg[knowhere::meta::SPAN_ID]); + + ASSERT_TRUE(strncmp((char*)ctx->traceID, trace_id_str.c_str(), 16) == 0); + ASSERT_TRUE(strncmp((char*)ctx->spanID, span_id_str.c_str(), 8) == 0); delete[] ctx->traceID; delete[] ctx->spanID;