From 2c9528232d597ee3395bd2f68cb20ba495482f69 Mon Sep 17 00:00:00 2001 From: Pratik Mankawde <3397372+pratikmankawde@users.noreply.github.com> Date: Mon, 27 Apr 2026 14:34:47 +0100 Subject: [PATCH] fix(telemetry): use thread_local PRNG for span IDs and update class diagram Replace per-call std::random_device with thread_local std::mt19937 in txSpan() for span ID generation. random_device is ~423x slower due to /dev/urandom syscalls on each construction; mt19937 is seeded once per thread and reused for all subsequent span IDs. Update the SpanGuard class ASCII diagram to include txSpan factory methods that were added in the hash-derived trace ID commit. Co-Authored-By: Claude Opus 4.6 (1M context) --- include/xrpl/telemetry/SpanGuard.h | 36 +++++++++++++++-------------- src/libxrpl/telemetry/SpanGuard.cpp | 4 ++-- 2 files changed, 21 insertions(+), 19 deletions(-) diff --git a/include/xrpl/telemetry/SpanGuard.h b/include/xrpl/telemetry/SpanGuard.h index 691e6ce8dc..11afe36c92 100644 --- a/include/xrpl/telemetry/SpanGuard.h +++ b/include/xrpl/telemetry/SpanGuard.h @@ -9,23 +9,25 @@ Dependency diagram: - +-------------------------------------------+ - | SpanGuard | - +-------------------------------------------+ - | - impl_ : unique_ptr (pimpl) | - +-------------------------------------------+ - | + span(name) : SpanGuard [static] | - | + span(cat, prefix, name) [static] | - | + childSpan(name) : SpanGuard | - | + linkedSpan(name) : SpanGuard | - | + captureContext() : SpanContext | - | + setAttribute(key, value) | - | + setOk() / setError(desc) | - | + addEvent(name) | - | + recordException(e) | - | + discard() | - | + operator bool() | - +-------------------------------------------+ + +------------------------------------------------+ + | SpanGuard | + +------------------------------------------------+ + | - impl_ : unique_ptr (pimpl) | + +------------------------------------------------+ + | + span(name) : SpanGuard [static] | + | + span(cat, prefix, name) [static] | + | + childSpan(name) : SpanGuard | + | + linkedSpan(name) : SpanGuard | + | + txSpan(prefix, name, hash) [static] | + | + txSpan(prefix, name, hash, parent) [static] | + | + captureContext() : SpanContext | + | + setAttribute(key, value) | + | + setOk() / setError(desc) | + | + addEvent(name) | + | + recordException(e) | + | + discard() | + | + operator bool() | + +------------------------------------------------+ | hides (pimpl) +-------+-------+ | | diff --git a/src/libxrpl/telemetry/SpanGuard.cpp b/src/libxrpl/telemetry/SpanGuard.cpp index 9facee670f..71f157d2b2 100644 --- a/src/libxrpl/telemetry/SpanGuard.cpp +++ b/src/libxrpl/telemetry/SpanGuard.cpp @@ -258,9 +258,9 @@ SpanGuard::txSpan( otel_trace::TraceId traceId(opentelemetry::nostd::span(hashData, 16)); std::uint8_t spanIdBytes[8]; - std::random_device rd; + thread_local std::mt19937 prng{std::random_device{}()}; for (auto& b : spanIdBytes) - b = static_cast(rd()); + b = static_cast(prng()); otel_trace::SpanId spanId(opentelemetry::nostd::span(spanIdBytes, 8)); otel_trace::SpanContext syntheticCtx(