pub struct Metrics { /* private fields */ }Expand description
Lock-free counters for BEAM actor sends, drops, and hot-path throughput.
Cheap to share via Arc<Metrics>. Designed to be passed via
ActorContext (Composition-Root IoC) so any actor can record
metrics without coupling to a global registry.
All counters are cumulative for the lifetime of the Metrics
instance. They never reset — start a new Metrics if you need
per-window observation.
§Counter semantics
§Drop & quorum counters (original)
dropped_sends: incremented whenAddr::sendreturnsErr(())in a fire-and-forget context. The primary “silent drop is no longer invisible” counter.reaped_quorums: incremented when the quorum reaper evicts an expired entry. Indicates that quorum timeouts are happening.put_acks_seen: incremented when a Node receives any Put ack.put_acks_quorum: incremented when a Put ack completes a quorum (the__quorum_met__sentinel fired).
§Hot-path counters (v0.11.0)
These trace the relay hot path: WebSocket → parse → router → serialize → WebSocket. Under load, the ratio between these counters reveals the bottleneck:
- If
messages_parsed>>messages_relayed→ dedup is dropping most messages - If
messages_relayed>>ws_messages_sent→ serialization or I/O is the bottleneck - If
ws_messages_received≈messages_parsed→ parse is keeping up subscriber_fanout_total / messages_relayed→ average fanout ratio
Implementations§
Source§impl Metrics
impl Metrics
Sourcepub fn record_dropped_send(&self)
pub fn record_dropped_send(&self)
Record that a fire-and-forget send was dropped.
Call this when Addr::send(msg) returns Err(()) in a
context where you accept the loss but want to know it happened.
Sourcepub fn record_reaped_quorum(&self)
pub fn record_reaped_quorum(&self)
Record that the quorum reaper evicted an expired entry.
Sourcepub fn record_put_ack(&self)
pub fn record_put_ack(&self)
Record that a Put ack was received.
Sourcepub fn record_quorum_ack(&self)
pub fn record_quorum_ack(&self)
Record that a Put ack completed a quorum.
Sourcepub fn record_parsed(&self)
pub fn record_parsed(&self)
Record that a wire message was parsed from JSON into a Message struct.
Called at the entry point of every inbound message —
Message::try_from. This is the first counter in the hot path.
Sourcepub fn record_relayed(&self)
pub fn record_relayed(&self)
Record that a Put was successfully relayed to peers/subscribers.
Called in Router::handle_put_relay after fan-out completes.
Sourcepub fn record_dropped_dup(&self)
pub fn record_dropped_dup(&self)
Record that a message was dropped by the dedup gate.
Called in Router::handle_put when Dup::check returns true.
Sourcepub fn record_serialization(&self)
pub fn record_serialization(&self)
Record a wire-format serialization call.
Called in Message::to_string / Put::to_string.
Sourcepub fn record_subscriber_fanout(&self, count: u64)
pub fn record_subscriber_fanout(&self, count: u64)
Record subscriber deliveries from a relay fan-out.
Called in Router::handle_put_relay with the number of
subscribers that received this message. Pass 0 if no
subscribers were present (the relay still happened, just
nobody was listening).
Sourcepub fn record_ws_received(&self)
pub fn record_ws_received(&self)
Record an inbound WebSocket message frame.
Called in WsConn::handle on each incoming Text or Binary frame.
Sourcepub fn record_ws_sent(&self)
pub fn record_ws_sent(&self)
Record an outbound WebSocket message frame.
Called on each successful WsConn send.
Sourcepub fn record_dropped_ham(&self)
pub fn record_dropped_ham(&self)
Record that a Put was dropped by the HAM stale-data pre-filter.
Called in Router::handle_put when ham_filter returns false.
Each increment represents a Put that was not forwarded to storage
or relayed — work avoided, not just work made cheaper.
Sourcepub fn snapshot(&self) -> MetricsSnapshot
pub fn snapshot(&self) -> MetricsSnapshot
Read all counters as a plain struct.
Non-atomic across counters — values may be slightly inconsistent. Acceptable for telemetry; do not use for control flow.