thunder/server/
metrics.rs1use std::sync::atomic::{AtomicU64, Ordering};
8use std::time::Duration;
9
10#[derive(Debug, Default)]
13pub(crate) struct Metrics {
14 connections: AtomicU64,
15 commands_total: AtomicU64,
16 commands_error_total: AtomicU64,
17 command_duration_microseconds_total: AtomicU64,
18 frame_bytes_in_total: AtomicU64,
19 frame_bytes_out_total: AtomicU64,
20 slow_commands_total: AtomicU64,
21}
22
23impl Metrics {
24 pub(crate) fn connection_opened(&self) {
26 self.connections.fetch_add(1, Ordering::Relaxed);
27 }
28
29 pub(crate) fn connection_closed(&self) {
31 self.connections.fetch_sub(1, Ordering::Relaxed);
32 }
33
34 pub(crate) fn record_command(
38 &self,
39 in_bytes: usize,
40 out_bytes: usize,
41 duration: Duration,
42 is_error: bool,
43 slow_threshold: Duration,
44 ) {
45 self.commands_total.fetch_add(1, Ordering::Relaxed);
46 if is_error {
47 self.commands_error_total.fetch_add(1, Ordering::Relaxed);
48 }
49 self.command_duration_microseconds_total
50 .fetch_add(duration.as_micros() as u64, Ordering::Relaxed);
51 self.frame_bytes_in_total
52 .fetch_add(in_bytes as u64, Ordering::Relaxed);
53 self.frame_bytes_out_total
54 .fetch_add(out_bytes as u64, Ordering::Relaxed);
55 if !slow_threshold.is_zero() && duration >= slow_threshold {
56 self.slow_commands_total.fetch_add(1, Ordering::Relaxed);
57 }
58 }
59
60 pub(crate) fn record_push(&self, out_bytes: usize) {
63 self.frame_bytes_out_total
64 .fetch_add(out_bytes as u64, Ordering::Relaxed);
65 }
66
67 pub(crate) fn snapshot(&self) -> MetricsSnapshot {
69 MetricsSnapshot {
70 connections: self.connections.load(Ordering::Relaxed),
71 commands_total: self.commands_total.load(Ordering::Relaxed),
72 commands_error_total: self.commands_error_total.load(Ordering::Relaxed),
73 command_duration_microseconds_total: self
74 .command_duration_microseconds_total
75 .load(Ordering::Relaxed),
76 frame_bytes_in_total: self.frame_bytes_in_total.load(Ordering::Relaxed),
77 frame_bytes_out_total: self.frame_bytes_out_total.load(Ordering::Relaxed),
78 slow_commands_total: self.slow_commands_total.load(Ordering::Relaxed),
79 }
80 }
81}
82
83#[derive(Debug, Clone, Copy, Default, PartialEq, Eq)]
86pub struct MetricsSnapshot {
87 pub connections: u64,
89 pub commands_total: u64,
91 pub commands_error_total: u64,
93 pub command_duration_microseconds_total: u64,
95 pub frame_bytes_in_total: u64,
97 pub frame_bytes_out_total: u64,
99 pub slow_commands_total: u64,
101}