use metriken::{Gauge, ShardedCounterGroup, metric};
#[metric(
name = "ringline/connections",
description = "Connection lifecycle counters"
)]
pub static CONNECTIONS: ShardedCounterGroup = ShardedCounterGroup::new(2);
#[metric(name = "ringline/bytes", description = "Byte transfer counters")]
pub static BYTES: ShardedCounterGroup = ShardedCounterGroup::new(3);
#[metric(name = "ringline/ring", description = "Ring utilization counters")]
pub static RING: ShardedCounterGroup = ShardedCounterGroup::new(5);
#[metric(name = "ringline/pool", description = "Pool exhaustion counters")]
pub static POOL: ShardedCounterGroup = ShardedCounterGroup::new(6);
#[metric(name = "ringline/udp", description = "UDP counters")]
pub static UDP: ShardedCounterGroup = ShardedCounterGroup::new(4);
#[metric(
name = "ringline/connections/active",
description = "Currently active connections"
)]
pub static CONNECTIONS_ACTIVE: Gauge = Gauge::new();
pub mod conn {
pub const ACCEPTED: usize = 0;
pub const CLOSED: usize = 1;
}
pub mod bytes {
pub const RECEIVED: usize = 0;
pub const SENT: usize = 1;
pub const FALLBACK_RECEIVED: usize = 2;
}
pub mod ring {
pub const CQE_PROCESSED: usize = 0;
pub const SQE_SUBMIT_FAILURES: usize = 1;
pub const CLOSE_SUBMIT_FAILURES: usize = 2;
pub const RECV_ARM_FAILURES: usize = 3;
pub const CQE_UNKNOWN_TAG: usize = 4;
}
pub mod pool {
pub const SEND_EXHAUSTED: usize = 0;
pub const TIMER_EXHAUSTED: usize = 1;
pub const BUFFER_RING_EMPTY: usize = 2;
pub const SEND_EAGAIN: usize = 3;
pub const RECV_PARKED: usize = 4;
pub const RECV_FALLBACK: usize = 5;
}
pub mod udp {
pub const DATAGRAMS_RECEIVED: usize = 0;
pub const DATAGRAMS_SENT: usize = 1;
pub const SEND_ERRORS: usize = 2;
pub const DATAGRAMS_DROPPED: usize = 3;
}
pub fn init_metadata() {
CONNECTIONS.insert_metadata(conn::ACCEPTED, "op".into(), "accepted".into());
CONNECTIONS.insert_metadata(conn::CLOSED, "op".into(), "closed".into());
BYTES.insert_metadata(bytes::RECEIVED, "op".into(), "received".into());
BYTES.insert_metadata(bytes::SENT, "op".into(), "sent".into());
BYTES.insert_metadata(
bytes::FALLBACK_RECEIVED,
"op".into(),
"fallback_received".into(),
);
RING.insert_metadata(ring::CQE_PROCESSED, "op".into(), "cqe_processed".into());
RING.insert_metadata(
ring::SQE_SUBMIT_FAILURES,
"op".into(),
"sqe_submit_failures".into(),
);
RING.insert_metadata(
ring::CLOSE_SUBMIT_FAILURES,
"op".into(),
"close_submit_failures".into(),
);
RING.insert_metadata(
ring::RECV_ARM_FAILURES,
"op".into(),
"recv_arm_failures".into(),
);
RING.insert_metadata(ring::CQE_UNKNOWN_TAG, "op".into(), "cqe_unknown_tag".into());
POOL.insert_metadata(pool::SEND_EXHAUSTED, "op".into(), "send_exhausted".into());
POOL.insert_metadata(pool::TIMER_EXHAUSTED, "op".into(), "timer_exhausted".into());
POOL.insert_metadata(
pool::BUFFER_RING_EMPTY,
"op".into(),
"buffer_ring_empty".into(),
);
POOL.insert_metadata(pool::SEND_EAGAIN, "op".into(), "send_eagain".into());
POOL.insert_metadata(pool::RECV_PARKED, "op".into(), "recv_parked".into());
POOL.insert_metadata(pool::RECV_FALLBACK, "op".into(), "recv_fallback".into());
UDP.insert_metadata(
udp::DATAGRAMS_RECEIVED,
"op".into(),
"datagrams_received".into(),
);
UDP.insert_metadata(udp::DATAGRAMS_SENT, "op".into(), "datagrams_sent".into());
UDP.insert_metadata(udp::SEND_ERRORS, "op".into(), "send_errors".into());
UDP.insert_metadata(
udp::DATAGRAMS_DROPPED,
"op".into(),
"datagrams_dropped".into(),
);
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn declared_indices_are_in_bounds() {
for idx in [conn::ACCEPTED, conn::CLOSED] {
assert!(
CONNECTIONS.increment(idx),
"CONNECTIONS[{idx}] out of bounds"
);
}
for idx in [bytes::RECEIVED, bytes::SENT, bytes::FALLBACK_RECEIVED] {
assert!(BYTES.increment(idx), "BYTES[{idx}] out of bounds");
}
for idx in [
ring::CQE_PROCESSED,
ring::SQE_SUBMIT_FAILURES,
ring::CLOSE_SUBMIT_FAILURES,
ring::RECV_ARM_FAILURES,
ring::CQE_UNKNOWN_TAG,
] {
assert!(RING.increment(idx), "RING[{idx}] out of bounds");
}
for idx in [
pool::SEND_EXHAUSTED,
pool::TIMER_EXHAUSTED,
pool::BUFFER_RING_EMPTY,
pool::SEND_EAGAIN,
pool::RECV_PARKED,
pool::RECV_FALLBACK,
] {
assert!(POOL.increment(idx), "POOL[{idx}] out of bounds");
}
for idx in [
udp::DATAGRAMS_RECEIVED,
udp::DATAGRAMS_SENT,
udp::SEND_ERRORS,
udp::DATAGRAMS_DROPPED,
] {
assert!(UDP.increment(idx), "UDP[{idx}] out of bounds");
}
}
}