libblobd_direct/
metrics.rs

1use std::sync::atomic::AtomicU64;
2use std::sync::atomic::Ordering::Relaxed;
3use std::sync::Arc;
4
5#[rustfmt::skip]
6#[derive(Default)]
7pub(crate) struct Inner {
8  // For all `*_op_*` metrics, only successful calls are considered.
9  pub(crate) commit_op_count: AtomicU64,
10  pub(crate) create_op_count: AtomicU64,
11  pub(crate) delete_op_count: AtomicU64,
12  pub(crate) inspect_op_count: AtomicU64,
13
14  pub(crate) read_op_count: AtomicU64,
15  pub(crate) read_op_bytes_requested: AtomicU64,
16  pub(crate) read_op_bytes_sent: AtomicU64,
17  pub(crate) read_op_bytes_discarded: AtomicU64, // How many additional bytes were read from the device but not actually used due to alignment (i.e. read amplification).
18
19  pub(crate) write_op_count: AtomicU64,
20  pub(crate) write_op_bytes_requested: AtomicU64,
21  pub(crate) write_op_bytes_written: AtomicU64,
22
23  // To determine internal fragmentation, subtract `object_metadata_bytes + object_data_bytes` from this.
24  pub(crate) allocated_bytes: AtomicU64,
25  pub(crate) object_metadata_bytes: AtomicU64, // This includes incomplete objects.
26  pub(crate) object_data_bytes: AtomicU64, // This includes incomplete objects.
27
28  pub(crate) incomplete_object_count: AtomicU64,
29  pub(crate) committed_object_count: AtomicU64,
30}
31
32#[derive(Clone, Default)]
33pub struct BlobdMetrics(pub(crate) Arc<Inner>);
34
35#[rustfmt::skip]
36impl BlobdMetrics {
37  pub fn commit_op_count(&self) -> u64 { self.0.commit_op_count.load(Relaxed) }
38  pub fn create_op_count(&self) -> u64 { self.0.create_op_count.load(Relaxed) }
39  pub fn delete_op_count(&self) -> u64 { self.0.delete_op_count.load(Relaxed) }
40  pub fn inspect_op_count(&self) -> u64 { self.0.inspect_op_count.load(Relaxed) }
41
42  pub fn read_op_count(&self) -> u64 { self.0.read_op_count.load(Relaxed) }
43  pub fn read_op_bytes_requested(&self) -> u64 { self.0.read_op_bytes_requested.load(Relaxed) }
44  pub fn read_op_bytes_sent(&self) -> u64 { self.0.read_op_bytes_sent.load(Relaxed) }
45  pub fn read_op_bytes_discarded(&self) -> u64 { self.0.read_op_bytes_discarded.load(Relaxed) }
46
47  pub fn write_op_count(&self) -> u64 { self.0.write_op_count.load(Relaxed) }
48  pub fn write_op_bytes_requested(&self) -> u64 { self.0.write_op_bytes_requested.load(Relaxed) }
49  pub fn write_op_bytes_written(&self) -> u64 { self.0.write_op_bytes_written.load(Relaxed) }
50
51  pub fn allocated_bytes(&self) -> u64 { self.0.allocated_bytes.load(Relaxed) }
52  pub fn object_metadata_bytes(&self) -> u64 { self.0.object_metadata_bytes.load(Relaxed) }
53  pub fn object_data_bytes(&self) -> u64 { self.0.object_data_bytes.load(Relaxed) }
54
55  pub fn incomplete_object_count(&self) -> u64 { self.0.incomplete_object_count.load(Relaxed) }
56  pub fn committed_object_count(&self) -> u64 { self.0.committed_object_count.load(Relaxed) }
57}