205 lines
6.4 KiB
Rust
205 lines
6.4 KiB
Rust
use {
|
|
crate::tpu_connection::ClientStats,
|
|
std::sync::atomic::{AtomicU64, Ordering},
|
|
};
|
|
|
|
#[derive(Default)]
|
|
pub struct ConnectionCacheStats {
|
|
pub(crate) cache_hits: AtomicU64,
|
|
pub(crate) cache_misses: AtomicU64,
|
|
pub(crate) cache_evictions: AtomicU64,
|
|
pub(crate) eviction_time_ms: AtomicU64,
|
|
pub(crate) sent_packets: AtomicU64,
|
|
pub(crate) total_batches: AtomicU64,
|
|
pub(crate) batch_success: AtomicU64,
|
|
pub(crate) batch_failure: AtomicU64,
|
|
pub(crate) get_connection_ms: AtomicU64,
|
|
pub(crate) get_connection_lock_ms: AtomicU64,
|
|
pub(crate) get_connection_hit_ms: AtomicU64,
|
|
pub(crate) get_connection_miss_ms: AtomicU64,
|
|
|
|
// Need to track these separately per-connection
|
|
// because we need to track the base stat value from quinn
|
|
pub total_client_stats: ClientStats,
|
|
}
|
|
|
|
pub(crate) const CONNECTION_STAT_SUBMISSION_INTERVAL: u64 = 2000;
|
|
|
|
impl ConnectionCacheStats {
|
|
pub fn add_client_stats(
|
|
&self,
|
|
client_stats: &ClientStats,
|
|
num_packets: usize,
|
|
is_success: bool,
|
|
) {
|
|
self.total_client_stats.total_connections.fetch_add(
|
|
client_stats.total_connections.load(Ordering::Relaxed),
|
|
Ordering::Relaxed,
|
|
);
|
|
self.total_client_stats.connection_reuse.fetch_add(
|
|
client_stats.connection_reuse.load(Ordering::Relaxed),
|
|
Ordering::Relaxed,
|
|
);
|
|
self.total_client_stats.connection_errors.fetch_add(
|
|
client_stats.connection_errors.load(Ordering::Relaxed),
|
|
Ordering::Relaxed,
|
|
);
|
|
self.total_client_stats.zero_rtt_accepts.fetch_add(
|
|
client_stats.zero_rtt_accepts.load(Ordering::Relaxed),
|
|
Ordering::Relaxed,
|
|
);
|
|
self.total_client_stats.zero_rtt_rejects.fetch_add(
|
|
client_stats.zero_rtt_rejects.load(Ordering::Relaxed),
|
|
Ordering::Relaxed,
|
|
);
|
|
self.total_client_stats.make_connection_ms.fetch_add(
|
|
client_stats.make_connection_ms.load(Ordering::Relaxed),
|
|
Ordering::Relaxed,
|
|
);
|
|
self.total_client_stats.send_timeout.fetch_add(
|
|
client_stats.send_timeout.load(Ordering::Relaxed),
|
|
Ordering::Relaxed,
|
|
);
|
|
self.sent_packets
|
|
.fetch_add(num_packets as u64, Ordering::Relaxed);
|
|
self.total_batches.fetch_add(1, Ordering::Relaxed);
|
|
if is_success {
|
|
self.batch_success.fetch_add(1, Ordering::Relaxed);
|
|
} else {
|
|
self.batch_failure.fetch_add(1, Ordering::Relaxed);
|
|
}
|
|
}
|
|
|
|
pub(crate) fn report(&self) {
|
|
datapoint_info!(
|
|
"quic-client-connection-stats",
|
|
(
|
|
"cache_hits",
|
|
self.cache_hits.swap(0, Ordering::Relaxed),
|
|
i64
|
|
),
|
|
(
|
|
"cache_misses",
|
|
self.cache_misses.swap(0, Ordering::Relaxed),
|
|
i64
|
|
),
|
|
(
|
|
"cache_evictions",
|
|
self.cache_evictions.swap(0, Ordering::Relaxed),
|
|
i64
|
|
),
|
|
(
|
|
"eviction_time_ms",
|
|
self.eviction_time_ms.swap(0, Ordering::Relaxed),
|
|
i64
|
|
),
|
|
(
|
|
"get_connection_ms",
|
|
self.get_connection_ms.swap(0, Ordering::Relaxed),
|
|
i64
|
|
),
|
|
(
|
|
"get_connection_lock_ms",
|
|
self.get_connection_lock_ms.swap(0, Ordering::Relaxed),
|
|
i64
|
|
),
|
|
(
|
|
"get_connection_hit_ms",
|
|
self.get_connection_hit_ms.swap(0, Ordering::Relaxed),
|
|
i64
|
|
),
|
|
(
|
|
"get_connection_miss_ms",
|
|
self.get_connection_miss_ms.swap(0, Ordering::Relaxed),
|
|
i64
|
|
),
|
|
(
|
|
"make_connection_ms",
|
|
self.total_client_stats
|
|
.make_connection_ms
|
|
.swap(0, Ordering::Relaxed),
|
|
i64
|
|
),
|
|
(
|
|
"total_connections",
|
|
self.total_client_stats
|
|
.total_connections
|
|
.swap(0, Ordering::Relaxed),
|
|
i64
|
|
),
|
|
(
|
|
"connection_reuse",
|
|
self.total_client_stats
|
|
.connection_reuse
|
|
.swap(0, Ordering::Relaxed),
|
|
i64
|
|
),
|
|
(
|
|
"connection_errors",
|
|
self.total_client_stats
|
|
.connection_errors
|
|
.swap(0, Ordering::Relaxed),
|
|
i64
|
|
),
|
|
(
|
|
"zero_rtt_accepts",
|
|
self.total_client_stats
|
|
.zero_rtt_accepts
|
|
.swap(0, Ordering::Relaxed),
|
|
i64
|
|
),
|
|
(
|
|
"zero_rtt_rejects",
|
|
self.total_client_stats
|
|
.zero_rtt_rejects
|
|
.swap(0, Ordering::Relaxed),
|
|
i64
|
|
),
|
|
(
|
|
"congestion_events",
|
|
self.total_client_stats.congestion_events.load_and_reset(),
|
|
i64
|
|
),
|
|
(
|
|
"tx_streams_blocked_uni",
|
|
self.total_client_stats
|
|
.tx_streams_blocked_uni
|
|
.load_and_reset(),
|
|
i64
|
|
),
|
|
(
|
|
"tx_data_blocked",
|
|
self.total_client_stats.tx_data_blocked.load_and_reset(),
|
|
i64
|
|
),
|
|
(
|
|
"tx_acks",
|
|
self.total_client_stats.tx_acks.load_and_reset(),
|
|
i64
|
|
),
|
|
(
|
|
"num_packets",
|
|
self.sent_packets.swap(0, Ordering::Relaxed),
|
|
i64
|
|
),
|
|
(
|
|
"total_batches",
|
|
self.total_batches.swap(0, Ordering::Relaxed),
|
|
i64
|
|
),
|
|
(
|
|
"batch_failure",
|
|
self.batch_failure.swap(0, Ordering::Relaxed),
|
|
i64
|
|
),
|
|
(
|
|
"send_timeout",
|
|
self.total_client_stats
|
|
.send_timeout
|
|
.swap(0, Ordering::Relaxed),
|
|
i64
|
|
),
|
|
);
|
|
}
|
|
}
|