Refactor AddressBook metrics into their own struct
And provide an accessor function for address book metrics.
This commit is contained in:
parent
fc4b8c1e70
commit
6a342e93ca
|
@ -23,6 +23,28 @@ pub struct AddressBook {
|
||||||
span: Span,
|
span: Span,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Metrics about the states of the addresses in an [`AddressBook`].
|
||||||
|
#[derive(Debug)]
|
||||||
|
pub struct AddressMetrics {
|
||||||
|
/// The number of addresses in the `Responded` state.
|
||||||
|
responded: usize,
|
||||||
|
|
||||||
|
/// The number of addresses in the `NeverAttempted` state.
|
||||||
|
never_attempted: usize,
|
||||||
|
|
||||||
|
/// The number of addresses in the `Failed` state.
|
||||||
|
failed: usize,
|
||||||
|
|
||||||
|
/// The number of addresses in the `AttemptPending` state.
|
||||||
|
attempt_pending: usize,
|
||||||
|
|
||||||
|
/// The number of `Responded` addresses within the liveness limit.
|
||||||
|
recently_live: usize,
|
||||||
|
|
||||||
|
/// The number of `Responded` addresses outside the liveness limit.
|
||||||
|
recently_stopped_responding: usize,
|
||||||
|
}
|
||||||
|
|
||||||
#[allow(clippy::len_without_is_empty)]
|
#[allow(clippy::len_without_is_empty)]
|
||||||
impl AddressBook {
|
impl AddressBook {
|
||||||
/// Construct an `AddressBook` with the given [`tracing::Span`].
|
/// Construct an `AddressBook` with the given [`tracing::Span`].
|
||||||
|
@ -219,42 +241,50 @@ impl AddressBook {
|
||||||
self.by_addr.len()
|
self.by_addr.len()
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Update the metrics for this address book.
|
/// Returns metrics for the addresses in this address book.
|
||||||
fn update_metrics(&self) {
|
pub fn address_metrics(&self) -> AddressMetrics {
|
||||||
let _guard = self.span.enter();
|
|
||||||
|
|
||||||
let responded = self.state_peers(PeerAddrState::Responded).count();
|
let responded = self.state_peers(PeerAddrState::Responded).count();
|
||||||
let never_attempted = self.state_peers(PeerAddrState::NeverAttempted).count();
|
let never_attempted = self.state_peers(PeerAddrState::NeverAttempted).count();
|
||||||
let failed = self.state_peers(PeerAddrState::Failed).count();
|
let failed = self.state_peers(PeerAddrState::Failed).count();
|
||||||
let pending = self.state_peers(PeerAddrState::AttemptPending).count();
|
let attempt_pending = self.state_peers(PeerAddrState::AttemptPending).count();
|
||||||
|
|
||||||
let recently_live = self.recently_live_peers().count();
|
let recently_live = self.recently_live_peers().count();
|
||||||
let recently_stopped_responding = responded
|
let recently_stopped_responding = responded
|
||||||
.checked_sub(recently_live)
|
.checked_sub(recently_live)
|
||||||
.expect("all recently live peers must have responded");
|
.expect("all recently live peers must have responded");
|
||||||
|
|
||||||
|
AddressMetrics {
|
||||||
|
responded,
|
||||||
|
never_attempted,
|
||||||
|
failed,
|
||||||
|
attempt_pending,
|
||||||
|
recently_live,
|
||||||
|
recently_stopped_responding,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Update the metrics for this address book.
|
||||||
|
fn update_metrics(&self) {
|
||||||
|
let _guard = self.span.enter();
|
||||||
|
|
||||||
|
let m = self.address_metrics();
|
||||||
|
|
||||||
|
// TODO: rename to address_book.[state_name]
|
||||||
|
metrics::gauge!("candidate_set.responded", m.responded as f64);
|
||||||
|
metrics::gauge!("candidate_set.gossiped", m.never_attempted as f64);
|
||||||
|
metrics::gauge!("candidate_set.failed", m.failed as f64);
|
||||||
|
metrics::gauge!("candidate_set.pending", m.attempt_pending as f64);
|
||||||
|
|
||||||
// TODO: rename to address_book.responded.recently_live
|
// TODO: rename to address_book.responded.recently_live
|
||||||
metrics::gauge!("candidate_set.recently_live", recently_live as f64);
|
metrics::gauge!("candidate_set.recently_live", m.recently_live as f64);
|
||||||
// TODO: rename to address_book.responded.stopped_responding
|
// TODO: rename to address_book.responded.stopped_responding
|
||||||
metrics::gauge!(
|
metrics::gauge!(
|
||||||
"candidate_set.disconnected",
|
"candidate_set.disconnected",
|
||||||
recently_stopped_responding as f64
|
m.recently_stopped_responding as f64
|
||||||
);
|
);
|
||||||
|
|
||||||
// TODO: rename to address_book.[state_name]
|
|
||||||
metrics::gauge!("candidate_set.responded", responded as f64);
|
|
||||||
metrics::gauge!("candidate_set.gossiped", never_attempted as f64);
|
|
||||||
metrics::gauge!("candidate_set.failed", failed as f64);
|
|
||||||
metrics::gauge!("candidate_set.pending", pending as f64);
|
|
||||||
|
|
||||||
debug!(
|
debug!(
|
||||||
%recently_live,
|
address_metrics = ?m,
|
||||||
%recently_stopped_responding,
|
|
||||||
%responded,
|
|
||||||
%never_attempted,
|
|
||||||
%failed,
|
|
||||||
%pending,
|
|
||||||
"address book peers"
|
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue