iota_network/state_sync/
metrics.rs

1// Copyright (c) Mysten Labs, Inc.
2// Modifications Copyright (c) 2024 IOTA Stiftung
3// SPDX-License-Identifier: Apache-2.0
4
5use std::sync::Arc;
6
7use iota_types::messages_checkpoint::CheckpointSequenceNumber;
8use prometheus::{
9    Histogram, IntGauge, Registry, register_histogram_with_registry,
10    register_int_gauge_with_registry,
11};
12use tap::Pipe;
13
14#[derive(Clone)]
15pub(super) struct Metrics(Option<Arc<Inner>>);
16
17impl std::fmt::Debug for Metrics {
18    fn fmt(&self, fmt: &mut std::fmt::Formatter) -> std::fmt::Result {
19        fmt.debug_struct("Metrics").finish()
20    }
21}
22
23impl Metrics {
24    pub fn enabled(registry: &Registry) -> Self {
25        Metrics(Some(Inner::new(registry)))
26    }
27
28    pub fn disabled() -> Self {
29        Metrics(None)
30    }
31
32    pub fn set_highest_known_checkpoint(&self, sequence_number: CheckpointSequenceNumber) {
33        if let Some(inner) = &self.0 {
34            inner.highest_known_checkpoint.set(sequence_number as i64);
35        }
36    }
37
38    pub fn set_highest_verified_checkpoint(&self, sequence_number: CheckpointSequenceNumber) {
39        if let Some(inner) = &self.0 {
40            inner
41                .highest_verified_checkpoint
42                .set(sequence_number as i64);
43        }
44    }
45
46    pub fn set_highest_synced_checkpoint(&self, sequence_number: CheckpointSequenceNumber) {
47        if let Some(inner) = &self.0 {
48            inner.highest_synced_checkpoint.set(sequence_number as i64);
49        }
50    }
51
52    pub fn checkpoint_summary_age_metrics(&self) -> Option<&Histogram> {
53        if let Some(inner) = &self.0 {
54            return Some(&inner.checkpoint_summary_age);
55        }
56        None
57    }
58}
59
60struct Inner {
61    highest_known_checkpoint: IntGauge,
62    highest_verified_checkpoint: IntGauge,
63    highest_synced_checkpoint: IntGauge,
64    checkpoint_summary_age: Histogram,
65}
66
67impl Inner {
68    pub fn new(registry: &Registry) -> Arc<Self> {
69        Self {
70            highest_known_checkpoint: register_int_gauge_with_registry!(
71                "highest_known_checkpoint",
72                "Highest known checkpoint",
73                registry
74            )
75            .unwrap(),
76
77            highest_verified_checkpoint: register_int_gauge_with_registry!(
78                "highest_verified_checkpoint",
79                "Highest verified checkpoint",
80                registry
81            )
82            .unwrap(),
83
84            highest_synced_checkpoint: register_int_gauge_with_registry!(
85                "highest_synced_checkpoint",
86                "Highest synced checkpoint",
87                registry
88            )
89            .unwrap(),
90
91            checkpoint_summary_age: register_histogram_with_registry!(
92                "checkpoint_summary_age",
93                "Age of checkpoints summaries when they arrive and are verified.",
94                iota_metrics::LATENCY_SEC_BUCKETS.to_vec(),
95                registry,
96            )
97            .unwrap(),
98        }
99        .pipe(Arc::new)
100    }
101}