mirror of
https://github.com/XRPLF/rippled.git
synced 2026-07-23 15:10:34 +00:00
fix(telemetry): root peer.validation.receive and peer.proposal.receive spans
These inbound peer-message entry points (kConsumer) used span(), which inherits whatever span is active on the peer thread — including a leaked tx.receive scope — so validations/proposals were wrongly nested under unrelated transaction traces. rootSpan() starts a fresh trace root. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -211,6 +211,11 @@ Controlled by `trace_peer` in `[telemetry]` config. **Enabled by default** (high
|
||||
| `peer.proposal.receive` | — | PeerImp.cpp | Consensus proposal received from peer |
|
||||
| `peer.validation.receive` | — | PeerImp.cpp | Validation message received from peer |
|
||||
|
||||
A `—` parent means the span is a fresh trace root (`kConsumer`): it is started
|
||||
via `SpanGuard::rootSpan()` at the inbound-message entry point and never
|
||||
inherits an ambient span left active on the peer thread, so it does not nest
|
||||
under an unrelated transaction's trace.
|
||||
|
||||
**Where to find**: Tempo → TraceQL: `{resource.service.name="xrpld" && name=~"peer.*"}`
|
||||
|
||||
**Grafana dashboard**: _Peer Network_ (`peer-network`)
|
||||
|
||||
@@ -175,6 +175,12 @@ RED metrics on the _Transaction Overview_ dashboard.
|
||||
| `peer.proposal.receive` | PeerImp.cpp:1667 | `peer_id`, `proposal_trusted` | Proposal received from peer |
|
||||
| `peer.validation.receive` | PeerImp.cpp:2264 | `peer_id`, `validation_trusted` | Validation received from peer |
|
||||
|
||||
Both peer receive spans are `kConsumer` inbound entry points started as fresh
|
||||
trace roots. They never inherit an ambient span left active on the peer thread,
|
||||
so they do not nest under an unrelated transaction's trace. The distributed
|
||||
child span that links back to the sending node is the separate
|
||||
`consensus.*.receive` / `tx.receive` span (see Cross-Node Trace Propagation).
|
||||
|
||||
---
|
||||
|
||||
## Insights and Sample Queries
|
||||
|
||||
@@ -1750,7 +1750,9 @@ void
|
||||
PeerImp::onMessage(std::shared_ptr<protocol::TMProposeSet> const& m)
|
||||
{
|
||||
using namespace telemetry;
|
||||
auto span = SpanGuard::span(TraceCategory::Peer, seg::peer, peer_span::op::proposalReceive);
|
||||
// root: inbound peer message entry point (kConsumer); must not inherit
|
||||
// any span left active on this peer thread.
|
||||
auto span = SpanGuard::rootSpan(TraceCategory::Peer, seg::peer, peer_span::op::proposalReceive);
|
||||
span.setAttribute(peer_span::attr::peerId, static_cast<int64_t>(id_));
|
||||
|
||||
protocol::TMProposeSet const& set = *m;
|
||||
@@ -2367,8 +2369,10 @@ void
|
||||
PeerImp::onMessage(std::shared_ptr<protocol::TMValidation> const& m)
|
||||
{
|
||||
using namespace telemetry;
|
||||
// root: inbound peer message entry point (kConsumer); must not inherit
|
||||
// any span left active on this peer thread.
|
||||
auto valSpan =
|
||||
SpanGuard::span(TraceCategory::Peer, seg::peer, peer_span::op::validationReceive);
|
||||
SpanGuard::rootSpan(TraceCategory::Peer, seg::peer, peer_span::op::validationReceive);
|
||||
valSpan.setAttribute(peer_span::attr::peerId, static_cast<int64_t>(id_));
|
||||
|
||||
if (m->validation().size() < 50)
|
||||
|
||||
Reference in New Issue
Block a user