fix: Save traceID and spanID as hex string into search config (#31071)

Issue: #30961

Signed-off-by: Yudong Cai <yudong.cai@zilliz.com>
pull/31225/head
Cai Yudong 2024-03-11 14:21:01 +08:00 committed by GitHub
parent 425da78b38
commit a99143dd52
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
5 changed files with 87 additions and 16 deletions

View File

@ -12,6 +12,8 @@
#include "Tracer.h"
#include "log/Log.h"
#include <iomanip>
#include <iostream>
#include <utility>
#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<int>(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<char>(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();
}

View File

@ -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

View File

@ -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;
// }

View File

@ -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;
// }

View File

@ -12,10 +12,12 @@
#include <gtest/gtest.h>
#include <memory>
#include <random>
#include <string.h>
#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<TraceConfig>();
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<TraceContext>();
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;