aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorOleg Shatov <35371391+domwst@users.noreply.github.com>2023-12-21 08:29:02 +0600
committerGitHub <noreply@github.com>2023-12-21 08:29:02 +0600
commit2f0b10a6842a50ce0577d7a41b83581310c1203e (patch)
tree331604137128e611bff960e4992e01cde0405f81
parentadc4da7d985c95a79c4ca845423f8afe2a903b0d (diff)
downloadydb-2f0b10a6842a50ce0577d7a41b83581310c1203e.tar.gz
KIKIMR-20533 Implemented conversion from OTEL header to traceId (#607)
* KIKIMR-20533 Implemented conversion from OTEL header to traceId
-rw-r--r--ydb/library/actors/wilson/wilson_trace.cpp63
-rw-r--r--ydb/library/actors/wilson/wilson_trace.h10
2 files changed, 67 insertions, 6 deletions
diff --git a/ydb/library/actors/wilson/wilson_trace.cpp b/ydb/library/actors/wilson/wilson_trace.cpp
index 73bed31da3..babcde2e95 100644
--- a/ydb/library/actors/wilson/wilson_trace.cpp
+++ b/ydb/library/actors/wilson/wilson_trace.cpp
@@ -1,4 +1,67 @@
#include "wilson_trace.h"
+#include <util/generic/algorithm.h>
+#include <util/string/hex.h>
+
namespace NWilson {
+ TTraceId TTraceId::FromTraceparentHeader(const TStringBuf header) {
+ constexpr size_t versionChars = 2; // Only version 0 is supported
+ constexpr size_t versionStart = 0;
+
+ constexpr size_t traceIdChars = 32;
+ constexpr size_t traceIdStart = versionStart + versionChars + 1;
+ static_assert(traceIdChars == TTraceId::GetTraceIdSize() * 2);
+
+ constexpr size_t parentSpanIdChars = 16;
+ constexpr size_t parentSpanIdStart = traceIdStart + traceIdChars + 1;
+ static_assert(parentSpanIdChars == TTraceId::GetSpanIdSize() * 2);
+
+ constexpr size_t traceFlagsChars = 2;
+ constexpr size_t traceFlagsStart = parentSpanIdStart + parentSpanIdChars + 1;
+
+ constexpr size_t expectedHeaderSize =
+ versionChars + traceIdChars + parentSpanIdChars + traceFlagsChars + 3;
+
+ if (header.Size() != expectedHeaderSize) {
+ return {};
+ }
+
+ auto isHex = [](char c) {
+ return (c >= '0' && c <= '9') || (c >= 'A' && c <= 'F') || (c >= 'a' && c <= 'f');
+ };
+
+ if (!AllOf(header.substr(versionStart, versionChars), isHex) ||
+ !AllOf(header.substr(traceIdStart, traceIdChars), isHex) ||
+ !AllOf(header.substr(parentSpanIdStart, parentSpanIdChars), isHex) ||
+ !AllOf(header.substr(traceFlagsStart, traceFlagsChars), isHex)) {
+ return {};
+ }
+
+ if (header[traceIdStart - 1] != '-' || header[parentSpanIdStart - 1] != '-' || header[traceIdChars - 1] != '-') {
+ return {};
+ }
+
+ ui8 version;
+ HexDecode(header.Data(), versionChars, &version);
+ if (version != 0) {
+ return {};
+ }
+
+ TTrace traceId;
+ ui64 spanId;
+ static_assert(traceIdChars == 2 * sizeof(traceId));
+ static_assert(parentSpanIdChars == 2 * sizeof(spanId));
+ HexDecode(header.Data() + traceIdStart, traceIdChars, &traceId);
+ HexDecode(header.Data() + parentSpanIdStart, parentSpanIdChars, &spanId);
+
+ if ((traceId[0] == 0 && traceId[1] == 0) || spanId == 0) {
+ return {};
+ }
+
+ return TTraceId(traceId, spanId, 15, Max<ui32>());
+ }
+
+ TString TTraceId::GetHexTraceId() const {
+ return HexEncode(GetTraceIdPtr(), GetTraceIdSize());
+ }
}
diff --git a/ydb/library/actors/wilson/wilson_trace.h b/ydb/library/actors/wilson/wilson_trace.h
index 2cba7e4bda..07f5172a3a 100644
--- a/ydb/library/actors/wilson/wilson_trace.h
+++ b/ydb/library/actors/wilson/wilson_trace.h
@@ -5,11 +5,9 @@
#include <library/cpp/string_utils/base64/base64.h>
-#include <util/stream/output.h>
#include <util/random/random.h>
#include <util/random/fast.h>
-
-#include <util/string/hex.h>
+#include <util/stream/output.h>
#include <util/string/printf.h>
#include <array>
@@ -186,6 +184,8 @@ namespace NWilson {
return TTraceId();
}
+ static TTraceId FromTraceparentHeader(const TStringBuf header);
+
TTraceId Span(ui8 verbosity) const {
Validate();
if (!*this || !TimeToLive) {
@@ -223,9 +223,7 @@ namespace NWilson {
const void *GetSpanIdPtr() const { return &SpanId; }
static constexpr size_t GetSpanIdSize() { return sizeof(ui64); }
- TString GetHexTraceId() const {
- return HexEncode(GetTraceIdPtr(), GetTraceIdSize());
- }
+ TString GetHexTraceId() const;
void Validate() const {
Y_DEBUG_ABORT_UNLESS(*this || !SpanId);