ic_backup/ops/persistence/download_journal/metrics/
mod.rs1use super::DownloadJournalGuard;
4pub use ic_metrics::MeasurementSummary;
9use std::{
10 sync::PoisonError,
11 time::{Duration, Instant},
12};
13
14#[derive(Clone, Copy, Debug, Default, Eq, PartialEq)]
27pub struct IcSnapshotLocalMetrics {
28 verification_success_ns: MeasurementSummary,
29 verification_failure_ns: MeasurementSummary,
30 upload_metadata_success_ns: MeasurementSummary,
31 upload_metadata_failure_ns: MeasurementSummary,
32 upload_data_success_ns: MeasurementSummary,
33 upload_data_failure_ns: MeasurementSummary,
34 prepared_chunk_bytes: MeasurementSummary,
35}
36
37impl IcSnapshotLocalMetrics {
38 #[must_use]
40 pub const fn verification_success_ns(self) -> MeasurementSummary {
41 self.verification_success_ns
42 }
43 #[must_use]
45 pub const fn verification_failure_ns(self) -> MeasurementSummary {
46 self.verification_failure_ns
47 }
48 #[must_use]
50 pub const fn upload_metadata_success_ns(self) -> MeasurementSummary {
51 self.upload_metadata_success_ns
52 }
53 #[must_use]
55 pub const fn upload_metadata_failure_ns(self) -> MeasurementSummary {
56 self.upload_metadata_failure_ns
57 }
58 #[must_use]
60 pub const fn upload_data_success_ns(self) -> MeasurementSummary {
61 self.upload_data_success_ns
62 }
63 #[must_use]
65 pub const fn upload_data_failure_ns(self) -> MeasurementSummary {
66 self.upload_data_failure_ns
67 }
68 #[must_use]
70 pub const fn prepared_chunk_bytes(self) -> MeasurementSummary {
71 self.prepared_chunk_bytes
72 }
73
74 fn record(
75 &mut self,
76 operation: LocalOperation,
77 elapsed: Duration,
78 succeeded: bool,
79 chunk_bytes: Option<usize>,
80 ) {
81 let duration = u64::try_from(elapsed.as_nanos()).unwrap_or(u64::MAX);
82 let summary = match (operation, succeeded) {
83 (LocalOperation::Verification, true) => &mut self.verification_success_ns,
84 (LocalOperation::Verification, false) => &mut self.verification_failure_ns,
85 (LocalOperation::UploadMetadata, true) => &mut self.upload_metadata_success_ns,
86 (LocalOperation::UploadMetadata, false) => &mut self.upload_metadata_failure_ns,
87 (LocalOperation::UploadData, true) => &mut self.upload_data_success_ns,
88 (LocalOperation::UploadData, false) => &mut self.upload_data_failure_ns,
89 };
90 summary.record(duration);
91 if let (LocalOperation::UploadData, true, Some(bytes)) = (operation, succeeded, chunk_bytes)
92 {
93 self.prepared_chunk_bytes
94 .record(u64::try_from(bytes).unwrap_or(u64::MAX));
95 }
96 }
97}
98
99#[derive(Clone, Copy)]
100pub(super) enum LocalOperation {
101 Verification,
102 UploadMetadata,
103 UploadData,
104}
105
106impl DownloadJournalGuard<'_> {
107 #[must_use]
115 pub fn ic_snapshot_metrics(&self) -> IcSnapshotLocalMetrics {
116 *self
117 .ic_snapshot_metrics
118 .lock()
119 .unwrap_or_else(PoisonError::into_inner)
120 }
121
122 pub(super) fn record_ic_snapshot_metrics(
123 &self,
124 operation: LocalOperation,
125 started: Instant,
126 succeeded: bool,
127 chunk_bytes: Option<usize>,
128 ) {
129 let elapsed = started.elapsed();
130 self.ic_snapshot_metrics
131 .lock()
132 .unwrap_or_else(PoisonError::into_inner)
133 .record(operation, elapsed, succeeded, chunk_bytes);
134 }
135}
136
137#[cfg(test)]
138mod tests;