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