diff --git a/src/xrpld/app/misc/NetworkOPs.cpp b/src/xrpld/app/misc/NetworkOPs.cpp index 33c2b04d36..b02e4c4cf7 100644 --- a/src/xrpld/app/misc/NetworkOPs.cpp +++ b/src/xrpld/app/misc/NetworkOPs.cpp @@ -34,6 +34,7 @@ #include #include #include +#include #include #include @@ -1313,9 +1314,10 @@ NetworkOPsImp::processTransaction( FailHard failType) { using namespace telemetry; - auto span = SpanGuard::span(TraceCategory::Transactions, "tx", "process"); - span.setAttribute("xrpl.tx.hash", to_string(transaction->getID()).c_str()); - span.setAttribute("xrpl.tx.local", bLocal); + auto span = + SpanGuard::span(TraceCategory::Transactions, tx_span::prefix::tx, tx_span::op::process); + span.setAttribute(tx_span::attr::hash, to_string(transaction->getID()).c_str()); + span.setAttribute(tx_span::attr::local, bLocal); auto ev = m_job_queue.makeLoadEvent(jtTXN_PROC, "ProcessTXN"); @@ -1325,12 +1327,12 @@ NetworkOPsImp::processTransaction( if (bLocal) { - span.setAttribute("xrpl.tx.path", "sync"); + span.setAttribute(tx_span::attr::path, tx_span::val::sync); doTransactionSync(transaction, bUnlimited, failType); } else { - span.setAttribute("xrpl.tx.path", "async"); + span.setAttribute(tx_span::attr::path, tx_span::val::async); doTransactionAsync(transaction, bUnlimited, failType); } } diff --git a/src/xrpld/overlay/detail/PeerImp.cpp b/src/xrpld/overlay/detail/PeerImp.cpp index 8902749f92..4c4b6acc92 100644 --- a/src/xrpld/overlay/detail/PeerImp.cpp +++ b/src/xrpld/overlay/detail/PeerImp.cpp @@ -21,6 +21,7 @@ #include #include #include +#include #include #include @@ -1423,10 +1424,11 @@ PeerImp::handleTransaction( bool batch) { using namespace telemetry; - auto span = SpanGuard::span(TraceCategory::Transactions, "tx", "receive"); - span.setAttribute("xrpl.peer.id", static_cast(id_)); + auto span = + SpanGuard::span(TraceCategory::Transactions, tx_span::prefix::tx, tx_span::op::receive); + span.setAttribute(tx_span::attr::peerId, static_cast(id_)); if (auto const version = getVersion(); !version.empty()) - span.setAttribute("xrpl.peer.version", version.c_str()); + span.setAttribute(tx_span::attr::peerVersion, version.c_str()); XRPL_ASSERT(eraseTxQueue != batch, ("xrpl::PeerImp::handleTransaction : valid inputs")); if (tracking_.load() == Tracking::diverged) @@ -1446,7 +1448,7 @@ PeerImp::handleTransaction( { auto stx = std::make_shared(sit); uint256 const txID = stx->getTransactionID(); - span.setAttribute("xrpl.tx.hash", to_string(txID).c_str()); + span.setAttribute(tx_span::attr::hash, to_string(txID).c_str()); // Charge strongly for attempting to relay a txn with tfInnerBatchTxn // LCOV_EXCL_START @@ -1480,11 +1482,11 @@ PeerImp::handleTransaction( if (!app_.getHashRouter().shouldProcess(txID, id_, flags, tx_interval)) { - span.setAttribute("xrpl.tx.suppressed", true); + span.setAttribute(tx_span::attr::suppressed, true); // we have seen this transaction recently if (any(flags & HashRouterFlags::BAD)) { - span.setAttribute("xrpl.tx.status", "known_bad"); + span.setAttribute(tx_span::attr::status, tx_span::val::knownBad); fee_.update(Resource::feeUselessData, "known bad"); JLOG(p_journal_.debug()) << "Ignoring known bad tx " << txID; } diff --git a/src/xrpld/telemetry/TxSpanNames.h b/src/xrpld/telemetry/TxSpanNames.h new file mode 100644 index 0000000000..1401e10c2a --- /dev/null +++ b/src/xrpld/telemetry/TxSpanNames.h @@ -0,0 +1,72 @@ +#pragma once + +/** Compile-time span name constants for transaction tracing. + * + * Used by PeerImp (overlay) and NetworkOPs (app) for transaction + * lifecycle spans. Built on StaticStr/join() from SpanNames.h. + * + * Span hierarchy: + * + * Node A (sender) Node B (receiver) + * +------------------+ +------------------+ + * | tx.process | protobuf | tx.receive | + * | injectTo | ---------> | extractFrom | + * | Protobuf() | trace_ctx | Protobuf() | + * +------------------+ +------------------+ + */ + +#include + +namespace xrpl { +namespace telemetry { +namespace tx_span { + +// ===== Span prefixes ======================================================= + +namespace prefix { +/// "tx" — root prefix for transaction lifecycle spans. +inline constexpr auto tx = seg::tx; +} // namespace prefix + +// ===== Span operation suffixes ============================================= + +namespace op { +inline constexpr auto receive = makeStr("receive"); +inline constexpr auto process = makeStr("process"); +} // namespace op + +// ===== Attribute keys ====================================================== + +namespace attr { +inline constexpr auto xrplTx = join(seg::xrpl, seg::tx); + +/// "xrpl.tx.hash" +inline constexpr auto hash = join(xrplTx, makeStr("hash")); +/// "xrpl.tx.local" +inline constexpr auto local = join(xrplTx, makeStr("local")); +/// "xrpl.tx.path" +inline constexpr auto path = join(xrplTx, makeStr("path")); +/// "xrpl.tx.suppressed" +inline constexpr auto suppressed = join(xrplTx, makeStr("suppressed")); +/// "xrpl.tx.status" +inline constexpr auto status = join(xrplTx, makeStr("status")); + +inline constexpr auto xrplPeer = join(seg::xrpl, seg::peer); + +/// "xrpl.peer.id" +inline constexpr auto peerId = join(xrplPeer, makeStr("id")); +/// "xrpl.peer.version" +inline constexpr auto peerVersion = join(xrplPeer, makeStr("version")); +} // namespace attr + +// ===== Attribute values ==================================================== + +namespace val { +inline constexpr auto sync = makeStr("sync"); +inline constexpr auto async = makeStr("async"); +inline constexpr auto knownBad = makeStr("known_bad"); +} // namespace val + +} // namespace tx_span +} // namespace telemetry +} // namespace xrpl