libblobd_kv/
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) delete_op_count: AtomicU64,
10
11  pub(crate) read_op_count: AtomicU64,
12  pub(crate) read_op_bytes_sent: AtomicU64,
13  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).
14
15  pub(crate) write_op_count: AtomicU64,
16  pub(crate) write_op_bytes_persisted: AtomicU64,
17  pub(crate) write_op_bytes_padding: AtomicU64, // How many additional unnecessary bytes were written to the device due to alignment (i.e. write amplification).
18
19  // To determine internal fragmentation, subtract `heap_object_data_bytes` from this.
20  pub(crate) allocated_bytes: AtomicU64,
21  pub(crate) heap_object_data_bytes: AtomicU64, // i.e. does not include inline data.
22  pub(crate) object_count: AtomicU64, // Does not include written objects sitting in the log buffer.
23
24  pub(crate) log_buffer_write_entry_count: AtomicU64,
25  pub(crate) log_buffer_write_entry_data_bytes: AtomicU64,
26  pub(crate) log_buffer_delete_entry_count: AtomicU64,
27  pub(crate) log_buffer_virtual_head: AtomicU64,
28  pub(crate) log_buffer_virtual_tail: AtomicU64,
29
30  pub(crate) log_buffer_commit_count: AtomicU64,
31  pub(crate) log_buffer_commit_entry_count: AtomicU64,
32  pub(crate) log_buffer_commit_object_grouping_us: AtomicU64, // How long it took to group entries into bundles and allocate space for object heap moves.
33  pub(crate) log_buffer_commit_object_heap_move_count: AtomicU64, // How many objects were moved to the heap.
34  pub(crate) log_buffer_commit_object_heap_move_bytes: AtomicU64,
35  pub(crate) log_buffer_commit_object_heap_move_write_us: AtomicU64, // How long it took to move objects to the heap.
36  pub(crate) log_buffer_commit_bundle_committed_count: AtomicU64, // This only differs from `log_buffer_commit_bundle_count` while a commit is executing.
37  pub(crate) log_buffer_commit_bundle_count: AtomicU64,
38  pub(crate) log_buffer_commit_bundle_read_us: AtomicU64, // Total amount of time spent reading existing bundles from the device; not equal to wall time since reads are parallelised.
39  pub(crate) log_buffer_commit_bundle_write_us: AtomicU64, // Total amount of time spent writing new bundles to the device; not equal to wall time since writes are parallelised.
40  pub(crate) log_buffer_commit_bundles_update_us: AtomicU64,
41
42  pub(crate) log_buffer_flush_entry_count: AtomicU64, // How many log buffer entries were flushed.
43  pub(crate) log_buffer_flush_count: AtomicU64, // How many log buffer flushes occurred.
44  pub(crate) log_buffer_flush_4k_count: AtomicU64, // How many flushes were [0, 4 KiB] in size excluding padding.
45  pub(crate) log_buffer_flush_64k_count: AtomicU64, // How many flushes were (4 KiB, 64 KiB] in size excluding padding.
46  pub(crate) log_buffer_flush_1m_count: AtomicU64, // How many flushes were (64 KiB, 1 MiB] in size excluding padding.
47  pub(crate) log_buffer_flush_8m_count: AtomicU64, // How many flushes were (1 MiB, 8 MiB] in size excluding padding.
48  pub(crate) log_buffer_flush_data_bytes: AtomicU64,
49  pub(crate) log_buffer_flush_padding_bytes: AtomicU64,
50  pub(crate) log_buffer_flush_write_us: AtomicU64, // How long it took to perform the log buffer flush's device write.
51  pub(crate) log_buffer_flush_total_us: AtomicU64, // How long it took to perform the entire log buffer flush, including the device write and waiting for any antecedent flush to update the overlay and write the virtual tail.
52  pub(crate) log_buffer_flush_state_count: AtomicU64, // How many times the log buffer virtual pointers were updated.
53
54  pub(crate) uring_submission_count: AtomicU64,
55  pub(crate) uring_read_request_count: AtomicU64,
56  pub(crate) uring_read_request_bytes: AtomicU64,
57  pub(crate) uring_read_request_us: AtomicU64,
58  pub(crate) uring_write_request_count: AtomicU64,
59  pub(crate) uring_write_request_bytes: AtomicU64,
60  pub(crate) uring_write_request_us: AtomicU64,
61  pub(crate) uring_sync_request_count: AtomicU64,
62  pub(crate) uring_sync_request_us: AtomicU64,
63}
64
65#[derive(Clone, Default)]
66pub struct BlobdMetrics(pub(crate) Arc<Inner>);
67
68#[rustfmt::skip]
69impl BlobdMetrics {
70  pub fn delete_op_count(&self) -> u64 { self.0.delete_op_count.load(Relaxed) }
71
72  pub fn read_op_count(&self) -> u64 { self.0.read_op_count.load(Relaxed) }
73  pub fn read_op_bytes_sent(&self) -> u64 { self.0.read_op_bytes_sent.load(Relaxed) }
74  pub fn read_op_bytes_discarded(&self) -> u64 { self.0.read_op_bytes_discarded.load(Relaxed) }
75
76  pub fn write_op_count(&self) -> u64 { self.0.write_op_count.load(Relaxed) }
77  pub fn write_op_bytes_persisted(&self) -> u64 { self.0.write_op_bytes_persisted.load(Relaxed) }
78  pub fn write_op_bytes_padding(&self) -> u64 { self.0.write_op_bytes_padding.load(Relaxed) }
79
80  pub fn allocated_bytes(&self) -> u64 { self.0.allocated_bytes.load(Relaxed) }
81  pub fn heap_object_data_bytes(&self) -> u64 { self.0.heap_object_data_bytes.load(Relaxed) }
82  pub fn object_count(&self) -> u64 { self.0.object_count.load(Relaxed) }
83
84  pub fn log_buffer_write_entry_count(&self) -> u64 { self.0.log_buffer_write_entry_count.load(Relaxed) }
85  pub fn log_buffer_write_entry_data_bytes(&self) -> u64 { self.0.log_buffer_write_entry_data_bytes.load(Relaxed) }
86  pub fn log_buffer_delete_entry_count(&self) -> u64 { self.0.log_buffer_delete_entry_count.load(Relaxed) }
87  pub fn log_buffer_virtual_head(&self) -> u64 { self.0.log_buffer_virtual_head.load(Relaxed) }
88  pub fn log_buffer_virtual_tail(&self) -> u64 { self.0.log_buffer_virtual_tail.load(Relaxed) }
89
90  pub fn log_buffer_commit_count(&self) -> u64 { self.0.log_buffer_commit_count.load(Relaxed) }
91  pub fn log_buffer_commit_entry_count(&self) -> u64 { self.0.log_buffer_commit_entry_count.load(Relaxed) }
92  pub fn log_buffer_commit_object_grouping_us(&self) -> u64 { self.0.log_buffer_commit_object_grouping_us.load(Relaxed) }
93  pub fn log_buffer_commit_object_heap_move_count(&self) -> u64 { self.0.log_buffer_commit_object_heap_move_count.load(Relaxed) }
94  pub fn log_buffer_commit_object_heap_move_bytes(&self) -> u64 { self.0.log_buffer_commit_object_heap_move_bytes.load(Relaxed) }
95  pub fn log_buffer_commit_object_heap_move_write_us(&self) -> u64 { self.0.log_buffer_commit_object_heap_move_write_us.load(Relaxed) }
96  pub fn log_buffer_commit_bundle_committed_count(&self) -> u64 { self.0.log_buffer_commit_bundle_committed_count.load(Relaxed) }
97  pub fn log_buffer_commit_bundle_count(&self) -> u64 { self.0.log_buffer_commit_bundle_count.load(Relaxed) }
98  pub fn log_buffer_commit_bundle_read_us(&self) -> u64 { self.0.log_buffer_commit_bundle_read_us.load(Relaxed) }
99  pub fn log_buffer_commit_bundle_write_us(&self) -> u64 { self.0.log_buffer_commit_bundle_write_us.load(Relaxed) }
100  pub fn log_buffer_commit_bundles_update_us(&self) -> u64 { self.0.log_buffer_commit_bundles_update_us.load(Relaxed) }
101
102  pub fn log_buffer_flush_entry_count(&self) -> u64 { self.0.log_buffer_flush_entry_count.load(Relaxed) }
103  pub fn log_buffer_flush_count(&self) -> u64 { self.0.log_buffer_flush_count.load(Relaxed) }
104  pub fn log_buffer_flush_4k_count(&self) -> u64 { self.0.log_buffer_flush_4k_count.load(Relaxed) }
105  pub fn log_buffer_flush_64k_count(&self) -> u64 { self.0.log_buffer_flush_64k_count.load(Relaxed) }
106  pub fn log_buffer_flush_1m_count(&self) -> u64 { self.0.log_buffer_flush_1m_count.load(Relaxed) }
107  pub fn log_buffer_flush_8m_count(&self) -> u64 { self.0.log_buffer_flush_8m_count.load(Relaxed) }
108  pub fn log_buffer_flush_data_bytes(&self) -> u64 { self.0.log_buffer_flush_data_bytes.load(Relaxed) }
109  pub fn log_buffer_flush_padding_bytes(&self) -> u64 { self.0.log_buffer_flush_padding_bytes.load(Relaxed) }
110  pub fn log_buffer_flush_write_us(&self) -> u64 { self.0.log_buffer_flush_write_us.load(Relaxed) }
111  pub fn log_buffer_flush_total_us(&self) -> u64 { self.0.log_buffer_flush_total_us.load(Relaxed) }
112  pub fn log_buffer_flush_state_count(&self) -> u64 { self.0.log_buffer_flush_state_count.load(Relaxed) }
113
114  pub fn uring_submission_count(&self) -> u64 { self.0.uring_submission_count.load(Relaxed) }
115  pub fn uring_read_request_count(&self) -> u64 { self.0.uring_read_request_count.load(Relaxed) }
116  pub fn uring_read_request_bytes(&self) -> u64 { self.0.uring_read_request_bytes.load(Relaxed) }
117  pub fn uring_read_request_us(&self) -> u64 { self.0.uring_read_request_us.load(Relaxed) }
118  pub fn uring_write_request_count(&self) -> u64 { self.0.uring_write_request_count.load(Relaxed) }
119  pub fn uring_write_request_bytes(&self) -> u64 { self.0.uring_write_request_bytes.load(Relaxed) }
120  pub fn uring_write_request_us(&self) -> u64 { self.0.uring_write_request_us.load(Relaxed) }
121  pub fn uring_sync_request_count(&self) -> u64 { self.0.uring_sync_request_count.load(Relaxed) }
122  pub fn uring_sync_request_us(&self) -> u64 { self.0.uring_sync_request_us.load(Relaxed) }
123}